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 @@
-
- {{ formatted }}
-
-
-
\ 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 @@
-
- {{ value }}
-
-
-
\ 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 @@
-
-
- {{ v }}
-
- {{ value }}
-
-
-
\ 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 @@
-
- {{ value }}
-
-
-
\ 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 @@
-
-
-
-
-
-
-
-
- {{ col.name }}
- Действия
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
| + {{ col.name }} + + + | ++ + | +
|---|---|
| + {{ getCellValue(row, col) || '—' }} + + | ++ + | +
| + + | +
{{ table.description || 'Без описания' }}
-Удалить таблицу {{ selectedTable?.name }}?
+