Initial commit
This commit is contained in:
110
routes/users.js
Executable file
110
routes/users.js
Executable file
@@ -0,0 +1,110 @@
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
const db = require('../db');
|
||||
const jwt = require('jsonwebtoken');
|
||||
const bcrypt = require('bcryptjs');
|
||||
const rateLimit = require('express-rate-limit');
|
||||
|
||||
if (!process.env.JWT_SECRET) {
|
||||
throw new Error('JWT_SECRET não definido no .env');
|
||||
}
|
||||
|
||||
// limiter só para auth
|
||||
const authLimiter = rateLimit({
|
||||
windowMs: 60 * 1000,
|
||||
max: 10,
|
||||
standardHeaders: true,
|
||||
legacyHeaders: false,
|
||||
});
|
||||
|
||||
// POST /api/users/login
|
||||
router.post('/login', authLimiter, async (req, res) => {
|
||||
const { username, password } = req.body;
|
||||
|
||||
if (!username || !password) {
|
||||
return res
|
||||
.status(400)
|
||||
.json({ success: false, message: 'Usuário e senha são obrigatórios' });
|
||||
}
|
||||
|
||||
try {
|
||||
const user = await db('users').where({ username }).first();
|
||||
|
||||
if (!user) {
|
||||
return res
|
||||
.status(401)
|
||||
.json({ success: false, message: 'Credenciais inválidas' });
|
||||
}
|
||||
|
||||
const isValidPassword = await bcrypt.compare(password, user.password);
|
||||
if (!isValidPassword) {
|
||||
return res
|
||||
.status(401)
|
||||
.json({ success: false, message: 'Credenciais inválidas' });
|
||||
}
|
||||
|
||||
const token = jwt.sign(
|
||||
{ id: user.id, username: user.username },
|
||||
process.env.JWT_SECRET,
|
||||
{ expiresIn: '24h' }
|
||||
);
|
||||
|
||||
return res.json({ success: true, data: { token } });
|
||||
} catch (err) {
|
||||
console.error('Erro ao autenticar usuário:', err);
|
||||
return res
|
||||
.status(500)
|
||||
.json({ success: false, message: 'Erro interno do servidor' });
|
||||
}
|
||||
});
|
||||
|
||||
// POST /api/users/register
|
||||
router.post('/register', authLimiter, async (req, res) => {
|
||||
const { username, password } = req.body;
|
||||
|
||||
if (
|
||||
!username ||
|
||||
!password ||
|
||||
typeof username !== 'string' ||
|
||||
typeof password !== 'string' ||
|
||||
username.length < 3 ||
|
||||
password.length < 4
|
||||
) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message:
|
||||
'Nome de usuário deve ter pelo menos 3 caracteres e senha pelo menos 4 caracteres',
|
||||
});
|
||||
}
|
||||
|
||||
try {
|
||||
const existing = await db('users').where({ username }).first();
|
||||
if (existing) {
|
||||
return res
|
||||
.status(409)
|
||||
.json({ success: false, message: 'Nome de usuário já está em uso' });
|
||||
}
|
||||
|
||||
const hashedPassword = await bcrypt.hash(password, 10);
|
||||
|
||||
const [row] = await db('users')
|
||||
.insert({ username, password: hashedPassword })
|
||||
.returning('id');
|
||||
|
||||
const token = jwt.sign(
|
||||
{ id: row.id, username },
|
||||
process.env.JWT_SECRET,
|
||||
{ expiresIn: '24h' }
|
||||
);
|
||||
|
||||
return res.status(201).json({ success: true, data: { token } });
|
||||
} catch (err) {
|
||||
console.error('Erro ao registrar usuário:', err);
|
||||
return res.status(500).json({
|
||||
success: false,
|
||||
message: 'Erro interno ao registrar usuário',
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = router;
|
||||
Reference in New Issue
Block a user