/*********************************************************************************************************************************************************************** * 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 : user_task_overdue, achievement, course_unlocked, * certificate_issued, task_reminder, announcement * * Author: Kenneth Obsequio (@lash0000) * Date Created: Jun. 19, 2026 ***********************************************************************************************************************************************************************/ 'use strict'; 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 }, }; }, }, // ───────────────────────────────────────────────────────────────────────── // 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 ${new Date(deadline).toLocaleDateString('en-US', { month: 'long', day: 'numeric', year: 'numeric' })}.`, 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 }, }; }, }, certificate_issued: { type: 'course', scope: 'user', trigger: 'event', 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 }, }; }, }, // ── Platform ────────────────────────────────────────────────────────────── announcement: { type: 'announcement', scope: 'user', trigger: 'manual', build({ title, body }) { return { type: 'announcement', title, message: body, data: {}, }; }, }, }; module.exports = { NOTIFICATION_REGISTRY };