A community based topic aggregation platform built on atproto
1package communityFeed 2 3import ( 4 "encoding/json" 5 "errors" 6 "log" 7 "net/http" 8 9 "Coves/internal/core/communityFeeds" 10) 11 12// ErrorResponse represents an XRPC error response 13type ErrorResponse struct { 14 Error string `json:"error"` 15 Message string `json:"message"` 16} 17 18// writeError writes a JSON error response 19func writeError(w http.ResponseWriter, statusCode int, errorType, message string) { 20 w.Header().Set("Content-Type", "application/json") 21 w.WriteHeader(statusCode) 22 if err := json.NewEncoder(w).Encode(ErrorResponse{ 23 Error: errorType, 24 Message: message, 25 }); err != nil { 26 // Log encoding errors but can't send error response (headers already sent) 27 log.Printf("ERROR: Failed to encode error response: %v", err) 28 } 29} 30 31// handleServiceError maps service errors to HTTP responses 32func handleServiceError(w http.ResponseWriter, err error) { 33 switch { 34 case errors.Is(err, communityFeeds.ErrCommunityNotFound): 35 writeError(w, http.StatusNotFound, "CommunityNotFound", "Community not found") 36 37 case errors.Is(err, communityFeeds.ErrInvalidCursor): 38 writeError(w, http.StatusBadRequest, "InvalidCursor", "Invalid pagination cursor") 39 40 case communityFeeds.IsValidationError(err): 41 writeError(w, http.StatusBadRequest, "InvalidRequest", err.Error()) 42 43 default: 44 // Internal server error - don't leak details 45 writeError(w, http.StatusInternalServerError, "InternalServerError", "An internal error occurred") 46 } 47}