Bỏ qua, đến nội dung

Kiến trúc — Notification Manager

Tổng quan

Plugin notification-managerhub 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