1
1
import User from '#models/user'
2
+ import UserInvitation from '#models/user_invitation'
2
3
import UserToken from '#models/user_token'
3
4
import MailService from '#services/mail_service'
5
+ import env from '#start/env'
4
6
import { createRegisterValidator } from '#validators/register_validator'
5
7
import { inject } from '@adonisjs/core'
6
8
import type { HttpContext } from '@adonisjs/core/http'
9
+ import vine from '@vinejs/vine'
7
10
8
11
@inject ( )
9
12
export default class RegisterController {
@@ -12,18 +15,74 @@ export default class RegisterController {
12
15
/**
13
16
* Display the registration form
14
17
*/
15
- async index ( { inertia } : HttpContext ) {
16
- return inertia . render ( 'auth/register' )
18
+ async index ( { inertia, request, session, i18n, response } : HttpContext ) {
19
+ if ( ! env . get ( 'REQUIRE_INVITATION' ) ) {
20
+ return inertia . render ( 'auth/register' )
21
+ }
22
+
23
+ const { invitationToken } = await request . validateUsing (
24
+ vine . compile (
25
+ vine . object ( {
26
+ invitationToken : vine . string ( ) . optional ( ) ,
27
+ } )
28
+ )
29
+ )
30
+
31
+ if ( ! invitationToken ) {
32
+ session . flashErrors ( {
33
+ E_INVITATION_REQUIRED : i18n . t ( 'errors.E_INVITATION_REQUIRED' ) ,
34
+ } )
35
+
36
+ return response . redirect ( ) . toPath ( '/auth/login' )
37
+ }
38
+
39
+ const invitation = await UserInvitation . query ( ) . where ( 'token' , invitationToken ) . first ( )
40
+
41
+ if ( ! invitation || invitation . isExpired ( ) ) {
42
+ session . flashErrors ( {
43
+ E_INVITATION_INVALID : i18n . t ( 'errors.E_INVITATION_INVALID' ) ,
44
+ } )
45
+ return response . redirect ( ) . toPath ( '/auth/login' )
46
+ }
47
+
48
+ return inertia . render ( 'auth/register' , {
49
+ email : invitation . email ,
50
+ } )
17
51
}
18
52
19
53
/**
20
54
* Handle form submission for the create action
21
55
*/
22
56
async store ( { request, response, session, i18n } : HttpContext ) {
23
- const { fullName, email, password } = await request . validateUsing ( createRegisterValidator )
57
+ const { fullName, email, password, invitationToken } =
58
+ await request . validateUsing ( createRegisterValidator )
59
+
60
+ if ( env . get ( 'REQUIRE_INVITATION' ) ) {
61
+ if ( ! invitationToken ) {
62
+ session . flashErrors ( {
63
+ E_INVITATION_REQUIRED : i18n . t ( 'errors.E_INVITATION_REQUIRED' ) ,
64
+ } )
65
+
66
+ return response . redirect ( ) . toPath ( '/auth/login' )
67
+ }
68
+
69
+ const invitation = await UserInvitation . query ( )
70
+ . where ( 'email' , email )
71
+ . where ( 'token' , invitationToken )
72
+ . first ( )
73
+
74
+ if ( ! invitation || invitation . isExpired ( ) ) {
75
+ session . flashErrors ( {
76
+ E_INVITATION_INVALID : i18n . t ( 'errors.E_INVITATION_INVALID' ) ,
77
+ } )
78
+ return response . redirect ( ) . toPath ( '/auth/login' )
79
+ }
80
+ }
24
81
25
82
const user = await User . create ( { fullName, email, password } )
26
83
84
+ await UserInvitation . query ( ) . where ( 'email' , email ) . delete ( )
85
+
27
86
const token = await UserToken . generateEmailVerificationToken ( user )
28
87
await this . mailService . sendEmailVerification ( user , token , i18n . locale )
29
88
0 commit comments