Skip to content

Commit

Permalink
#219 SignDataSource 에서 로그인, 회원가입 기능을 클래스로 분리
Browse files Browse the repository at this point in the history
  • Loading branch information
pknujsp committed Mar 11, 2024
1 parent f1b3adc commit a94249a
Show file tree
Hide file tree
Showing 17 changed files with 139 additions and 217 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ import com.android.mediproject.core.network.datasource.news.adminaction.AdminAct
import com.android.mediproject.core.network.datasource.news.recallsuspension.RecallSaleSuspensionDataSource
import com.android.mediproject.core.network.datasource.news.recallsuspension.RecallSaleSuspensionListDataSourceImpl
import com.android.mediproject.core.network.datasource.news.safetynotification.SafetyNotificationDataSource
import com.android.mediproject.core.network.datasource.sign.SignDataSource
import com.android.mediproject.core.network.datasource.sign.LoginDataSource
import com.android.mediproject.core.network.datasource.user.UserDataSource
import dagger.Module
import dagger.Provides
Expand Down Expand Up @@ -113,10 +113,10 @@ object RepositoryModule {
@Provides
@Singleton
internal fun providesSignRepositoryImpl(
signDataSource: SignDataSource,
loginDataSource: LoginDataSource,
appDataStore: AppDataStore,
accountSessionRepository: AccountSessionRepository,
): SignRepository = SignRepositoryImpl(signDataSource, accountSessionRepository, appDataStore)
): SignRepository = SignRepositoryImpl(loginDataSource, accountSessionRepository, appDataStore)


