feat: add stickers
This commit is contained in:
@@ -38,6 +38,8 @@ func writeChatError(w http.ResponseWriter, err error) {
|
||||
response.Error(w, http.StatusNotFound, err.Error())
|
||||
case errors.Is(err, service.ErrChatBadEntity):
|
||||
response.Error(w, http.StatusBadRequest, err.Error())
|
||||
case errors.Is(err, repository.ErrStickerNotOwned):
|
||||
response.Error(w, http.StatusForbidden, "that sticker isn't in your collection")
|
||||
case errors.Is(err, service.ErrChatBadEmoji):
|
||||
response.Error(w, http.StatusBadRequest, err.Error())
|
||||
case errors.Is(err, service.ErrChatBadQuote):
|
||||
@@ -206,6 +208,8 @@ type sendReq struct {
|
||||
// quote is a passage shared from the library. `path` must be app-relative;
|
||||
// the service refuses anything that could navigate off-site.
|
||||
Quote *quoteReq `json:"quote"`
|
||||
// sticker_key sends reward artwork. Ownership is checked server-side.
|
||||
StickerKey *string `json:"sticker_key"`
|
||||
// entity shares something else in the app — a post — as a card. Only the
|
||||
// reference; the BFF resolves the contents and re-checks visibility.
|
||||
Entity *entityReq `json:"entity"`
|
||||
@@ -249,6 +253,7 @@ func (h *ChatHandler) Send(w http.ResponseWriter, r *http.Request) {
|
||||
ReplyToID: req.ReplyToID,
|
||||
PreviewURL: req.PreviewURL,
|
||||
Quote: quote,
|
||||
StickerKey: req.StickerKey,
|
||||
Entity: entity,
|
||||
Attachments: media,
|
||||
})
|
||||
@@ -675,6 +680,38 @@ func (h *ChatHandler) MessageReactions(w http.ResponseWriter, r *http.Request) {
|
||||
response.JSON(w, http.StatusOK, list)
|
||||
}
|
||||
|
||||
// Stickers — GET /chat/stickers. What the caller may send.
|
||||
func (h *ChatHandler) Stickers(w http.ResponseWriter, r *http.Request) {
|
||||
list, err := h.svc.Stickers(r.Context(), middleware.UserID(r.Context()))
|
||||
if err != nil {
|
||||
writeChatError(w, err)
|
||||
return
|
||||
}
|
||||
response.JSON(w, http.StatusOK, list)
|
||||
}
|
||||
|
||||
type saveStickerReq struct {
|
||||
Key string `json:"key"`
|
||||
}
|
||||
|
||||
// SaveSticker — POST /chat/conversations/{id}/messages/{messageID}/sticker
|
||||
//
|
||||
// Keyed to the message it was sent on, not just the sticker key: that is what
|
||||
// proves the caller was actually sent it rather than guessing at the catalog.
|
||||
func (h *ChatHandler) SaveSticker(w http.ResponseWriter, r *http.Request) {
|
||||
var req saveStickerReq
|
||||
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
||||
response.Error(w, http.StatusBadRequest, "invalid JSON body")
|
||||
return
|
||||
}
|
||||
if err := h.svc.SaveSticker(r.Context(), middleware.UserID(r.Context()),
|
||||
chi.URLParam(r, "messageID"), req.Key); err != nil {
|
||||
writeChatError(w, err)
|
||||
return
|
||||
}
|
||||
response.NoContent(w)
|
||||
}
|
||||
|
||||
// Typing — POST /chat/conversations/{id}/typing
|
||||
//
|
||||
// Fire-and-forget: nothing is stored and the response carries nothing, because
|
||||
|
||||
Reference in New Issue
Block a user