const express = require('express'); const { db, logActivity } = require('../database/db'); const { adminAuth } = require('../middleware/auth-enhanced-v2'); const router = express.Router(); // Get notifications (unread activity logs) router.get('/', adminAuth, async (req, res) => { try { const { limit = 20, includeRead = false } = req.query; let query = db('activity_logs') .select( 'activity_logs.*', 'events.event_name' ) .leftJoin('events', 'activity_logs.event_id', 'events.id') .orderBy('activity_logs.created_at', 'desc') .limit(parseInt(limit)); // By default, only show unread notifications if (includeRead !== 'true') { query = query.whereNull('activity_logs.read_at'); } const notifications = await query; // Format notifications const formattedNotifications = notifications.map(notification => ({ id: notification.id, type: notification.activity_type, actorType: notification.actor_type, actorName: notification.actor_name, eventName: notification.event_name, eventId: notification.event_id, metadata: (() => { try { if (!notification.metadata) return {}; if (typeof notification.metadata === 'object') return notification.metadata; return JSON.parse(notification.metadata); } catch (e) { console.warn('Failed to parse metadata for notification:', notification.id, e.message); return {}; } })(), createdAt: notification.created_at, readAt: notification.read_at, isRead: !!notification.read_at })); // Get unread count const unreadCount = await db('activity_logs') .whereNull('read_at') .count('id as count') .first(); res.json({ notifications: formattedNotifications, unreadCount: unreadCount.count || 0 }); } catch (error) { console.error('Notifications fetch error:', error); res.status(500).json({ error: 'Failed to fetch notifications' }); } }); // Mark notification as read router.put('/:id/read', adminAuth, async (req, res) => { try { const { id } = req.params; await db('activity_logs') .where('id', id) .update({ read_at: new Date() }); res.json({ message: 'Notification marked as read' }); } catch (error) { console.error('Mark notification read error:', error); res.status(500).json({ error: 'Failed to mark notification as read' }); } }); // Mark all notifications as read router.put('/read-all', adminAuth, async (req, res) => { try { await db('activity_logs') .whereNull('read_at') .update({ read_at: new Date() }); res.json({ message: 'All notifications marked as read' }); } catch (error) { console.error('Mark all notifications read error:', error); res.status(500).json({ error: 'Failed to mark all notifications as read' }); } }); // Delete old notifications (older than 30 days and read) router.delete('/clear-old', adminAuth, async (req, res) => { try { // Use database-agnostic date calculation const thirtyDaysAgo = new Date(); thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30); const deletedCount = await db('activity_logs') .whereNotNull('read_at') .where('created_at', '<', thirtyDaysAgo) .delete(); res.json({ message: 'Old notifications cleared', deletedCount }); } catch (error) { console.error('Clear old notifications error:', error); res.status(500).json({ error: 'Failed to clear old notifications' }); } }); module.exports = router;