Skip to content

Commit

Permalink
#219 TokenRepository.kt 를 생성하여 SignRepositoryImpl에 구현하도록 함, 현재 로그인 세션…
Browse files Browse the repository at this point in the history
… 정보(토큰)를 가지고 있는 레포지토리
  • Loading branch information
pknujsp committed Mar 10, 2024
1 parent 702470c commit 2ae4679
Show file tree
Hide file tree
Showing 6 changed files with 97 additions and 92 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,7 @@ import com.android.mediproject.core.data.search.SearchHistoryRepository
import com.android.mediproject.core.data.search.SearchHistoryRepositoryImpl
import com.android.mediproject.core.data.sign.SignRepository
import com.android.mediproject.core.data.sign.SignRepositoryImpl
import com.android.mediproject.core.data.token.TokenRepository
import com.android.mediproject.core.data.token.TokenRepositoryImpl
import com.android.mediproject.core.data.sign.TokenRepository
import com.android.mediproject.core.data.user.UserInfoRepository
import com.android.mediproject.core.data.user.UserInfoRepositoryImpl
import com.android.mediproject.core.data.user.UserRepository
Expand All @@ -47,10 +46,8 @@ import com.android.mediproject.core.network.datasource.news.recallsuspension.Rec
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.tokens.TokenDataSource
import com.android.mediproject.core.network.datasource.user.UserDataSource
import com.android.mediproject.core.network.datasource.user.UserInfoDataSource
import com.android.mediproject.core.network.tokens.TokenServer
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
Expand Down Expand Up @@ -115,14 +112,25 @@ object RepositoryModule {
fun providesCommentsRepository(commentsDataSource: CommentsDataSource, tokenRepository: TokenRepository): CommentsRepository =
CommentsRepositoryImpl(commentsDataSource, tokenRepository)


@Provides
@Singleton
fun providesSignRepository(
fun providesSignRepositoryImpl(
signDataSource: SignDataSource,
appDataStore: AppDataStore,
userInfoRepository: UserInfoRepository,
): SignRepository = SignRepositoryImpl(signDataSource, appDataStore, userInfoRepository)
): SignRepositoryImpl = SignRepositoryImpl(signDataSource, appDataStore, userInfoRepository)

@Provides
@Singleton
fun providesSignRepository(
signRepositoryImpl: SignRepositoryImpl,
): SignRepository = signRepositoryImpl

@Provides
@Singleton
fun providesTokenRepository(
signRepositoryImpl: SignRepositoryImpl,
): TokenRepository = signRepositoryImpl

@Provides
@Singleton
Expand All @@ -143,12 +151,12 @@ object RepositoryModule {
userInfoDataSource: UserInfoDataSource, appDataStore: AppDataStore,
): UserInfoRepository = UserInfoRepositoryImpl(userInfoDataSource, appDataStore)

@Provides
@Singleton
fun providesTokenRepository(
tokenDataSource: TokenDataSource,
tokenServer: TokenServer,
): TokenRepository = TokenRepositoryImpl(tokenDataSource, tokenServer)
/* @Provides
@Singleton
fun providesTokenRepository(
tokenDataSource: TokenDataSource,
tokenServer: TokenServer,
): TokenRepository = TokenRepositoryImpl(tokenDataSource, tokenServer)*/

@Provides
@Singleton
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import androidx.paging.Pager
import androidx.paging.PagingConfig
import androidx.paging.PagingData
import com.android.mediproject.core.common.SERVER_PAGE_SIZE
import com.android.mediproject.core.data.sign.TokenRepository
import com.android.mediproject.core.model.comments.CommentChangedResponse
import com.android.mediproject.core.model.comments.CommentListResponse
import com.android.mediproject.core.model.comments.LikeResponse
Expand All @@ -19,6 +20,7 @@ import javax.inject.Inject

class CommentsRepositoryImpl @Inject constructor(
private val commentsDataSource: CommentsDataSource,
private val tokenRepository: TokenRepository,
) : CommentsRepository {
override fun getCommentsByMedicineId(medicineId: Long): Flow<PagingData<CommentListResponse.Comment>> = Pager(
config = PagingConfig(pageSize = SERVER_PAGE_SIZE, prefetchDistance = 0),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.android.mediproject.core.data.sign

import com.amazonaws.mobileconnectors.cognitoidentityprovider.CognitoUserSession
import com.android.mediproject.core.data.user.UserInfoRepository
import com.android.mediproject.core.datastore.AppDataStore
import com.android.mediproject.core.model.requestparameters.LoginParameter
Expand All @@ -11,11 +12,16 @@ class SignRepositoryImpl(
private val signDataSource: SignDataSource,
private val appDataStore: AppDataStore,
private val userInfoRepository: UserInfoRepository,
) : SignRepository {
) : SignRepository, TokenRepository {

private var _session: CognitoUserSession? = null

override val session: CognitoUserSession? get() = _session

override suspend fun login(loginParameter: LoginParameter): Result<Boolean> {
val result = signDataSource.logIn(loginParameter)
result.onSuccess {
_session = it.userSession
appDataStore.run {
saveSkipIntro(true)
userInfoRepository.updateMyAccountInfo(
Expand All @@ -31,6 +37,8 @@ class SignRepositoryImpl(
myAccountId = 0L,
)
}
}.onFailure {
_session = null
}

return Result.success(true)
Expand All @@ -45,5 +53,8 @@ class SignRepositoryImpl(
return Result.success(true)
}

override suspend fun signOut() = signDataSource.signOut()
override suspend fun signOut() {
_session = null
signDataSource.signOut()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.android.mediproject.core.data.sign

import com.amazonaws.mobileconnectors.cognitoidentityprovider.CognitoUserSession

interface TokenRepository {
val session: CognitoUserSession?
}
Original file line number Diff line number Diff line change
@@ -1,82 +1,62 @@
package com.android.mediproject.core.network.datasource.tokens

import android.util.Log
import com.android.mediproject.core.model.token.CurrentTokens
import com.android.mediproject.core.model.token.ReissueTokenResponse
import com.android.mediproject.core.model.token.RequestBehavior
import com.android.mediproject.core.model.token.TokenState
import com.android.mediproject.core.network.module.AwsNetworkApi
import com.android.mediproject.core.network.tokens.TokenServer
import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.channelFlow
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import javax.inject.Inject
import javax.inject.Singleton

/**
* 서버에 토큰 재발급을 요청하는 DataSource
*
* @property awsNetworkApi
* @property tokenServer
*/
@Singleton
class TokenDataSourceImpl @Inject constructor(
private val awsNetworkApi: AwsNetworkApi,
private val tokenServer: TokenServer,
private val awsNetworkApi: AwsNetworkApi,
private val tokenServer: TokenServer,
) : TokenDataSource {
private val mutex = Mutex()
private var processingTokenReissuance = false
private val mutex = Mutex()
private var processingTokenReissuance = false
private val lastTokenReissueResult = MutableSharedFlow<Result<Unit>>(
replay = 0, extraBufferCapacity = 1,
onBufferOverflow = BufferOverflow.DROP_OLDEST,
)
private val lastTokenReissueResult = MutableSharedFlow<Result<Unit>>(
replay = 0, extraBufferCapacity = 1,
onBufferOverflow = BufferOverflow.DROP_OLDEST,
)
/**
* 토큰 갱신
*/
private fun reissueTokens(): Flow<Result<ReissueTokenResponse>> = channelFlow {
awsNetworkApi.reissueTokens().onResponseWithTokens(RequestBehavior.ReissueTokens, tokenServer).fold(
onSuccess = { Result.success(it) },
onFailure = { Result.failure(it) },
).also {
trySend(it)
}
}
/**
* 토큰 갱신
*/
private fun reissueTokens(): Flow<Result<ReissueTokenResponse>> = channelFlow {
awsNetworkApi.reissueTokens().onResponseWithTokens(RequestBehavior.ReissueTokens, tokenServer).fold(
onSuccess = { Result.success(it) },
onFailure = { Result.failure(it) },
).also {
trySend(it)
}
}
/**
* 메모리상에 있는 현재 토큰의 상태에 따라 새로운 토큰을 서버에 요청한다.
*
* refresh token이 없는 경우, 토큰 재발급 불가
*
* return Result<Unit>.failure()
*
* refresh token이 있는 경우, 토큰 재발급 가능
*
* return Result<Unit>.success()
*/
override fun reissueToken(currentToken: TokenState.Tokens.AccessExpiration<CurrentTokens>): Flow<Result<Unit>> = channelFlow {
Log.d("wap", "reissueToken, currentToken : $currentToken")
if (processingTokenReissuance) {
lastTokenReissueResult.collect {
trySend(it)
}
}
/**
* 메모리상에 있는 현재 토큰의 상태에 따라 새로운 토큰을 서버에 요청한다.
*
* refresh token이 없는 경우, 토큰 재발급 불가
*
* return Result<Unit>.failure()
*
* refresh token이 있는 경우, 토큰 재발급 가능
*
* return Result<Unit>.success()
*/
override fun reissueToken(currentToken: TokenState.Tokens.AccessExpiration<CurrentTokens>): Flow<Result<Unit>> = channelFlow {
Log.d("wap", "reissueToken, currentToken : $currentToken")
if (processingTokenReissuance) {
lastTokenReissueResult.collect {
trySend(it)
}
}
mutex.withLock { processingTokenReissuance = true }
reissueTokens().collectLatest { reissueTokenResponseResult ->
val result = reissueTokenResponseResult.fold(onSuccess = { Result.success(Unit) }, onFailure = { Result.failure(it) })
mutex.withLock { processingTokenReissuance = true }
reissueTokens().collectLatest { reissueTokenResponseResult ->
val result = reissueTokenResponseResult.fold(onSuccess = { Result.success(Unit) }, onFailure = { Result.failure(it) })
Log.d("wap", "reissueToken, result : $result")
lastTokenReissueResult.emit(result)
trySend(result)
Log.d("wap", "reissueToken, result : $result")
lastTokenReissueResult.emit(result)
trySend(result)
mutex.withLock { processingTokenReissuance = false }
}
}
mutex.withLock { processingTokenReissuance = false }
}
}
}
*/
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,10 @@ import com.android.mediproject.core.network.datasource.sign.SignDataSource
import com.android.mediproject.core.network.datasource.sign.SignDataSourceImpl
import com.android.mediproject.core.network.datasource.sign.SignInOutAWSImpl
import com.android.mediproject.core.network.datasource.sign.SignUpAWSImpl
import com.android.mediproject.core.network.datasource.tokens.TokenDataSource
import com.android.mediproject.core.network.datasource.tokens.TokenDataSourceImpl
import com.android.mediproject.core.network.datasource.user.UserDataSource
import com.android.mediproject.core.network.datasource.user.UserDataSourceImpl
import com.android.mediproject.core.network.datasource.user.UserInfoDataSource
import com.android.mediproject.core.network.datasource.user.UserInfoDataSourceImpl
import com.android.mediproject.core.network.tokens.TokenServer
import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory
import dagger.Module
import dagger.Provides
Expand Down Expand Up @@ -114,12 +111,12 @@ object ServerNetwork {
@Singleton
fun providesUserDataSource(awsNetworkApi: AwsNetworkApi, aesCoder: AesCoder): UserDataSource = UserDataSourceImpl(awsNetworkApi, aesCoder)

@Provides
@Singleton
fun providesTokenDataSource(
awsNetworkApi: AwsNetworkApi,
tokenServer: TokenServer,
): TokenDataSource = TokenDataSourceImpl(awsNetworkApi, tokenServer)
/* @Provides
@Singleton
fun providesTokenDataSource(
awsNetworkApi: AwsNetworkApi,
tokenServer: TokenServer,
): TokenDataSource = TokenDataSourceImpl(awsNetworkApi, tokenServer)*/
}

interface AwsNetworkApi {
Expand Down

0 comments on commit 2ae4679

Please sign in to comment.