// Package handlers provides HTTP request handlers for the chat server. package handlers import ( "context" "encoding/json" "errors" "log/slog" "net/http" "git.eeqj.de/sneak/chat/internal/broker" "git.eeqj.de/sneak/chat/internal/config" "git.eeqj.de/sneak/chat/internal/db" "git.eeqj.de/sneak/chat/internal/globals" "git.eeqj.de/sneak/chat/internal/healthcheck" "git.eeqj.de/sneak/chat/internal/logger" "go.uber.org/fx" ) var errUnauthorized = errors.New("unauthorized") // Params defines the dependencies for creating Handlers. type Params struct { fx.In Logger *logger.Logger Globals *globals.Globals Config *config.Config Database *db.Database Healthcheck *healthcheck.Healthcheck } // Handlers manages HTTP request handling. type Handlers struct { params *Params log *slog.Logger hc *healthcheck.Healthcheck broker *broker.Broker } // New creates a new Handlers instance. func New( lifecycle fx.Lifecycle, params Params, ) (*Handlers, error) { hdlr := &Handlers{ params: ¶ms, log: params.Logger.Get(), hc: params.Healthcheck, broker: broker.New(), } lifecycle.Append(fx.Hook{ OnStart: func(_ context.Context) error { return nil }, OnStop: func(_ context.Context) error { return nil }, }) return hdlr, nil } func (hdlr *Handlers) respondJSON( writer http.ResponseWriter, _ *http.Request, data any, status int, ) { writer.Header().Set( "Content-Type", "application/json; charset=utf-8", ) writer.WriteHeader(status) if data != nil { err := json.NewEncoder(writer).Encode(data) if err != nil { hdlr.log.Error( "json encode error", "error", err, ) } } } func (hdlr *Handlers) respondError( writer http.ResponseWriter, request *http.Request, msg string, status int, ) { hdlr.respondJSON( writer, request, map[string]string{"error": msg}, status, ) }