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 GraphQL | Bắt buộc | Quy tắc và ý nghĩa |
|---|---|---|---|
messageId | ID! | Có | UUID của tin nhắn trong conversation mà người gọi tham gia; không có giá trị mặc định. |
emoji | String! | 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ường | Kiểu GraphQL | Ý nghĩa |
|---|---|---|
id | ID! | ID tin nhắn trên server. |
clientMessageId | String! | ID client đã gửi. |
conversationId | ID! | Conversation chứa tin nhắn. |
senderId | ID! | Người gửi. |
sequence | Int! | Thứ tự tăng trong conversation. |
type | MessageType! | TEXT là tin do người dùng gửi; enum cũng có SYSTEM. |
content | String | Nội dung; có thể rỗng với tin chỉ có tệp, hoặc null khi tin đã xóa mềm. |
replyToMessageId | ID | ID tin được trả lời hoặc null. |
replyTo | MessageSummary | Tóm tắt tin được trả lời hoặc null; xem MessageSummary. |
createdAt | DateTime! | Thời điểm tạo. |
updatedAt | DateTime! | Thời điểm cập nhật. |
deletedAt | DateTime | Thờ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ường | Kiểu GraphQL | Ý nghĩa |
|---|---|---|
id | ID! | ID tin được trả lời. |
senderId | ID! | Người gửi tin đó. |
content | String | Nội dung hoặc null nếu đã xóa. |
deletedAt | DateTime | Thời điểm xóa mềm hoặc null. |
MessageAttachmentView
| Trường | Kiểu GraphQL | Ý nghĩa |
|---|---|---|
id | ID! | ID tệp đính kèm để lấy URL tải hoặc xem trước. |
fileName | String! | Tên tệp sau khi server xử lý. |
contentType | String! | MIME type đã lưu. |
size | Int! | Kích thước byte do client báo. |
ReactionSummary
| Trường | Kiểu GraphQL | Ý nghĩa |
|---|---|---|
emoji | String! | 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.