A community based topic aggregation platform built on atproto
1package discover 2 3import ( 4 "encoding/json" 5 "errors" 6 "log" 7 "net/http" 8 9 "Coves/internal/core/discover" 10) 11 12// XRPCError represents an XRPC error response 13type XRPCError 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, status int, errorType, message string) { 20 w.Header().Set("Content-Type", "application/json") 21 w.WriteHeader(status) 22 23 resp := XRPCError{ 24 Error: errorType, 25 Message: message, 26 } 27 28 if err := json.NewEncoder(w).Encode(resp); err != nil { 29 log.Printf("ERROR: Failed to encode error response: %v", err) 30 } 31} 32 33// handleServiceError maps service errors to HTTP responses 34func handleServiceError(w http.ResponseWriter, err error) { 35 switch { 36 case discover.IsValidationError(err): 37 writeError(w, http.StatusBadRequest, "InvalidRequest", err.Error()) 38 case errors.Is(err, discover.ErrInvalidCursor): 39 writeError(w, http.StatusBadRequest, "InvalidCursor", "The provided cursor is invalid") 40 default: 41 log.Printf("ERROR: Discover service error: %v", err) 42 writeError(w, http.StatusInternalServerError, "InternalServerError", "An error occurred while fetching discover feed") 43 } 44}