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}