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 GraphQL | Bắt buộc | Quy tắc và ý nghĩa |
|---|---|---|---|
messageId | ID! | Có | UUID của tin nhắn; không nhận null, không có giá trị mặc định. |
emoji | String! | 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ườ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 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.