package search import ( "log/slog" "net/http" "github.com/jackc/pgx/v5/pgxpool" "github.com/ultisuite/ulti-backend/internal/api/apiresponse" "github.com/ultisuite/ulti-backend/internal/api/apivalidate" "github.com/ultisuite/ulti-backend/internal/api/middleware" "github.com/ultisuite/ulti-backend/internal/api/query" ) type Handler struct { svc *Service logger *slog.Logger } func NewHandler(db *pgxpool.Pool) *Handler { return &Handler{ svc: NewService(db), logger: slog.Default().With("component", "search"), } } func (h *Handler) Search(w http.ResponseWriter, r *http.Request) { claims := middleware.ClaimsFromContext(r.Context()) q := r.URL.Query().Get("q") if verr := validateSearchQuery(q); verr != nil { apiresponse.WriteError(w, r, http.StatusBadRequest, apiresponse.CodeInvalidQueryParam, "invalid query parameters", verr.Details) return } types := r.URL.Query().Get("types") if verr := validateSearchTypes(types); verr != nil { apiresponse.WriteError(w, r, http.StatusBadRequest, apiresponse.CodeInvalidQueryParam, "invalid query parameters", verr.Details) return } params, err := query.ParseListRequest(r) if err != nil { apivalidate.WriteQueryError(w, r, err) return } result, err := h.svc.Search(r.Context(), claims.Sub, q, types, params) if err != nil { h.logger.Error("search", "error", err) apivalidate.WriteInternal(w, r) return } apiresponse.WriteJSON(w, http.StatusOK, result) }