package httpapi import ( "encoding/json" "errors" "log" "net/http" "github.com/allai/allai-backend/internal/app" ) type Handler struct { service *app.Service logger *log.Logger } func (h *Handler) health(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) _ = json.NewEncoder(w).Encode(map[string]string{"status": "ok"}) } func (h *Handler) listModels(w http.ResponseWriter, r *http.Request) { models, err := h.service.Models(r.Context()) if err != nil { h.writeError(w, http.StatusInternalServerError, err) return } h.writeJSON(w, http.StatusOK, models) } func (h *Handler) generate(w http.ResponseWriter, r *http.Request) { var payload app.GenerationRequest if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { h.writeError(w, http.StatusBadRequest, errors.New("invalid JSON payload")) return } resp, err := h.service.Generate(r.Context(), payload) if err != nil { h.writeError(w, http.StatusBadRequest, err) return } h.writeJSON(w, http.StatusAccepted, resp) } func (h *Handler) writeJSON(w http.ResponseWriter, status int, payload any) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(status) if err := json.NewEncoder(w).Encode(payload); err != nil { h.logger.Printf("response encode failed: %v", err) } } func (h *Handler) writeError(w http.ResponseWriter, status int, err error) { h.logger.Printf("request error: %v", err) h.writeJSON(w, status, map[string]string{ "error": err.Error(), }) } func middleware(next http.Handler, logger *log.Logger) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { logger.Printf("%s %s", r.Method, r.URL.Path) next.ServeHTTP(w, r) }) }