diff --git a/Diary/Diary.xcodeproj/project.pbxproj b/Diary/Diary.xcodeproj/project.pbxproj index af079286..89fffd9c 100644 --- a/Diary/Diary.xcodeproj/project.pbxproj +++ b/Diary/Diary.xcodeproj/project.pbxproj @@ -315,7 +315,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.8.3; + MARKETING_VERSION = 1.8.4; OTHER_LDFLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = io.github.taetae98coding.diary.dev; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -413,7 +413,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.8.3; + MARKETING_VERSION = 1.8.4; OTHER_LDFLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = io.github.taetae98coding.diary; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -518,7 +518,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.8.3; + MARKETING_VERSION = 1.8.4; OTHER_LDFLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = io.github.taetae98coding.diary; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/build-logic/src/main/kotlin/BuildConfig.kt b/build-logic/src/main/kotlin/BuildConfig.kt index ea8ae1f6..60623f92 100644 --- a/build-logic/src/main/kotlin/BuildConfig.kt +++ b/build-logic/src/main/kotlin/BuildConfig.kt @@ -4,6 +4,6 @@ public data object BuildConfig { internal const val ANDROID_TARGET_SDK = 36 public const val NAMESPACE: String = "io.github.taetae98coding.diary" - public const val VERSION_NAME: String = "1.8.3" - public const val VERSION_CODE: Int = 12 + public const val VERSION_NAME: String = "1.8.4" + public const val VERSION_CODE: Int = 13 } diff --git a/core/datastore/api/src/commonMain/kotlin/io/github/taetae98coding/diary/core/datastore/api/entity/AccountMetaDataDataStoreEntity.kt b/core/datastore/api/src/commonMain/kotlin/io/github/taetae98coding/diary/core/datastore/api/entity/AccountMetaDataDataStoreEntity.kt index 06ceb6a9..bfb009a2 100644 --- a/core/datastore/api/src/commonMain/kotlin/io/github/taetae98coding/diary/core/datastore/api/entity/AccountMetaDataDataStoreEntity.kt +++ b/core/datastore/api/src/commonMain/kotlin/io/github/taetae98coding/diary/core/datastore/api/entity/AccountMetaDataDataStoreEntity.kt @@ -1,10 +1,13 @@ package io.github.taetae98coding.diary.core.datastore.api.entity +import kotlin.uuid.Uuid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable public data class AccountMetaDataDataStoreEntity( + @SerialName("accountId") + val accountId: Uuid = Uuid.NIL, @SerialName("profileImage") val profileImage: String? = null, ) diff --git a/data/account/src/commonMain/kotlin/io/github/taetae98coding/diary/data/account/repository/AccountInfoRepositoryImpl.kt b/data/account/src/commonMain/kotlin/io/github/taetae98coding/diary/data/account/repository/AccountInfoRepositoryImpl.kt index 567a944b..8590905c 100644 --- a/data/account/src/commonMain/kotlin/io/github/taetae98coding/diary/data/account/repository/AccountInfoRepositoryImpl.kt +++ b/data/account/src/commonMain/kotlin/io/github/taetae98coding/diary/data/account/repository/AccountInfoRepositoryImpl.kt @@ -9,9 +9,7 @@ import io.github.taetae98coding.diary.domain.account.repository.AccountInfoRepos import kotlin.uuid.Uuid import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.mapLatest -import kotlinx.coroutines.flow.runningFold import org.koin.core.annotation.Factory import org.koin.core.annotation.Provided @@ -21,14 +19,7 @@ internal class AccountInfoRepositoryImpl( private val supabaseAuth: SupabaseAuth, ) : AccountInfoRepository { override fun get(): Flow { - return supabaseAuth.sessionStatus.runningFold(SupabaseSessionStatus.Loading) { acc, value -> - when (value) { - is SupabaseSessionStatus.Authenticated, is SupabaseSessionStatus.NotAuthenticated -> value - else -> acc - } - }.filter { status -> - status is SupabaseSessionStatus.Authenticated || status is SupabaseSessionStatus.NotAuthenticated - }.mapLatest { status -> + return supabaseAuth.sessionStatus.mapLatest { status -> when (status) { is SupabaseSessionStatus.Authenticated -> { AccountInfo( diff --git a/data/account/src/commonMain/kotlin/io/github/taetae98coding/diary/data/account/repository/AccountMetaDataRepositoryImpl.kt b/data/account/src/commonMain/kotlin/io/github/taetae98coding/diary/data/account/repository/AccountMetaDataRepositoryImpl.kt index 928457f5..7d57a60f 100644 --- a/data/account/src/commonMain/kotlin/io/github/taetae98coding/diary/data/account/repository/AccountMetaDataRepositoryImpl.kt +++ b/data/account/src/commonMain/kotlin/io/github/taetae98coding/diary/data/account/repository/AccountMetaDataRepositoryImpl.kt @@ -1,11 +1,15 @@ +@file:OptIn(ExperimentalCoroutinesApi::class) + package io.github.taetae98coding.diary.data.account.repository import io.github.taetae98coding.diary.core.datastore.api.datasource.AccountMetaDataDataStoreDataSource import io.github.taetae98coding.diary.core.mapper.toDomain import io.github.taetae98coding.diary.core.model.account.AccountMetaData import io.github.taetae98coding.diary.domain.account.repository.AccountMetaDataRepository +import kotlin.uuid.Uuid +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.mapLatest import org.koin.core.annotation.Factory import org.koin.core.annotation.Provided @@ -14,7 +18,9 @@ internal class AccountMetaDataRepositoryImpl( @param:Provided private val accountMetaDataDataStoreDataSource: AccountMetaDataDataStoreDataSource, ) : AccountMetaDataRepository { - override fun get(): Flow { - return accountMetaDataDataStoreDataSource.get().map { it?.toDomain() } + override fun get(accountId: Uuid): Flow { + return accountMetaDataDataStoreDataSource.get() + .mapLatest { it?.takeIf { it.accountId == accountId } } + .mapLatest { it?.toDomain() } } } diff --git a/data/credentials/src/commonMain/kotlin/io/github/taetae98coding/diary/data/credentials/repository/SessionRepositoryImpl.kt b/data/credentials/src/commonMain/kotlin/io/github/taetae98coding/diary/data/credentials/repository/SessionRepositoryImpl.kt index 9481d1e4..93e2c60c 100644 --- a/data/credentials/src/commonMain/kotlin/io/github/taetae98coding/diary/data/credentials/repository/SessionRepositoryImpl.kt +++ b/data/credentials/src/commonMain/kotlin/io/github/taetae98coding/diary/data/credentials/repository/SessionRepositoryImpl.kt @@ -37,7 +37,12 @@ public class SessionRepositoryImpl( } private suspend fun updateSession(sessionRemote: SessionRemoteEntity) { - accountMetaDataDataStoreDataSource.upsert(AccountMetaDataDataStoreEntity(profileImage = sessionRemote.account.profileImage)) + accountMetaDataDataStoreDataSource.upsert( + AccountMetaDataDataStoreEntity( + accountId = sessionRemote.account.id, + profileImage = sessionRemote.account.profileImage, + ), + ) supabaseAuth.importAuthToken(sessionRemote.accessToken, sessionRemote.refreshToken) } } diff --git a/data/credentials/src/jvmTest/kotlin/io/github/taetae98coding/diary/data/credentials/repository/SessionRepositoryImplTest.kt b/data/credentials/src/jvmTest/kotlin/io/github/taetae98coding/diary/data/credentials/repository/SessionRepositoryImplTest.kt index 4f3e7708..c1106040 100644 --- a/data/credentials/src/jvmTest/kotlin/io/github/taetae98coding/diary/data/credentials/repository/SessionRepositoryImplTest.kt +++ b/data/credentials/src/jvmTest/kotlin/io/github/taetae98coding/diary/data/credentials/repository/SessionRepositoryImplTest.kt @@ -43,7 +43,10 @@ class SessionRepositoryImplTest : FunSpec() { coVerifyOrder { sessionRemoteDataSource.getByGoogleIdToken(idToken) accountMetaDataDataStoreDataSource.upsert( - AccountMetaDataDataStoreEntity(profileImage = sessionRemote.account.profileImage), + AccountMetaDataDataStoreEntity( + accountId = sessionRemote.account.id, + profileImage = sessionRemote.account.profileImage, + ), ) supabaseAuth.importAuthToken(sessionRemote.accessToken, sessionRemote.refreshToken) } @@ -62,7 +65,10 @@ class SessionRepositoryImplTest : FunSpec() { coVerifyOrder { sessionRemoteDataSource.getByGoogleAuthorizationCode(clientId, code, redirectUri) accountMetaDataDataStoreDataSource.upsert( - AccountMetaDataDataStoreEntity(profileImage = sessionRemote.account.profileImage), + AccountMetaDataDataStoreEntity( + accountId = sessionRemote.account.id, + profileImage = sessionRemote.account.profileImage, + ), ) supabaseAuth.importAuthToken(sessionRemote.accessToken, sessionRemote.refreshToken) } diff --git a/domain/account/src/commonMain/kotlin/io/github/taetae98coding/diary/domain/account/repository/AccountMetaDataRepository.kt b/domain/account/src/commonMain/kotlin/io/github/taetae98coding/diary/domain/account/repository/AccountMetaDataRepository.kt index cc986b31..e9bcb7f4 100644 --- a/domain/account/src/commonMain/kotlin/io/github/taetae98coding/diary/domain/account/repository/AccountMetaDataRepository.kt +++ b/domain/account/src/commonMain/kotlin/io/github/taetae98coding/diary/domain/account/repository/AccountMetaDataRepository.kt @@ -1,8 +1,9 @@ package io.github.taetae98coding.diary.domain.account.repository import io.github.taetae98coding.diary.core.model.account.AccountMetaData +import kotlin.uuid.Uuid import kotlinx.coroutines.flow.Flow public interface AccountMetaDataRepository { - public fun get(): Flow + public fun get(accountId: Uuid): Flow } diff --git a/domain/account/src/commonMain/kotlin/io/github/taetae98coding/diary/domain/account/usecase/GetAccountUseCase.kt b/domain/account/src/commonMain/kotlin/io/github/taetae98coding/diary/domain/account/usecase/GetAccountUseCase.kt index ee28ad67..16f58283 100644 --- a/domain/account/src/commonMain/kotlin/io/github/taetae98coding/diary/domain/account/usecase/GetAccountUseCase.kt +++ b/domain/account/src/commonMain/kotlin/io/github/taetae98coding/diary/domain/account/usecase/GetAccountUseCase.kt @@ -8,9 +8,10 @@ import io.github.taetae98coding.diary.domain.account.repository.AccountMetaDataR import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.catch -import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.emitAll +import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.mapLatest import org.koin.core.annotation.Factory import org.koin.core.annotation.Provided @@ -24,21 +25,21 @@ public class GetAccountUseCase( ) { public operator fun invoke(): Flow> { return flow { - combine( - accountInfoRepository.get(), - accountMetaDataRepository.get(), - ) { accountInfo, accountMetaData -> - if (accountInfo == null) { - Account.Guest - } else { - Account.User( - accountInfo = accountInfo, - accountMetaData = accountMetaData, - ) + accountInfoRepository.get() + .flatMapLatest { accountInfo -> + if (accountInfo == null) { + flowOf(Account.Guest) + } else { + accountMetaDataRepository.get(accountInfo.id) + .mapLatest { accountMetaData -> + Account.User( + accountInfo = accountInfo, + accountMetaData = accountMetaData, + ) + } + } } - }.also { - emitAll(it) - } + .also { emitAll(it) } }.mapLatest { Result.success(it) }.catch { diff --git a/domain/account/src/jvmTest/kotlin/io/github/taetae98coding/diary/domain/account/usecase/GetAccountUseCaseTest.kt b/domain/account/src/jvmTest/kotlin/io/github/taetae98coding/diary/domain/account/usecase/GetAccountUseCaseTest.kt index 271f4ac2..29bc474b 100644 --- a/domain/account/src/jvmTest/kotlin/io/github/taetae98coding/diary/domain/account/usecase/GetAccountUseCaseTest.kt +++ b/domain/account/src/jvmTest/kotlin/io/github/taetae98coding/diary/domain/account/usecase/GetAccountUseCaseTest.kt @@ -35,7 +35,6 @@ class GetAccountUseCaseTest : BehaviorSpec() { clearAllMocks() every { accountInfoRepository.get() } returns flowOf(null) - every { accountMetaDataRepository.get() } returns flowOf(null) When("GetAccountUseCase를 호출하면") { val result = useCase().first() @@ -59,7 +58,7 @@ class GetAccountUseCaseTest : BehaviorSpec() { .sample() every { accountInfoRepository.get() } returns flowOf(accountInfo) - every { accountMetaDataRepository.get() } returns flowOf(accountMetaData) + every { accountMetaDataRepository.get(accountInfo.id) } returns flowOf(accountMetaData) When("GetAccountUseCase를 호출하면") { val result = useCase().first() @@ -78,7 +77,7 @@ class GetAccountUseCaseTest : BehaviorSpec() { } Then("AccountMetaDataRepository를 호출한다") { - verify(exactly = 1) { accountMetaDataRepository.get() } + verify(exactly = 1) { accountMetaDataRepository.get(accountInfo.id) } } } } @@ -88,7 +87,7 @@ class GetAccountUseCaseTest : BehaviorSpec() { val accountInfo = fixtureMonkey.giveMeOne() every { accountInfoRepository.get() } returns flowOf(accountInfo) - every { accountMetaDataRepository.get() } returns flowOf(null) + every { accountMetaDataRepository.get(accountInfo.id) } returns flowOf(null) When("GetAccountUseCase를 호출하면") { val result = useCase().first() diff --git a/feature/memo/src/commonMain/kotlin/io/github/taetae98coding/diary/feature/memo/common/TagCard.kt b/feature/memo/src/commonMain/kotlin/io/github/taetae98coding/diary/feature/memo/common/TagCard.kt index 8104e5aa..42252182 100644 --- a/feature/memo/src/commonMain/kotlin/io/github/taetae98coding/diary/feature/memo/common/TagCard.kt +++ b/feature/memo/src/commonMain/kotlin/io/github/taetae98coding/diary/feature/memo/common/TagCard.kt @@ -6,6 +6,7 @@ import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.ExperimentalFlexBoxApi import androidx.compose.foundation.layout.FlexAlignContent +import androidx.compose.foundation.layout.FlexAlignItems import androidx.compose.foundation.layout.FlexBox import androidx.compose.foundation.layout.FlexJustifyContent import androidx.compose.foundation.layout.FlexWrap @@ -83,6 +84,7 @@ private fun TagFlowRow( wrap(FlexWrap.Wrap) gap(6.dp) justifyContent(FlexJustifyContent.Center) + alignItems(FlexAlignItems.Center) alignContent(FlexAlignContent.Center) }, ) { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 981e3ba6..ff1caa8f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -39,7 +39,7 @@ firebase-perf-plugin = "2.0.2" coil = "3.4.0" # https://github.com/coil-kt/coil/releases koin = "4.2.1" # https://github.com/InsertKoinIO/koin/releases koin-compiler-plugin = "1.0.0-RC2" # https://github.com/InsertKoinIO/koin-compiler-plugin/releases -fixture-monkey = "1.1.19" # https://github.com/naver/fixture-monkey/releases +fixture-monkey = "1.1.20" # https://github.com/naver/fixture-monkey/releases google-identity = "1.2.0" # https://developers.google.com/identity/android-credential-manager/releases?hl=en google-oauth-client = "1.39.0" # https://github.com/googleapis/google-oauth-java-client/releases google-play-services-location = "21.3.0" # https://developers.google.com/android/guides/releases?hl=en