Bỏ qua, đến nội dung

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ầngThành phầnMô tả
CallerWorkflow, Code, APINơi phát sinh yêu cầu gửi thông báo
ManagerNotificationManagerRegistry và dispatcher trung tâm
ChannelEmail, 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ầnMô tả
typeTên loại kênh (ví dụ: email, in-app-message)
ChannelClass 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ênhPluginPhương thức gửi
emailplugin-notification-emailSMTP qua nodemailer
in-app-messageplugin-notification-in-app-messageSSE real-time + database
CustomPlugin bên thứ baTuỳ implementation

Database Schema ​

Bảng notificationChannels ​

Lưu cấu hình kênh thông báo:

TrườngKiểuMô tả
idbigint (PK)ID kênh
namestringTên kênh (dùng để gọi API: channelName)
channelTypestringLoại kênh: email, in-app-message, v.v.
optionsjsonCấu hình riêng (SMTP host, port, v.v.)
enabledbooleanBật/tắt kênh

Bảng notificationSendLogs ​

Lịch sử gửi thông báo:

TrườngKiểuMô tả
idbigint (PK)ID log
channelIdbigint (FK)Kênh đã gửi
receiverstringNgười nhận
statusstringsuccess, failed, pending
contentjsonNội dung đã gửi
errorMessagetextChi tiết lỗi (nếu có)
createdAtdatetimeThời gian gửi

Phân quyền (ACL) ​

ACL SnippetActionsMô tả
pm.notification.channelsnotificationChannels:*Quản lý kênh thông báo (admin)
pm.notification.logsnotificationSendLogs:*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/.

Vòng đời Plugin ​