diff --git a/internal/services/sync/service.go b/internal/services/sync/service.go index 39f5762..7318f10 100644 --- a/internal/services/sync/service.go +++ b/internal/services/sync/service.go @@ -484,6 +484,9 @@ func (s *Service) pushConfigurationCreate(change *localdb.PendingChange) error { // Create repository configRepo := repository.NewConfigurationRepository(mariaDB) + if err := s.ensureConfigurationOwner(mariaDB, &cfg); err != nil { + return fmt.Errorf("resolve configuration owner: %w", err) + } // Create on server if err := configRepo.Create(&cfg); err != nil { @@ -536,6 +539,9 @@ func (s *Service) pushConfigurationUpdate(change *localdb.PendingChange) error { // Create repository configRepo := repository.NewConfigurationRepository(mariaDB) + if err := s.ensureConfigurationOwner(mariaDB, &cfg); err != nil { + return fmt.Errorf("resolve configuration owner: %w", err) + } // Ensure we have a server ID before updating // If the payload doesn't have ID, get it from local configuration @@ -585,6 +591,32 @@ func (s *Service) pushConfigurationUpdate(change *localdb.PendingChange) error { return nil } +func (s *Service) ensureConfigurationOwner(mariaDB *gorm.DB, cfg *models.Configuration) error { + if cfg == nil { + return fmt.Errorf("configuration is nil") + } + + ownerUsername := cfg.OwnerUsername + if ownerUsername == "" { + ownerUsername = s.localDB.GetDBUser() + cfg.OwnerUsername = ownerUsername + } + if ownerUsername == "" { + return fmt.Errorf("owner username is empty") + } + + userID, err := models.EnsureDBUser(mariaDB, ownerUsername) + if err != nil { + return err + } + if userID == 0 { + return fmt.Errorf("resolved user ID is 0 for owner %q", ownerUsername) + } + + cfg.UserID = userID + return nil +} + func (s *Service) pushConfigurationRollback(change *localdb.PendingChange) error { // Last-write-wins for now: rollback is pushed as an update with rollback metadata. return s.pushConfigurationUpdate(change)