feat: adicionar gerenciamento de clínicas e tokens

This commit is contained in:
VPS 4 Builder
2026-05-26 02:59:11 +02:00
parent 5e86717d12
commit 75c4bf3f87
14 changed files with 1241 additions and 2123 deletions
+66 -8
View File
@@ -48,7 +48,10 @@ router.post('/login', async (req, res) => {
user: {
id: user.id,
username: user.username,
email: user.email
email: user.email,
clinic_name: user.clinic_name,
pc_name: user.pc_name,
is_admin: user.is_admin
}
});
@@ -85,7 +88,10 @@ router.get('/verify', async (req, res) => {
user: {
id: user.id,
username: user.username,
email: user.email
email: user.email,
clinic_name: user.clinic_name,
pc_name: user.pc_name,
is_admin: user.is_admin
}
});
@@ -109,13 +115,17 @@ router.post('/logout', (req, res) => {
// POST /api/auth/create-user - Criar usuário (admin only)
// ================================================================
router.post('/create-user', async (req, res) => {
router.post('/create-user', authenticateToken, async (req, res) => {
try {
const { username, email, password } = req.body;
if (!req.user.is_admin) {
return res.status(403).json({ error: 'Apenas administradores podem criar usuários' });
}
const { username, email, password, clinic_name, pc_name } = req.body;
if (!username || !email || !password) {
return res.status(400).json({
error: 'Todos os campos são obrigatórios'
error: 'Username, email e senha são obrigatórios'
});
}
@@ -136,9 +146,9 @@ router.post('/create-user', async (req, res) => {
// Criar usuário
const result = await db.run(
`INSERT INTO users (username, email, password_hash, created_at)
VALUES (?, ?, ?, NOW())`,
[username, email, passwordHash]
`INSERT INTO users (username, email, password_hash, clinic_name, pc_name, created_at)
VALUES (?, ?, ?, ?, ?, NOW())`,
[username, email, passwordHash, clinic_name || null, pc_name || null]
);
res.json({
@@ -153,6 +163,54 @@ router.post('/create-user', async (req, res) => {
}
});
// ================================================================
// GERENCIAMENTO DE USUÁRIOS/CLÍNICAS (ADMIN)
// ================================================================
router.get('/users', authenticateToken, async (req, res) => {
try {
if (!req.user.is_admin) {
return res.status(403).json({ error: 'Acesso negado' });
}
const users = await db.all('SELECT id, username, email, clinic_name, pc_name, is_admin, created_at FROM users ORDER BY created_at DESC');
res.json({ success: true, users });
} catch (error) {
res.status(500).json({ error: 'Erro ao buscar usuários' });
}
});
router.delete('/users/:id', authenticateToken, async (req, res) => {
try {
if (!req.user.is_admin) {
return res.status(403).json({ error: 'Acesso negado' });
}
const userId = req.params.id;
if (parseInt(userId) === req.user.id) {
return res.status(400).json({ error: 'Não é possível excluir o próprio usuário admin' });
}
await db.run('DELETE FROM users WHERE id = ?', [userId]);
res.json({ success: true, message: 'Usuário excluído com sucesso' });
} catch (error) {
res.status(500).json({ error: 'Erro ao excluir usuário' });
}
});
router.post('/users/:id/token', authenticateToken, async (req, res) => {
try {
if (!req.user.is_admin) {
return res.status(403).json({ error: 'Acesso negado' });
}
const user = await db.get('SELECT * FROM users WHERE id = ?', [req.params.id]);
if (!user) return res.status(404).json({ error: 'Usuário não encontrado' });
// Gera um token com duração longa para uso no desktop (ex: 3650 dias = ~10 anos)
const token = generateToken(user, '3650d');
res.json({ success: true, token });
} catch (error) {
res.status(500).json({ error: 'Erro ao gerar token' });
}
});
// ================================================================
// PUT /api/auth/update-credentials - Alterar usuário/senha
// ================================================================