This commit is contained in:
Professional 2025-05-26 17:02:46 +07:00
parent 920168e7d1
commit 817c0e48ca
2 changed files with 67 additions and 42 deletions

View File

@ -127,45 +127,59 @@ const toggleUserActive = async (req, res) => {
// Получаем доступ к io для отправки уведомлений
const io = req.app.get('io');
if (!io) {
console.error('[AdminController] Ошибка: экземпляр Socket.IO не доступен через req.app.get("io")');
return res.status(500).json({ message: 'Внутренняя ошибка сервера: Socket.IO недоступен' });
}
// Изменяем статус активности на противоположный
const wasActive = user.isActive;
user.isActive = !user.isActive;
await user.save();
// Получаем глобальный массив активных пользователей из server.js
// Это напрямую обращается к глобальной переменной в server.js
const activeUsers = req.app.get('activeUsers') || [];
console.log(`[AdminController] Активные пользователи:`, activeUsers);
// Если пользователь был активным и теперь блокируется
if (wasActive && !user.isActive) {
console.log(`[AdminController] Блокировка пользователя ${userId}. Причина: ${reason || 'Не указана'}`);
// Находим все активные сокеты пользователя - новый подход с более надежным поиском
const activeSockets = Array.from(io.sockets.sockets.values()).filter(socket => {
return socket &&
socket.handshake &&
socket.handshake.query &&
socket.handshake.query.userId === userId;
});
console.log(`[AdminController] Найдено активных сокетов пользователя: ${activeSockets.length}`);
if (activeSockets.length > 0) {
// Отправляем уведомление по всем активным сокетам пользователя
activeSockets.forEach(socket => {
console.log(`[AdminController] Отправка уведомления о блокировке на сокет: ${socket.id}`);
socket.emit("account_blocked", {
message: 'Ваш аккаунт был заблокирован администратором.',
reason: reason || 'Нарушение правил сервиса',
timestamp: new Date().toISOString(),
blocked: true
});
// Ищем пользователя среди активных пользователей
const userSockets = activeUsers.filter(u => u.userId === userId);
console.log(`[AdminController] Найдено активных записей пользователя: ${userSockets.length}`);
if (userSockets.length > 0) {
userSockets.forEach(userSocket => {
try {
const socket = io.sockets.sockets.get(userSocket.socketId);
if (socket) {
console.log(`[AdminController] Отправка уведомления о блокировке на сокет: ${userSocket.socketId}`);
socket.emit("account_blocked", {
message: 'Ваш аккаунт был заблокирован администратором.',
reason: reason || 'Нарушение правил сервиса',
timestamp: new Date().toISOString(),
blocked: true
});
// Принудительно отключаем сокет
setTimeout(() => {
try {
console.log(`[AdminController] Принудительное отключение сокета: ${userSocket.socketId}`);
socket.disconnect(true);
} catch (socketError) {
console.error(`[AdminController] Ошибка при отключении сокета ${userSocket.socketId}:`, socketError);
}
}, 500);
} else {
console.log(`[AdminController] Не найден объект сокета для ID: ${userSocket.socketId}`);
}
} catch (socketError) {
console.error(`[AdminController] Ошибка при обработке сокета ${userSocket.socketId}:`, socketError);
}
});
// Принудительно отключаем все сокеты пользователя
setTimeout(() => {
activeSockets.forEach(socket => {
console.log(`[AdminController] Принудительное отключение сокета: ${socket.id}`);
socket.disconnect(true);
});
}, 1000); // Небольшая задержка, чтобы сообщение о блокировке успело доставиться
} else {
console.log(`[AdminController] Пользователь ${userId} не найден в активных соединениях`);
}
@ -174,21 +188,25 @@ const toggleUserActive = async (req, res) => {
else if (!wasActive && user.isActive) {
console.log(`[AdminController] Разблокировка пользователя ${userId}`);
// То же самое для поиска сокетов пользователя
const activeSockets = Array.from(io.sockets.sockets.values()).filter(socket => {
return socket &&
socket.handshake &&
socket.handshake.query &&
socket.handshake.query.userId === userId;
});
// Ищем пользователя среди активных пользователей (на случай, если он онлайн с другим аккаунтом)
const userSockets = activeUsers.filter(u => u.userId === userId);
if (activeSockets.length > 0) {
activeSockets.forEach(socket => {
console.log(`[AdminController] Отправка уведомления о разблокировке на сокет: ${socket.id}`);
socket.emit("account_unblocked", {
message: 'Ваш аккаунт был разблокирован администратором.',
timestamp: new Date().toISOString()
});
if (userSockets.length > 0) {
userSockets.forEach(userSocket => {
try {
const socket = io.sockets.sockets.get(userSocket.socketId);
if (socket) {
console.log(`[AdminController] Отправка уведомления о разблокировке на сокет: ${userSocket.socketId}`);
socket.emit("account_unblocked", {
message: 'Ваш аккаунт был разблокирован администратором.',
timestamp: new Date().toISOString()
});
} else {
console.log(`[AdminController] Не найден объект сокета для ID: ${userSocket.socketId}`);
}
} catch (socketError) {
console.error(`[AdminController] Ошибка при обработке сокета ${userSocket.socketId}:`, socketError);
}
});
} else {
console.log(`[AdminController] Пользователь ${userId} не найден в активных соединениях для отправки уведомления о разблокировке`);

View File

@ -91,6 +91,9 @@ app.use('/api/admin', adminRoutes); // Подключаем маршруты д
// Socket.IO логика
let activeUsers = [];
// Делаем массив activeUsers доступным для контроллеров
app.set('activeUsers', activeUsers);
io.on("connection", (socket) => {
console.log("A user connected:", socket.id);
@ -106,6 +109,10 @@ io.on("connection", (socket) => {
// Добавляем нового пользователя
activeUsers.push({ userId, socketId: socket.id });
}
// Обновляем массив пользователей в приложении для доступа из контроллеров
app.set('activeUsers', activeUsers);
io.emit("getUsers", activeUsers); // Отправляем обновленный список активных пользователей всем клиентам
console.log("User added to active users:", userId, socket.id);
console.log("Active users:", activeUsers);