mirror of
https://github.com/rgrgogu/new_starr.git
synced 2026-09-27 00:12:54 +08:00
80 lines
3.7 KiB
JavaScript
80 lines
3.7 KiB
JavaScript
/***********************************************************************************************************************************************************************
|
|
* File Name : notification.controller.js
|
|
* Type : Controller (Admin)
|
|
* Description : Admin notification management.
|
|
* GET /admin/notifications — paginated list, newest first
|
|
* GET /admin/notifications/unseen — unseen count only
|
|
* PATCH /admin/notifications/:id/seen — mark one as seen
|
|
* PATCH /admin/notifications/seen-all — mark all as seen
|
|
*
|
|
* Author: Kenneth Obsequio (@lash0000)
|
|
* Date Created: Jun. 19, 2026
|
|
***********************************************************************************************************************************************************************/
|
|
const AdminNotification = require('../../models/notifications/admin_notification.mdl');
|
|
const R = require('../../utils/response.util');
|
|
|
|
// ─── GET /admin/notifications ─────────────────────────────────────────────────
|
|
async function list(req, res) {
|
|
try {
|
|
const page = Math.max(1, parseInt(req.query.page) || 1);
|
|
const limit = Math.min(50, parseInt(req.query.limit) || 20);
|
|
const offset = (page - 1) * limit;
|
|
|
|
const { count, rows } = await AdminNotification.findAndCountAll({
|
|
order: [['createdAt', 'DESC']],
|
|
limit,
|
|
offset,
|
|
});
|
|
|
|
return R.success(res, 'Notifications fetched.', {
|
|
notifications: rows,
|
|
pagination: { page, limit, total: count, pages: Math.ceil(count / limit) },
|
|
});
|
|
} catch (err) {
|
|
console.error('[NOTIFICATION] list error:', err);
|
|
return R.error(res, 'Failed to fetch notifications.');
|
|
}
|
|
}
|
|
|
|
// ─── GET /admin/notifications/unseen ─────────────────────────────────────────
|
|
async function unseenCount(req, res) {
|
|
try {
|
|
const count = await AdminNotification.count({ where: { seen: false } });
|
|
return R.success(res, 'Unseen count fetched.', { count });
|
|
} catch (err) {
|
|
console.error('[NOTIFICATION] unseenCount error:', err);
|
|
return R.error(res, 'Failed to fetch unseen count.');
|
|
}
|
|
}
|
|
|
|
// ─── PATCH /admin/notifications/:id/seen ─────────────────────────────────────
|
|
async function markSeen(req, res) {
|
|
try {
|
|
const notification = await AdminNotification.findByPk(req.params.id);
|
|
if (!notification) return R.error(res, 'Notification not found.', 404);
|
|
|
|
await notification.update({ seen: true, seen_at: new Date() });
|
|
return R.success(res, 'Notification marked as seen.', notification);
|
|
} catch (err) {
|
|
console.error('[NOTIFICATION] markSeen error:', err);
|
|
return R.error(res, 'Failed to mark notification as seen.');
|
|
}
|
|
}
|
|
|
|
// ─── PATCH /admin/notifications/seen-all ─────────────────────────────────────
|
|
async function markAllSeen(req, res) {
|
|
try {
|
|
const now = new Date();
|
|
const [count] = await AdminNotification.update(
|
|
{ seen: true, seen_at: now },
|
|
{ where: { seen: false } }
|
|
);
|
|
return R.success(res, `${count} notification(s) marked as seen.`, { count });
|
|
} catch (err) {
|
|
console.error('[NOTIFICATION] markAllSeen error:', err);
|
|
return R.error(res, 'Failed to mark all notifications as seen.');
|
|
}
|
|
}
|
|
|
|
module.exports = { list, unseenCount, markSeen, markAllSeen };
|