slack5-1770529463/services/preferences-api/internal/api/handlers/preference.go
rdev-worker 73532902e7
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
build: /implement-feature user-preferences
2026-02-08 06:13:10 +00:00

92 lines
2.6 KiB
Go

package handlers
import (
"errors"
"net/http"
"github.com/go-chi/chi/v5"
"git.threesix.ai/jordan/slack5-1770529463/pkg/app"
"git.threesix.ai/jordan/slack5-1770529463/pkg/httperror"
"git.threesix.ai/jordan/slack5-1770529463/pkg/httpresponse"
"git.threesix.ai/jordan/slack5-1770529463/pkg/logging"
"git.threesix.ai/jordan/slack5-1770529463/services/preferences-api/internal/domain"
"git.threesix.ai/jordan/slack5-1770529463/services/preferences-api/internal/service"
)
// Preference handles HTTP requests for user preferences.
type Preference struct {
svc *service.PreferenceService
logger *logging.Logger
}
// NewPreference creates a new Preference handler with injected dependencies.
func NewPreference(svc *service.PreferenceService, logger *logging.Logger) *Preference {
return &Preference{
svc: svc,
logger: logger.WithComponent("PreferenceHandler"),
}
}
// UpdatePreferencesRequest is the request body for updating preferences.
type UpdatePreferencesRequest struct {
Preferences map[string]any `json:"preferences"`
}
// PreferencesResponse is the response for preference endpoints.
type PreferencesResponse struct {
UserID string `json:"user_id"`
Preferences map[string]any `json:"preferences"`
}
// GetPreferences returns all preferences for a user.
func (h *Preference) GetPreferences(w http.ResponseWriter, r *http.Request) error {
userID := chi.URLParam(r, "user_id")
result, err := h.svc.GetPreferences(r.Context(), userID)
if err != nil {
return mapPreferenceError(err)
}
httpresponse.OK(w, r, PreferencesResponse{
UserID: result.UserID,
Preferences: result.Preferences,
})
return nil
}
// UpdatePreferences creates or updates preferences for a user.
func (h *Preference) UpdatePreferences(w http.ResponseWriter, r *http.Request) error {
userID := chi.URLParam(r, "user_id")
var req UpdatePreferencesRequest
if err := app.Bind(r, &req); err != nil {
return err
}
result, err := h.svc.UpdatePreferences(r.Context(), userID, req.Preferences)
if err != nil {
return mapPreferenceError(err)
}
httpresponse.OK(w, r, PreferencesResponse{
UserID: result.UserID,
Preferences: result.Preferences,
})
return nil
}
// mapPreferenceError converts domain errors to HTTP errors.
func mapPreferenceError(err error) error {
switch {
case errors.Is(err, domain.ErrInvalidUserID):
return httperror.BadRequest("invalid user_id format: must be a valid UUID")
case errors.Is(err, domain.ErrUnknownPreferenceKey):
return httperror.BadRequest(err.Error())
case errors.Is(err, domain.ErrInvalidPreferenceValue):
return httperror.BadRequest(err.Error())
default:
return err
}
}