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:
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user