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