@@ -10,8 +10,14 @@ import { UserAttributes, LoginAttributes } from 'models/user'
10
10
import SendMail from 'helpers/SendEmail'
11
11
import RefreshTokenService from 'controllers/RefreshToken/service'
12
12
import UserService from 'controllers/User/service'
13
+ import SessionService from 'controllers/Session/service'
14
+ import { Request } from 'express'
15
+ import userAgentHelper from 'helpers/userAgent'
16
+ import { verifyAccessToken } from 'helpers/Token'
17
+ import { isEmpty } from 'lodash'
13
18
14
19
const { User, Role } = models
20
+ const including = [ { model : Role } ]
15
21
16
22
const { JWT_SECRET_ACCESS_TOKEN , JWT_SECRET_REFRESH_TOKEN } : any = process . env
17
23
@@ -42,6 +48,9 @@ class AuthService {
42
48
* @param formData
43
49
*/
44
50
public static async signUp ( formData : UserAttributes ) {
51
+ // check duplicate email
52
+ await UserService . validateUserEmail ( formData . email )
53
+
45
54
const generateToken = {
46
55
code : getUniqueCodev2 ( ) ,
47
56
}
@@ -72,7 +81,9 @@ class AuthService {
72
81
*
73
82
* @param formData
74
83
*/
75
- public static async signIn ( formData : LoginAttributes ) {
84
+ public static async signIn ( req : Request , formData : LoginAttributes ) {
85
+ const { clientIp, useragent } = req
86
+
76
87
const value = useValidation ( schemaAuth . login , formData )
77
88
78
89
const userData = await User . scope ( 'withPassword' ) . findOne ( {
@@ -115,12 +126,20 @@ class AuthService {
115
126
}
116
127
)
117
128
118
- const formDataRefreshToken = {
129
+ // create refresh token
130
+ await RefreshTokenService . create ( {
119
131
UserId : userData . id ,
120
132
token : refreshToken ,
121
- }
133
+ } )
122
134
123
- await RefreshTokenService . create ( formDataRefreshToken )
135
+ // create session
136
+ await SessionService . create ( {
137
+ UserId : userData . id ,
138
+ token : accessToken ,
139
+ ipAddress : clientIp ?. replace ( '::ffff:' , '' ) ,
140
+ device : userAgentHelper . currentDevice ( req ) ,
141
+ platform : useragent ?. platform ,
142
+ } )
124
143
125
144
// create directory
126
145
await createDirectory ( userData . id )
@@ -144,13 +163,26 @@ class AuthService {
144
163
)
145
164
}
146
165
166
+ public static async verifySession ( UserId : string , token : string ) {
167
+ const sessionUser = await SessionService . findByTokenUser ( UserId , token )
168
+ const verifyToken = verifyAccessToken ( sessionUser . token )
169
+
170
+ if ( ! isEmpty ( verifyToken ?. data ) ) {
171
+ // @ts -ignore
172
+ const data = await User . findByPk ( verifyToken ?. data ?. id , {
173
+ include : including ,
174
+ } )
175
+ return data
176
+ }
177
+
178
+ return null
179
+ }
180
+
147
181
/**
148
182
*
149
183
* @param token
150
184
*/
151
185
public static async profile ( userData : UserAttributes ) {
152
- const including = [ { model : Role } ]
153
-
154
186
const data = await User . findByPk ( userData . id , { include : including } )
155
187
return data
156
188
}
@@ -159,15 +191,17 @@ class AuthService {
159
191
*
160
192
* @param UserId
161
193
*/
162
- public static async logout ( UserId : string , userData : any ) {
194
+ public static async logout ( UserId : string , userData : any , token : string ) {
163
195
if ( userData ?. id !== UserId ) {
164
196
throw new ResponseError . Unauthorized ( 'Invalid user login!' )
165
197
}
166
198
167
199
const data = await UserService . getOne ( UserId )
168
200
169
- // remove refresh token by user id
201
+ // clean refresh token & session
170
202
await RefreshTokenService . delete ( data . id )
203
+ await SessionService . deleteByTokenUser ( data . id , token )
204
+
171
205
const message = 'You have logged out of the application'
172
206
173
207
return message
0 commit comments