"use strict"; const fs = require('node:fs/promises'); const path = require('path'); exports.go = async (req, res, postData, urlParsed) => { try { console.log('[api/auth-dev] РАЗРАБОТЧЕСКАЯ авторизация:', postData); // Проверяем, что данные переданы if (!postData || !postData.phone) { return res.end(JSON.stringify({ success: false, error: "Не указан номер телефона" })); } // Нормализуем номер телефона (убираем все кроме цифр) const normalizedPhone = postData.phone.replace(/\D/g, ''); console.log('[api/auth-dev] РАЗРАБОТЧЕСКАЯ авторизация для телефона:', normalizedPhone); // Читаем данные администраторов let admins = {}; try { const adminsData = await fs.readFile(path.join(__dirname, '../data/avt.ini'), 'utf8'); admins = JSON.parse(adminsData); console.log('[api/auth-dev] Доступные пользователи:', Object.keys(admins).length); } catch (error) { console.error('[api/auth-dev] Ошибка чтения файла пользователей:', error); return res.end(JSON.stringify({ success: false, error: "Ошибка загрузки данных пользователей" })); } // Ищем пользователя по номеру телефона let foundUser = null; for (const [phone, userData] of Object.entries(admins)) { const userNormalizedPhone = phone.replace(/\D/g, ''); if (userNormalizedPhone === normalizedPhone) { foundUser = userData; break; } } if (!foundUser) { console.log('[api/auth-dev] Пользователь не найден'); return res.end(JSON.stringify({ success: false, error: "Пользователь с таким номером телефона не найден" })); } console.log('[api/auth-dev] РАЗРАБОТЧЕСКАЯ авторизация успешна для:', foundUser.fio || foundUser._id); // Генерируем сессионный hash для WebSocket авторизации let sessionHash = null; try { // Читаем текущие хэши let hashData = {}; try { const hashFileContent = await fs.readFile(path.join(__dirname, '../data/hash.ini'), 'utf8'); hashData = JSON.parse(hashFileContent); } catch (error) { console.log('[api/auth-dev] Создаем новый файл хэшей'); hashData = {}; } // Генерируем новый хэш (упрощенная версия) sessionHash = require('crypto').randomBytes(8).toString('hex'); hashData[normalizedPhone] = sessionHash; // Сохраняем хэш await fs.writeFile(path.join(__dirname, '../data/hash.ini'), JSON.stringify(hashData)); console.log('[api/auth-dev] Сгенерирован hash для WebSocket:', sessionHash); } catch (error) { console.warn('[api/auth-dev] Ошибка генерации hash:', error); } // Определяем роль пользователя let userRole = 'operator'; if (foundUser.taccess) { userRole = foundUser.taccess; } else if (foundUser.access && foundUser.access.fullaccess) { userRole = 'admin'; } else if (foundUser.groupz && foundUser.groupz.name) { const groupName = foundUser.groupz.name.toLowerCase(); if (groupName.includes('программист') || groupName.includes('админ')) { userRole = 'admin'; } else if (groupName.includes('оператор')) { userRole = 'operators'; } else if (groupName.includes('техник')) { userRole = 'technics'; } } // Возвращаем данные пользователя в формате React клиента const response = { success: true, user: { id: foundUser._id || foundUser.id || normalizedPhone, name: foundUser.fio || foundUser.name || foundUser._id || 'Пользователь', phone: normalizedPhone, role: userRole, isAuthenticated: true, hash: sessionHash, // Hash для WebSocket авторизации // Дополнительные данные из профиля group: foundUser.groupz ? foundUser.groupz.name : null, color: foundUser.color || null, balance: foundUser.bal || null, devAuth: true, // Флаг что это разработческая авторизация serverConnected: global.conn_to_server } }; res.end(JSON.stringify(response)); } catch (error) { console.error('[api/auth-dev] Критическая ошибка при авторизации:', error); res.end(JSON.stringify({ success: false, error: "Внутренняя ошибка сервера при авторизации" })); } };