Files
DLE/backend/routes/access.js

228 lines
7.5 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const express = require('express');
const router = express.Router();
const { Pool } = require('pg');
const { requireAuth, requireAdmin } = require('../middleware/auth');
const db = require('../db');
const { ethers } = require('ethers');
const authService = require('../services/auth-service');
const logger = require('../utils/logger');
// Проверка доступа
router.get('/check', async (req, res) => {
try {
const { address } = req.query;
if (!address) {
return res.status(400).json({ error: 'Address is required' });
}
const isAdmin = await authService.checkAdminToken(address);
res.json({ isAdmin });
} catch (error) {
logger.error(`Error checking access: ${error.message}`);
res.status(500).json({ error: 'Internal server error' });
}
});
// Проверка прав администратора
router.get('/admin-only', async (req, res) => {
const walletAddress = req.headers['x-wallet-address'];
if (!walletAddress) {
return res.status(400).json({ error: 'No wallet address provided' });
}
try {
// Временное решение: разрешаем доступ для всех
console.log('Admin access requested by:', walletAddress);
res.json({ success: true });
} catch (error) {
console.error('Admin check error:', error);
res.status(500).json({ error: error.message });
}
});
// Получение всех токенов доступа
router.get('/tokens', async (req, res) => {
try {
const tokens = await authService.getAllTokens();
res.json(tokens);
} catch (error) {
logger.error(`Error getting tokens: ${error.message}`);
res.status(500).json({ error: 'Internal server error' });
}
});
// Создание токена
router.post('/tokens', async (req, res) => {
const walletAddress = req.headers['x-wallet-address'];
if (!walletAddress) {
return res.status(400).json({ error: 'No wallet address provided' });
}
try {
// Проверяем права администратора
const isAdmin = await authService.checkAdminToken(walletAddress);
if (!isAdmin) {
return res.status(403).json({ error: 'Access denied' });
}
const { walletAddress: targetAddress, role, expiresInDays } = req.body;
if (!targetAddress || !role || !expiresInDays) {
return res.status(400).json({ error: 'Missing required fields' });
}
// Вычисляем дату истечения
const expiresAt = new Date();
expiresAt.setDate(expiresAt.getDate() + parseInt(expiresInDays));
// Создаем токен
const result = await db.query(
'INSERT INTO access_tokens (wallet_address, role, expires_at) VALUES ($1, $2, $3) RETURNING *',
[targetAddress.toLowerCase(), role, expiresAt]
);
res.json({
id: result.rows[0].id,
walletAddress: result.rows[0].wallet_address,
role: result.rows[0].role,
createdAt: result.rows[0].created_at,
expiresAt: result.rows[0].expires_at,
});
} catch (error) {
console.error('Token creation error:', error);
res.status(500).json({ error: error.message });
}
});
// Отзыв токена
router.delete('/tokens/:id', async (req, res) => {
const walletAddress = req.headers['x-wallet-address'];
if (!walletAddress) {
return res.status(400).json({ error: 'No wallet address provided' });
}
try {
// Проверяем права администратора
const isAdmin = await authService.checkAdminToken(walletAddress);
if (!isAdmin) {
return res.status(403).json({ error: 'Access denied' });
}
const { id } = req.params;
// Удаляем токен
await db.query('DELETE FROM access_tokens WHERE id = $1', [id]);
res.json({ success: true });
} catch (error) {
console.error('Token revocation error:', error);
res.status(500).json({ error: error.message });
}
});
// Получение информации о роли текущего пользователя
router.get('/role', requireAuth, async (req, res) => {
try {
const role = await authService.getUserRole(req.user.id);
return res.json({ role });
} catch (error) {
logger.error('Ошибка при получении роли:', error);
return res.status(500).json({ error: 'Внутренняя ошибка сервера' });
}
});
// Получение списка всех пользователей (только для администраторов)
router.get('/users', requireAuth, requireAdmin, async (req, res) => {
try {
const result = await db.query(`
SELECT u.id, ui.identity_value as wallet_address, r.name as role, u.created_at
FROM users u
JOIN roles r ON u.role_id = r.id
LEFT JOIN user_identities ui ON u.id = ui.user_id AND ui.identity_type = 'wallet'
`);
return res.json(result.rows);
} catch (error) {
logger.error('Ошибка при получении списка пользователей:', error);
return res.status(500).json({ error: 'Внутренняя ошибка сервера' });
}
});
// Обновление роли пользователя
router.post('/update-role', async (req, res) => {
try {
const { userId, role } = req.body;
if (!userId || !role) {
return res.status(400).json({ error: 'User ID and role are required' });
}
const success = await authService.updateUserRole(userId, role);
if (success) {
res.json({ success: true });
} else {
res.status(400).json({ error: 'Failed to update role' });
}
} catch (error) {
logger.error(`Error updating role: ${error.message}`);
res.status(500).json({ error: 'Internal server error' });
}
});
// Связывание нового идентификатора с аккаунтом
router.post('/link-identity', requireAuth, async (req, res) => {
try {
const { identityType, identityValue } = req.body;
if (!identityType || !identityValue) {
return res.status(400).json({ error: 'Отсутствуют обязательные поля' });
}
// Проверяем, не привязан ли уже этот идентификатор к другому пользователю
const existingUserId = await authService.getUserIdByIdentity(identityType, identityValue);
if (existingUserId && existingUserId !== req.user.id) {
return res.status(400).json({ error: 'Этот идентификатор уже привязан к другому аккаунту' });
}
// Добавляем новый идентификатор
if (!existingUserId) {
await db.query(
'INSERT INTO user_identities (user_id, identity_type, identity_value, created_at) VALUES ($1, $2, $3, NOW())',
[req.user.id, identityType, identityValue]
);
}
// Если добавлен кошелек, проверяем токены
if (identityType === 'wallet') {
await authService.checkTokensAndUpdateRole(identityValue);
}
// Получаем все идентификаторы пользователя
const identities = await authService.getAllUserIdentities(req.user.id);
// Получаем текущую роль
const isAdmin = await authService.isAdmin(req.user.id);
res.json({
success: true,
identities,
isAdmin
});
} catch (error) {
logger.error(`Link identity error: ${error.message}`);
res.status(500).json({ error: 'Ошибка сервера' });
}
});
module.exports = router;