Skip to content

Commit 93061f2

Browse files
committed
Migrate ResetPassword useCase to coroutines
1 parent a118d88 commit 93061f2

21 files changed

+118
-333
lines changed

aws-auth-cognito/src/main/java/com/amplifyframework/auth/cognito/AWSCognitoAuthPlugin.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -313,13 +313,13 @@ class AWSCognitoAuthPlugin : AuthPlugin<AWSCognitoAuthService>() {
313313
options: AuthResetPasswordOptions,
314314
onSuccess: Consumer<AuthResetPasswordResult>,
315315
onError: Consumer<AuthException>
316-
) = enqueue(onSuccess, onError) { queueFacade.resetPassword(username, options) }
316+
) = enqueue(onSuccess, onError) { useCaseFactory.resetPassword().execute(username, options) }
317317

318318
override fun resetPassword(
319319
username: String,
320320
onSuccess: Consumer<AuthResetPasswordResult>,
321321
onError: Consumer<AuthException>
322-
) = enqueue(onSuccess, onError) { queueFacade.resetPassword(username) }
322+
) = enqueue(onSuccess, onError) { useCaseFactory.resetPassword().execute(username) }
323323

324324
override fun confirmResetPassword(
325325
username: String,

aws-auth-cognito/src/main/java/com/amplifyframework/auth/cognito/KotlinAuthFacadeInternal.kt

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,10 @@ import com.amplifyframework.auth.options.AuthConfirmSignInOptions
2626
import com.amplifyframework.auth.options.AuthConfirmSignUpOptions
2727
import com.amplifyframework.auth.options.AuthFetchSessionOptions
2828
import com.amplifyframework.auth.options.AuthResendSignUpCodeOptions
29-
import com.amplifyframework.auth.options.AuthResetPasswordOptions
3029
import com.amplifyframework.auth.options.AuthSignInOptions
3130
import com.amplifyframework.auth.options.AuthSignOutOptions
3231
import com.amplifyframework.auth.options.AuthSignUpOptions
3332
import com.amplifyframework.auth.options.AuthWebUISignInOptions
34-
import com.amplifyframework.auth.result.AuthResetPasswordResult
3533
import com.amplifyframework.auth.result.AuthSignInResult
3634
import com.amplifyframework.auth.result.AuthSignOutResult
3735
import com.amplifyframework.auth.result.AuthSignUpResult
@@ -193,24 +191,6 @@ internal class KotlinAuthFacadeInternal(private val delegate: RealAWSCognitoAuth
193191
)
194192
}
195193

196-
suspend fun resetPassword(username: String): AuthResetPasswordResult = suspendCoroutine { continuation ->
197-
delegate.resetPassword(
198-
username,
199-
{ continuation.resume(it) },
200-
{ continuation.resumeWithException(it) }
201-
)
202-
}
203-
204-
suspend fun resetPassword(username: String, options: AuthResetPasswordOptions): AuthResetPasswordResult =
205-
suspendCoroutine { continuation ->
206-
delegate.resetPassword(
207-
username,
208-
options,
209-
{ continuation.resume(it) },
210-
{ continuation.resumeWithException(it) }
211-
)
212-
}
213-
214194
suspend fun signOut(): AuthSignOutResult = suspendCoroutine { continuation ->
215195
delegate.signOut { continuation.resume(it) }
216196
}

aws-auth-cognito/src/main/java/com/amplifyframework/auth/cognito/RealAWSCognitoAuthPlugin.kt

