function createCrudRoutes(app, auth, table, options = {}) { const { authenticateToken, requireAdmin } = auth; const prefix = options.prefix || `/api/admin/${table}`; const allowedFields = options.fields || []; const extraRoutes = options.extraRoutes || null; app.get(prefix, authenticateToken, requireAdmin, (req, res) => { const orderBy = options.orderBy || 'sort_order'; db.all(`SELECT * FROM ${table} ORDER BY ${orderBy}`, (err, rows) => { if (err) { console.error(err); return res.status(500).json({ error: 'Ошибка БД' }); } res.json(rows); }); }); app.post(prefix, authenticateToken, requireAdmin, (req, res) => { const values = allowedFields.map(f => req.body[f] !== undefined ? req.body[f] : null); const placeholders = values.map(() => '?').join(', '); const cols = allowedFields.join(', '); const stmt = db.prepare(`INSERT INTO ${table} (${cols}) VALUES (${placeholders})`); stmt.run(...values, function(err) { if (err) { console.error(err); return res.status(500).json({ error: 'Ошибка создания' }); } db.get(`SELECT * FROM ${table} WHERE id = ?`, [this.lastID], (err2, row) => { if (err2) return res.status(500).json({ error: 'Ошибка получения' }); res.status(201).json(row); }); }); stmt.finalize(); }); app.put(`${prefix}/:id`, authenticateToken, requireAdmin, (req, res) => { const id = parseInt(req.params.id); if (isNaN(id)) return res.status(400).json({ error: 'Неверный ID' }); const setClauses = allowedFields.map(f => `${f} = ?`).join(', '); const values = allowedFields.map(f => req.body[f] !== undefined ? req.body[f] : null); values.push(id); const stmt = db.prepare(`UPDATE ${table} SET ${setClauses} WHERE id = ?`); stmt.run(...values, function(err) { if (err) { console.error(err); return res.status(500).json({ error: 'Ошибка обновления' }); } if (this.changes === 0) return res.status(404).json({ error: 'Не найдено' }); db.get(`SELECT * FROM ${table} WHERE id = ?`, [id], (err2, row) => { if (err2) return res.status(500).json({ error: 'Ошибка получения' }); res.json(row); }); }); stmt.finalize(); }); app.delete(`${prefix}/:id`, authenticateToken, requireAdmin, (req, res) => { const id = parseInt(req.params.id); if (isNaN(id)) return res.status(400).json({ error: 'Неверный ID' }); const stmt = db.prepare(`DELETE FROM ${table} WHERE id = ?`); stmt.run(id, 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({ message: 'Удалено' }); }); stmt.finalize(); }); if (extraRoutes) extraRoutes(app, authenticateToken, requireAdmin); } let db; function init(database) { db = database; } module.exports = { createCrudRoutes, init };