A community based topic aggregation platform built on atproto
1package aggregator
2
3import (
4 "Coves/internal/core/aggregators"
5 "encoding/json"
6 "log"
7 "net/http"
8)
9
10// ErrorResponse represents an XRPC error response
11type ErrorResponse struct {
12 Error string `json:"error"`
13 Message string `json:"message"`
14}
15
16// writeError writes a JSON error response
17func writeError(w http.ResponseWriter, statusCode int, errorType, message string) {
18 w.Header().Set("Content-Type", "application/json")
19 w.WriteHeader(statusCode)
20 if err := json.NewEncoder(w).Encode(ErrorResponse{
21 Error: errorType,
22 Message: message,
23 }); err != nil {
24 log.Printf("ERROR: Failed to encode error response: %v", err)
25 }
26}
27
28// handleServiceError maps service errors to HTTP responses
29func handleServiceError(w http.ResponseWriter, err error) {
30 if err == nil {
31 return
32 }
33
34 // Map domain errors to HTTP status codes
35 switch {
36 case aggregators.IsNotFound(err):
37 writeError(w, http.StatusNotFound, "NotFound", err.Error())
38 case aggregators.IsValidationError(err):
39 writeError(w, http.StatusBadRequest, "InvalidRequest", err.Error())
40 case aggregators.IsUnauthorized(err):
41 writeError(w, http.StatusForbidden, "Forbidden", err.Error())
42 case aggregators.IsConflict(err):
43 writeError(w, http.StatusConflict, "Conflict", err.Error())
44 case aggregators.IsRateLimited(err):
45 writeError(w, http.StatusTooManyRequests, "RateLimitExceeded", err.Error())
46 case aggregators.IsNotImplemented(err):
47 writeError(w, http.StatusNotImplemented, "NotImplemented", "This feature is not yet available (Phase 2)")
48 default:
49 // Internal errors - don't leak details
50 log.Printf("ERROR: Aggregator service error: %v", err)
51 writeError(w, http.StatusInternalServerError, "InternalServerError",
52 "An internal error occurred")
53 }
54}