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 (Stage 8). A block // is mutual in effect (the social checks apply it both ways) and severs any // friendship between the pair. 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)}) }