63 lines
1.8 KiB
Go
63 lines
1.8 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"time"
|
|
|
|
"git.threesix.ai/jordan/slack5-1770541397/pkg/logging"
|
|
"git.threesix.ai/jordan/slack5-1770541397/services/preferences-api/internal/domain"
|
|
"git.threesix.ai/jordan/slack5-1770541397/services/preferences-api/internal/port"
|
|
)
|
|
|
|
// PreferencesService handles preference-related business logic.
|
|
type PreferencesService struct {
|
|
repo port.PreferencesRepository
|
|
logger *logging.Logger
|
|
}
|
|
|
|
// NewPreferencesService creates a new preferences service.
|
|
func NewPreferencesService(repo port.PreferencesRepository, logger *logging.Logger) *PreferencesService {
|
|
return &PreferencesService{
|
|
repo: repo,
|
|
logger: logger.WithService("PreferencesService"),
|
|
}
|
|
}
|
|
|
|
// GetPreferences returns the preferences for a user.
|
|
// If no preferences are stored, default preferences are returned.
|
|
func (s *PreferencesService) GetPreferences(ctx context.Context, userID domain.UserID) (*domain.UserPreferences, error) {
|
|
prefs, err := s.repo.Get(ctx, userID)
|
|
if err != nil {
|
|
if errors.Is(err, domain.ErrPreferencesNotFound) {
|
|
defaults := domain.DefaultPreferences()
|
|
return &domain.UserPreferences{
|
|
UserID: userID,
|
|
Preferences: defaults,
|
|
}, nil
|
|
}
|
|
return nil, err
|
|
}
|
|
return prefs, nil
|
|
}
|
|
|
|
// SetPreferences validates and stores preferences for a user.
|
|
func (s *PreferencesService) SetPreferences(ctx context.Context, userID domain.UserID, prefs domain.Preferences) (*domain.UserPreferences, error) {
|
|
if err := prefs.Validate(); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
userPrefs := &domain.UserPreferences{
|
|
UserID: userID,
|
|
Preferences: prefs,
|
|
UpdatedAt: time.Now().UTC(),
|
|
}
|
|
|
|
if err := s.repo.Upsert(ctx, userPrefs); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
s.logger.Info("preferences updated", "user_id", string(userID))
|
|
return userPrefs, nil
|
|
}
|