71 lines
1.7 KiB
Go
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)
|
|
})
|
|
}
|