57 lines
1.6 KiB
Go
57 lines
1.6 KiB
Go
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)
|
|
}
|