A community based topic aggregation platform built on atproto
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}