slack5-1770541397/services/preferences-api/internal/service/preferences.go
rdev-worker e3e19a3fa8
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
build: /implement-feature user-preferences
2026-02-08 09:29:22 +00:00

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
}