// 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(lc fx.Lifecycle, params Params) (*Handlers, error) { s := new(Handlers) s.params = ¶ms s.log = params.Logger.Get() s.hc = params.Healthcheck s.broker = broker.New() lc.Append(fx.Hook{ OnStart: func(_ context.Context) error { return nil }, }) return s, nil } func (s *Handlers) respondJSON(w http.ResponseWriter, _ *http.Request, data any, status int) { w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(status) if data != nil { if err := json.NewEncoder(w).Encode(data); err != nil { s.log.Error("json encode error", "error", err) } } }