create-exam-project
Version:
Create exam projects with React + Express + PostgreSQL in seconds
112 lines (98 loc) • 3.2 kB
JavaScript
const express = require('express');
const router = express.Router();
const { body, validationResult } = require('express-validator');
const jwt = require('jsonwebtoken');
const { User } = require('../models');
// Регистрация
router.post('/register', [
body('login').isLength({ min: 4 }).matches(/^[а-яА-ЯёЁa-zA-Z0-9]+$/),
body('password').isLength({ min: 6 }),
body('fullName').matches(/^[а-яА-ЯёЁ\s]+$/),
body('phone').matches(/^\+7\(\d{3}\)-\d{3}-\d{2}-\d{2}$/),
body('email').isEmail()
], async (req, res) => {
try {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
const { login, password, fullName, phone, email } = req.body;
// Проверка уникальности логина
const existingUser = await User.findOne({ where: { login } });
if (existingUser) {
return res.status(400).json({ message: 'Пользователь с таким логином уже существует' });
}
// Создание пользователя
const user = await User.create({
login,
password,
fullName,
phone,
email
});
// Генерация токена
const token = jwt.sign(
{ id: user.id, login: user.login, role: user.role },
process.env.JWT_SECRET,
{ expiresIn: '7d' }
);
res.status(201).json({
message: 'Регистрация успешна',
token,
user: {
id: user.id,
login: user.login,
fullName: user.fullName,
email: user.email,
role: user.role
}
});
} catch (error) {
console.error(error);
res.status(500).json({ message: 'Ошибка при регистрации' });
}
});
// Авторизация
router.post('/login', [
body('login').notEmpty(),
body('password').notEmpty()
], async (req, res) => {
try {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
const { login, password } = req.body;
// Поиск пользователя
const user = await User.findOne({ where: { login } });
if (!user) {
return res.status(401).json({ message: 'Неверный логин или пароль' });
}
// Проверка пароля
const isPasswordValid = await user.validatePassword(password);
if (!isPasswordValid) {
return res.status(401).json({ message: 'Неверный логин или пароль' });
}
// Генерация токена
const token = jwt.sign(
{ id: user.id, login: user.login, role: user.role },
process.env.JWT_SECRET,
{ expiresIn: '7d' }
);
res.json({
message: 'Авторизация успешна',
token,
user: {
id: user.id,
login: user.login,
fullName: user.fullName,
email: user.email,
role: user.role
}
});
} catch (error) {
console.error(error);
res.status(500).json({ message: 'Ошибка при авторизации' });
}
});
module.exports = router;