Files
sts-avto-v2/modules/users/index.js
kalugin66 11fb813a09
All checks were successful
Deploy sts / deploy-sber (push) Successful in 42s
модификация
2026-07-20 00:27:48 +05:00

85 lines
4.3 KiB
JavaScript
Raw Permalink 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.
const bcrypt = require('bcryptjs');
let db;
function init(database) { db = database; }
function setupRoutes(app, auth) {
const { authenticateToken, requireAdmin } = auth;
app.get('/api/admin/users', authenticateToken, requireAdmin, (req, res) => {
db.all(`SELECT id, login, full_name, role, created_at FROM users ORDER BY id`, (err, rows) => {
if (err) return res.status(500).json({ error: 'Ошибка БД' });
res.json(rows);
});
});
app.post('/api/admin/users', authenticateToken, requireAdmin, (req, res) => {
const { login, password, full_name, role } = req.body;
if (!login || !password) return res.status(400).json({ error: 'Логин и пароль обязательны' });
const hash = bcrypt.hashSync(password, 10);
const stmt = db.prepare(`INSERT INTO users (login, password_hash, full_name, role) VALUES (?, ?, ?, ?)`);
stmt.run(login, hash, full_name || '', role || 'admin', function(err) {
if (err) {
if (err.message.includes('UNIQUE')) return res.status(409).json({ error: 'Пользователь с таким логином уже существует' });
return res.status(500).json({ error: 'Ошибка создания' });
}
db.get(`SELECT id, login, full_name, role, created_at FROM users WHERE id = ?`, [this.lastID], (e2, row) => {
res.status(201).json(row);
});
});
stmt.finalize();
});
app.put('/api/admin/users/:id', authenticateToken, requireAdmin, (req, res) => {
const id = parseInt(req.params.id);
if (isNaN(id)) return res.status(400).json({ error: 'Неверный ID' });
const { login, password, full_name, role } = req.body;
if (password) {
const hash = bcrypt.hashSync(password, 10);
const stmt = db.prepare(`UPDATE users SET login = ?, password_hash = ?, full_name = ?, role = ? WHERE id = ?`);
stmt.run(login, hash, full_name || '', role || 'admin', id, function(err) {
if (err) return res.status(500).json({ error: 'Ошибка обновления' });
if (this.changes === 0) return res.status(404).json({ error: 'Не найдено' });
db.get(`SELECT id, login, full_name, role, created_at FROM users WHERE id = ?`, [id], (e2, row) => {
res.json(row);
});
});
stmt.finalize();
} else {
const stmt = db.prepare(`UPDATE users SET login = ?, full_name = ?, role = ? WHERE id = ?`);
stmt.run(login, full_name || '', role || 'admin', id, function(err) {
if (err) return res.status(500).json({ error: 'Ошибка обновления' });
if (this.changes === 0) return res.status(404).json({ error: 'Не найдено' });
db.get(`SELECT id, login, full_name, role, created_at FROM users WHERE id = ?`, [id], (e2, row) => {
res.json(row);
});
});
stmt.finalize();
}
});
app.delete('/api/admin/users/:id', authenticateToken, requireAdmin, (req, res) => {
const id = parseInt(req.params.id);
if (isNaN(id)) return res.status(400).json({ error: 'Неверный ID' });
if (id === req.user.id) return res.status(400).json({ error: 'Нельзя удалить самого себя' });
const superadmin = process.env.ADMIN_USERNAME || 'admin';
db.get(`SELECT login FROM users WHERE id = ?`, [id], (e1, row) => {
if (row && row.login === superadmin) {
return res.status(400).json({ error: 'Нельзя удалить суперадминистратора из .env' });
}
const stmt = db.prepare(`DELETE FROM users WHERE id = ?`);
stmt.run(id, function(err) {
if (err) return res.status(500).json({ error: 'Ошибка удаления' });
if (this.changes === 0) return res.status(404).json({ error: 'Не найдено' });
res.json({ message: 'Пользователь удалён' });
});
stmt.finalize();
});
});
}
module.exports = { init, setupRoutes };