@@ -6,113 +6,120 @@ import {
66import * as argon from 'argon2'
77import { AuthDto } from './dto'
88import { PrismaService } from 'src/prisma/prisma.service'
9- import { Request } from 'express '
9+ import { FastifyRequest } from 'fastify '
1010import { Users } from '@prisma/client'
1111
1212@Injectable ( )
1313export class AuthService {
1414 constructor ( private prisma : PrismaService ) { }
1515
16- async signupLocal ( dto : AuthDto , req : Request ) : Promise < Users > {
17- const User = await this . prisma . users . findUnique ( {
18- where : {
19- username : dto . username ,
20- email : dto . email ,
21- } ,
16+ async signupLocal ( dto : AuthDto , req : FastifyRequest ) : Promise < Users > {
17+ // Проверка, существует ли уже пользователь
18+ const existingUser = await this . prisma . users . findUnique ( {
19+ where : { username : dto . username , email : dto . email } ,
2220 } )
21+ if ( existingUser ) {
22+ throw new BadRequestException ( 'User already exists' )
23+ }
2324
24- if ( User ) throw { message : 'User already exists' }
25-
25+ // Хэширование пароля
2626 const hash = await argon . hash ( dto . password )
2727 dto . password = undefined
2828
29- await this . saveSession ( req , User )
30-
31- return this . prisma . users . create ( {
32- data : {
33- ...dto ,
34- hash : hash ,
35- } ,
29+ // Создание нового пользователя в базе данных
30+ const newUser = await this . prisma . users . create ( {
31+ data : { ...dto , hash : hash } ,
3632 } )
33+
34+ // Сохранение сессии с данными нового пользователя
35+ await this . saveSession ( req , newUser )
36+
37+ return newUser
3738 }
3839
39- async ValidateUser ( dto : AuthDto ) : Promise < any > {
40- const User = await this . prisma . users . findUnique ( {
40+ async ValidateUser ( dto : AuthDto ) : Promise < Users > {
41+ const user = await this . prisma . users . findUnique ( {
4142 where : { username : dto . username } ,
4243 } )
44+ if ( ! user ) throw new ForbiddenException ( 'Access Denied' )
4345
44- if ( ! User ) throw new ForbiddenException ( 'Access Denied' )
45-
46- const passwordMatches = await argon . verify ( User . hash , dto . password )
46+ const passwordMatches = await argon . verify ( user . hash , dto . password )
4747 if ( ! passwordMatches ) throw new ForbiddenException ( 'Access Denied' )
4848
49- return User
49+ return user
5050 }
5151
52- async signinLocal ( dto : AuthDto , req : Request ) : Promise < Users > {
53- const User = await this . ValidateUser ( dto )
54-
55- await this . saveSession ( req , User , dto . remember )
56-
57- return User
52+ async signinLocal ( dto : AuthDto , req : FastifyRequest ) : Promise < Users > {
53+ const user = await this . ValidateUser ( dto )
54+ await this . saveSession ( req , user , dto . remember )
55+ return user
5856 }
5957
60- async logout ( req : Request ) : Promise < boolean > {
58+ async logout ( req : FastifyRequest ) : Promise < boolean > {
6159 await this . destroySession ( req )
6260 return true
6361 }
6462
65- async ValidateOAuthUser ( dto : AuthDto , req : Request ) : Promise < any > {
66- const User = await this . prisma . users . findUnique ( {
67- where : {
68- username : dto . username ,
69- email : dto . email ,
70- } ,
63+ async ValidateOAuthUser ( dto : AuthDto , req : FastifyRequest ) : Promise < Users > {
64+ const user = await this . prisma . users . findUnique ( {
65+ where : { username : dto . username , email : dto . email } ,
7166 } )
72-
73- if ( User ) {
74- await this . saveSession ( req , User , true )
75- return User
67+ if ( user ) {
68+ await this . saveSession ( req , user , true )
69+ return user
7670 }
7771
72+ // Если пользователь не найден, создаем нового
7873 const hash = await argon . hash ( dto . password )
7974 dto . password = undefined
80-
81- const user = await this . prisma . users . create ( {
82- data : {
83- ...dto ,
84- hash : hash ,
85- } ,
75+ const newUser = await this . prisma . users . create ( {
76+ data : { ...dto , hash : hash } ,
8677 } )
8778
88- if ( user ) {
89- await this . saveSession ( req , User , true )
90- return user
79+ if ( newUser ) {
80+ await this . saveSession ( req , newUser , true )
81+ return newUser
9182 }
92- return new BadRequestException ( )
83+ throw new BadRequestException ( 'OAuth validation failed' )
9384 }
9485
9586 private async saveSession (
96- req : Request ,
87+ req : FastifyRequest ,
9788 user : Users ,
9889 remember ?: boolean ,
9990 ) : Promise < boolean > {
10091 return new Promise ( ( resolve , reject ) => {
101- if ( ! remember ) req . session . cookie . maxAge = 1000
92+ // Установка времени жизни cookie в зависимости от флага remember
93+ if ( remember ) {
94+ req . session . cookie . maxAge = 1000 * 60 * 60 * 24 * 30 // 30 дней
95+ } else {
96+ req . session . cookie . maxAge = 1000 * 60 * 10 // 10 минут
97+ }
98+
10299 req . session . user = { ...user }
103100 req . session . save ( ( err ) => {
104- if ( err ) reject ( err )
105- else resolve ( true )
101+ if ( err ) {
102+ reject ( err )
103+ } else {
104+ resolve ( true )
105+ }
106106 } )
107107 } )
108108 }
109109
110- private async destroySession ( req : Request ) : Promise < boolean > {
110+ private async destroySession ( req : FastifyRequest ) : Promise < boolean > {
111111 return new Promise ( ( resolve , reject ) => {
112- req . session . destroy ( ( err ) => {
113- if ( err ) reject ( err )
114- else resolve ( true )
115- } )
112+ if ( req . session ) {
113+ req . session . destroy ( ( err ) => {
114+ if ( err ) {
115+ reject ( err )
116+ } else {
117+ resolve ( true )
118+ }
119+ } )
120+ } else {
121+ reject ( new Error ( 'Session handling is not available' ) )
122+ }
116123 } )
117124 }
118125}
0 commit comments