A community based topic aggregation platform built on atproto
at main 55 lines 3.0 kB view raw
1package communitysuggestion 2 3import ( 4 "Coves/internal/api/xrpc" 5 "Coves/internal/core/communitysuggestions" 6 "errors" 7 "log" 8 "net/http" 9) 10 11// writeError writes an XRPC error response 12func writeError(w http.ResponseWriter, status int, error, message string) { 13 xrpc.WriteError(w, status, error, message) 14} 15 16// handleServiceError converts service errors to appropriate HTTP responses 17// Each sentinel error is mapped to a static, user-facing message to prevent 18// leaking internal error details to clients. 19func handleServiceError(w http.ResponseWriter, err error) { 20 switch { 21 case communitysuggestions.IsValidationError(err): 22 switch { 23 case errors.Is(err, communitysuggestions.ErrTitleRequired): 24 writeError(w, http.StatusBadRequest, "InvalidRequest", "Suggestion title is required") 25 case errors.Is(err, communitysuggestions.ErrTitleTooLong): 26 writeError(w, http.StatusBadRequest, "InvalidRequest", "Suggestion title exceeds maximum length") 27 case errors.Is(err, communitysuggestions.ErrDescriptionRequired): 28 writeError(w, http.StatusBadRequest, "InvalidRequest", "Suggestion description is required") 29 case errors.Is(err, communitysuggestions.ErrDescriptionTooLong): 30 writeError(w, http.StatusBadRequest, "InvalidRequest", "Suggestion description exceeds maximum length") 31 case errors.Is(err, communitysuggestions.ErrInvalidStatus): 32 writeError(w, http.StatusBadRequest, "InvalidStatus", "Invalid status value. Must be one of: open, under_review, approved, declined") 33 case errors.Is(err, communitysuggestions.ErrInvalidVoteValue): 34 writeError(w, http.StatusBadRequest, "InvalidVoteValue", "Invalid vote value. Must be 1 or -1") 35 case errors.Is(err, communitysuggestions.ErrInvalidSuggestionID): 36 writeError(w, http.StatusBadRequest, "InvalidRequest", "Invalid suggestion ID") 37 case errors.Is(err, communitysuggestions.ErrVoterRequired): 38 writeError(w, http.StatusBadRequest, "InvalidRequest", "Voter identification is required") 39 case errors.Is(err, communitysuggestions.ErrSubmitterRequired): 40 writeError(w, http.StatusBadRequest, "InvalidRequest", "Submitter identification is required") 41 default: 42 log.Printf("Unhandled validation error in community suggestion handler: %v", err) 43 writeError(w, http.StatusBadRequest, "InvalidRequest", "The request contains invalid data") 44 } 45 case communitysuggestions.IsNotFound(err): 46 writeError(w, http.StatusNotFound, "NotFound", "The requested resource was not found") 47 case communitysuggestions.IsRateLimitError(err): 48 writeError(w, http.StatusTooManyRequests, "RateLimitExceeded", "Too many suggestions. Please try again later") 49 case communitysuggestions.IsAuthorizationError(err): 50 writeError(w, http.StatusForbidden, "Forbidden", "You are not authorized to perform this action") 51 default: 52 log.Printf("XRPC community suggestion handler error: %v", err) 53 writeError(w, http.StatusInternalServerError, "InternalServerError", "An internal error occurred") 54 } 55}