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