Files
ospab.host/ospabhost/backend/src/modules/auth/auth.controller.ts
2025-09-16 14:47:30 +03:00

126 lines
4.2 KiB
TypeScript
Raw 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.
import type { Request, Response } from 'express';
import bcrypt from 'bcryptjs';
import jwt from 'jsonwebtoken';
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
// Замените 'любая_секретная_строка' на вашу переменную окружения JWT_SECRET
const JWT_SECRET = process.env.JWT_SECRET || 'любая_секретная_строка';
export const register = async (req: Request, res: Response) => {
try {
const { username, email, password } = req.body as Partial<{ username: string; email: string; password: string }>;
if (!username || !email || !password) {
return res.status(400).json({ message: 'Необходимо указать username, email и password' });
}
// Проверка, есть ли уже пользователь с таким email
const existingUser = await prisma.user.findUnique({ where: { email } });
if (existingUser) {
return res.status(409).json({ message: 'Пользователь с таким email уже существует.' });
}
// Хеширование пароля
const salt = await bcrypt.genSalt(10);
const hashedPassword = await bcrypt.hash(password, salt);
// Создание нового пользователя в базе данных
const newUser = await prisma.user.create({
data: {
username,
email,
password: hashedPassword,
},
});
// Генерация JWT токена
const token = jwt.sign({ id: newUser.id }, JWT_SECRET, { expiresIn: '1h' });
res.status(201).json({
message: 'Регистрация прошла успешно!',
token,
user: {
id: newUser.id,
username: newUser.username,
email: newUser.email,
},
});
} catch (error) {
console.error('Ошибка при регистрации:', error);
res.status(500).json({ message: 'Внутренняя ошибка сервера' });
}
};
export const login = async (req: Request, res: Response) => {
try {
const { email, password } = req.body as Partial<{ email: string; password: string }>;
if (!email || !password) {
return res.status(400).json({ message: 'Необходимо указать email и password' });
}
// Поиск пользователя по email
const user = await prisma.user.findUnique({ where: { email } });
if (!user) {
return res.status(401).json({ message: 'Неверный email или пароль' });
}
// Проверка пароля
const isMatch = await bcrypt.compare(password, user.password);
if (!isMatch) {
return res.status(401).json({ message: 'Неверный email или пароль' });
}
// Генерация JWT токена
const token = jwt.sign({ id: user.id }, JWT_SECRET, { expiresIn: '1h' });
res.status(200).json({
message: 'Вход выполнен успешно!',
token,
user: {
id: user.id,
username: user.username,
email: user.email,
},
});
} catch (error) {
console.error('Ошибка при входе:', error);
res.status(500).json({ message: 'Внутренняя ошибка сервера' });
}
};
type AuthRequest = Request & { userId?: number };
export const getMe = async (req: AuthRequest, res: Response) => {
try {
// ID пользователя будет добавлен мидлваром
const userId = req.userId;
if (!userId) {
return res.status(401).json({ message: 'Не авторизован' });
}
// Получение пользователя из базы данных, исключая пароль
const user = await prisma.user.findUnique({
where: { id: userId },
select: {
id: true,
username: true,
email: true,
createdAt: true,
},
});
if (!user) {
return res.status(404).json({ message: 'Пользователь не найден' });
}
res.status(200).json({ user });
} catch (error) {
console.error('Ошибка при получении данных пользователя:', error);
res.status(500).json({ message: 'Внутренняя ошибка сервера' });
}
};