Tí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.
Screenshot 2026-09-19 at 22.51.18.png

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ênTên hiển thị và dữ liệu phục vụ tìm kiếm
Kênh chaCho phép xây dựng cấu trúc phân cấp
Hồ sơ chatLiên kết kênh với một cấu hình hoặc nhóm hỗ trợ
Ảnh đại diệnMedia dùng làm avatar của kênh
Loại kênhNORMAL, OA hoặc SUPPORT
Phạm viPUBLIC hoặc PRIVATE; mặc định là PRIVATE
Kiểu hội thoạiDIRECT hoặc GROUP; mặc định là DIRECT
Định dạngCHANNEL, GROUP hoặc THREAD; mặc định là CHANNEL
Người tạoLoại danh tính và ID của người tạo
Trạng tháiTrạng thái vòng đời của kênh
Thời gian chat gần nhấtDùng để sắp xếp hội thoại theo mức độ hoạt động
Thời gian tạo/cập nhậtPhụ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ợ:
  1. Hệ thống kiểm tra người đó có thuộc nhóm nhân viên hỗ trợ hay không.
  2. 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.
  3. Nếu đủ điều kiện, thêm quản trị viên vào kênh.
  4. 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:
  1. Kiểm tra nội dung và quyền thành viên.
  2. Lưu tin nhắn và các tài nguyên liên quan.
  3. Cập nhật thời gian chat gần nhất của kênh.
  4. Tăng số tin chưa đọc cho mọi thành viên trừ người gửi.
  5. Bảo đảm thành viên hỗ trợ cần thiết đã có trong kênh.
  6. Tạo trạng thái gửi cho các thành viên nhận.
  7. 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.