12de5a230a
- suggestion_service: fix scorer (stringList unmarshal accepts scalar|array; anchor scoring on base universal score so bool matches no longer tie); add localizeReasons for human-readable, Accept-Language-localized match reasons - lookup_i18n: localize lookup display names, home-profile options, document types/categories via internal/i18n - static_data_handler: per-locale seeded-data response (display_name, home profile options, document types/categories) with per-locale cache + ETag - settings_handler: invalidate per-locale seeded-data cache on lookup change instead of pre-warming a single non-localized blob - cache_service: per-locale seeded-data keys + ETag - DTOs: add DisplayName fields (task/residence/contractor) - translations: add suggestion.reason.* and lookup.* keys across all 10 langs - cmd/api: extract startup helpers + tests Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
52 lines
1.4 KiB
Go
52 lines
1.4 KiB
Go
package handlers
|
|
|
|
import (
|
|
"net/http"
|
|
"strconv"
|
|
|
|
"github.com/labstack/echo/v4"
|
|
|
|
"github.com/treytartt/honeydue-api/internal/apperrors"
|
|
"github.com/treytartt/honeydue-api/internal/i18n"
|
|
"github.com/treytartt/honeydue-api/internal/middleware"
|
|
"github.com/treytartt/honeydue-api/internal/services"
|
|
)
|
|
|
|
// SuggestionHandler handles task suggestion endpoints
|
|
type SuggestionHandler struct {
|
|
suggestionService *services.SuggestionService
|
|
}
|
|
|
|
// NewSuggestionHandler creates a new suggestion handler
|
|
func NewSuggestionHandler(suggestionService *services.SuggestionService) *SuggestionHandler {
|
|
return &SuggestionHandler{
|
|
suggestionService: suggestionService,
|
|
}
|
|
}
|
|
|
|
// GetSuggestions handles GET /api/tasks/suggestions/?residence_id=X
|
|
// Returns task template suggestions scored against the residence's home profile
|
|
func (h *SuggestionHandler) GetSuggestions(c echo.Context) error {
|
|
user, err := middleware.MustGetAuthUser(c)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
residenceIDStr := c.QueryParam("residence_id")
|
|
if residenceIDStr == "" {
|
|
return apperrors.BadRequest("error.residence_id_required")
|
|
}
|
|
|
|
residenceID, err := strconv.ParseUint(residenceIDStr, 10, 32)
|
|
if err != nil {
|
|
return apperrors.BadRequest("error.invalid_id")
|
|
}
|
|
|
|
resp, err := h.suggestionService.GetSuggestions(uint(residenceID), user.ID, i18n.GetLocalizer(c))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return c.JSON(http.StatusOK, resp)
|
|
}
|