179 lines
7.5 KiB
JavaScript
179 lines
7.5 KiB
JavaScript
// 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 для пользовательских списков подключено');
|
||
}; |