ChatAI Node Server – Tài liệu

1. Tổng quan

Server chỉ xây cầu và chuyển tiếp: nhận request, đưa job vào queue, broadcast/notify qua WebSocket. Không lưu trữ tin nhắn – client tự lo lưu trữ và dọn dẹp. Mỗi request từ client (HTTP hoặc WebSocket) đều kích hoạt xử lý queue.

2. Multi-server (Sub servers)

Cho phép thêm các server Node khác làm sub, điều phối và phân chia tầng theo server sub.

2.1 Bật / tắt multi-server

2.2 Server điều phối và server sub

2.3 Thêm / xóa server sub

2.4 Bảo mật: X-Sub-Secret

Để sub chấp nhận job từ server điều phối, mọi server (điều phối và sub) phải cấu hình cùng một secret.

2.5 Luồng job khi multi-server bật

  1. Client gửi tin (vd: POST /api/chat/send) tới server điều phối.
  2. Điều phối thêm job vào queue local, xử lý (broadcast trong phòng trên chính nó).
  3. Điều phối gửi POST tới từng sub: { "type": "broadcast", "payload": { ... } } kèm X-Sub-Secret.
  4. Mỗi sub nhận request, kiểm tra secret, thêm job vào queue local và xử lý (broadcast trên sub đó).

3. API liên quan multi-server

MethodPathMô tả
GET/api/admin/multi-serverTrạng thái bật/tắt và danh sách sub (cần X-Admin-Token)
POST/api/admin/multi-server/enabledBody { "enabled": true|false } – bật/tắt multi-server
POST/api/admin/multi-server/subsBody { "url", "name?", "tier?" } – thêm sub
PUT/api/admin/multi-server/subs/:idBody { "url?", "name?", "tier?" } – cập nhật sub
DELETE/api/admin/multi-server/subs/:idXóa sub
POST/api/sub/receiveNhận job từ điều phối. Header X-Sub-Secret bắt buộc. Body { "type", "payload" }.

4. Lưu trữ danh sách sub

Danh sách sub và trạng thái bật/tắt được lưu trong file servernode/data/sub-servers.json (tự tạo thư mục nếu chưa có). Server khởi động lại vẫn giữ cấu hình.

5. Node Admin – Đăng nhập và phân quyền

Giao diện quản trị tại /nodeadmin/. Hỗ trợ hai phương thức đăng nhập:

5.1 Đăng nhập User (userId + mật khẩu)

5.2 Đăng nhập Admin (token)

5.3 Phân quyền (admin/member)

RoleQuyền
super_adminToàn quyền: token, user, device, blocklist, queue, settings, …
adminTạo member, quản lý token của member, quản lý device của member. Tạo token mới cho member.
viewerQuản lý token của mình, device của mình, sửa thông tin cá nhân. Tạo token API.

Cách cấp token: Super admin tạo token mới → chọn role admin (nhập User được quản lý) hoặc viewer (nhập UserId).

6. Token API của user

User tạo token để tích hợp vào App (mobile, web, bot). Token dùng header X-User-Token khi gọi API.

6.1 API User (cần X-User-Token – session hoặc token API)

MethodPathMô tả
GET/api/user/tokensDanh sách token API của user
POST/api/user/tokensBody { "name": "App A" } – tạo token mới (chỉ hiện 1 lần)
DELETE/api/user/tokens/:idThu hồi token

6.2 API Admin (cần X-Admin-Token)

MethodPathMô tả
GET/api/admin/user-tokens?userId=xxxDanh sách token API của user
POST/api/admin/user-tokensBody { "userId", "name" } – tạo token cho user
DELETE/api/admin/user-tokens/:id?userId=xxxThu hồi token

6.3 Xác thực X-User-Token

API chấp nhận hai loại:

7. Device API

Device hoạt động độc lập, được cấp token qua user hoặc admin. Xác thực bằng X-User-Token hoặc userId trong body/query.

7.1 API User (X-User-Token hoặc userId)

MethodPathMô tả
POST/api/device/registerĐăng ký device (body: userId?, name?, platform?, groupId?)
GET/api/device/list?userId=Danh sách device của user
PUT/api/device/:deviceIdCập nhật (body: userId?, groupId?, name?, platform?)
GET/api/device/:deviceId/tokenXem token device
POST/api/device/:deviceId/tokenGia hạn token
DELETE/api/device/:deviceIdXóa device
POST/api/device/notify-groupGửi thông báo tới nhóm (body: groupId, content?, type?)

7.2 API Admin (X-Admin-Token)

MethodPathMô tả
GET/api/admin/devices?userId=Danh sách device (tất cả hoặc theo user)
POST/api/admin/devicesTạo device (body: userId, deviceId?, name?, groupId?, companyId?)
PUT/api/admin/devices/:deviceId/tokenCấp/cập nhật token (body: token?)
PUT/api/admin/devices/:deviceIdCập nhật device
DELETE/api/admin/devices/:deviceIdXóa device

7.3 WebSocket với device token

const ws = new WebSocket('wss://example.com/ws');
ws.onopen = () => {
  ws.send(JSON.stringify({ type: 'auth_device', token: 'YOUR_DEVICE_TOKEN' }));
};
ws.onmessage = (ev) => {
  const m = JSON.parse(ev.data);
  if (m.type === 'auth_ok') {
    ws.send(JSON.stringify({ type: 'subscribe', roomId: 'device_group:' + groupId }));
  }
};

8. Auth API

MethodPathMô tả
POST/api/auth/loginBody { "userId", "password" }. Trả về userToken (session), adminToken (nếu user có token viewer).

9. Bảo mật (Security)

Server tích hợp các lớp bảo mật cho môi trường production:

9.1 Cấu hình (biến môi trường)

BiếnMô tả
SECURITY_DISABLED=1Tắt toàn bộ lớp bảo mật (chỉ dùng khi debug)
RATE_LIMIT_WINDOW_MSCửa sổ rate limit (giây), mặc định 60
RATE_LIMIT_MAXSố request tối đa mỗi cửa sổ, mặc định 200
AUTH_RATE_WINDOW_MSCửa sổ auth rate (giây), mặc định 900 (15 phút)
AUTH_MAX_ATTEMPTSSố lần thử đăng nhập tối đa, mặc định 15

10. Tài liệu khác