|
|
|
|
@@ -3,7 +3,7 @@ const bcrypt = require('bcryptjs');
|
|
|
|
|
const multer = require('multer');
|
|
|
|
|
const path = require('path');
|
|
|
|
|
const router = express.Router();
|
|
|
|
|
const { getDb, addUserToPublicGroups } = require('../models/db');
|
|
|
|
|
const { getDb, addUserToPublicGroups, getOrCreateSupportGroup } = require('../models/db');
|
|
|
|
|
const { authMiddleware, adminMiddleware } = require('../middleware/auth');
|
|
|
|
|
|
|
|
|
|
const avatarStorage = multer.diskStorage({
|
|
|
|
|
@@ -121,6 +121,13 @@ router.post('/', authMiddleware, adminMiddleware, (req, res) => {
|
|
|
|
|
`).run(resolvedName, email, hash, role === 'admin' ? 'admin' : 'member');
|
|
|
|
|
|
|
|
|
|
addUserToPublicGroups(result.lastInsertRowid);
|
|
|
|
|
// Admin users are automatically added to the Support group
|
|
|
|
|
if (role === 'admin') {
|
|
|
|
|
const supportGroupId = getOrCreateSupportGroup();
|
|
|
|
|
if (supportGroupId) {
|
|
|
|
|
db.prepare('INSERT OR IGNORE INTO group_members (group_id, user_id) VALUES (?, ?)').run(supportGroupId, result.lastInsertRowid);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
const user = db.prepare('SELECT id, name, email, role, status, must_change_password, created_at FROM users WHERE id = ?').get(result.lastInsertRowid);
|
|
|
|
|
res.json({ user });
|
|
|
|
|
});
|
|
|
|
|
@@ -151,8 +158,15 @@ router.post('/bulk', authMiddleware, adminMiddleware, (req, res) => {
|
|
|
|
|
const resolvedName = resolveUniqueName(db, name);
|
|
|
|
|
const pw = (u.password || '').trim() || defaultPw;
|
|
|
|
|
const hash = bcrypt.hashSync(pw, 10);
|
|
|
|
|
const r = insertUser.run(resolvedName, email, hash, u.role === 'admin' ? 'admin' : 'member');
|
|
|
|
|
const newRole = u.role === 'admin' ? 'admin' : 'member';
|
|
|
|
|
const r = insertUser.run(resolvedName, email, hash, newRole);
|
|
|
|
|
addUserToPublicGroups(r.lastInsertRowid);
|
|
|
|
|
if (newRole === 'admin') {
|
|
|
|
|
const supportGroupId = getOrCreateSupportGroup();
|
|
|
|
|
if (supportGroupId) {
|
|
|
|
|
db.prepare('INSERT OR IGNORE INTO group_members (group_id, user_id) VALUES (?, ?)').run(supportGroupId, r.lastInsertRowid);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
results.created.push(email);
|
|
|
|
|
} catch (e) {
|
|
|
|
|
results.skipped.push({ email, reason: e.message });
|
|
|
|
|
@@ -184,6 +198,13 @@ router.patch('/:id/role', authMiddleware, adminMiddleware, (req, res) => {
|
|
|
|
|
if (target.is_default_admin) return res.status(403).json({ error: 'Cannot modify default admin role' });
|
|
|
|
|
if (!['member', 'admin'].includes(role)) return res.status(400).json({ error: 'Invalid role' });
|
|
|
|
|
db.prepare("UPDATE users SET role = ?, updated_at = datetime('now') WHERE id = ?").run(role, target.id);
|
|
|
|
|
// If promoted to admin, ensure they're in the Support group
|
|
|
|
|
if (role === 'admin') {
|
|
|
|
|
const supportGroupId = getOrCreateSupportGroup();
|
|
|
|
|
if (supportGroupId) {
|
|
|
|
|
db.prepare('INSERT OR IGNORE INTO group_members (group_id, user_id) VALUES (?, ?)').run(supportGroupId, target.id);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
res.json({ success: true });
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|