Add Reaction

Mutation · addReaction

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

Thêm phản ứng của người gọi vào một tin nhắn chưa xóa. Mọi thành viên conversation đều có thể phản ứng, kể cả khi họ không phải người gửi. Một người chỉ có một bản ghi cho cùng emoji trên cùng tin nhắn; gọi lại không thêm bản ghi trùng. Tối đa 20 phản ứng khác nhau của mỗi người trên mỗi tin nhắn. Kết quả nhóm các userIds theo emoji; mutation cập nhật updatedAt của tin và phát messageUpdated sau khi lưu. Không có sự kiện riêng cho phản ứng.

Gửi mutation qua HTTP POST /graphql với Authorization: Bearer <accessToken>. Client cần dùng trạng thái query đã lưu để bù nếu bỏ lỡ thông báo realtime.

Input

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

Output

Trả về MessageView!, không null, gồm danh sách reactions sau khi thêm. Gọi lại với cùng emoji vẫn có một ID người gọi trong nhóm đó, dù updatedAt và thông báo realtime có thể được cập nhật lại.

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 AddReaction($messageId: ID!, $emoji: String!) {
  addReaction(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:

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

Phản hồi minh họa khi người gọi là an:

{
  "data": {
    "addReaction": {
      "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": ["11111111-1111-4111-8111-111111111111"]
        }
      ]
    }
  }
}

Thiếu hoặc sai access token trả UNAUTHENTICATED. ID sai định dạng, emoji không hợp lệ, quá giới hạn phản ứng hoặc tin đã xóa trả BAD_USER_INPUT; ID 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.