Remove Reaction

Mutation · removeReaction

removeReaction(emoji: String!, messageId: ID!): MessageView!

Gỡ phản ứng của chính người gọi với emoji đã chọn trên tin nhắn. Thành viên conversation có thể gỡ phản ứng của mình, không gỡ phản ứng của người khác. Nếu chưa có phản ứng đó, gọi lại vẫn thành công và reactions không đổi. Server cập nhật updatedAt và phát messageUpdated sau mỗi lần gọi hợp lệ, kể cả khi không có phản ứng để gỡ. Tin đã xóa mềm vẫn có thể gỡ phản ứng cũ vì mutation này không chặn trạng thái đã xóa.

Gửi mutation qua HTTP POST /graphql với Authorization: Bearer <accessToken>. Cần đăng nhập và là thành viên conversation chứa tin nhắn.

Input

Đối sốKiểu GraphQLBắt buộcQuy tắc và ý nghĩa
messageIdID!CóUUID của tin nhắn; không nhận null, không có giá trị mặc định.
emojiString!CóChuỗi không rỗng, tối đa 32 đơn vị UTF-16 và có code point đầu từ U+2000 trở lên. Server không kiểm tra ngữ pháp emoji đầy đủ. Không nhận null; không có giá trị mặc định.

Output

Trả về MessageView!, không null, với reactions sau khi gỡ. Nếu người khác vẫn dùng cùng emoji, nhóm đó còn trong danh sách với userIds của họ.

MessageView

TrườngKiểu GraphQLÝ nghĩa
idID!ID tin nhắn trên server.
clientMessageIdString!ID client đã gửi.
conversationIdID!Conversation chứa tin nhắn.
senderIdID!Người gửi.
sequenceInt!Thứ tự tăng trong conversation.
typeMessageType!TEXT là tin do người dùng gửi; enum cũng có SYSTEM.
contentStringNội dung; có thể rỗng với tin chỉ có tệp, hoặc null khi tin đã xóa mềm.
replyToMessageIdIDID tin được trả lời hoặc null.
replyToMessageSummaryTóm tắt tin được trả lời hoặc null; xem MessageSummary.
createdAtDateTime!Thời điểm tạo.
updatedAtDateTime!Thời điểm cập nhật.
deletedAtDateTimeThời điểm xóa mềm hoặc null.
attachments[MessageAttachmentView!]!Tệp đính kèm; danh sách và phần tử không null. Xem MessageAttachmentView.
reactions[ReactionSummary!]!Phản ứng nhóm theo emoji; danh sách và phần tử không null. Xem ReactionSummary.

MessageSummary

TrườngKiểu GraphQLÝ nghĩa
idID!ID tin được trả lời.
senderIdID!Người gửi tin đó.
contentStringNội dung hoặc null nếu đã xóa.
deletedAtDateTimeThời điểm xóa mềm hoặc null.

MessageAttachmentView

TrườngKiểu GraphQLÝ nghĩa
idID!ID tệp đính kèm để lấy URL tải hoặc xem trước.
fileNameString!Tên tệp sau khi server xử lý.
contentTypeString!MIME type đã lưu.
sizeInt!Kích thước byte do client báo.

ReactionSummary

TrườngKiểu GraphQLÝ nghĩa
emojiString!Emoji phản ứng.
userIds[ID!]!ID người đã dùng emoji này; danh sách và phần tử không null.

Ví dụ

mutation RemoveReaction($messageId: ID!, $emoji: String!) {
  removeReaction(messageId: $messageId, emoji: $emoji) {
    id
    clientMessageId
    conversationId
    senderId
    sequence
    type
    content
    replyToMessageId
    replyTo { id senderId content deletedAt }
    createdAt
    updatedAt
    deletedAt
    attachments { id fileName contentType size }
    reactions { emoji userIds }
  }
}

Biến khi người gọi là an:

{
  "messageId": "55555555-5555-4555-8555-555555555555",
  "emoji": "👍"
}

Phản hồi minh họa khi binh vẫn giữ phản ứng 👍:

{
  "data": {
    "removeReaction": {
      "id": "55555555-5555-4555-8555-555555555555",
      "clientMessageId": "send-005",
      "conversationId": "33333333-3333-4333-8333-333333333333",
      "senderId": "22222222-2222-4222-8222-222222222222",
      "sequence": 5,
      "type": "TEXT",
      "content": "Chào bạn",
      "replyToMessageId": null,
      "replyTo": null,
      "createdAt": "2026-09-26T09:01:00.000Z",
      "updatedAt": "2026-09-26T09:05:00.000Z",
      "deletedAt": null,
      "attachments": [],
      "reactions": [
        {
          "emoji": "👍",
          "userIds": ["22222222-2222-4222-8222-222222222222"]
        }
      ]
    }
  }
}

Thiếu hoặc sai access token trả UNAUTHENTICATED. ID sai định dạng hoặc emoji không hợp lệ trả BAD_USER_INPUT; tin không tồn tại trả NOT_FOUND. Người không phải thành viên conversation nhận FORBIDDEN.

Chữ ký operation được tạo từ GraphQL schema.