/*********************************************************************************************************************************************************************** * File Name : notification.mdl.js * Type : Sequelize Model * Description : Admin-facing system notifications. Each row is a single event * surfaced in the admin bell dropdown (e.g. "5 tasks overdue"). * Not user-scoped — visible to all admins. * * Author: Kenneth Obsequio (@lash0000) * Date Created: Jun. 19, 2026 ***********************************************************************************************************************************************************************/ const { DataTypes } = require('sequelize'); const sequelize = require('../../config/db.config'); const mdl_Assets = require('../assets/assets.mdl'); const AdminNotification = sequelize.define('AdminNotification', { notification_id: { type: DataTypes.BIGINT, autoIncrement: true, primaryKey: true, }, type: { type: DataTypes.STRING(64), allowNull: false, }, title: { type: DataTypes.STRING(255), allowNull: false, }, message: { type: DataTypes.TEXT, allowNull: false, }, // Controls where this notification is rendered in the admin UI. show_in_notifications: { type: DataTypes.BOOLEAN, allowNull: false, defaultValue: true, }, show_in_sticky: { type: DataTypes.BOOLEAN, allowNull: false, defaultValue: false, }, // Named color key (utils/tierColors.js on the frontend) for the sticky banner. color: { type: DataTypes.STRING(20), allowNull: false, defaultValue: 'indigo', }, // Denormalized copy of the source NotificationBroadcast's per-alert // layout image (see notification_broadcast.mdl.js) — null when the // alert has none. image_asset_id: { type: DataTypes.BIGINT, allowNull: true, }, // Denormalized copy of the source NotificationBroadcast's visibility // window (see notificationVisibility.util.js) — null means unbounded. start_date: { type: DataTypes.DATE, allowNull: true, }, end_date: { type: DataTypes.DATE, allowNull: true, }, // Links back to the source broadcast so editing it after send can // propagate content changes into already-created rows (see // notificationBroadcasts.controller.js#updateBroadcast). Null for // notification types with no broadcast source. broadcast_id: { type: DataTypes.BIGINT, allowNull: true, }, data: { type: DataTypes.JSONB, allowNull: true, defaultValue: null, }, seen: { type: DataTypes.BOOLEAN, allowNull: false, defaultValue: false, }, seen_at: { type: DataTypes.DATE, allowNull: true, defaultValue: null, }, }, { tableName: 'admin_notifications', timestamps: true, indexes: [ { fields: ['seen'], name: 'idx_an_seen' }, { fields: ['type'], name: 'idx_an_type' }, { fields: ['createdAt'], name: 'idx_an_created_at' }, ], }); AdminNotification.belongsTo(mdl_Assets, { as: "image", foreignKey: "image_asset_id" }); module.exports = AdminNotification;