Create Direct Conversation

Mutation · createDirectConversation

createDirectConversation(participantId: ID!, workspaceId: ID!): ConversationView!

Mở DM giữa người gọi và một thành viên khác của cùng workspace. Nếu cặp người này đã có DM trong workspace đó, mutation trả lại conversation cũ thay vì tạo bản sao; đảo thứ tự người gọi và người nhận vẫn trả cùng DM. Cùng hai người ở workspace khác sẽ có DM riêng. Mutation không gửi tin nhắn.

Gửi mutation qua HTTP POST /graphql với Authorization: Bearer <accessToken>. Cần đăng nhập và thuộc workspace. Chính sách hiện tại cho phép cả GUEST tạo DM với thành viên khác trong workspace.

Input

Đối sốKiểu GraphQLBắt buộcQuy tắc và ý nghĩa
participantIdID!CóUUID của người còn lại; không được là chính người gọi và phải thuộc workspace đích.
workspaceIdID!CóUUID workspace chứa cả hai người. Không có giá trị mặc định.

Output

Trả về ConversationView!, không null. Với DM mới, type là DIRECT, visibility là PRIVATE, title và description là null, members có đúng hai người. Nếu DM đã tồn tại, các trường phản ánh trạng thái hiện tại của DM đó.

ConversationView

TrườngKiểu GraphQLÝ nghĩa
idID!ID conversation.
workspaceIdID!Workspace chứa conversation.
typeConversationType!DIRECT là DM hai người; CHANNEL là kênh.
visibilityConversationVisibility!PRIVATE hoặc PUBLIC. DM mới là PRIVATE; kênh PUBLIC vẫn cần tham gia để đọc nội dung.
isDefaultBoolean!true với kênh mặc định #general; DM là false.
titleStringTên kênh; DM mới là null.
descriptionStringMô tả kênh hoặc null; DM mới là null.
createdAtDateTime!Thời điểm tạo conversation.
updatedAtDateTime!Thời điểm cập nhật conversation.
pinnedAtDateTimeThời điểm người gọi ghim conversation, hoặc null.
mutedBoolean!Trạng thái tắt thông báo nhắc tên của người gọi.
lastMessageSequenceIntMốc sequence tin nhắn gần nhất, hoặc null nếu chưa có tin nhắn.
members[ConversationMemberView!]!Danh sách thành viên, không có phần tử null; xem ConversationMemberView.

ConversationMemberView

TrườngKiểu GraphQLÝ nghĩa
userIdID!ID người dùng.
usernameString!Username.
displayNameString!Tên hiển thị.
avatarUrlStringURL ảnh đại diện hoặc null.
roleMemberRole!Vai trò trong conversation: OWNER, ADMIN hoặc MEMBER; thành viên DM mới có MEMBER.
lastReadSequenceInt!Mốc sequence đã đọc của thành viên; thành viên mới bắt đầu ở 0.

Ví dụ

mutation CreateDirectConversation($workspaceId: ID!, $participantId: ID!) {
  createDirectConversation(workspaceId: $workspaceId, participantId: $participantId) {
      id
      workspaceId
      type
      visibility
      isDefault
      title
      description
      createdAt
      updatedAt
      pinnedAt
      muted
      lastMessageSequence
      members {
        userId
        username
        displayName
        avatarUrl
        role
        lastReadSequence
      }
  }
}

Biến:

{
  "workspaceId": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
  "participantId": "22222222-2222-4222-8222-222222222222"
}

Phản hồi minh họa cho DM mới:

{
  "data": {
    "createDirectConversation": {
      "id": "33333333-3333-4333-8333-333333333333",
      "workspaceId": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
      "type": "DIRECT",
      "visibility": "PRIVATE",
      "isDefault": false,
      "title": null,
      "description": null,
      "createdAt": "2026-09-26T09:00:00.000Z",
      "updatedAt": "2026-09-26T09:00:00.000Z",
      "pinnedAt": null,
      "muted": false,
      "lastMessageSequence": null,
      "members": [
        {
          "userId": "11111111-1111-4111-8111-111111111111",
          "username": "an",
          "displayName": "An",
          "avatarUrl": null,
          "role": "MEMBER",
          "lastReadSequence": 0
        },
        {
          "userId": "22222222-2222-4222-8222-222222222222",
          "username": "binh",
          "displayName": "Bình",
          "avatarUrl": null,
          "role": "MEMBER",
          "lastReadSequence": 0
        }
      ]
    }
  }
}

Thiếu hoặc sai access token trả UNAUTHENTICATED; người gọi ngoài workspace nhận FORBIDDEN. ID sai định dạng hoặc chọn chính mình trả BAD_USER_INPUT. Người nhận không thuộc workspace trả NOT_FOUND, không tiết lộ liệu tài khoản đó có tồn tại ở workspace khác hay không.

Chữ ký operation được tạo từ GraphQL schema.