1
1
import { setCookie } from 'hono/cookie' ;
2
2
import { inject , injectable } from 'tsyringe' ;
3
3
import { zValidator } from '@hono/zod-validator' ;
4
- import { IamService } from '../services/iam.service' ;
5
4
import { limiter } from '../middlewares/rate-limiter.middlware' ;
6
- import { requireAuth } from '../middlewares/auth.middleware' ;
5
+ import { requireAuth } from '../middlewares/require- auth.middleware' ;
7
6
import { Controler } from '../common/types/controller' ;
8
- import { registerEmailDto } from '$lib/server/api/dtos/register-email.dto' ;
9
- import { signInEmailDto } from '$lib/server/api/dtos/signin-email.dto' ;
10
7
import { updateEmailDto } from '$lib/server/api/dtos/update-email.dto' ;
11
8
import { verifyEmailDto } from '$lib/server/api/dtos/verify-email.dto' ;
12
9
import { LuciaService } from '../services/lucia.service' ;
10
+ import { AuthenticationService } from '../services/authentication.service' ;
11
+ import { EmailVerificationService } from '../services/email-verification.service' ;
12
+ import { loginDto } from '../dtos/login.dto' ;
13
+ import { verifyLoginDto } from '../dtos/verify-login.dto' ;
13
14
14
15
@injectable ( )
15
16
export class IamController extends Controler {
16
17
constructor (
17
- @inject ( IamService ) private iamService : IamService ,
18
+ @inject ( AuthenticationService ) private authenticationService : AuthenticationService ,
19
+ @inject ( EmailVerificationService ) private emailVerificationService : EmailVerificationService ,
18
20
@inject ( LuciaService ) private luciaService : LuciaService ,
19
21
) {
20
22
super ( ) ;
21
23
}
22
24
23
25
routes ( ) {
24
26
return this . controller
25
- . get ( '/user ' , async ( c ) => {
27
+ . get ( '/me ' , async ( c ) => {
26
28
const user = c . var . user ;
27
29
return c . json ( { user : user } ) ;
28
30
} )
29
- . post ( '/login/request ' , zValidator ( 'json' , registerEmailDto ) , limiter ( { limit : 10 , minutes : 60 } ) , async ( c ) => {
31
+ . post ( '/login' , zValidator ( 'json' , loginDto ) , limiter ( { limit : 10 , minutes : 60 } ) , async ( c ) => {
30
32
const { email } = c . req . valid ( 'json' ) ;
31
- await this . iamService . createLoginRequest ( { email } ) ;
33
+ await this . authenticationService . createLoginRequest ( { email } ) ;
32
34
return c . json ( { message : 'Verification email sent' } ) ;
33
35
} )
34
- . post ( '/login/verify' , zValidator ( 'json' , signInEmailDto ) , limiter ( { limit : 10 , minutes : 60 } ) , async ( c ) => {
36
+ . post ( '/login/verify' , zValidator ( 'json' , verifyLoginDto ) , limiter ( { limit : 10 , minutes : 60 } ) , async ( c ) => {
35
37
const { email, token } = c . req . valid ( 'json' ) ;
36
- const session = await this . iamService . verifyLoginRequest ( { email, token } ) ;
38
+ const session = await this . authenticationService . verifyLoginRequest ( { email, token } ) ;
37
39
const sessionCookie = this . luciaService . lucia . createSessionCookie ( session . id ) ;
38
40
setCookie ( c , sessionCookie . name , sessionCookie . value , {
39
41
path : sessionCookie . attributes . path ,
@@ -46,9 +48,21 @@ export class IamController extends Controler {
46
48
} ) ;
47
49
return c . json ( { message : 'ok' } ) ;
48
50
} )
51
+ . patch ( '/email' , requireAuth , zValidator ( 'json' , updateEmailDto ) , limiter ( { limit : 10 , minutes : 60 } ) , async ( c ) => {
52
+ const json = c . req . valid ( 'json' ) ;
53
+ await this . emailVerificationService . create ( c . var . user . id , json . email ) ;
54
+ return c . json ( { message : 'Verification email sent' } ) ;
55
+ } )
56
+ // this could also be named to use custom methods, aka /email#verify
57
+ // https://cloud.google.com/apis/design/custom_methods
58
+ . post ( '/email/verify' , requireAuth , zValidator ( 'json' , verifyEmailDto ) , limiter ( { limit : 10 , minutes : 60 } ) , async ( c ) => {
59
+ const json = c . req . valid ( 'json' ) ;
60
+ await this . emailVerificationService . verify ( c . var . user . id , json . token ) ;
61
+ return c . json ( { message : 'Verified and updated' } ) ;
62
+ } )
49
63
. post ( '/logout' , requireAuth , async ( c ) => {
50
64
const sessionId = c . var . session . id ;
51
- await this . iamService . logout ( sessionId ) ;
65
+ await this . authenticationService . logout ( sessionId ) ;
52
66
const sessionCookie = this . luciaService . lucia . createBlankSessionCookie ( ) ;
53
67
setCookie ( c , sessionCookie . name , sessionCookie . value , {
54
68
path : sessionCookie . attributes . path ,
@@ -61,17 +75,5 @@ export class IamController extends Controler {
61
75
} ) ;
62
76
return c . json ( { status : 'success' } ) ;
63
77
} )
64
- . patch ( '/email' , requireAuth , zValidator ( 'json' , updateEmailDto ) , limiter ( { limit : 10 , minutes : 60 } ) , async ( c ) => {
65
- const json = c . req . valid ( 'json' ) ;
66
- await this . iamService . dispatchEmailVerificationRequest ( c . var . user . id , json . email ) ;
67
- return c . json ( { message : 'Verification email sent' } ) ;
68
- } )
69
- // this could also be named to use custom methods, aka /email#verify
70
- // https://cloud.google.com/apis/design/custom_methods
71
- . post ( '/email/verification' , requireAuth , zValidator ( 'json' , verifyEmailDto ) , limiter ( { limit : 10 , minutes : 60 } ) , async ( c ) => {
72
- const json = c . req . valid ( 'json' ) ;
73
- await this . iamService . processEmailVerificationRequest ( c . var . user . id , json . token ) ;
74
- return c . json ( { message : 'Verified and updated' } ) ;
75
- } ) ;
76
78
}
77
79
}
0 commit comments