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 GraphQL | Bắt buộc | Quy tắc và ý nghĩa |
|---|---|---|---|
participantId | ID! | 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. |
workspaceId | ID! | 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ường | Kiểu GraphQL | Ý nghĩa |
|---|---|---|
id | ID! | ID conversation. |
workspaceId | ID! | Workspace chứa conversation. |
type | ConversationType! | DIRECT là DM hai người; CHANNEL là kênh. |
visibility | ConversationVisibility! | PRIVATE hoặc PUBLIC. DM mới là PRIVATE; kênh PUBLIC vẫn cần tham gia để đọc nội dung. |
isDefault | Boolean! | true với kênh mặc định #general; DM là false. |
title | String | Tên kênh; DM mới là null. |
description | String | Mô tả kênh hoặc null; DM mới là null. |
createdAt | DateTime! | Thời điểm tạo conversation. |
updatedAt | DateTime! | Thời điểm cập nhật conversation. |
pinnedAt | DateTime | Thời điểm người gọi ghim conversation, hoặc null. |
muted | Boolean! | Trạng thái tắt thông báo nhắc tên của người gọi. |
lastMessageSequence | Int | Mố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ường | Kiểu GraphQL | Ý nghĩa |
|---|---|---|
userId | ID! | ID người dùng. |
username | String! | Username. |
displayName | String! | Tên hiển thị. |
avatarUrl | String | URL ảnh đại diện hoặc null. |
role | MemberRole! | Vai trò trong conversation: OWNER, ADMIN hoặc MEMBER; thành viên DM mới có MEMBER. |
lastReadSequence | Int! | 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.