Giao diện
Kiến trúc — Notification Manager
Tổng quan
Plugin notification-manager là hub trung tâm cho toàn bộ hệ thống thông báo của Digiforce. Thay vì mỗi plugin tự viết logic gửi riêng, tất cả đăng ký channel type vào NotificationManager — một registry trung tâm quản lý việc gửi, dispatch, và ghi log thông báo.
Kiến trúc 3 tầng
| Tầng | Thành phần | Mô tả |
|---|---|---|
| Caller | Workflow, Code, API | Nơi phát sinh yêu cầu gửi thông báo |
| Manager | NotificationManager | Registry và dispatcher trung tâm |
| Channel | Email, In-app, SMS... | Plugin cung cấp kênh gửi cụ thể |
Luồng gửi thông báo chi tiết
Channel Type Registry
Registry là bản đồ Map<string, ChannelType> — mỗi channel type bao gồm:
| Thành phần | Mô tả |
|---|---|
| type | Tên loại kênh (ví dụ: email, in-app-message) |
| Channel | Class implement logic gửi thông báo |
Cách đăng ký channel type
Plugin kênh thông báo đăng ký vào manager trong method load():
typescript
class MyNotificationPlugin extends Plugin {
async load() {
const notificationManager = this.pm.get(
PluginNotificationManagerServer
) as PluginNotificationManagerServer;
notificationManager.registerChannelType({
type: 'sms',
Channel: MySMSChannel,
});
}
}Kênh có sẵn
| Kênh | Plugin | Phương thức gửi |
|---|---|---|
email | plugin-notification-email | SMTP qua nodemailer |
in-app-message | plugin-notification-in-app-message | SSE real-time + database |
| Custom | Plugin bên thứ ba | Tuỳ implementation |
Database Schema
Bảng notificationChannels
Lưu cấu hình kênh thông báo:
| Trường | Kiểu | Mô tả |
|---|---|---|
id | bigint (PK) | ID kênh |
name | string | Tên kênh (dùng để gọi API: channelName) |
channelType | string | Loại kênh: email, in-app-message, v.v. |
options | json | Cấu hình riêng (SMTP host, port, v.v.) |
enabled | boolean | Bật/tắt kênh |
Bảng notificationSendLogs
Lịch sử gửi thông báo:
| Trường | Kiểu | Mô tả |
|---|---|---|
id | bigint (PK) | ID log |
channelId | bigint (FK) | Kênh đã gửi |
receiver | string | Người nhận |
status | string | success, failed, pending |
content | json | Nội dung đã gửi |
errorMessage | text | Chi tiết lỗi (nếu có) |
createdAt | datetime | Thời gian gửi |
Phân quyền (ACL)
| ACL Snippet | Actions | Mô tả |
|---|---|---|
pm.notification.channels | notificationChannels:* | Quản lý kênh thông báo (admin) |
pm.notification.logs | notificationSendLogs:* | Xem lịch sử gửi (admin) |
Action messages:send được đăng ký riêng trong beforeLoad() — không qua ACL snippet, có thể gọi từ server-side code (workflow, plugin).
Logging
Plugin tạo logger riêng với daily rotate:
typescript
this.logger = this.createLogger({
dirname: 'notification-manager',
filename: '%DATE%.log',
transports: ['dailyRotateFile'],
});Log files được lưu tại storage/logs/notification-manager/.