// Package handlers provides HTTP request handlers. package handlers import ( "encoding/json" "log/slog" "net/http" "github.com/gorilla/csrf" "go.uber.org/fx" "git.eeqj.de/sneak/upaas/internal/database" "git.eeqj.de/sneak/upaas/internal/docker" "git.eeqj.de/sneak/upaas/internal/globals" "git.eeqj.de/sneak/upaas/internal/healthcheck" "git.eeqj.de/sneak/upaas/internal/logger" "git.eeqj.de/sneak/upaas/internal/service/app" "git.eeqj.de/sneak/upaas/internal/service/auth" "git.eeqj.de/sneak/upaas/internal/service/deploy" "git.eeqj.de/sneak/upaas/internal/service/webhook" ) // Params contains dependencies for Handlers. type Params struct { fx.In Logger *logger.Logger Globals *globals.Globals Database *database.Database Healthcheck *healthcheck.Healthcheck Auth *auth.Service App *app.Service Deploy *deploy.Service Webhook *webhook.Service Docker *docker.Client } // Handlers provides HTTP request handlers. type Handlers struct { log *slog.Logger params *Params db *database.Database hc *healthcheck.Healthcheck auth *auth.Service appService *app.Service deploy *deploy.Service webhook *webhook.Service docker *docker.Client globals *globals.Globals } // New creates a new Handlers instance. func New(_ fx.Lifecycle, params Params) (*Handlers, error) { return &Handlers{ log: params.Logger.Get(), params: ¶ms, db: params.Database, hc: params.Healthcheck, auth: params.Auth, appService: params.App, deploy: params.Deploy, webhook: params.Webhook, docker: params.Docker, globals: params.Globals, }, nil } // addGlobals adds version info and CSRF token to template data map. func (h *Handlers) addGlobals( data map[string]any, request *http.Request, ) map[string]any { data["Version"] = h.globals.Version data["Appname"] = h.globals.Appname if request != nil { data["CSRFField"] = csrf.TemplateField(request) } return data } func (h *Handlers) respondJSON( writer http.ResponseWriter, _ *http.Request, data any, status int, ) { writer.Header().Set("Content-Type", "application/json") writer.WriteHeader(status) if data != nil { err := json.NewEncoder(writer).Encode(data) if err != nil { h.log.Error("json encode error", "error", err) } } }