mirror of
https://github.com/rgrgogu/new_starr.git
synced 2026-09-27 00:12:54 +08:00
212 lines
9.3 KiB
JavaScript
212 lines
9.3 KiB
JavaScript
/***********************************************************************************************************************************************************************
|
|
* 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.<key>.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,
|
|
* course_completed, 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 },
|
|
};
|
|
},
|
|
},
|
|
|
|
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 is being prepared and will be ready in about 5 minutes.`,
|
|
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 },
|
|
};
|
|
},
|
|
},
|
|
|
|
// ── 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: {},
|
|
};
|
|
},
|
|
},
|
|
|
|
};
|
|
|
|
module.exports = { NOTIFICATION_REGISTRY };
|