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.
This commit is contained in:
Radosław Gierwiało
2025-12-02 20:10:47 +01:00
parent 4dd6603018
commit d641e3f059

View File

@@ -75,6 +75,36 @@ function initializeSocket(httpServer) {
socket.join(userRoom); socket.join(userRoom);
console.log(`📬 ${socket.user.username} joined personal room: ${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 // Join event room
socket.on('join_event_room', async ({ slug }) => { socket.on('join_event_room', async ({ slug }) => {
try { try {