Messages
Query · messages
messages(aroundMessageId: ID, before: String, conversationId: ID!, first: Int! = 30): MessagePage!
Lấy các tin nhắn mới nhất trong DM hoặc kênh, hoặc đi lùi qua lịch sử bằng before. Có thể dùng aroundMessageId để bắt đầu tại một tin nhắn còn tồn tại; trang trả về gồm tin nhắn đó và các tin cũ hơn, không lấy các tin mới hơn nó. Nếu truyền cả before và aroundMessageId, before được ưu tiên. Tin đã xóa mềm vẫn nằm trong kết quả nhưng không lộ nội dung hay tệp đính kèm.
Gửi query qua HTTP POST /graphql với Authorization: Bearer <accessToken>. Người gọi phải là thành viên conversation; chỉ là thành viên workspace thì chưa đủ. Query không cập nhật mốc đã đọc; dùng markConversationAsRead khi cần.
Input
| Đối số | Kiểu GraphQL | Bắt buộc | Quy tắc và ý nghĩa |
|---|---|---|---|
conversationId | ID! | Có | UUID của conversation; không có giá trị mặc định. |
first | Int! | Không nếu bỏ qua | Kích thước trang, từ 1 đến 100; mặc định 30. Không nhận null. |
before | String | Không | Cursor endCursor của trang trước để lấy các tin có sequence nhỏ hơn. null hoặc bỏ qua bắt đầu ở tin mới nhất. Cursor chỉ dùng cho chính conversation đã tạo ra nó. |
aroundMessageId | ID | Không | UUID của tin nhắn mốc; khi có giá trị và không có before, lấy trang kết thúc tại tin đó. Tin mốc phải thuộc conversation và chưa bị xóa. null hoặc bỏ qua thì không áp dụng. |
Output
Trả về MessagePage!, không null. nodes xếp theo sequence tăng dần trong từng trang, dù các trang được lấy từ mới về cũ. Dùng endCursor của trang hiện tại làm before cho lần gọi tiếp theo khi hasNextPage là true; cursor rỗng trang là null.
MessagePage
| Trường | Kiểu GraphQL | Ý nghĩa |
|---|---|---|
nodes | [MessageView!]! | Tin nhắn của trang, danh sách và phần tử không null. Xem MessageView. |
endCursor | String | Cursor tại tin cũ nhất của trang, hoặc null nếu trang rỗng. |
hasNextPage | Boolean! | true nếu còn tin cũ hơn trang này. |
MessageView
| Trường | Kiểu GraphQL | Ý nghĩa |
|---|---|---|
id | ID! | ID tin nhắn trên server. |
clientMessageId | String! | ID do client gửi, dùng đối chiếu tin nhắn lạc quan và retry. |
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 cho tin do người dùng gửi; schema còn có SYSTEM. |
content | String | Nội dung; null khi tin đã bị xóa mềm. Tin chỉ có tệp có thể là chuỗi rỗng. |
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 còn truy cập được; rỗng nếu tin đã xóa. Xem MessageAttachmentView. |
reactions | [ReactionSummary!]! | Phản ứng nhóm theo emoji. 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 hiển thị. |
contentType | String! | MIME type của tệp. |
size | Int! | Kích thước byte do client báo khi gửi. |
ReactionSummary
| Trường | Kiểu GraphQL | Ý nghĩa |
|---|---|---|
emoji | String! | Emoji phản ứng. |
userIds | [ID!]! | ID những người đã dùng emoji này; danh sách và phần tử không null. |
Ví dụ
query Messages($conversationId: ID!, $first: Int!, $before: String) {
messages(conversationId: $conversationId, first: $first, before: $before) {
nodes {
id
clientMessageId
conversationId
senderId
sequence
type
content
replyToMessageId
replyTo { id senderId content deletedAt }
createdAt
updatedAt
deletedAt
attachments { id fileName contentType size }
reactions { emoji userIds }
}
endCursor
hasNextPage
}
}
Biến cho trang đầu:
{
"conversationId": "33333333-3333-4333-8333-333333333333",
"first": 1
}
Phản hồi minh họa:
{
"data": {
"messages": {
"nodes": [
{
"id": "44444444-4444-4444-8444-444444444444",
"clientMessageId": "send-004",
"conversationId": "33333333-3333-4333-8333-333333333333",
"senderId": "11111111-1111-4111-8111-111111111111",
"sequence": 4,
"type": "TEXT",
"content": "Chào bạn",
"replyToMessageId": null,
"replyTo": null,
"createdAt": "2026-09-26T09:00:00.000Z",
"updatedAt": "2026-09-26T09:00:00.000Z",
"deletedAt": null,
"attachments": [],
"reactions": []
}
],
"endCursor": "WyIzMzMzMzMzMy0zMzMzLTQzMzMtODMzMy0zMzMzMzMzMzMzMzMiLCI0Il0",
"hasNextPage": true
}
}
}
Dùng endCursor trên làm biến before để lấy tin có sequence nhỏ hơn 4. Thiếu hoặc sai access token trả UNAUTHENTICATED; ID conversation sai định dạng, first ngoài 1–100, cursor sai hoặc thuộc conversation khác trả BAD_USER_INPUT. Không phải thành viên nhận FORBIDDEN. aroundMessageId sai định dạng trả BAD_USER_INPUT; tin mốc không tồn tại, đã xóa hoặc thuộc conversation khác trả NOT_FOUND.
Chữ ký operation được tạo từ GraphQL schema.