Message Deleted
Subscription · messageDeleted
messageDeleted(conversationId: ID!): MessageView!
Nhận trạng thái của tin nhắn sau khi người gửi gọi deleteMessage. Tin được xóa mềm: payload vẫn có id và sequence cũ để client cập nhật đúng bản tin, nhưng content là null, deletedAt có thời điểm xóa và attachments là danh sách rỗng. Các phản ứng đã có vẫn có thể xuất hiện trong reactions. Gọi xóa lại một tin đã xóa cũng có thể phát thêm sự kiện cùng trạng thái đã xóa.
Kết nối GraphQL WebSocket (graphql-ws) tại wss://<host>/graphql hoặc ws://<host>/graphql trong môi trường local. Truyền connectionParams.authorization: "Bearer <accessToken>". Cần đăng nhập và là thành viên conversation; server kiểm tra quyền lúc đăng ký và trước mỗi sự kiện, đồng thời kiểm tra lại access token. Subscription chỉ là thông báo realtime, không lưu sự kiện để phát lại. Nếu mất kết nối, truy vấn lại các trang messages đang hiển thị để nhận trạng thái xóa của tin cũ. messagesSince chỉ lấy sequence mới hơn, nên không tự khôi phục sự kiện xóa bị bỏ lỡ trên tin đã có.
Input
| Đối số | Kiểu GraphQL | Bắt buộc | Quy tắc và ý nghĩa |
|---|---|---|---|
conversationId | ID! | Có | UUID của conversation muốn theo dõi; không nhận null, không có giá trị mặc định. |
Output
Mỗi sự kiện trả về MessageView!, không null, với trạng thái sau khi xóa mềm. Danh sách attachments rỗng; replyTo và reactions vẫn phản ánh dữ liệu còn liên quan đến tin đó.
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ụ
subscription MessageDeleted($conversationId: ID!) {
messageDeleted(conversationId: $conversationId) {
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:
{
"conversationId": "33333333-3333-4333-8333-333333333333"
}
Một payload minh họa:
{
"data": {
"messageDeleted": {
"id": "55555555-5555-4555-8555-555555555555",
"clientMessageId": "send-005",
"conversationId": "33333333-3333-4333-8333-333333333333",
"senderId": "11111111-1111-4111-8111-111111111111",
"sequence": 5,
"type": "TEXT",
"content": null,
"replyToMessageId": null,
"replyTo": null,
"createdAt": "2026-09-26T09:01:00.000Z",
"updatedAt": "2026-09-26T09:05:00.000Z",
"deletedAt": "2026-09-26T09:05:00.000Z",
"attachments": [],
"reactions": []
}
}
}
Thiếu hoặc sai Bearer token bị từ chối khi kết nối; ID sai định dạng trả BAD_USER_INPUT, còn người không phải thành viên conversation nhận FORBIDDEN. Token hết hạn hoặc quyền thành viên bị thu hồi khiến lần phát tiếp theo ngừng stream.
Chữ ký operation được tạo từ GraphQL schema.