diff --git a/core/data/src/main/java/com/android/mediproject/core/data/sign/SignRepository.kt b/core/data/src/main/java/com/android/mediproject/core/data/sign/SignRepository.kt index fea523eb..21a559c5 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/sign/SignRepository.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/sign/SignRepository.kt @@ -5,7 +5,7 @@ import com.android.mediproject.core.model.sign.LoginParameter import com.android.mediproject.core.model.sign.SignUpParameter interface SignRepository { - suspend fun login(loginParameter: LoginParameter): Result + suspend fun login(loginParameter: LoginParameter): SignInState suspend fun signUp(signUpParameter: SignUpParameter): Result suspend fun signOut() diff --git a/core/data/src/main/java/com/android/mediproject/core/data/sign/SignRepositoryImpl.kt b/core/data/src/main/java/com/android/mediproject/core/data/sign/SignRepositoryImpl.kt index 2ccd996b..83d79206 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/sign/SignRepositoryImpl.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/sign/SignRepositoryImpl.kt @@ -1,6 +1,7 @@ package com.android.mediproject.core.data.sign import com.amazonaws.mobileconnectors.cognitoidentityprovider.CognitoUserSession +import com.amazonaws.services.cognitoidentityprovider.model.UserNotConfirmedException import com.android.mediproject.core.data.user.UserInfoRepository import com.android.mediproject.core.datastore.AppDataStore import com.android.mediproject.core.model.sign.LoginParameter @@ -17,8 +18,8 @@ internal class SignRepositoryImpl( private var _session: CognitoUserSession? = null override val session: CognitoUserSession? get() = _session - override suspend fun login(loginParameter: LoginParameter): Result { - signDataSource.logIn(loginParameter).onSuccess { + override suspend fun login(loginParameter: LoginParameter) = signDataSource.logIn(loginParameter).fold( + onSuccess = { _session = it.userSession appDataStore.run { saveSkipIntro(true) @@ -35,19 +36,23 @@ internal class SignRepositoryImpl( myAccountId = 0L, ) } - }.onFailure { - _session = null - } + SignInState.Success + }, + onFailure = { + if (it is UserNotConfirmedException) { + SignInState.NotVerified + } else { + SignInState.Failed(it) + } + }, + ) - return Result.success(true) - } override suspend fun signUp(signUpParameter: SignUpParameter): Result { val result = signDataSource.signUp(signUpParameter) if (result.isSuccess) { appDataStore.saveSkipIntro(true) } - return Result.success(true) } @@ -56,3 +61,10 @@ internal class SignRepositoryImpl( signDataSource.signOut() } } + + +sealed interface SignInState { + data object Success : SignInState + data object NotVerified : SignInState + data class Failed(val exception: Throwable) : SignInState +} diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/AWSAccountManager.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/AWSAccountManager.kt index 8590fed5..5b651cf6 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/AWSAccountManager.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/AWSAccountManager.kt @@ -4,6 +4,4 @@ import com.amazonaws.mobileconnectors.cognitoidentityprovider.CognitoUserPool open class AWSAccountManager( protected val userPool: CognitoUserPool, -) { - -} +) diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignDataSource.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignDataSource.kt index a5c2824c..717c2efb 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignDataSource.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignDataSource.kt @@ -4,7 +4,8 @@ import com.android.mediproject.core.model.sign.LoginParameter import com.android.mediproject.core.model.sign.SignUpParameter interface SignDataSource { - suspend fun logIn(loginParameter: LoginParameter): Result - suspend fun signUp(signUpParameter: SignUpParameter): Result + suspend fun logIn(loginParameter: LoginParameter): Result + suspend fun signUp(signUpParameter: SignUpParameter): Result + suspend fun vertifyEmail(email: String, code: String): Result suspend fun signOut() } diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignDataSourceImpl.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignDataSourceImpl.kt index fcc4d4a0..01e8a14a 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignDataSourceImpl.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignDataSourceImpl.kt @@ -9,17 +9,18 @@ private const val USER_NAME = "user_name" class SignDataSourceImpl( private val signInOutAWS: SignInOutAWS, private val signUpAWS: SignUpAWS, + private val verifyEmailAWS: VerifyEmailAWS, ) : SignDataSource { - override suspend fun logIn(loginParameter: LoginParameter): Result = signInOutAWS.signIn( - SignInOutAWS.SignInRequest( + override suspend fun logIn(loginParameter: LoginParameter) = signInOutAWS.signIn( + SignInRequest( loginParameter.email, loginParameter.password, ), ) - override suspend fun signUp(signUpParameter: SignUpParameter): Result = signUpAWS.signUp( - SignUpAWS.SignUpRequest( + override suspend fun signUp(signUpParameter: SignUpParameter): Result = signUpAWS.signUp( + SignUpRequest( signUpParameter.email, signUpParameter.password, CognitoUserAttributes().apply { @@ -28,6 +29,8 @@ class SignDataSourceImpl( ), ) + override suspend fun vertifyEmail(email: String, code: String): Result = verifyEmailAWS.verifyEmail(email, code) + override suspend fun signOut() { signInOutAWS.signOut() } diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignInOutAWS.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignInOutAWS.kt index 9e196099..1b4b4b7d 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignInOutAWS.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignInOutAWS.kt @@ -8,25 +8,21 @@ import com.amazonaws.mobileconnectors.cognitoidentityprovider.continuations.Auth import com.amazonaws.mobileconnectors.cognitoidentityprovider.continuations.ChallengeContinuation import com.amazonaws.mobileconnectors.cognitoidentityprovider.continuations.MultiFactorAuthenticationContinuation import com.amazonaws.mobileconnectors.cognitoidentityprovider.handlers.AuthenticationHandler -import com.amazonaws.services.cognitoidentityprovider.model.UserNotConfirmedException -import kotlinx.coroutines.suspendCancellableCoroutine import kotlin.coroutines.resume +import kotlin.coroutines.resumeWithException +import kotlin.coroutines.suspendCoroutine internal class SignInOutAWSImpl(userPool: CognitoUserPool) : AWSAccountManager(userPool), SignInOutAWS { - override suspend fun signIn(request: SignInRequest) = suspendCancellableCoroutine { continuation -> + override suspend fun signIn(request: SignInRequest) = suspendCoroutine { continuation -> userPool.getUser(request.email).getSession( object : AuthenticationHandler { override fun onSuccess(userSession: CognitoUserSession, newDevice: CognitoDevice?) { - continuation.resume(SignInState.Success(userSession, newDevice)) + continuation.resume(Result.success(SignInResponse(userSession, newDevice))) } override fun onFailure(exception: Exception) { - if (exception is UserNotConfirmedException) { - continuation.resume(SignInState.NotVerified) - } else { - continuation.resume(SignInState.Failed(exception)) - } + continuation.resumeWithException(exception) // UserNotConfirmedException : 이메일 인증을 하지 않았을 때 발생 } @@ -54,7 +50,7 @@ internal class SignInOutAWSImpl(userPool: CognitoUserPool) : AWSAccountManager(u interface SignInOutAWS { - suspend fun signIn(request: SignInRequest): SignInState + suspend fun signIn(request: SignInRequest): Result suspend fun signOut() } @@ -64,13 +60,7 @@ class SignInRequest( val password: ByteArray, ) - -sealed interface SignInState { - class Success( - val userSession: CognitoUserSession, - val device: CognitoDevice? = null, - ) : SignInState - - data class Failed(val exception: Exception) : SignInState - data object NotVerified : SignInState -} +class SignInResponse( + val userSession: CognitoUserSession, + val newDevice: CognitoDevice?, +) diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignUpAWS.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignUpAWS.kt index 8a9bb873..dd85d8a1 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignUpAWS.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignUpAWS.kt @@ -8,20 +8,20 @@ import com.amazonaws.mobileconnectors.cognitoidentityprovider.handlers.GenericHa import com.amazonaws.mobileconnectors.cognitoidentityprovider.handlers.SignUpHandler import com.amazonaws.mobileconnectors.cognitoidentityprovider.handlers.VerificationHandler import com.amazonaws.services.cognitoidentityprovider.model.SignUpResult -import kotlinx.coroutines.suspendCancellableCoroutine import kotlin.coroutines.resume import kotlin.coroutines.resumeWithException +import kotlin.coroutines.suspendCoroutine internal class SignUpAWSImpl( - override val userPool: CognitoUserPool, + userPool: CognitoUserPool, ) : AWSAccountManager(userPool), SignUpAWS { - override suspend fun signUp(request: SignUpAWS.SignUpRequest) = suspendCancellableCoroutine { continuation -> + override suspend fun signUp(request: SignUpRequest) = suspendCoroutine { continuation -> userPool.signUp( request.email, request.passwordString, request.cognitoUserAttributes, null, object : SignUpHandler { override fun onSuccess(cognitoUser: CognitoUser, signUpResult: SignUpResult) { - val response = SignUpAWS.SignUpResponse(cognitoUser, signUpResult) + val response = SignUpResponse(cognitoUser, signUpResult) continuation.resume(Result.success(response)) } @@ -32,7 +32,7 @@ internal class SignUpAWSImpl( ) } - override suspend fun confirmSignUp(cognitoUser: CognitoUser, confirmationCode: String) = suspendCancellableCoroutine { continuation -> + override suspend fun confirmSignUp(cognitoUser: CognitoUser, confirmationCode: String) = suspendCoroutine { continuation -> cognitoUser.confirmSignUpInBackground( confirmationCode, false, object : GenericHandler { @@ -47,14 +47,14 @@ internal class SignUpAWSImpl( ) } - override suspend fun resendConfirmationCode(cognitoUser: CognitoUser): Result = - suspendCancellableCoroutine { continuation -> + override suspend fun resendConfirmationCode(cognitoUser: CognitoUser): Result = + suspendCoroutine { continuation -> cognitoUser.resendConfirmationCode( object : VerificationHandler { override fun onSuccess(verificationCodeDeliveryMedium: CognitoUserCodeDeliveryDetails) { continuation.resume( Result.success( - SignUpAWS.ConfirmationCodeDeliveryDetails( + ConfirmationCodeDeliveryDetails( destination = verificationCodeDeliveryMedium.destination, deliveryMedium = verificationCodeDeliveryMedium.deliveryMedium, attributeName = verificationCodeDeliveryMedium.attributeName, @@ -79,23 +79,23 @@ interface SignUpAWS { suspend fun confirmSignUp(cognitoUser: CognitoUser, confirmationCode: String): Result suspend fun resendConfirmationCode(cognitoUser: CognitoUser): Result +} - class SignUpRequest( - val email: String, - private val password: ByteArray, - val cognitoUserAttributes: CognitoUserAttributes, - ) { - val passwordString: String get() = password.decodeToString() - } +class SignUpRequest( + val email: String, + private val password: ByteArray, + val cognitoUserAttributes: CognitoUserAttributes, +) { + val passwordString: String get() = password.decodeToString() +} - data class SignUpResponse( - val cognitoUser: CognitoUser, - val signUpResult: SignUpResult, - ) +data class SignUpResponse( + val cognitoUser: CognitoUser, + val signUpResult: SignUpResult, +) - data class ConfirmationCodeDeliveryDetails( - val destination: String, - val deliveryMedium: String, - val attributeName: String, - ) -} +data class ConfirmationCodeDeliveryDetails( + val destination: String, + val deliveryMedium: String, + val attributeName: String, +) diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/VerifyEmail.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/VerifyEmailAWS.kt similarity index 78% rename from core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/VerifyEmail.kt rename to core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/VerifyEmailAWS.kt index a9e453f8..607dca03 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/VerifyEmail.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/VerifyEmailAWS.kt @@ -3,6 +3,7 @@ package com.android.mediproject.core.network.datasource.sign import com.amazonaws.mobileconnectors.cognitoidentityprovider.CognitoUserPool import com.amazonaws.mobileconnectors.cognitoidentityprovider.handlers.GenericHandler import kotlin.coroutines.resume +import kotlin.coroutines.resumeWithException import kotlin.coroutines.suspendCoroutine class VerifyEmailImpl(userPool: CognitoUserPool) : AWSAccountManager(userPool), VerifyEmailAWS { @@ -11,11 +12,11 @@ class VerifyEmailImpl(userPool: CognitoUserPool) : AWSAccountManager(userPool), code, true, object : GenericHandler { override fun onSuccess() { - it.resume(true) + it.resume(Result.success(true)) } override fun onFailure(exception: Exception) { - it.resume(false) + it.resumeWithException(exception) } }, ) @@ -23,5 +24,5 @@ class VerifyEmailImpl(userPool: CognitoUserPool) : AWSAccountManager(userPool), } interface VerifyEmailAWS { - suspend fun verifyEmail(email: String, code: String): Boolean + suspend fun verifyEmail(email: String, code: String): Result }