Files
minicrm/api-user-lists.js

179 lines
7.5 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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 для пользовательских списков подключено');
};