Mô tả chi tiết tính năng quản lý các kênh chat
Back to ezychatTính năng quản lý kênh chat tổ chức mỗi cuộc hội thoại thành một kênh độc lập. Kênh giữ metadata và trạng thái chung; thành viên, tin nhắn, trạng thái đọc và thiết lập cá nhân được lưu thành các quan hệ riêng. Thiết kế này hỗ trợ hội thoại trực tiếp, nhóm, chăm sóc khách hàng và các cấu trúc mở rộng như group hoặc thread.

Mô hình kênh chat
Mỗi kênh có các thông tin chính:
| Thuộc tính | Ý nghĩa |
|---|---|
| ID | Định danh duy nhất của kênh |
| Tên | Tên hiển thị và dữ liệu phục vụ tìm kiếm |
| Kênh cha | Cho phép xây dựng cấu trúc phân cấp |
| Hồ sơ chat | Liên kết kênh với một cấu hình hoặc nhóm hỗ trợ |
| Ảnh đại diện | Media dùng làm avatar của kênh |
| Loại kênh | NORMAL, OA hoặc SUPPORT |
| Phạm vi | PUBLIC hoặc PRIVATE; mặc định là PRIVATE |
| Kiểu hội thoại | DIRECT hoặc GROUP; mặc định là DIRECT |
| Định dạng | CHANNEL, GROUP hoặc THREAD; mặc định là CHANNEL |
| Người tạo | Loại danh tính và ID của người tạo |
| Trạng thái | Trạng thái vòng đời của kênh |
| Thời gian chat gần nhất | Dùng để sắp xếp hội thoại theo mức độ hoạt động |
| Thời gian tạo/cập nhật | Phục vụ quản trị và đồng bộ |
Ba thuộc tính “loại kênh”, “kiểu hội thoại” và “định dạng” có vai trò khác nhau:
- Loại kênh mô tả mục đích nghiệp vụ, chẳng hạn kênh hỗ trợ.
- Kiểu hội thoại mô tả hình thức giao tiếp trực tiếp hay theo nhóm.
- Định dạng mô tả cấu trúc logic của kênh, nhóm hoặc luồng thảo luận.
Thành viên kênh
Thành viên được lưu độc lập với kênh. Mỗi quan hệ thành viên bao gồm:
- Kênh tham gia.
- Loại danh tính, ví dụ người dùng hoặc quản trị viên.
- ID thành viên.
- Vai trò và tên vai trò.
- Trạng thái thành viên.
- Số tin chưa đọc.
- Thời điểm đọc gần nhất.
- Thời gian tạo và cập nhật quan hệ.
Trạng thái thành viên hiện hỗ trợ:
-
ADDED: đã được thêm vào kênh. -
WAITING_FOR_APPROVAL: đang chờ duyệt.
Thao tác thêm thành viên có tính idempotent: nếu quan hệ giữa kênh và thành viên đã tồn tại, hệ thống không tạo thêm bản ghi trùng lặp.
Thành viên cũng có thể được xóa khỏi kênh. Việc này xóa quan hệ tham gia, không xóa danh tính người dùng và không xóa nội dung đã có trong kênh.
Khởi tạo kênh hỗ trợ
Hệ thống cung cấp hai cách tạo kênh chăm sóc khách hàng:
- Tìm kênh gần nhất của người dùng và tái sử dụng nếu đã có.
- Luôn tạo một kênh hỗ trợ mới.
Khi tạo kênh hỗ trợ, hệ thống thực hiện các bước:
sequenceDiagram
participant U as Người dùng
participant API as API chat
participant C as Dịch vụ kênh
participant M as Thành viên
participant P as Hồ sơ chat
U->>API: Yêu cầu mở cuộc hội thoại
API->>C: Tìm hoặc tạo kênh SUPPORT
C->>M: Thêm người dùng vào kênh
C->>M: Thêm nhân viên hỗ trợ mặc định
API->>P: Gắn hồ sơ chat nếu có
P->>M: Thêm thành viên của hồ sơ đang hoạt động
API-->>U: Trả về ID kênh và trạng thái chatbot
Kênh mới được khởi tạo với:
- Loại
SUPPORT. - Trạng thái
ACTIVATED. - Phạm vi mặc định
PRIVATE. - Kiểu hội thoại mặc định
DIRECT. - Định dạng mặc định
CHANNEL. - Người yêu cầu được ghi nhận là người tạo.
Tên kênh ưu tiên lấy từ tên hiển thị của người tạo. Nếu không tìm thấy tên, hệ thống sinh một định danh ổn định và dùng nó làm tên thay thế.
Nếu kênh được tạo từ một hồ sơ chat, hệ thống:
- Gắn hồ sơ đó vào kênh.
- Thêm các thành viên đang hoạt động của hồ sơ vào kênh.
- Có thể tự động thêm chatbot nếu dịch vụ chatbot đã được cấu hình.
Quản lý danh sách kênh
Màn hình quản trị hiển thị:
- ID và avatar.
- Tên kênh.
- Loại kênh.
- Phạm vi công khai hoặc riêng tư.
- Kiểu hội thoại.
- Định dạng kênh.
- Trạng thái.
- Thời gian cập nhật.
- Các thao tác xem chat, lưu trữ, khôi phục hoặc xóa.
Danh sách hỗ trợ các tiêu chí trên giao diện:
- Loại kênh.
- Phạm vi.
- Kiểu hội thoại.
- Định dạng.
- Trạng thái.
- Từ khóa.
- Số bản ghi trên trang.
Các giá trị lựa chọn được lấy từ dữ liệu đang tồn tại thay vì cố định toàn bộ trên giao diện. Nhờ đó, các loại hoặc trạng thái mới xuất hiện trong dữ liệu có thể được hiển thị trong bộ lọc.
Tìm kiếm tên sử dụng chỉ mục dữ liệu và cơ chế khớp tiền tố. Vì vậy, từ khóa được hiểu là phần bắt đầu của nội dung đã lập chỉ mục, không phải phép tìm kiếm toàn văn tùy ý.
Phân trang và sắp xếp
Hệ thống dùng phân trang theo cursor, hỗ trợ:
- Trang đầu.
- Trang trước.
- Trang tiếp theo.
- Trang cuối.
- Điều chỉnh số bản ghi trên mỗi trang.
Các chế độ sắp xếp được mô hình hóa gồm:
- ID tăng dần.
- ID giảm dần.
- Thời gian chat gần nhất giảm dần, sau đó ID giảm dần.
Việc dùng đồng thời thời gian chat và ID giúp thứ tự ổn định hơn khi nhiều kênh có cùng thời điểm hoạt động.
Ở giao diện chat hỗ trợ, khi tải thêm dữ liệu, client loại bỏ các kênh đã có. Điều này xử lý trường hợp cursor bị dịch chuyển do một kênh vừa nhận tin mới và được đưa lên đầu danh sách.
Vòng đời của kênh
Kênh có bốn trạng thái:
stateDiagram-v2
[*] --> ACTIVATED
ACTIVATED --> ARCHIVED: Lưu trữ
ARCHIVED --> ACTIVATED: Khôi phục
ARCHIVED --> DELETED: Xóa
ACTIVATED --> BLOCKED: Chặn theo nghiệp vụ
BLOCKED --> ACTIVATED: Kích hoạt lại
Đang hoạt động
ACTIVATED là trạng thái mặc định của kênh hỗ trợ mới. Kênh có thể xuất hiện trong danh sách hội thoại đang hoạt động và tiếp tục nhận tin.Đã lưu trữ
Thao tác lưu trữ chuyển trạng thái sang
ARCHIVED. Dữ liệu kênh, thành viên và tin nhắn vẫn được giữ nguyên.Kênh đã lưu trữ có thể được khôi phục về
ACTIVATED.Đã xóa
Thao tác xóa trong màn hình quản trị là xóa mềm: trạng thái được chuyển sang
DELETED, không xóa vật lý bản ghi.Giao diện chỉ cho phép xóa một kênh sau khi kênh đã được lưu trữ. Các API phía người dùng cũng kiểm tra trạng thái này trước khi cho phép đọc hoặc gửi tin.
Bị chặn
BLOCKED đã được định nghĩa trong mô hình trạng thái, nhưng luồng quản trị kênh hiện tại chưa cung cấp thao tác chặn hoặc bỏ chặn trực tiếp trên màn hình danh sách.Mở kênh và tham gia hỗ trợ
Quản trị viên chỉ được tải tin nhắn hoặc thực hiện các thao tác nhạy cảm nếu là thành viên của kênh.
Khi quản trị viên chọn mở một cuộc hội thoại hỗ trợ:
- Hệ thống kiểm tra người đó có thuộc nhóm nhân viên hỗ trợ hay không.
- Kiểm tra loại kênh có nằm trong nhóm kênh hỗ trợ được cấu hình hay không.
- Nếu đủ điều kiện, thêm quản trị viên vào kênh.
- Sau đó chuyển tới màn hình chat.
Nếu không đủ điều kiện, thao tác thêm thành viên được bỏ qua. Việc này không tự động cấp quyền chỉ vì người dùng biết ID kênh.
Trong quá trình gửi tin hoặc phát sự kiện nhập liệu, hệ thống còn kiểm tra danh sách nhân viên hỗ trợ hiện tại. Các nhân viên hỗ trợ còn thiếu có thể được bổ sung vào kênh trước khi phát sự kiện tới các thành viên.
Tin nhắn, trạng thái đọc và số chưa đọc
Kênh là ranh giới truy cập của tin nhắn. Trước khi gửi hoặc đọc nội dung, hệ thống kiểm tra người thực hiện có phải thành viên kênh hay không.
Khi một tin nhắn được gửi:
- Kiểm tra nội dung và quyền thành viên.
- Lưu tin nhắn và các tài nguyên liên quan.
- Cập nhật thời gian chat gần nhất của kênh.
- Tăng số tin chưa đọc cho mọi thành viên trừ người gửi.
- Bảo đảm thành viên hỗ trợ cần thiết đã có trong kênh.
- Tạo trạng thái gửi cho các thành viên nhận.
- Phát sự kiện realtime tới các thành viên.
Khi một thành viên tải danh sách tin nhắn:
- Số tin chưa đọc của thành viên đó được đặt về
0. - Thời gian đọc gần nhất được cập nhật.
- Các tin vừa tải được đánh dấu là đã xem đối với người nhận.
Hệ thống cũng hỗ trợ:
- Lấy tin nhắn cuối cùng của nhiều kênh.
- Lấy nhóm tin nhắn xung quanh một tin cụ thể.
- Tra cứu trạng thái gửi/xem của từng tin nhắn.
Mọi thao tác hàng loạt đều xác minh người gọi có quyền trên toàn bộ tập kênh được yêu cầu.
Quản lý chatbot theo kênh
Chatbot được quản lý như một thành viên đặc biệt của kênh:
- Bật chatbot: lấy danh tính chatbot đã cấu hình và thêm vào kênh.
- Tắt chatbot: loại chatbot khỏi kênh.
- Nếu chưa có dịch vụ chatbot hợp lệ, yêu cầu bật không tạo thành viên mới.
Cách mô hình hóa này giúp luồng phát tin nhắn và trạng thái thành viên áp dụng thống nhất cho cả người dùng, quản trị viên và bot.
Thiết lập riêng theo người dùng
Một kênh có thể có thiết lập khác nhau đối với từng người dùng hoặc quản trị viên. Các thiết lập được mô hình hóa gồm:
- Đánh dấu spam.
- Ẩn kênh.
- Chặn.
- Mật khẩu khóa kênh.
- Token mở khóa có thời hạn.
- Khóa công khai và thông tin mã hóa.
- Tùy chọn hiển thị trạng thái đã xem.
- Các cặp thiết lập mở rộng.
Spam
Đánh dấu spam không thay đổi trạng thái chung của kênh. Nó chỉ tạo hoặc cập nhật thiết lập của người thực hiện đối với kênh đó. Vì vậy, một quản trị viên có thể coi kênh là spam mà không làm thay đổi cách kênh hiển thị với người khác.
Ẩn kênh
Khi tải danh sách của người dùng, các kênh có thiết lập
hidden được loại khỏi kết quả. Đây cũng là thiết lập cá nhân, không phải trạng thái toàn cục.Khóa kênh
Mật khẩu khóa được băm bằng HMAC-SHA-256 cùng một giá trị bí mật cấu hình ở máy chủ.
Khi mở khóa thành công:
- Hệ thống tạo token mở khóa ngẫu nhiên.
- Token có thời hạn.
- Token được lưu trong thiết lập của người dùng.
- Các yêu cầu đọc hoặc gửi tin tiếp theo kiểm tra hiệu lực của token.
Thay đổi mật khẩu sẽ xóa token mở khóa hiện tại. Thao tác khóa thủ công cũng xóa token và thời hạn tương ứng.
Khóa kênh áp dụng theo từng người dùng; nó không biến kênh thành một phòng dùng chung một mật khẩu cho tất cả thành viên.
Xác thực và phân quyền
Các API quản trị và API người dùng đều yêu cầu đăng nhập.
Quyền truy cập kênh chủ yếu dựa trên quan hệ thành viên:
- Không phải thành viên thì không được tải hoặc gửi tin.
- Kênh bị khóa thì người dùng phải mở khóa trước.
- Kênh đã xóa bị từ chối ở các luồng phía người dùng.
- Quản trị viên chỉ được xem tin nhắn cuối của một tập kênh khi thuộc tất cả các kênh đó.
- Tin nhắn được yêu cầu phải thực sự thuộc kênh đang truy cập.
Trong nhiều trường hợp, hệ thống trả về “không tìm thấy kênh” khi người gọi không phải thành viên. Cách này hạn chế việc suy đoán sự tồn tại của các kênh không được phép truy cập.
Quan hệ dữ liệu
erDiagram
CHANNEL ||--o{ CHANNEL_MEMBER : "có thành viên"
CHANNEL ||--o{ MESSAGE : "chứa tin nhắn"
CHANNEL ||--o{ USER_CHANNEL_SETTING : "có thiết lập cá nhân"
CHAT_PROFILE ||--o{ CHANNEL : "cấu hình cho"
CHANNEL ||--o{ CHANNEL : "kênh cha/con"
CHANNEL {
long id
string name
string type
string visibility
string conversationType
string channelFormat
string status
datetime lastChatTime
}
CHANNEL_MEMBER {
long channelId
string memberType
long memberId
long unreadCount
datetime lastReadTime
}
USER_CHANNEL_SETTING {
long channelId
string userType
long userId
string spam
string hidden
string blocked
string lockPasswordHash
}
Kết luận
Quản lý kênh chat được xây dựng quanh ba lớp trạng thái:
- Trạng thái chung của kênh, như đang hoạt động, lưu trữ hoặc đã xóa.
- Trạng thái thành viên, như vai trò, số chưa đọc và lần đọc cuối.
- Thiết lập cá nhân, như spam, ẩn hoặc khóa bằng mật khẩu.
Sự phân tách này cho phép cùng một kênh có vòng đời chung nhưng trải nghiệm khác nhau đối với từng thành viên. Các thao tác quản trị sử dụng chuyển trạng thái và kiểm tra quan hệ thành viên, giúp bảo toàn lịch sử hội thoại, hỗ trợ realtime và hạn chế truy cập trái phép.