@Provides
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ import com.android.mediproject.core.model.sign.SignUpParameter
interface SignRepository {
suspend fun login(loginParameter: LoginParameter): LoginState
suspend fun signUp(signUpParameter: SignUpParameter): Result<Boolean>
suspend fun signOut()

suspend fun isValidEmail(email: String): Boolean
suspend fun signOut()
suspend fun verifyEmail(email: String, code: String): Result<Boolean>
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@ import com.android.mediproject.core.data.session.AccountSessionRepository
import com.android.mediproject.core.datastore.AppDataStore
import com.android.mediproject.core.model.sign.LoginParameter
import com.android.mediproject.core.model.sign.SignUpParameter
import com.android.mediproject.core.network.datasource.sign.SignDataSource
import com.android.mediproject.core.network.datasource.sign.LoginDataSource

internal class SignRepositoryImpl(
private val signDataSource: SignDataSource,
private val loginDataSource: LoginDataSource,
private val accountSessionRepository: AccountSessionRepository,
private val appDataStore: AppDataStore,
) : SignRepository {

override suspend fun login(loginParameter: LoginParameter) = signDataSource.logIn(loginParameter).fold(
override suspend fun login(loginParameter: LoginParameter) = loginDataSource.logIn(loginParameter).fold(
onSuccess = {
accountSessionRepository.updateSession(it.userSession)
accountSessionRepository.updateAccount(loginParameter.email, it.userSession.username)
Expand All @@ -30,19 +30,19 @@ internal class SignRepositoryImpl(
)

override suspend fun signUp(signUpParameter: SignUpParameter): Result<Boolean> {
signDataSource.signUp(signUpParameter).onSuccess {
loginDataSource.signUp(signUpParameter).onSuccess {
appDataStore.saveSkipIntro(true)
}
return Result.success(true)
}

override suspend fun signOut() {
accountSessionRepository.updateSession(null)
signDataSource.signOut()
loginDataSource.logout()
}

override suspend fun verifyEmail(email: String, code: String): Result<Boolean> {
return signDataSource.vertifyEmail(email, code)
return loginDataSource.vertifyEmail(email, code)
}
}

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.android.mediproject.core.network.datasource.sign

import com.amazonaws.mobileconnectors.cognitoidentityprovider.CognitoDevice
import com.amazonaws.mobileconnectors.cognitoidentityprovider.CognitoUserSession

interface LoginDataSource {
suspend fun login(request: LoginRequest): Result<LoginResponse>
suspend fun logout()
}

class LoginRequest(
val email: String,
val password: ByteArray,
)

class LoginResponse(
val userSession: CognitoUserSession,
val newDevice: CognitoDevice?,
)
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,22 @@ 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) = suspendCoroutine { continuation ->
class LoginDataSourceImpl(
private val userPool: CognitoUserPool,
) : LoginDataSource {

override suspend fun login(request: LoginRequest) = suspendCoroutine { continuation ->
userPool.getUser(request.email).getSession(
object : AuthenticationHandler {
override fun onSuccess(userSession: CognitoUserSession, newDevice: CognitoDevice?) {
continuation.resume(Result.success(SignInResponse(userSession, newDevice)))
continuation.resume(Result.success(LoginResponse(userSession, newDevice)))
}

override fun onFailure(exception: Exception) {
continuation.resumeWithException(exception)
// UserNotConfirmedException : 이메일 인증을 하지 않았을 때 발생
// UserExistsException : 이미 가입된 이메일일 때 발생
}

override fun authenticationChallenge(continuation: ChallengeContinuation?) {
Expand All @@ -32,7 +36,11 @@ internal class SignInOutAWSImpl(userPool: CognitoUserPool) : AWSAccountManager(u

override fun getAuthenticationDetails(authenticationContinuation: AuthenticationContinuation, userId: String) {
authenticationContinuation.run {
val authDetails = AuthenticationDetails(userId, request.password.decodeToString(), null)
val authDetails = AuthenticationDetails(
userId,
request.password.decodeToString(),
null,
)
setAuthenticationDetails(authDetails)
continueTask()
}
Expand All @@ -45,22 +53,5 @@ internal class SignInOutAWSImpl(userPool: CognitoUserPool) : AWSAccountManager(u
)
}

override suspend fun signOut() = userPool.currentUser.signOut()
override suspend fun logout() = userPool.currentUser.signOut()
}


interface SignInOutAWS {
suspend fun signIn(request: SignInRequest): Result<SignInResponse>

suspend fun signOut()
}

class SignInRequest(
val email: String,
val password: ByteArray,
)

class SignInResponse(
val userSession: CognitoUserSession,
val newDevice: CognitoDevice?,
)

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.android.mediproject.core.network.datasource.sign

import com.amazonaws.mobileconnectors.cognitoidentityprovider.CognitoUser
import com.amazonaws.mobileconnectors.cognitoidentityprovider.CognitoUserAttributes
import com.amazonaws.services.cognitoidentityprovider.model.SignUpResult

interface SignupDataSource {
suspend fun signUp(signUpParameter: SignUpRequest): Result<SignUpResponse>
suspend fun confirmEmail(email: String, code: 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()
}

data class SignUpResponse(
val cognitoUser: CognitoUser,
val signUpResult: SignUpResult,
)

data class ConfirmationCodeDeliveryDetails(
val destination: String,
val deliveryMedium: String,
val attributeName: String,
)
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.android.mediproject.core.network.datasource.sign

import com.amazonaws.mobileconnectors.cognitoidentityprovider.CognitoUser
import com.amazonaws.mobileconnectors.cognitoidentityprovider.CognitoUserAttributes
import com.amazonaws.mobileconnectors.cognitoidentityprovider.CognitoUserCodeDeliveryDetails
import com.amazonaws.mobileconnectors.cognitoidentityprovider.CognitoUserPool
import com.amazonaws.mobileconnectors.cognitoidentityprovider.handlers.GenericHandler
Expand All @@ -12,9 +11,11 @@ import kotlin.coroutines.resume
import kotlin.coroutines.resumeWithException
import kotlin.coroutines.suspendCoroutine

internal class SignUpAWSImpl(
userPool: CognitoUserPool,
) : AWSAccountManager(userPool), SignUpAWS {
private const val USER_NAME = "user_name"

class SignupDataSourceImpl(
private val userPool: CognitoUserPool,
) : SignupDataSource {

override suspend fun signUp(request: SignUpRequest) = suspendCoroutine { continuation ->
userPool.signUp(
Expand All @@ -32,21 +33,6 @@ internal class SignUpAWSImpl(
)
}

override suspend fun confirmSignUp(cognitoUser: CognitoUser, confirmationCode: String) = suspendCoroutine { continuation ->
cognitoUser.confirmSignUpInBackground(
confirmationCode, false,
object : GenericHandler {
override fun onSuccess() {
continuation.resume(Result.success(Unit))
}

override fun onFailure(exception: Exception) {
continuation.resumeWithException(exception)
}
},
)
}

override suspend fun resendConfirmationCode(cognitoUser: CognitoUser): Result<ConfirmationCodeDeliveryDetails> =
suspendCoroutine { continuation ->
cognitoUser.resendConfirmationCode(
Expand All @@ -70,32 +56,19 @@ internal class SignUpAWSImpl(
)
}

}

interface SignUpAWS {

suspend fun signUp(request: SignUpRequest): Result<SignUpResponse>

suspend fun confirmSignUp(cognitoUser: CognitoUser, confirmationCode: String): Result<Unit>

suspend fun resendConfirmationCode(cognitoUser: CognitoUser): Result<ConfirmationCodeDeliveryDetails>
}
override suspend fun confirmEmail(email: String, code: String) = suspendCoroutine {
userPool.getUser(email).confirmSignUp(
code, true,
object : GenericHandler {
override fun onSuccess() {
it.resume(Result.success(Unit))
}

class SignUpRequest(
val email: String,
private val password: ByteArray,
val cognitoUserAttributes: CognitoUserAttributes,
) {
val passwordString: String get() = password.decodeToString()
override fun onFailure(exception: Exception) {
it.resumeWithException(exception)
}
},
)
}

}

data class SignUpResponse(
val cognitoUser: CognitoUser,
val signUpResult: SignUpResult,
)

data class ConfirmationCodeDeliveryDetails(
val destination: String,
val deliveryMedium: String,
val attributeName: String,
)

This file was deleted.

Loading

0 comments on commit a94249a

Please sign in to comment.