AllAi/backend/go/internal/httpapi/handlers.go
2025-11-14 21:54:04 +03:00

71 lines
1.7 KiB
Go

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)
})
}