A community based topic aggregation platform built on atproto
at main 1.7 kB view raw
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}