Giao diện
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ênh | Plugin cần cài |
|---|---|
| Hub trung tâm (bắt buộc) | plugin-notification-manager |
| Gửi email | plugin-notification-email |
| Thông báo trong app | plugin-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:
- Chọn Channel: Kênh đã cấu hình (ví dụ:
default-email,in-app-message) - Người nhận: Biến từ workflow context (ví dụ:
{{$context.record.email}}) - 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:
- Danh sách kênh trong Settings → Notification → Channels
- Tên kênh trong API phải trùng chính xác với
nameđã cấu hình - 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:
- Cấu hình SMTP trong kênh email: host, port, username, password
- Thử gửi test email từ form cấu hình
- Xem chi tiết lỗi trong Send Logs (
errorMessage) - 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ị?
- Kiểm tra
plugin-notification-in-app-messageđã bật - Kiểm tra user đang online (SSE connection active)
- Kiểm tra
userIdtrongtolà đúng - 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áp | Mô tả |
|---|---|
| Cleanup định kỳ | Xoá log cũ hơn X ngày (cron job hoặc workflow) |
| Lọc log | Chỉ giữ log failed, xoá log success sau 7 ngày |
| Archiving | Export log cũ ra file trước khi xoá |
Bảo mật
Ai có quyền quản lý thông báo?
| Quyền | ACL Snippet | Mô tả |
|---|---|---|
| Quản lý kênh | pm.notification.channels | Tạo, sửa, xoá kênh (admin) |
| Xem log | pm.notification.logs | Xem lịch sử gửi (admin) |
| Gửi thông báo | Action messages:send | Server-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.