Files
memind/health-event-notification-service.mjs
T
john 2baf29b3ae feat(health): complete P0 health channel — baseline engine, page-data, MindSpace UI
Deliver encrypted health zone, observation API, baseline maturity pipeline,
page-data bindings, and H5/WeChat channel integration for health P0.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-09 18:04:57 +08:00

76 lines
2.0 KiB
JavaScript

import {
buildHealthEventNotificationCopy,
healthEventNotificationType,
shouldAttemptWechatNotification,
shouldCreateWebNotification,
} from './health-event-notification.mjs';
export function createHealthEventNotificationService({
createUserNotification = null,
notificationDispatcher = null,
logger = console,
} = {}) {
return {
async notifyNewEvent(userId, event, { eventId = null } = {}) {
const severity = String(event?.severity ?? 'info');
if (!shouldCreateWebNotification(severity)) {
return { ok: true, skipped: true, reason: 'severity_silent', severity };
}
const notificationType = healthEventNotificationType(severity);
const { title, body } = buildHealthEventNotificationCopy(event);
const data = {
eventId,
severity,
ruleId: event.ruleId ?? null,
eventType: event.eventType ?? null,
metricType: event.metricType ?? null,
};
let webCreated = false;
if (typeof createUserNotification === 'function') {
try {
await createUserNotification({
userId,
channel: 'web',
notificationType,
title,
body,
data,
});
webCreated = true;
} catch (error) {
logger.warn?.('Health web notification failed:', error);
}
}
let wechatSent = false;
if (
shouldAttemptWechatNotification(severity)
&& typeof notificationDispatcher?.sendHealthEventNotification === 'function'
) {
try {
wechatSent = await notificationDispatcher.sendHealthEventNotification({
userId,
title,
body,
eventId,
severity,
});
} catch (error) {
logger.warn?.('Health wechat notification failed:', error);
}
}
return {
ok: true,
skipped: false,
webCreated,
wechatSent,
severity,
eventId,
};
},
};
}