список пользователя

This commit is contained in:
2026-03-06 13:54:52 +05:00
parent bbab4434bb
commit 37b03dc1b5
5 changed files with 881 additions and 238 deletions

179
api-user-lists.js Normal file
View File

@@ -0,0 +1,179 @@
// 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 для пользовательских списков подключено');
};