From d641e3f059df55a894c6a6e78c82fdaf69d9a38e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rados=C5=82aw=20Gierwia=C5=82o?= Date: Tue, 2 Dec 2025 20:10:47 +0100 Subject: [PATCH] feat(activity-log): add Socket.IO real-time streaming (Phase 5) Added socket handlers for admin activity log streaming: Socket Events: - join_admin_activity_logs: Admin joins streaming room - Verifies isAdmin flag from database - Rejects non-admin users with warning log - Emits confirmation: admin_activity_logs_joined - leave_admin_activity_logs: Admin leaves streaming room - Clean disconnect from room Real-time Flow: 1. Admin connects and emits join_admin_activity_logs 2. Server verifies admin status (fresh DB check) 3. Admin joins 'admin_activity_logs' Socket.IO room 4. activityLog.log() emits activity_log_entry to room 5. Admin receives real-time log entries as they happen The activityLog service (Phase 2) already emits events, so streaming is fully functional with these handlers. --- backend/src/socket/index.js | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/backend/src/socket/index.js b/backend/src/socket/index.js index fce5242..0dc5251 100644 --- a/backend/src/socket/index.js +++ b/backend/src/socket/index.js @@ -75,6 +75,36 @@ function initializeSocket(httpServer) { socket.join(userRoom); console.log(`📬 ${socket.user.username} joined personal room: ${userRoom}`); + // Join admin activity logs room (admin-only) + socket.on('join_admin_activity_logs', async () => { + try { + // Verify admin status + const user = await prisma.user.findUnique({ + where: { id: socket.user.id }, + select: { isAdmin: true, username: true }, + }); + + if (!user || !user.isAdmin) { + socket.emit('error', { message: 'Admin access required' }); + console.warn(`🚫 Non-admin ${socket.user.username} attempted to join admin_activity_logs`); + return; + } + + socket.join('admin_activity_logs'); + console.log(`👑 Admin ${user.username} joined activity logs streaming room`); + socket.emit('admin_activity_logs_joined', { message: 'Successfully joined activity logs stream' }); + } catch (error) { + console.error('Join admin activity logs error:', error); + socket.emit('error', { message: 'Failed to join admin activity logs' }); + } + }); + + // Leave admin activity logs room + socket.on('leave_admin_activity_logs', () => { + socket.leave('admin_activity_logs'); + console.log(`👑 Admin ${socket.user.username} left activity logs streaming room`); + }); + // Join event room socket.on('join_event_room', async ({ slug }) => { try {