···
4
+
"Coves/internal/api/middleware"
5
+
"Coves/internal/core/communities"
12
+
// BlockHandler handles community blocking operations
13
+
type BlockHandler struct {
14
+
service communities.Service
17
+
// NewBlockHandler creates a new block handler
18
+
func NewBlockHandler(service communities.Service) *BlockHandler {
19
+
return &BlockHandler{
24
+
// HandleBlock blocks a community
25
+
// POST /xrpc/social.coves.community.block
26
+
// Body: { "community": "did:plc:xxx" or "!gaming@coves.social" }
27
+
func (h *BlockHandler) HandleBlock(w http.ResponseWriter, r *http.Request) {
28
+
if r.Method != http.MethodPost {
29
+
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
33
+
// Parse request body
35
+
Community string `json:"community"` // DID or handle
38
+
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
39
+
writeError(w, http.StatusBadRequest, "InvalidRequest", "Invalid request body")
43
+
if req.Community == "" {
44
+
writeError(w, http.StatusBadRequest, "InvalidRequest", "community is required")
48
+
// Validate format (DID or handle)
49
+
if !strings.HasPrefix(req.Community, "did:") && !strings.HasPrefix(req.Community, "!") {
50
+
writeError(w, http.StatusBadRequest, "InvalidRequest",
51
+
"community must be a DID (did:plc:...) or handle (!name@instance.com)")
55
+
// Extract authenticated user DID and access token from request context (injected by auth middleware)
56
+
userDID := middleware.GetUserDID(r)
58
+
writeError(w, http.StatusUnauthorized, "AuthRequired", "Authentication required")
62
+
userAccessToken := middleware.GetUserAccessToken(r)
63
+
if userAccessToken == "" {
64
+
writeError(w, http.StatusUnauthorized, "AuthRequired", "Missing access token")
68
+
// Block via service (write-forward to PDS)
69
+
block, err := h.service.BlockCommunity(r.Context(), userDID, userAccessToken, req.Community)
71
+
handleServiceError(w, err)
75
+
// Return success response (following atProto conventions for block responses)
76
+
response := map[string]interface{}{
77
+
"block": map[string]interface{}{
78
+
"recordUri": block.RecordURI,
79
+
"recordCid": block.RecordCID,
83
+
w.Header().Set("Content-Type", "application/json")
84
+
w.WriteHeader(http.StatusOK)
85
+
if err := json.NewEncoder(w).Encode(response); err != nil {
86
+
log.Printf("Failed to encode response: %v", err)
90
+
// HandleUnblock unblocks a community
91
+
// POST /xrpc/social.coves.community.unblock
92
+
// Body: { "community": "did:plc:xxx" or "!gaming@coves.social" }
93
+
func (h *BlockHandler) HandleUnblock(w http.ResponseWriter, r *http.Request) {
94
+
if r.Method != http.MethodPost {
95
+
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
99
+
// Parse request body
101
+
Community string `json:"community"`
104
+
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
105
+
writeError(w, http.StatusBadRequest, "InvalidRequest", "Invalid request body")
109
+
if req.Community == "" {
110
+
writeError(w, http.StatusBadRequest, "InvalidRequest", "community is required")
114
+
// Validate format (DID or handle)
115
+
if !strings.HasPrefix(req.Community, "did:") && !strings.HasPrefix(req.Community, "!") {
116
+
writeError(w, http.StatusBadRequest, "InvalidRequest",
117
+
"community must be a DID (did:plc:...) or handle (!name@instance.com)")
121
+
// Extract authenticated user DID and access token from request context (injected by auth middleware)
122
+
userDID := middleware.GetUserDID(r)
124
+
writeError(w, http.StatusUnauthorized, "AuthRequired", "Authentication required")
128
+
userAccessToken := middleware.GetUserAccessToken(r)
129
+
if userAccessToken == "" {
130
+
writeError(w, http.StatusUnauthorized, "AuthRequired", "Missing access token")
134
+
// Unblock via service (delete record on PDS)
135
+
err := h.service.UnblockCommunity(r.Context(), userDID, userAccessToken, req.Community)
137
+
handleServiceError(w, err)
141
+
// Return success response
142
+
w.Header().Set("Content-Type", "application/json")
143
+
w.WriteHeader(http.StatusOK)
144
+
if err := json.NewEncoder(w).Encode(map[string]interface{}{
147
+
log.Printf("Failed to encode response: %v", err)