feat: add Socket.IO heats_updated broadcast event

- Export getIO function from socket module
- Broadcast heats_updated event when user updates their heats
- Event includes userId, username, and updated heats array
- Non-blocking broadcast (won't fail request if socket fails)
This commit is contained in:
Radosław Gierwiało
2025-11-14 15:35:39 +01:00
parent 02d3d7ac42
commit c4240f05bb
2 changed files with 35 additions and 2 deletions

View File

@@ -1,6 +1,7 @@
const express = require('express');
const { prisma } = require('../utils/db');
const { authenticate } = require('../middleware/auth');
const { getIO } = require('../socket');
const router = express.Router();
@@ -566,6 +567,28 @@ router.post('/:slug/heats', authenticate, async (req, res, next) => {
return userHeats;
});
// Broadcast heats update to all users in event room
try {
const io = getIO();
const roomName = `event_${event.id}`;
io.to(roomName).emit('heats_updated', {
userId: req.user.id,
username: req.user.username,
heats: result.map(heat => ({
id: heat.id,
divisionId: heat.divisionId,
division: heat.division,
competitionTypeId: heat.competitionTypeId,
competitionType: heat.competitionType,
heatNumber: heat.heatNumber,
role: heat.role,
})),
});
} catch (socketError) {
// Don't fail the request if socket broadcast fails
console.error('Failed to broadcast heats update:', socketError);
}
res.json({
success: true,
count: result.length,

View File

@@ -5,8 +5,18 @@ const { prisma } = require('../utils/db');
// Track active users in each event room
const activeUsers = new Map(); // eventId -> Set of { socketId, userId, username, avatar }
// Global Socket.IO instance
let io;
function getIO() {
if (!io) {
throw new Error('Socket.IO not initialized');
}
return io;
}
function initializeSocket(httpServer) {
const io = new Server(httpServer, {
io = new Server(httpServer, {
cors: {
origin: process.env.CORS_ORIGIN || 'http://localhost:8080',
credentials: true,
@@ -348,4 +358,4 @@ function initializeSocket(httpServer) {
return io;
}
module.exports = { initializeSocket };
module.exports = { initializeSocket, getIO };