From 817c0e48cacac782c70ff77d79da645f4a942290 Mon Sep 17 00:00:00 2001 From: Professional Date: Mon, 26 May 2025 17:02:46 +0700 Subject: [PATCH] =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/controllers/adminController.js | 102 +++++++++++++++---------- backend/server.js | 7 ++ 2 files changed, 67 insertions(+), 42 deletions(-) diff --git a/backend/controllers/adminController.js b/backend/controllers/adminController.js index 5daecb7..f4b2e13 100644 --- a/backend/controllers/adminController.js +++ b/backend/controllers/adminController.js @@ -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} не найден в активных соединениях для отправки уведомления о разблокировке`); diff --git a/backend/server.js b/backend/server.js index 6bf7caf..945b02f 100644 --- a/backend/server.js +++ b/backend/server.js @@ -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);