package server import ( "net/http" "github.com/gin-gonic/gin" "github.com/google/uuid" ) // The /api/v1/user/blocks/* handlers wire the per-user block list. A block is asymmetric: // the blocker stops seeing everything from the blocked user (chat, nudge, requests, // invitations, matchmaking) while the blocked user notices nothing; it overrides — but does // not delete — any friendship (an unblock restores it). They reuse the friend handlers' // targetIDRequest and account-ref resolution. // blockListDTO is the accounts the caller has blocked. type blockListDTO struct { Blocked []accountRefDTO `json:"blocked"` } // handleBlock blocks the body-supplied account. func (s *Server) handleBlock(c *gin.Context) { uid, ok := userID(c) if !ok { abortBadRequest(c, "missing identity") return } var req targetIDRequest if err := c.ShouldBindJSON(&req); err != nil { abortBadRequest(c, "invalid request body") return } target, ok := parseUUIDField(req.AccountID) if !ok { abortBadRequest(c, "invalid account id") return } if err := s.social.Block(c.Request.Context(), uid, target); err != nil { s.abortErr(c, err) return } c.JSON(http.StatusOK, okResponse{OK: true}) } // handleUnblock removes the caller's block on the :id account. func (s *Server) handleUnblock(c *gin.Context) { uid, ok := userID(c) if !ok { abortBadRequest(c, "missing identity") return } target, err := uuid.Parse(c.Param("id")) if err != nil { abortBadRequest(c, "invalid account id") return } if err := s.social.Unblock(c.Request.Context(), uid, target); err != nil { s.abortErr(c, err) return } c.JSON(http.StatusOK, okResponse{OK: true}) } // handleListBlocks returns the accounts the caller has blocked. func (s *Server) handleListBlocks(c *gin.Context) { uid, ok := userID(c) if !ok { abortBadRequest(c, "missing identity") return } ids, err := s.social.ListBlocks(c.Request.Context(), uid) if err != nil { s.abortErr(c, err) return } c.JSON(http.StatusOK, blockListDTO{Blocked: s.accountRefs(c.Request.Context(), ids)}) }