package cuisine import ( "encoding/json" "log/slog" "net/http" "github.com/food-ai/backend/internal/infra/locale" "github.com/food-ai/backend/internal/infra/middleware" "github.com/jackc/pgx/v5/pgxpool" ) type cuisineItem struct { Slug string `json:"slug"` Name string `json:"name"` } // NewListHandler returns an http.HandlerFunc for GET /cuisines. // It queries the database directly, resolving translations via COALESCE. func NewListHandler(pool *pgxpool.Pool) http.HandlerFunc { return func(responseWriter http.ResponseWriter, request *http.Request) { lang := locale.FromContext(request.Context()) rows, queryError := pool.Query(request.Context(), ` SELECT c.slug, COALESCE(ct.name, c.name) AS name FROM cuisines c LEFT JOIN cuisine_translations ct ON ct.cuisine_slug = c.slug AND ct.lang = $1 ORDER BY c.sort_order`, lang) if queryError != nil { slog.ErrorContext(request.Context(), "list cuisines", "err", queryError) writeErrorJSON(responseWriter, request, http.StatusInternalServerError, "failed to load cuisines") return } defer rows.Close() items := make([]cuisineItem, 0) for rows.Next() { var item cuisineItem if scanError := rows.Scan(&item.Slug, &item.Name); scanError != nil { slog.ErrorContext(request.Context(), "scan cuisine row", "err", scanError) writeErrorJSON(responseWriter, request, http.StatusInternalServerError, "failed to load cuisines") return } items = append(items, item) } if rowsError := rows.Err(); rowsError != nil { slog.ErrorContext(request.Context(), "iterate cuisine rows", "err", rowsError) writeErrorJSON(responseWriter, request, http.StatusInternalServerError, "failed to load cuisines") return } responseWriter.Header().Set("Content-Type", "application/json") _ = json.NewEncoder(responseWriter).Encode(map[string]any{"cuisines": items}) } } func writeErrorJSON(responseWriter http.ResponseWriter, request *http.Request, status int, msg string) { responseWriter.Header().Set("Content-Type", "application/json") responseWriter.WriteHeader(status) _ = json.NewEncoder(responseWriter).Encode(map[string]any{"error": msg, "request_id": middleware.RequestIDFromCtx(request.Context())}) }