Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 27 additions & 1 deletion backend/src/drivers/SocketIODriver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ import { Server as HTTPServer } from "http";
import { Server, Socket } from "socket.io";
import { UtilityService } from "../services/UtilityService.js";
import { TokenProcessor } from "../processors/TokenProcessor.js";
import { AppDataSource } from "../datasources/PostgresDS.js";
import { EUserType } from "../types/EUserType.js";

export class SocketIODriver {

Expand Down Expand Up @@ -120,6 +122,23 @@ export class SocketIODriver {
});
}

// Allow admin users to join the admin-dashboard room for real-time stats
socket.on('join-admin-room', async () => {
if (!userId) return;
try {
const user = await AppDataSource.manager.findOne(
(await import('../models/DRAUsersPlatform.js')).DRAUsersPlatform,
{ where: { id: userId } }
);
if (user && user.user_type === EUserType.ADMIN) {
socket.join('admin-dashboard');
console.log(`[Socket.IO] Admin user ${userId} joined admin-dashboard room`);
}
} catch (err) {
console.error('[Socket.IO] Error joining admin room:', err);
}
});

// Handle disconnection
socket.on("disconnect", () => {
const userId = (socket as any).userId;
Expand Down Expand Up @@ -184,5 +203,12 @@ export class SocketIODriver {
});
}


/**
* Emit an event to all sockets in a named room.
*/
public emitToRoom(room: string, event: string, data: any): void {
if (!this.io) return;
this.io.to(room).emit(event, data);
}

}
2 changes: 2 additions & 0 deletions backend/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ import user_subscriptions from './routes/admin/user_subscriptions.js';
import platform_settings from './routes/admin/platform-settings.js';
import account_cancellations from './routes/admin/account-cancellations.js';
import admin_project_members from './routes/admin/project_members.js';
import admin_stats from './routes/admin/stats.js';
import public_article from './routes/article.js';
import sitemap from './routes/sitemap.js';
import subscription from './routes/subscription.js';
Expand Down Expand Up @@ -243,6 +244,7 @@ app.use('/admin/subscription-tiers', admin_subscription_tiers);
app.use('/admin/platform-settings', platform_settings);
app.use('/admin/account-cancellations', account_cancellations);
app.use('/admin/projects', admin_project_members);
app.use('/admin/stats', admin_stats);
app.use('/article', public_article);
app.use('/sitemap.txt', sitemap);
app.use('/subscription', subscription);
Expand Down
Loading