// api-user-lists.js - API для управления пользовательскими списками const express = require('express'); const router = express.Router(); module.exports = function(app, db) { // Middleware для проверки аутентификации const requireAuth = (req, res, next) => { if (!req.session || !req.session.user) { return res.status(401).json({ error: 'Требуется аутентификация' }); } next(); }; // GET /api/user/lists – получить все списки текущего пользователя router.get('/api/user/lists', requireAuth, (req, res) => { const userId = req.session.user.id; db.all( 'SELECT id, name, user_ids, created_at, updated_at FROM user_lists WHERE user_id = ? ORDER BY created_at DESC', [userId], (err, rows) => { if (err) { console.error('❌ Ошибка получения списков:', err); return res.status(500).json({ error: 'Ошибка получения списков' }); } // Преобразуем user_ids из JSON в массив const lists = (rows || []).map(row => ({ ...row, user_ids: JSON.parse(row.user_ids || '[]') })); res.json(lists); } ); }); // POST /api/user/lists – создать новый список router.post('/api/user/lists', requireAuth, (req, res) => { const userId = req.session.user.id; const { name, userIds } = req.body; if (!name || name.trim() === '') { return res.status(400).json({ error: 'Название списка обязательно' }); } if (name.length > 35) { return res.status(400).json({ error: 'Название не должно превышать 35 символов' }); } if (!Array.isArray(userIds)) { return res.status(400).json({ error: 'userIds должен быть массивом' }); } const user_ids_json = JSON.stringify(userIds); db.run( 'INSERT INTO user_lists (user_id, name, user_ids) VALUES (?, ?, ?)', [userId, name.trim(), user_ids_json], function(err) { if (err) { console.error('❌ Ошибка создания списка:', err); return res.status(500).json({ error: 'Ошибка создания списка' }); } // Возвращаем созданный список db.get( 'SELECT id, name, user_ids, created_at, updated_at FROM user_lists WHERE id = ?', [this.lastID], (err, row) => { if (err) { return res.status(500).json({ error: 'Список создан, но ошибка получения' }); } const newList = { ...row, user_ids: JSON.parse(row.user_ids || '[]') }; res.status(201).json(newList); } ); } ); }); // PUT /api/user/lists/:id – обновить список router.put('/api/user/lists/:id', requireAuth, (req, res) => { const listId = req.params.id; const userId = req.session.user.id; const { name, userIds } = req.body; // Проверяем, принадлежит ли список пользователю db.get('SELECT id FROM user_lists WHERE id = ? AND user_id = ?', [listId, userId], (err, list) => { if (err) { console.error('❌ Ошибка проверки списка:', err); return res.status(500).json({ error: 'Ошибка доступа' }); } if (!list) { return res.status(404).json({ error: 'Список не найден' }); } const updates = []; const params = []; if (name !== undefined) { if (name.trim() === '') { return res.status(400).json({ error: 'Название не может быть пустым' }); } if (name.length > 35) { return res.status(400).json({ error: 'Название не должно превышать 35 символов' }); } updates.push('name = ?'); params.push(name.trim()); } if (userIds !== undefined) { if (!Array.isArray(userIds)) { return res.status(400).json({ error: 'userIds должен быть массивом' }); } updates.push('user_ids = ?'); params.push(JSON.stringify(userIds)); } if (updates.length === 0) { return res.status(400).json({ error: 'Нет данных для обновления' }); } updates.push('updated_at = CURRENT_TIMESTAMP'); params.push(listId); const query = `UPDATE user_lists SET ${updates.join(', ')} WHERE id = ?`; db.run(query, params, function(err) { if (err) { console.error('❌ Ошибка обновления списка:', err); return res.status(500).json({ error: 'Ошибка обновления списка' }); } // Возвращаем обновлённый список db.get( 'SELECT id, name, user_ids, created_at, updated_at FROM user_lists WHERE id = ?', [listId], (err, row) => { if (err) { return res.status(500).json({ error: 'Список обновлён, но ошибка получения' }); } const updatedList = { ...row, user_ids: JSON.parse(row.user_ids || '[]') }; res.json(updatedList); } ); }); }); }); // DELETE /api/user/lists/:id – удалить список router.delete('/api/user/lists/:id', requireAuth, (req, res) => { const listId = req.params.id; const userId = req.session.user.id; db.run( 'DELETE FROM user_lists WHERE id = ? AND user_id = ?', [listId, userId], function(err) { if (err) { console.error('❌ Ошибка удаления списка:', err); return res.status(500).json({ error: 'Ошибка удаления списка' }); } if (this.changes === 0) { return res.status(404).json({ error: 'Список не найден' }); } res.json({ success: true, message: 'Список удалён' }); } ); }); // Подключаем роутер к приложению app.use(router); console.log('✅ API для пользовательских списков подключено'); };