Skip to content

Commit

Permalink
#219 이메일 검증 로직을 SignRepository에서 처리하도록 함, 로그인/가입 응답 객체 변경
Browse files Browse the repository at this point in the history
  • Loading branch information
pknujsp committed Mar 11, 2024
1 parent 63c088e commit c1d8270
Show file tree
Hide file tree
Showing 8 changed files with 71 additions and 66 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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<Boolean>
suspend fun login(loginParameter: LoginParameter): SignInState
suspend fun signUp(signUpParameter: SignUpParameter): Result<Boolean>

suspend fun signOut()
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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<Boolean> {
signDataSource.logIn(loginParameter).onSuccess {
override suspend fun login(loginParameter: LoginParameter) = signDataSource.logIn(loginParameter).fold(
onSuccess = {
_session = it.userSession
appDataStore.run {
saveSkipIntro(true)
Expand All @@ -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<Boolean> {
val result = signDataSource.signUp(signUpParameter)
if (result.isSuccess) {
appDataStore.saveSkipIntro(true)
}

return Result.success(true)
}

Expand All @@ -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
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,4 @@ import com.amazonaws.mobileconnectors.cognitoidentityprovider.CognitoUserPool

open class AWSAccountManager(
protected val userPool: CognitoUserPool,
) {

}
)
Original file line number Diff line number Diff line change
Expand Up @@ -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<SignInOutAWS.SignInResponse>
suspend fun signUp(signUpParameter: SignUpParameter): Result<SignUpAWS.SignUpResponse>
suspend fun logIn(loginParameter: LoginParameter): Result<SignInResponse>
suspend fun signUp(signUpParameter: SignUpParameter): Result<SignUpResponse>
suspend fun vertifyEmail(email: String, code: String): Result<Boolean>
suspend fun signOut()
}
Original file line number Diff line number Diff line change
Expand Up @@ -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.SignInResponse> = 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.SignUpResponse> = signUpAWS.signUp(
SignUpAWS.SignUpRequest(
override suspend fun signUp(signUpParameter: SignUpParameter): Result<SignUpResponse> = signUpAWS.signUp(
SignUpRequest(
signUpParameter.email,
signUpParameter.password,
CognitoUserAttributes().apply {
Expand All @@ -28,6 +29,8 @@ class SignDataSourceImpl(
),
)

override suspend fun vertifyEmail(email: String, code: String): Result<Boolean> = verifyEmailAWS.verifyEmail(email, code)

override suspend fun signOut() {
signInOutAWS.signOut()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 : 이메일 인증을 하지 않았을 때 발생
}

Expand Down Expand Up @@ -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<SignInResponse>

suspend fun signOut()
}
Expand All @@ -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?,
)
Original file line number Diff line number Diff line change
Expand Up @@ -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))
}

Expand All @@ -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 {
Expand All @@ -47,14 +47,14 @@ internal class SignUpAWSImpl(
)
}

override suspend fun resendConfirmationCode(cognitoUser: CognitoUser): Result<SignUpAWS.ConfirmationCodeDeliveryDetails> =
suspendCancellableCoroutine { continuation ->
override suspend fun resendConfirmationCode(cognitoUser: CognitoUser): Result<ConfirmationCodeDeliveryDetails> =
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,
Expand All @@ -79,23 +79,23 @@ interface SignUpAWS {
suspend fun confirmSignUp(cognitoUser: CognitoUser, confirmationCode: String): Result<Unit>

suspend fun resendConfirmationCode(cognitoUser: CognitoUser): Result<ConfirmationCodeDeliveryDetails>
}

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,
)
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -11,17 +12,17 @@ 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)
}
},
)
}
}

interface VerifyEmailAWS {
suspend fun verifyEmail(email: String, code: String): Boolean
suspend fun verifyEmail(email: String, code: String): Result<Boolean>
}

0 comments on commit c1d8270

Please sign in to comment.