package service import ( "context" "time" "git.threesix.ai/jordan/slack5-1770574304/pkg/logging" "git.threesix.ai/jordan/slack5-1770574304/services/preferences-api/internal/domain" "git.threesix.ai/jordan/slack5-1770574304/services/preferences-api/internal/port" ) // PreferenceService handles preference-related business logic. type PreferenceService struct { repo port.PreferenceRepository logger *logging.Logger } // NewPreferenceService creates a new preference service. func NewPreferenceService(repo port.PreferenceRepository, logger *logging.Logger) *PreferenceService { return &PreferenceService{ repo: repo, logger: logger.WithService("PreferenceService"), } } // GetPreferences returns the preferences for a user. // Returns default preferences if none are stored. func (s *PreferenceService) GetPreferences(ctx context.Context, userID string) (*domain.UserPreferences, error) { prefs, err := s.repo.Get(ctx, userID) if err != nil { return nil, err } if prefs == nil { return domain.DefaultPreferences(userID), nil } return prefs, nil } // UpdatePreferences validates and persists user preferences. func (s *PreferenceService) UpdatePreferences(ctx context.Context, userID string, prefs *domain.UserPreferences) (*domain.UserPreferences, error) { prefs.UserID = userID prefs.UpdatedAt = time.Now().UTC() if err := prefs.Validate(); err != nil { return nil, err } if err := s.repo.Upsert(ctx, prefs); err != nil { return nil, err } s.logger.Info("preferences updated", "user_id", userID) // Re-fetch to get the DB-set updated_at timestamp return s.repo.Get(ctx, userID) }