Harden local config updates and error logging

This commit is contained in:
2026-02-19 18:41:45 +03:00
parent cbaeafa9c8
commit 075fc709dd
3 changed files with 175 additions and 9 deletions

View File

@@ -461,9 +461,21 @@ func (s *LocalConfigurationService) UpdateNoAuth(uuid string, req *CreateConfigR
projectUUID := localCfg.ProjectUUID
if req.ProjectUUID != nil {
requestedProjectUUID := strings.TrimSpace(*req.ProjectUUID)
currentProjectUUID := ""
if localCfg.ProjectUUID != nil {
currentProjectUUID = strings.TrimSpace(*localCfg.ProjectUUID)
}
projectUUID, err = s.resolveProjectUUID(localCfg.OriginalUsername, req.ProjectUUID)
if err != nil {
return nil, err
// Allow save for legacy/orphaned configs when request keeps the same project UUID.
// This can happen for imported configs whose project is not present in local cache.
if errors.Is(err, ErrProjectNotFound) && requestedProjectUUID != "" && requestedProjectUUID == currentProjectUUID {
projectUUID = localCfg.ProjectUUID
} else {
return nil, err
}
}
}
pricelistID, err := s.resolvePricelistID(req.PricelistID)
@@ -1001,13 +1013,17 @@ func (s *LocalConfigurationService) saveWithVersionAndPending(localCfg *localdb.
return fmt.Errorf("load current version before save: %w", err)
}
sameRevisionContent, err := s.hasSameRevisionContent(localCfg, currentVersion)
if err != nil {
return fmt.Errorf("compare revision content: %w", err)
}
if sameRevisionContent {
cfg = localdb.LocalToConfiguration(&locked)
return nil
// Legacy/orphaned rows may have empty or stale current_version_id.
// In that case we treat update as content-changing and append a fresh version.
if currentVersion != nil {
sameRevisionContent, err := s.hasSameRevisionContent(localCfg, currentVersion)
if err != nil {
return fmt.Errorf("compare revision content: %w", err)
}
if sameRevisionContent {
cfg = localdb.LocalToConfiguration(&locked)
return nil
}
}
}
@@ -1058,6 +1074,9 @@ func (s *LocalConfigurationService) loadCurrentVersionTx(tx *gorm.DB, localCfg *
if err := tx.Where("configuration_uuid = ?", localCfg.UUID).
Order("version_no DESC").
First(&version).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, nil
}
return nil, err
}
return &version, nil