/*********************************************************************************************************************************************************************** * File Name: notifications.data.js * Type of Program: Data * Description: Central registry of all notification types for both admin and * client (user) notifications. * * Each entry describes one notification type: * type {string} — stored in the DB 'type' column * scope {string} — 'admin' | 'user' | 'both' * trigger {string} — what fires it (cron | event | manual) * build {function} — takes a data payload, returns the object * ready to pass to AdminNotification.create() * or UserNotification.create() / bulkCreate() * * To add a new notification type: * 1. Add an entry in the relevant section below. * 2. Call NOTIFICATION_REGISTRY..build(data) at the trigger * site (controller, cron, service). * No other changes needed. * * Current types: * Admin : task_overdue, user_registration, nogrp_user_registered * User : user_task_overdue, achievement, course_unlocked, * course_completed, certificate_issued, task_reminder, announcement, * nogrp_welcome, tier_expired * * Author: Kenneth Obsequio (@lash0000) * Date Created: Jun. 19, 2026 ***********************************************************************************************************************************************************************/ 'use strict'; const { fmtDate } = require('../utils/datetime.util'); const NOTIFICATION_REGISTRY = { // ───────────────────────────────────────────────────────────────────────── // ADMIN notifications (scope: 'admin') // ───────────────────────────────────────────────────────────────────────── // ── Task ────────────────────────────────────────────────────────────────── task_overdue: { type: 'task_overdue', scope: 'admin', trigger: 'cron', build({ count, task_list_ids = [] }) { return { type: 'task_overdue', title: 'Tasks Overdue', message: `${count} task${count === 1 ? ' was' : 's were'} automatically marked as overdue.`, data: { count, task_list_ids }, }; }, }, // ── User Registration ───────────────────────────────────────────────────── user_registration: { type: 'user_registration', scope: 'admin', trigger: 'event', build({ groupName, groupCode, userEmail }) { return { type: 'user_registration', title: 'New User Registered', message: `A new user registered in ${groupName}.`, data: { groupName, groupCode, userEmail }, }; }, }, // ── Unaffiliated User Registration ─────────────────────────────────────── nogrp_user_registered: { type: 'nogrp_user_registered', scope: 'admin', trigger: 'event', build({ userEmail, regType }) { return { type: 'nogrp_user_registered', title: 'New Unaffiliated User', message: `A new user (${userEmail}) registered via ${regType} without a group code and was placed in the default group.`, data: { userEmail, regType }, }; }, }, // ───────────────────────────────────────────────────────────────────────── // USER notifications (scope: 'user') // ───────────────────────────────────────────────────────────────────────── // ── Task ────────────────────────────────────────────────────────────────── user_task_overdue: { type: 'task', scope: 'user', trigger: 'cron', build({ count, task_list_ids = [] }) { const label = count === 1 ? '1 task has' : `${count} tasks have`; return { type: 'task', title: 'Tasks Overdue', message: `${label} passed their deadline and been marked as overdue.`, data: { count, task_list_ids }, }; }, }, task_reminder: { type: 'task', scope: 'user', trigger: 'cron', build({ taskName, deadline }) { return { type: 'task', title: 'Task Deadline Approaching', message: `"${taskName}" is due on ${fmtDate(deadline)}.`, data: { taskName, deadline }, }; }, }, // ── Achievement ─────────────────────────────────────────────────────────── achievement: { type: 'achievement', scope: 'user', trigger: 'event', build({ label, description, key }) { return { type: 'achievement', title: label, message: description, data: { key }, }; }, }, // ── Course ──────────────────────────────────────────────────────────────── course_unlocked: { type: 'course', scope: 'user', trigger: 'event', build({ courseTitle }) { return { type: 'course', title: 'New Course Available', message: `"${courseTitle}" has been added to your learning library.`, data: { courseTitle }, }; }, }, course_completed: { type: 'course', scope: 'user', trigger: 'event', build({ courseTitle }) { return { type: 'course', title: 'Course Completed', message: `Great job! You've completed "${courseTitle}". Your certificate will be issued within the next hour.`, data: { courseTitle }, }; }, }, certificate_issued: { type: 'course', scope: 'user', trigger: 'cron', build({ courseTitle, courseUuid }) { return { type: 'course', title: 'Certificate Issued', message: `Congratulations! Your certificate for "${courseTitle}" is ready.`, data: { courseTitle, courseUuid }, }; }, }, // ── Welcome ─────────────────────────────────────────────────────────────── welcome: { type: 'announcement', scope: 'user', trigger: 'event', build({ groupName, groupCode, accType }) { const greeting = accType === 'admin' ? 'Welcome, Administrator!' : accType === 'staff' ? 'Welcome to the Philproperties team!' : 'Welcome to Philproperties!'; return { type: 'announcement', title: 'Welcome to Philproperties', message: groupName ? `${greeting} You have been added to ${groupName}.` : greeting, data: { groupName, groupCode, accType }, }; }, }, // ── No-Group Welcome ────────────────────────────────────────────────────── nogrp_welcome: { type: 'announcement', scope: 'user', trigger: 'event', build() { return { type: 'announcement', title: "You're Not in a Group Yet", message: 'You are currently in the default group. Contact an administrator to be assigned to your team.', data: { groupCode: 'NOGRP' }, }; }, }, // ── Assessment ──────────────────────────────────────────────────────────── assessment_updated: { type: 'assessment', scope: 'user', trigger: 'event', build({ assessmentTitle, courseTitle }) { return { type: 'assessment', title: 'Assessment Updated', message: `The administrator has updated the "${assessmentTitle || 'Course Assessment'}" in "${courseTitle || 'your course'}". Your current session is still valid — continue where you left off.`, data: { assessmentTitle, courseTitle }, }; }, }, // ── Platform ────────────────────────────────────────────────────────────── announcement: { type: 'announcement', scope: 'user', trigger: 'manual', build({ title, body }) { return { type: 'announcement', title, message: body, data: {}, }; }, }, // ── Tier ────────────────────────────────────────────────────────────────── tier_expired: { type: 'tier_expired', scope: 'user', trigger: 'cron', build({ tier, label }) { return { type: 'tier_expired', title: 'Subscription Expired', message: `Your ${label ?? tier} plan has expired. Renew to keep access.`, data: { tier, label }, }; }, }, }; module.exports = { NOTIFICATION_REGISTRY };