Bỏ qua, đến nội dung

Câu hỏi thường gặp (FAQ) — Notification Manager

Cài đặt

Cần cài những plugin nào để gửi thông báo?

Phụ thuộc vào kênh muốn sử dụng:

KênhPlugin cần cài
Hub trung tâm (bắt buộc)plugin-notification-manager
Gửi emailplugin-notification-email
Thông báo trong appplugin-notification-in-app-message

Luôn cần plugin-notification-manager trước, sau đó cài thêm plugin kênh tương ứng.

Có thể tự tạo kênh thông báo riêng không?

Có. Viết plugin đăng ký channel type vào NotificationManager:

typescript
class MySMSPlugin extends Plugin {
  async load() {
    const nm = this.pm.get(PluginNotificationManagerServer);
    nm.registerChannelType({
      type: 'sms',
      Channel: MySMSChannel,
    });
  }
}

Channel class cần implement method send(options) để xử lý logic gửi.

Thứ tự bật plugin có quan trọng không?

Có. Phải bật plugin-notification-manager trước, sau đó mới bật các plugin kênh (email, in-app). Nếu bật kênh trước manager, plugin kênh sẽ gặp lỗi khi cố đăng ký channel type.

Sử dụng

Gửi thông báo từ Workflow như thế nào?

Trong workflow editor, sử dụng node Send Notification:

  1. Chọn Channel: Kênh đã cấu hình (ví dụ: default-email, in-app-message)
  2. Người nhận: Biến từ workflow context (ví dụ: {{$context.record.email}})
  3. Nội dung: Template có biến động

Làm sao biết thông báo đã gửi thành công?

Kiểm tra Settings → Notification → Send Logs:

  • Lọc theo trạng thái: success, failed
  • Lọc theo thời gian
  • Lọc theo kênh

Mỗi lần gửi đều được ghi log với trạng thái và chi tiết lỗi (nếu có).

Có thể gửi thông báo hàng loạt không?

Có. Truyền mảng người nhận trong trường to:

typescript
await api.resource('messages').send({
  values: {
    channelName: 'default-email',
    to: ['user1@example.com', 'user2@example.com', 'user3@example.com'],
    subject: 'Thông báo chung',
    content: 'Nội dung...',
  },
});

Manager gửi tuần tự cho từng người nhận và ghi log riêng cho mỗi lần gửi.

Có thể gửi qua nhiều kênh cùng lúc không?

Plugin gửi qua một kênh mỗi lần gọi. Nếu muốn gửi qua nhiều kênh (email + in-app), gọi send() nhiều lần với channelName khác nhau:

typescript
// Gửi email
await notificationManager.send({
  channelName: 'default-email',
  to: ['user@example.com'],
  content: 'Nội dung...',
});

// Gửi in-app
await notificationManager.send({
  channelName: 'in-app-message',
  to: [userId],
  content: 'Nội dung...',
});

Lỗi thường gặp

Lỗi "Channel not found"?

Tên kênh (channelName) không đúng hoặc kênh chưa được tạo. Kiểm tra:

  1. Danh sách kênh trong Settings → Notification → Channels
  2. Tên kênh trong API phải trùng chính xác với name đã cấu hình
  3. Plugin kênh tương ứng đã được bật (email, in-app)

Email không gửi được, báo "SMTP error"?

Lỗi ở tầng channel, không phải manager. Kiểm tra:

  1. Cấu hình SMTP trong kênh email: host, port, username, password
  2. Thử gửi test email từ form cấu hình
  3. Xem chi tiết lỗi trong Send Logs (errorMessage)
  4. Kiểm tra firewall cho phép kết nối outbound đến SMTP server

Thông báo in-app không hiển thị?

  1. Kiểm tra plugin-notification-in-app-message đã bật
  2. Kiểm tra user đang online (SSE connection active)
  3. Kiểm tra userId trong to là đúng
  4. Xem Send Logs có ghi thành công không

Send Logs quá nhiều, ảnh hưởng database?

Send Logs tích luỹ theo thời gian. Các biện pháp:

Giải phápMô tả
Cleanup định kỳXoá log cũ hơn X ngày (cron job hoặc workflow)
Lọc logChỉ giữ log failed, xoá log success sau 7 ngày
ArchivingExport log cũ ra file trước khi xoá

Bảo mật

Ai có quyền quản lý thông báo?

QuyềnACL SnippetMô tả
Quản lý kênhpm.notification.channelsTạo, sửa, xoá kênh (admin)
Xem logpm.notification.logsXem lịch sử gửi (admin)
Gửi thông báoAction messages:sendServer-side — không qua ACL snippet

Action messages:send được đăng ký trực tiếp trong beforeLoad() — chủ yếu được gọi từ server-side code (workflow, plugin), không expose trực tiếp cho end user.