@@ -22,8 +22,10 @@ enum class UsernameStatus {
22
22
USERNAME_TAKEN , USERNAME_RESERVED , USERNAME_AVAILABLE ,
23
23
}
24
24
25
- enum class EmailStatus {
26
- EMAIL_TAKEN , EMAIL_BLACKLISTED , EMAIL_AVAILABLE ,
25
+ sealed interface EmailStatusResponse {
26
+ data object EmailBlackListed : EmailStatusResponse
27
+ data object EmailAvailable : EmailStatusResponse
28
+ data class EmailTaken (val existingUsername : String ) : EmailStatusResponse
27
29
}
28
30
29
31
data class RegisteredUser (
@@ -49,10 +51,22 @@ class RegistrationService(
49
51
}
50
52
51
53
fun register (username : String , email : String ) {
52
- checkUsernameAndEmail(username, email)
54
+ checkUsername(username)
55
+
56
+ when (val emailStatus = emailAvailable(email)) {
57
+ is EmailStatusResponse .EmailBlackListed -> throw IllegalStateException (" Email provider is blacklisted" )
58
+ is EmailStatusResponse .EmailTaken -> onEmailTaken(username, emailStatus.existingUsername, email)
59
+ is EmailStatusResponse .EmailAvailable -> {
60
+ sendActivationEmail(username, email)
61
+ metricHelper.incrementUserRegistrationCounter()
62
+ }
63
+ }
64
+ }
53
65
54
- sendActivationEmail(username, email)
55
- metricHelper.incrementUserRegistrationCounter()
66
+ private fun onEmailTaken (desiredUsername : String , existingUsername : String , email : String ) {
67
+ val passwordResetUrl =
68
+ fafProperties.account().passwordReset().passwordResetInitiateEmailUrlFormat().format(email)
69
+ emailService.sendEmailAlreadyTakenMail(desiredUsername, existingUsername, email, passwordResetUrl)
56
70
}
57
71
58
72
private fun sendActivationEmail (username : String , email : String ) {
@@ -84,14 +98,14 @@ class RegistrationService(
84
98
}
85
99
86
100
@Transactional
87
- fun emailAvailable (email : String ): EmailStatus {
101
+ fun emailAvailable (email : String ): EmailStatusResponse {
88
102
val onBlacklist = domainBlacklistRepository.existsByDomain(email.substring(email.lastIndexOf(' @' ) + 1 ))
89
103
if (onBlacklist) {
90
- return EmailStatus . EMAIL_BLACKLISTED
104
+ return EmailStatusResponse . EmailBlackListed
91
105
}
92
106
93
- val exists = userRepository.existsByEmail (email)
94
- return if (exists) EmailStatus . EMAIL_TAKEN else EmailStatus . EMAIL_AVAILABLE
107
+ val user = userRepository.findByEmail (email)
108
+ return if (user != null ) EmailStatusResponse . EmailTaken (user.username) else EmailStatusResponse . EmailAvailable
95
109
}
96
110
97
111
fun validateRegistrationToken (registrationToken : String ): RegisteredUser {
@@ -115,7 +129,9 @@ class RegistrationService(
115
129
val email = registeredUser.email
116
130
val encodedPassword = passwordEncoder.encode(password)
117
131
118
- checkUsernameAndEmail(username, email)
132
+ checkUsername(username)
133
+ val emailStatus = emailAvailable(email)
134
+ require(emailStatus is EmailStatusResponse .EmailAvailable ) { " Email unavailable" }
119
135
120
136
val user = User (
121
137
username = username,
@@ -134,15 +150,8 @@ class RegistrationService(
134
150
return user
135
151
}
136
152
137
- private fun checkUsernameAndEmail (username : String , email : String ) {
153
+ private fun checkUsername (username : String ) {
138
154
val usernameStatus = usernameAvailable(username)
139
- if (usernameStatus != UsernameStatus .USERNAME_AVAILABLE ) {
140
- throw IllegalArgumentException (" Username unavailable" )
141
- }
142
-
143
- val emailStatus = emailAvailable(email)
144
- if (emailStatus != EmailStatus .EMAIL_AVAILABLE ) {
145
- throw IllegalArgumentException (" Email unavailable" )
146
- }
155
+ require(usernameStatus == UsernameStatus .USERNAME_AVAILABLE ) { " Username unavailable" }
147
156
}
148
157
}
0 commit comments