| 210 | } |
| 211 | |
| 212 | func (a *APIController) EventsHandler(w http.ResponseWriter, r *http.Request) { |
| 213 | ctx := r.Context() |
| 214 | if !auth.IsAdmin(ctx) { |
| 215 | w.WriteHeader(http.StatusForbidden) |
| 216 | if _, err := w.Write([]byte("events are available to admin users")); err != nil { |
| 217 | slog.With(slog.Any("error", err)).ErrorContext(ctx, "failed to encode response") |
| 218 | } |
| 219 | return |
| 220 | } |
| 221 | |
| 222 | conn, err := a.upgrader.Upgrade(w, r, nil) |
| 223 | if err != nil { |
| 224 | slog.With(slog.Any("error", err)).ErrorContext(ctx, "error upgrading to websockets") |
| 225 | return |
| 226 | } |
| 227 | defer conn.Close() |
| 228 | |
| 229 | wsClient, err := wsWriter.NewClient(ctx, conn) |
| 230 | if err != nil { |
| 231 | slog.With(slog.Any("error", err)).ErrorContext(ctx, "failed to create new client") |
| 232 | return |
| 233 | } |
| 234 | defer wsClient.Stop() |
| 235 | |
| 236 | eventHandler, err := events.NewHandler(ctx, wsClient) |
| 237 | if err != nil { |
| 238 | slog.With(slog.Any("error", err)).ErrorContext(ctx, "failed to create new event handler") |
| 239 | return |
| 240 | } |
| 241 | |
| 242 | if err := eventHandler.Start(); err != nil { |
| 243 | slog.With(slog.Any("error", err)).ErrorContext(ctx, "failed to start event handler") |
| 244 | return |
| 245 | } |
| 246 | <-eventHandler.Done() |
| 247 | } |
| 248 | |
| 249 | func (a *APIController) MetricsHandler(w http.ResponseWriter, r *http.Request) { |
| 250 | ctx := r.Context() |