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 GraphQLBắt buộcQuy tắc và ý nghĩa
conversationIdID!CóUUID của conversation; không có giá trị mặc định.
firstInt!Không nếu bỏ quaKích thước trang, từ 1 đến 100; mặc định 30. Không nhận null.
beforeStringKhôngCursor 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ó.
aroundMessageIdIDKhôngUUID 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ườngKiểu GraphQLÝ nghĩa
nodes[MessageView!]!Tin nhắn của trang, danh sách và phần tử không null. Xem MessageView.
endCursorStringCursor tại tin cũ nhất của trang, hoặc null nếu trang rỗng.
hasNextPageBoolean!true nếu còn tin cũ hơn trang này.

MessageView

TrườngKiểu GraphQLÝ nghĩa
idID!ID tin nhắn trên server.
clientMessageIdString!ID do client gửi, dùng đối chiếu tin nhắn lạc quan và retry.
conversationIdID!Conversation chứa tin nhắn.
senderIdID!Người gửi.
sequenceInt!Thứ tự tăng trong conversation.
typeMessageType!TEXT cho tin do người dùng gửi; schema còn có SYSTEM.
contentStringNội dung; null khi tin đã bị xóa mềm. Tin chỉ có tệp có thể là chuỗi rỗng.
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 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ườ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 hiển thị.
contentTypeString!MIME type của tệp.
sizeInt!Kích thước byte do client báo khi gửi.

ReactionSummary

TrườngKiểu GraphQLÝ nghĩa
emojiString!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.