diff --git a/backend/app.js b/backend/app.js index a3b2c24..cd821cc 100644 --- a/backend/app.js +++ b/backend/app.js @@ -63,6 +63,7 @@ const isicRoutes = require('./routes/isic'); // Добавленный импо const geocodingRoutes = require('./routes/geocoding'); // Добавленный импорт const dleRoutes = require('./routes/dle'); // Добавляем импорт DLE маршрутов const settingsRoutes = require('./routes/settings'); // Добавляем импорт маршрутов настроек +const tablesRoutes = require('./routes/tables'); // Добавляем импорт таблиц const app = express(); @@ -154,9 +155,10 @@ app.use((req, res, next) => { }); // Маршруты API +app.use('/api/tables', tablesRoutes); // ДОЛЖНО БЫТЬ ВЫШЕ! +app.use('/api', identitiesRoutes); app.use('/api/auth', authRoutes); app.use('/api/users', usersRoutes); -app.use('/api', identitiesRoutes); app.use('/api/chat', chatRoutes); app.use('/api/admin', adminRoutes); app.use('/api/tokens', tokensRouter); diff --git a/backend/db/migrations/028_create_dynamic_tables.sql b/backend/db/migrations/028_create_dynamic_tables.sql index ed33cbd..37bc753 100644 --- a/backend/db/migrations/028_create_dynamic_tables.sql +++ b/backend/db/migrations/028_create_dynamic_tables.sql @@ -8,6 +8,7 @@ CREATE TABLE IF NOT EXISTS user_tables ( updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); + CREATE TABLE IF NOT EXISTS user_columns ( id SERIAL PRIMARY KEY, table_id INTEGER NOT NULL REFERENCES user_tables(id) ON DELETE CASCADE, @@ -15,7 +16,8 @@ CREATE TABLE IF NOT EXISTS user_columns ( type VARCHAR(50) NOT NULL, -- text, number, select, multiselect, date, etc. options JSONB DEFAULT NULL, -- для select/multiselect "order" INTEGER DEFAULT 0, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS user_rows ( diff --git a/backend/middleware/auth.js b/backend/middleware/auth.js index 4930023..f21dcf3 100644 --- a/backend/middleware/auth.js +++ b/backend/middleware/auth.js @@ -1,3 +1,5 @@ +console.log('[DIAG][auth.js] Файл загружен:', __filename); + const { createError } = require('../utils/error'); const authService = require('../services/auth-service'); const logger = require('../utils/logger'); @@ -9,82 +11,12 @@ const { checkAdminTokens } = require('../services/auth-service'); * Middleware для проверки аутентификации */ const requireAuth = async (req, res, next) => { - try { - console.log('Session in requireAuth:', { - id: req.sessionID, - userId: req.session?.userId, - authenticated: req.session?.authenticated, - }); - - // Проверяем сессию - if (req.session?.authenticated && req.session?.userId) { - // Обновляем время жизни сессии - req.session.touch(); - - req.user = { - userId: req.session.userId, - address: req.session.address, - isAdmin: req.session.isAdmin, - authType: req.session.authType, - }; - return next(); - } - - // Проверяем Bearer токен - const authHeader = req.headers.authorization; - if (authHeader?.startsWith('Bearer ')) { - const address = authHeader.split(' ')[1]; - - if (address.startsWith('0x')) { - const result = await db.getQuery()( - ` - SELECT u.id, u.is_admin - FROM users u - JOIN user_identities ui ON u.id = ui.user_id - WHERE ui.identity_type = 'wallet' - AND LOWER(ui.identity_value) = LOWER($1) - `, - [address] - ); - - if (result.rows.length > 0) { - const user = result.rows[0]; - - // Создаем новую сессию - req.session.regenerate(async (err) => { - if (err) { - console.error('Error regenerating session:', err); - return res.status(500).json({ error: 'Session error' }); - } - - // Устанавливаем данные сессии - req.session.authenticated = true; - req.session.userId = user.id; - req.session.address = address; - req.session.isAdmin = user.is_admin; - req.session.authType = 'wallet'; - - // Сохраняем сессию - await new Promise((resolve) => req.session.save(resolve)); - - req.user = { - userId: user.id, - address: address, - isAdmin: user.is_admin, - authType: 'wallet', - }; - next(); - }); - return; - } - } - } - - return res.status(401).json({ error: 'Unauthorized' }); - } catch (error) { - console.error('Auth middleware error:', error); - return res.status(500).json({ error: 'Internal server error' }); + console.log('[DIAG][requireAuth] session:', req.session); + if (!req.session || !req.session.authenticated) { + return res.status(401).json({ error: 'Требуется аутентификация' }); } + // Можно добавить проверку isAdmin здесь, если нужно + next(); }; /** diff --git a/backend/routes/tables.js b/backend/routes/tables.js index e207244..eb094bf 100644 --- a/backend/routes/tables.js +++ b/backend/routes/tables.js @@ -1,3 +1,5 @@ +console.log('[DIAG][tables.js] Файл загружен:', __filename); + const express = require('express'); const router = express.Router(); const db = require('../db'); @@ -196,23 +198,37 @@ router.patch('/:id', async (req, res, next) => { // DELETE: удалить таблицу и каскадно все связанные строки/столбцы/ячейки (доступно всем) router.delete('/:id', requireAuth, async (req, res, next) => { + const dbModule = require('../db'); try { - const tableId = Number(req.params.id); - console.log('Backend: typeof tableId:', typeof tableId, 'value:', tableId); - // Проверяем, существует ли таблица - const checkResult = await db.getQuery()('SELECT id, name FROM user_tables WHERE id = $1', [tableId]); - console.log('Backend: Table check result:', checkResult.rows); - if (checkResult.rows.length === 0) { - console.log('Backend: Table not found'); - return res.status(404).json({ error: 'Table not found' }); + // Логируем строку подключения и pool.options + console.log('[DIAG][DELETE] pool.options:', dbModule.pool.options); + console.log('[DIAG][DELETE] process.env.DATABASE_URL:', process.env.DATABASE_URL); + console.log('[DIAG][DELETE] process.env.DB_HOST:', process.env.DB_HOST); + console.log('[DIAG][DELETE] process.env.DB_NAME:', process.env.DB_NAME); + console.log('=== [DIAG] Попытка удаления таблицы ==='); + console.log('Сессия пользователя:', req.session); + if (!req.session.isAdmin) { + console.log('[DIAG] Нет прав администратора'); + return res.status(403).json({ error: 'Удаление доступно только администраторам' }); } - // Удаляем только основную таблицу - каскадное удаление сработает автоматически - console.log('Backend: Executing DELETE query for table_id:', tableId); - const result = await db.getQuery()('DELETE FROM user_tables WHERE id = $1', [tableId]); - console.log('Backend: Delete result - rowCount:', result.rowCount); + const tableId = Number(req.params.id); + console.log('[DIAG] id из запроса:', req.params.id, 'Преобразованный id:', tableId, 'typeof:', typeof tableId); + + // Проверяем наличие таблицы перед удалением + const checkBefore = await db.getQuery()('SELECT * FROM user_tables WHERE id = $1', [tableId]); + console.log('[DIAG] Таблица перед удалением:', checkBefore.rows); + + // Пытаемся удалить + const result = await db.getQuery()('DELETE FROM user_tables WHERE id = $1 RETURNING *', [tableId]); + console.log('[DIAG] Результат удаления (rowCount):', result.rowCount, 'rows:', result.rows); + + // Проверяем наличие таблицы после удаления + const checkAfter = await db.getQuery()('SELECT * FROM user_tables WHERE id = $1', [tableId]); + console.log('[DIAG] Таблица после удаления:', checkAfter.rows); + res.json({ success: true, deleted: result.rowCount }); } catch (err) { - console.error('Backend: Error deleting table:', err); + console.error('[DIAG] Ошибка при удалении таблицы:', err); next(err); } }); diff --git a/frontend/src/components/cells/CellCheckbox.vue b/frontend/src/components/cells/CellCheckbox.vue deleted file mode 100644 index c17d3eb..0000000 --- a/frontend/src/components/cells/CellCheckbox.vue +++ /dev/null @@ -1,12 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/cells/CellDate.vue b/frontend/src/components/cells/CellDate.vue deleted file mode 100644 index c8b4fb3..0000000 --- a/frontend/src/components/cells/CellDate.vue +++ /dev/null @@ -1,16 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/cells/CellNumber.vue b/frontend/src/components/cells/CellNumber.vue deleted file mode 100644 index 4d5a02b..0000000 --- a/frontend/src/components/cells/CellNumber.vue +++ /dev/null @@ -1,9 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/cells/CellSelect.vue b/frontend/src/components/cells/CellSelect.vue deleted file mode 100644 index cdf2553..0000000 --- a/frontend/src/components/cells/CellSelect.vue +++ /dev/null @@ -1,20 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/cells/CellText.vue b/frontend/src/components/cells/CellText.vue deleted file mode 100644 index 37ebb8b..0000000 --- a/frontend/src/components/cells/CellText.vue +++ /dev/null @@ -1,9 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/tables/DynamicTableEditor.vue b/frontend/src/components/tables/DynamicTableEditor.vue deleted file mode 100644 index 3fcd0a4..0000000 --- a/frontend/src/components/tables/DynamicTableEditor.vue +++ /dev/null @@ -1,276 +0,0 @@ -