Lines changed: 0 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ import com.amplifyframework.auth.cognito.result.FederateToIdentityPoolResult
7070
import com.amplifyframework.auth.cognito.result.GlobalSignOutError
7171
import com.amplifyframework.auth.cognito.result.HostedUIError
7272
import com.amplifyframework.auth.cognito.result.RevokeTokenError
73-
import com.amplifyframework.auth.cognito.usecases.ResetPasswordUseCase
7473
import com.amplifyframework.auth.cognito.util.toAuthCodeDeliveryDetails
7574
import com.amplifyframework.auth.exceptions.ConfigurationException
7675
import com.amplifyframework.auth.exceptions.InvalidStateException
@@ -83,12 +82,10 @@ import com.amplifyframework.auth.options.AuthConfirmSignInOptions
8382
import com.amplifyframework.auth.options.AuthConfirmSignUpOptions
8483
import com.amplifyframework.auth.options.AuthFetchSessionOptions
8584
import com.amplifyframework.auth.options.AuthResendSignUpCodeOptions
86-
import com.amplifyframework.auth.options.AuthResetPasswordOptions
8785
import com.amplifyframework.auth.options.AuthSignInOptions
8886
import com.amplifyframework.auth.options.AuthSignOutOptions
8987
import com.amplifyframework.auth.options.AuthSignUpOptions
9088
import com.amplifyframework.auth.options.AuthWebUISignInOptions
91-
import com.amplifyframework.auth.result.AuthResetPasswordResult
9289
import com.amplifyframework.auth.result.AuthSignInResult
9390
import com.amplifyframework.auth.result.AuthSignOutResult
9491
import com.amplifyframework.auth.result.AuthSignUpResult
@@ -141,7 +138,6 @@ import java.util.concurrent.atomic.AtomicReference
141138
import kotlin.coroutines.resume
142139
import kotlin.coroutines.resumeWithException
143140
import kotlin.coroutines.suspendCoroutine
144-
import kotlinx.coroutines.DelicateCoroutinesApi
145141
import kotlinx.coroutines.GlobalScope
146142
import kotlinx.coroutines.flow.collect
147143
import kotlinx.coroutines.flow.drop
@@ -1448,49 +1444,6 @@ internal class RealAWSCognitoAuthPlugin(
14481444
)
14491445
}
14501446

1451-
@OptIn(DelicateCoroutinesApi::class)
1452-
fun resetPassword(
1453-
username: String,
1454-
options: AuthResetPasswordOptions,
1455-
onSuccess: Consumer<AuthResetPasswordResult>,
1456-
onError: Consumer<AuthException>
1457-
) {
1458-
try {
1459-
val cognitoIdentityProviderClient = requireNotNull(
1460-
authEnvironment.cognitoAuthService.cognitoIdentityProviderClient
1461-
)
1462-
1463-
val appClient = requireNotNull(configuration.userPool?.appClient)
1464-
GlobalScope.launch {
1465-
val encodedData = authEnvironment.getUserContextData(username)
1466-
val pinpointEndpointId = authEnvironment.getPinpointEndpointId()
1467-
1468-
ResetPasswordUseCase(
1469-
cognitoIdentityProviderClient,
1470-
appClient,
1471-
configuration.userPool?.appClientSecret
1472-
).execute(
1473-
username,
1474-
options,
1475-
encodedData,
1476-
pinpointEndpointId,
1477-
onSuccess,
1478-
onError
1479-
)
1480-
}
1481-
} catch (ex: Exception) {
1482-
onError.accept(InvalidUserPoolConfigurationException())
1483-
}
1484-
}
1485-
1486-
fun resetPassword(
1487-
username: String,
1488-
onSuccess: Consumer<AuthResetPasswordResult>,
1489-
onError: Consumer<AuthException>
1490-
) {
1491-
resetPassword(username, AuthResetPasswordOptions.defaults(), onSuccess, onError)
1492-
}
1493-
14941447
fun signOut(onComplete: Consumer<AuthSignOutResult>) {
14951448
signOut(AuthSignOutOptions.builder().build(), onComplete)
14961449
}

aws-auth-cognito/src/main/java/com/amplifyframework/auth/cognito/usecases/AuthUseCaseFactory.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,11 @@ internal class AuthUseCaseFactory(
115115
stateMachine = stateMachine
116116
)
117117

118+
fun resetPassword() = ResetPasswordUseCase(
119+
client = authEnvironment.requireIdentityProviderClient(),
120+
environment = authEnvironment
121+
)
122+
118123
fun confirmResetPassword() = ConfirmResetPasswordUseCase(
119124
client = authEnvironment.requireIdentityProviderClient(),
120125
environment = authEnvironment,

aws-auth-cognito/src/main/java/com/amplifyframework/auth/cognito/usecases/ResetPasswordUseCase.kt

Lines changed: 33 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -18,72 +18,56 @@ package com.amplifyframework.auth.cognito.usecases
1818
import aws.sdk.kotlin.services.cognitoidentityprovider.CognitoIdentityProviderClient
1919
import aws.sdk.kotlin.services.cognitoidentityprovider.forgotPassword
2020
import aws.sdk.kotlin.services.cognitoidentityprovider.model.AnalyticsMetadataType
21-
import com.amplifyframework.AmplifyException
22-
import com.amplifyframework.auth.AuthException
23-
import com.amplifyframework.auth.cognito.CognitoAuthExceptionConverter
21+
import com.amplifyframework.auth.cognito.AuthEnvironment
2422
import com.amplifyframework.auth.cognito.helpers.AuthHelper
2523
import com.amplifyframework.auth.cognito.options.AWSCognitoAuthResetPasswordOptions
2624
import com.amplifyframework.auth.cognito.util.toAuthCodeDeliveryDetails
2725
import com.amplifyframework.auth.options.AuthResetPasswordOptions
2826
import com.amplifyframework.auth.result.AuthResetPasswordResult
2927
import com.amplifyframework.auth.result.step.AuthNextResetPasswordStep
3028
import com.amplifyframework.auth.result.step.AuthResetPasswordStep
31-
import com.amplifyframework.core.Consumer
32-
import kotlinx.coroutines.Dispatchers
33-
import kotlinx.coroutines.withContext
29+
import com.amplifyframework.statemachine.codegen.data.requireAppClientId
3430

3531
/**
3632
* Business logic to reset password if user forgot the old password.
3733
*/
3834
internal class ResetPasswordUseCase(
39-
private val cognitoIdentityProviderClient: CognitoIdentityProviderClient,
40-
private val appClientId: String,
41-
private val appClientSecret: String?
35+
private val client: CognitoIdentityProviderClient,
36+
private val environment: AuthEnvironment
4237
) {
4338
suspend fun execute(
4439
username: String,
45-
options: AuthResetPasswordOptions,
46-
encodedContextData: String?,
47-
pinpointEndpointId: String?,
48-
onSuccess: Consumer<AuthResetPasswordResult>,
49-
onError: Consumer<AuthException>
50-
) {
51-
try {
52-
val response = withContext(Dispatchers.IO) {
53-
cognitoIdentityProviderClient.forgotPassword {
54-
this.username = username
55-
this.clientMetadata = (options as? AWSCognitoAuthResetPasswordOptions)?.metadata ?: mapOf()
56-
this.clientId = appClientId
57-
this.secretHash = AuthHelper.getSecretHash(
58-
username,
59-
appClientId,
60-
appClientSecret
61-
)
62-
encodedContextData?.let { this.userContextData { encodedData = it } }
63-
pinpointEndpointId?.let {
64-
this.analyticsMetadata = AnalyticsMetadataType.invoke { analyticsEndpointId = it }
65-
}
66-
}
67-
}
40+
options: AuthResetPasswordOptions = AuthResetPasswordOptions.defaults()
41+
): AuthResetPasswordResult {
42+
val awsOptions = options as? AWSCognitoAuthResetPasswordOptions
6843

69-
withContext(Dispatchers.Main) {
70-
onSuccess.accept(
71-
AuthResetPasswordResult(
72-
false,
73-
AuthNextResetPasswordStep(
74-
AuthResetPasswordStep.CONFIRM_RESET_PASSWORD_WITH_CODE,
75-
mapOf(),
76-
response.codeDeliveryDetails.toAuthCodeDeliveryDetails()
77-
)
78-
)
79-
)
80-
}
81-
} catch (ex: Exception) {
82-
withContext(Dispatchers.Main) {
83-
onError.accept(
84-
CognitoAuthExceptionConverter.lookup(ex, AmplifyException.REPORT_BUG_TO_AWS_SUGGESTION)
85-
)
44+
val appClientId = environment.configuration.userPool.requireAppClientId()
45+
val appClientSecret = environment.configuration.userPool?.appClientSecret
46+
val encodedContextData = environment.getUserContextData(username)
47+
val pinpointEndpointId = environment.getPinpointEndpointId()
48+
49+
val response = client.forgotPassword {
50+
this.username = username
51+
clientMetadata = awsOptions?.metadata ?: emptyMap()
52+
clientId = appClientId
53+
secretHash = AuthHelper.getSecretHash(
54+
username,
55+
appClientId,
56+
appClientSecret
57+
)
58+
encodedContextData?.let { this.userContextData { encodedData = it } }
59+
pinpointEndpointId?.let {
60+
this.analyticsMetadata = AnalyticsMetadataType { analyticsEndpointId = it }
8661
}
8762
}
63+
64+
return AuthResetPasswordResult(
65+
false,
66+
AuthNextResetPasswordStep(
67+
AuthResetPasswordStep.CONFIRM_RESET_PASSWORD_WITH_CODE,
68+
emptyMap(),
69+
response.codeDeliveryDetails.toAuthCodeDeliveryDetails()
70+
)
71+
)
8872
}
8973
}

aws-auth-cognito/src/main/java/com/amplifyframework/statemachine/codegen/data/UserPoolConfiguration.kt

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package com.amplifyframework.statemachine.codegen.data
1717

1818
import com.amplifyframework.annotations.InternalAmplifyApi
1919
import com.amplifyframework.auth.AuthException
20+
import com.amplifyframework.auth.cognito.exceptions.configuration.InvalidUserPoolConfigurationException
2021
import org.json.JSONObject
2122

2223
/**
@@ -49,27 +50,21 @@ data class UserPoolConfiguration internal constructor(
4950
* @return fresh configuration builder instance.
5051
*/
5152
@JvmStatic
52-
fun builder(): Builder {
53-
return Builder()
54-
}
53+
fun builder(): Builder = Builder()
5554

5655
/**
5756
* Returns a builder object populated from JSON.
5857
* @return populated builder instance.
5958
*/
60-
fun fromJson(configJson: JSONObject): Builder {
61-
return Builder(configJson)
62-
}
59+
fun fromJson(configJson: JSONObject): Builder = Builder(configJson)
6360

6461
inline operator fun invoke(block: Builder.() -> Unit) = Builder().apply(block).build()
6562
}
6663

6764
/**
6865
* Builder class for constructing [UserPoolConfiguration].
6966
*/
70-
internal class Builder constructor(
71-
configJson: JSONObject? = null
72-
) {
67+
internal class Builder constructor(configJson: JSONObject? = null) {
7368
var region: String? = DEFAULT_REGION
7469
var endpoint: String? = null
7570
var poolId: String? = null
@@ -160,3 +155,6 @@ data class UserPoolConfiguration internal constructor(
160155
PINPOINT_APP_ID("PinpointAppId")
161156
}
162157
}
158+
159+
internal fun UserPoolConfiguration?.requireAppClientId() =
160+
this?.appClient ?: throw InvalidUserPoolConfigurationException()

aws-auth-cognito/src/test/java/com/amplifyframework/auth/cognito/AWSCognitoAuthPluginTest.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -377,9 +377,11 @@ class AWSCognitoAuthPluginTest {
377377
val expectedOnSuccess = Consumer<AuthResetPasswordResult> { }
378378
val expectedOnError = Consumer<AuthException> { }
379379

380+
val useCase = authPlugin.useCaseFactory.resetPassword()
381+
380382
authPlugin.resetPassword(expectedUsername, expectedOnSuccess, expectedOnError)
381383

382-
verify(timeout = CHANNEL_TIMEOUT) { realPlugin.resetPassword(expectedUsername, any(), any()) }
384+
coVerify(timeout = CHANNEL_TIMEOUT) { useCase.execute(expectedUsername, any()) }
383385
}
384386

385387
@Test
@@ -389,9 +391,11 @@ class AWSCognitoAuthPluginTest {
389391
val expectedOnSuccess = Consumer<AuthResetPasswordResult> { }
390392
val expectedOnError = Consumer<AuthException> { }
391393

394+
val useCase = authPlugin.useCaseFactory.resetPassword()
395+
392396
authPlugin.resetPassword(expectedUsername, expectedOptions, expectedOnSuccess, expectedOnError)
393397

394-
verify(timeout = CHANNEL_TIMEOUT) { realPlugin.resetPassword(expectedUsername, expectedOptions, any(), any()) }
398+
coVerify(timeout = CHANNEL_TIMEOUT) { useCase.execute(expectedUsername, expectedOptions) }
395399
}
396400

397401
@Test

aws-auth-cognito/src/test/java/com/amplifyframework/auth/cognito/Rules.kt renamed to aws-auth-cognito/src/test/java/com/amplifyframework/auth/cognito/MockAuthHelperRule.kt

File renamed without changes.

0 commit comments

Comments
 (0)