From d2676a11fc49d203ab9486a1fcd0fd80f983bbef Mon Sep 17 00:00:00 2001 From: taehwan Date: Mon, 10 Jun 2024 14:04:26 +0900 Subject: [PATCH] =?UTF-8?q?[#333]=20=EC=BD=94=EB=93=9C=EB=A6=AC=EB=B7=B0?= =?UTF-8?q?=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/api/ContributorRepository.kt | 4 +- .../DefaultContributorRepository.kt | 10 +++- .../DefaultContributorRepositoryTest.kt | 45 +++++++++------- .../domain/usecase/GetContributorsUseCase.kt | 4 +- .../usecase/FakeContributorRepository.kt | 6 +-- .../usecase/GetContributorsUseCaseTest.kt | 52 +++++++++++-------- .../app/core/model/ContributorGroup.kt | 6 +++ .../model/convert/ContributorsConvert.kt | 33 ++++-------- 8 files changed, 88 insertions(+), 72 deletions(-) create mode 100644 core/model/src/main/java/com/droidknights/app/core/model/ContributorGroup.kt diff --git a/core/data-api/src/main/java/com/droidknights/app/core/data/repository/api/ContributorRepository.kt b/core/data-api/src/main/java/com/droidknights/app/core/data/repository/api/ContributorRepository.kt index 02085ec0..534f449b 100644 --- a/core/data-api/src/main/java/com/droidknights/app/core/data/repository/api/ContributorRepository.kt +++ b/core/data-api/src/main/java/com/droidknights/app/core/data/repository/api/ContributorRepository.kt @@ -1,6 +1,6 @@ package com.droidknights.app.core.data.repository.api -import com.droidknights.app.core.model.Contributor +import com.droidknights.app.core.model.ContributorGroup import kotlinx.coroutines.flow.Flow interface ContributorRepository { @@ -8,5 +8,5 @@ interface ContributorRepository { fun flowContributors( owner: String, name: String, - ): Flow>> + ): Flow> } diff --git a/core/data/src/main/java/com/droidknights/app/core/data/repository/DefaultContributorRepository.kt b/core/data/src/main/java/com/droidknights/app/core/data/repository/DefaultContributorRepository.kt index 2477bb54..50ec66ea 100644 --- a/core/data/src/main/java/com/droidknights/app/core/data/repository/DefaultContributorRepository.kt +++ b/core/data/src/main/java/com/droidknights/app/core/data/repository/DefaultContributorRepository.kt @@ -4,7 +4,7 @@ import com.droidknights.app.core.data.api.GithubApi import com.droidknights.app.core.data.api.GithubRawApi import com.droidknights.app.core.data.mapper.toData import com.droidknights.app.core.data.repository.api.ContributorRepository -import com.droidknights.app.core.model.Contributor +import com.droidknights.app.core.model.ContributorGroup import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.flow @@ -16,7 +16,7 @@ internal class DefaultContributorRepository @Inject constructor( private val githubRawApi: GithubRawApi ) : ContributorRepository { - override fun flowContributors(owner: String, name: String): Flow>> = + override fun flowContributors(owner: String, name: String): Flow> = combine( flow { emit(githubApi.getContributors(owner, name)) @@ -48,5 +48,11 @@ internal class DefaultContributorRepository @Inject constructor( yearMap.mapValues { year -> year.value.mapNotNull { id -> resultMap[id] } } + yearMap.map { year -> + ContributorGroup( + year = year.key, + contributors = year.value.mapNotNull { id -> resultMap[id] }, + ) + } } } diff --git a/core/data/src/test/java/com/droidknights/app/core/data/repository/DefaultContributorRepositoryTest.kt b/core/data/src/test/java/com/droidknights/app/core/data/repository/DefaultContributorRepositoryTest.kt index b219caf1..aa36b232 100644 --- a/core/data/src/test/java/com/droidknights/app/core/data/repository/DefaultContributorRepositoryTest.kt +++ b/core/data/src/test/java/com/droidknights/app/core/data/repository/DefaultContributorRepositoryTest.kt @@ -4,6 +4,7 @@ import com.droidknights.app.core.data.api.fake.FakeGithubApi import com.droidknights.app.core.data.api.fake.FakeGithubRawApi import com.droidknights.app.core.data.api.model.ContributorResponse import com.droidknights.app.core.model.Contributor +import com.droidknights.app.core.model.ContributorGroup import io.kotest.core.spec.style.BehaviorSpec import io.kotest.matchers.shouldBe import kotlinx.coroutines.flow.first @@ -24,27 +25,33 @@ internal class DefaultContributorRepositoryTest : BehaviorSpec() { ).first() Then("컨트리뷰터를 반환한다") { contributorList.size shouldBe 2 - contributorList shouldBe mapOf( - 2024 to listOf( - Contributor( - name = "2024 - name", - imageUrl = "test image url", - githubUrl = "test github url", - id = 32327475 + contributorList shouldBe listOf( + ContributorGroup( + year = 2024, + contributors = listOf( + Contributor( + name = "2024 - name", + imageUrl = "test image url", + githubUrl = "test github url", + id = 32327475 + ), ), ), - 2023 to listOf( - Contributor( - name = "test name", - imageUrl = "test image url", - githubUrl = "test github url", - id = 28249981 - ), - Contributor( - name = "2024 - name", - imageUrl = "test image url", - githubUrl = "test github url", - id = 32327475 + ContributorGroup( + year = 2023, + contributors = listOf( + Contributor( + name = "test name", + imageUrl = "test image url", + githubUrl = "test github url", + id = 28249981 + ), + Contributor( + name = "2024 - name", + imageUrl = "test image url", + githubUrl = "test github url", + id = 32327475 + ), ), ), ) diff --git a/core/domain/src/main/java/com/droidknights/app/core/domain/usecase/GetContributorsUseCase.kt b/core/domain/src/main/java/com/droidknights/app/core/domain/usecase/GetContributorsUseCase.kt index c311f519..2e4a73f7 100644 --- a/core/domain/src/main/java/com/droidknights/app/core/domain/usecase/GetContributorsUseCase.kt +++ b/core/domain/src/main/java/com/droidknights/app/core/domain/usecase/GetContributorsUseCase.kt @@ -1,7 +1,7 @@ package com.droidknights.app.core.domain.usecase import com.droidknights.app.core.data.repository.api.ContributorRepository -import com.droidknights.app.core.model.Contributor +import com.droidknights.app.core.model.ContributorGroup import kotlinx.coroutines.flow.Flow import javax.inject.Inject @@ -9,7 +9,7 @@ class GetContributorsUseCase @Inject constructor( private val repository: ContributorRepository, ) { - operator fun invoke(): Flow>> = + operator fun invoke(): Flow> = repository.flowContributors( owner = OWNER, name = NAME, diff --git a/core/domain/src/test/java/com/droidknights/app/core/domain/usecase/FakeContributorRepository.kt b/core/domain/src/test/java/com/droidknights/app/core/domain/usecase/FakeContributorRepository.kt index a20df6e3..3441e08e 100644 --- a/core/domain/src/test/java/com/droidknights/app/core/domain/usecase/FakeContributorRepository.kt +++ b/core/domain/src/test/java/com/droidknights/app/core/domain/usecase/FakeContributorRepository.kt @@ -1,14 +1,14 @@ package com.droidknights.app.core.domain.usecase import com.droidknights.app.core.data.repository.api.ContributorRepository -import com.droidknights.app.core.model.Contributor +import com.droidknights.app.core.model.ContributorGroup import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOf internal class FakeContributorRepository( - private val contributors: Map>, + private val contributors: List, ) : ContributorRepository { - override fun flowContributors(owner: String, name: String): Flow>> = + override fun flowContributors(owner: String, name: String): Flow> = flowOf(contributors) } diff --git a/core/domain/src/test/java/com/droidknights/app/core/domain/usecase/GetContributorsUseCaseTest.kt b/core/domain/src/test/java/com/droidknights/app/core/domain/usecase/GetContributorsUseCaseTest.kt index 8de1e218..0a7a74e3 100644 --- a/core/domain/src/test/java/com/droidknights/app/core/domain/usecase/GetContributorsUseCaseTest.kt +++ b/core/domain/src/test/java/com/droidknights/app/core/domain/usecase/GetContributorsUseCaseTest.kt @@ -1,6 +1,7 @@ package com.droidknights.app.core.domain.usecase import com.droidknights.app.core.model.Contributor +import com.droidknights.app.core.model.ContributorGroup import io.kotest.core.spec.style.BehaviorSpec import io.kotest.matchers.shouldBe import kotlinx.coroutines.flow.first @@ -8,7 +9,7 @@ import kotlinx.coroutines.flow.first internal class GetContributorsUseCaseTest : BehaviorSpec() { private val useCase: GetContributorsUseCase = GetContributorsUseCase( - repository = FakeContributorRepository(contributors) + repository = FakeContributorRepository(mockContributors) ) init { @@ -17,35 +18,42 @@ internal class GetContributorsUseCaseTest : BehaviorSpec() { When("드로이드나이츠 컨트리뷰터를 조회한다") { val contributors = useCase.invoke().first() - Then("올해 드로이드나이츠 컨트리뷰터를 반환한다") { - contributors shouldBe contributors + Then("연도별 드로이드나이츠 컨트리뷰터를 반환한다") { + contributors shouldBe mockContributors } } } } companion object { - private val contributors = mapOf( - 2023 to listOf( - Contributor( - name = "test name", - imageUrl = "test image url", - githubUrl = "test github url", - id = 28249981 - ), - Contributor( - name = "2024 - name", - imageUrl = "test image url", - githubUrl = "test github url", - id = 32327475 + + private val mockContributors = listOf( + ContributorGroup( + year = 2024, + contributors = listOf( + Contributor( + name = "2024 - name", + imageUrl = "test image url", + githubUrl = "test github url", + id = 32327475 + ), ), ), - 2024 to listOf( - Contributor( - name = "2024 - name", - imageUrl = "test image url", - githubUrl = "test github url", - id = 32327475 + ContributorGroup( + year = 2023, + contributors = listOf( + Contributor( + name = "test name", + imageUrl = "test image url", + githubUrl = "test github url", + id = 28249981 + ), + Contributor( + name = "2024 - name", + imageUrl = "test image url", + githubUrl = "test github url", + id = 32327475 + ), ), ), ) diff --git a/core/model/src/main/java/com/droidknights/app/core/model/ContributorGroup.kt b/core/model/src/main/java/com/droidknights/app/core/model/ContributorGroup.kt new file mode 100644 index 00000000..92ecc7fc --- /dev/null +++ b/core/model/src/main/java/com/droidknights/app/core/model/ContributorGroup.kt @@ -0,0 +1,6 @@ +package com.droidknights.app.core.model + +data class ContributorGroup( + val year: Int, + val contributors: List, +) diff --git a/feature/contributor/src/main/java/com/droidknights/app/feature/contributor/model/convert/ContributorsConvert.kt b/feature/contributor/src/main/java/com/droidknights/app/feature/contributor/model/convert/ContributorsConvert.kt index 967a2784..bae1bfe5 100644 --- a/feature/contributor/src/main/java/com/droidknights/app/feature/contributor/model/convert/ContributorsConvert.kt +++ b/feature/contributor/src/main/java/com/droidknights/app/feature/contributor/model/convert/ContributorsConvert.kt @@ -1,32 +1,21 @@ package com.droidknights.app.feature.contributor.model.convert -import com.droidknights.app.core.model.Contributor +import com.droidknights.app.core.model.ContributorGroup import com.droidknights.app.feature.contributor.model.ContributorsUiState import kotlinx.collections.immutable.toPersistentList -internal fun Map>.toContributorsUiState(): ContributorsUiState { - val newList = mutableListOf() - - // key, value 추가 - forEach { (key, values) -> - newList.add( - ContributorsUiState.Contributors.Item.Section( - title = key.toString(), - ) - ) - values.forEach { item -> - newList.add( +internal fun List.toContributorsUiState(): ContributorsUiState = + ContributorsUiState.Contributors( + contributors = flatMap { (year, contributors) -> + sequenceOf( + ContributorsUiState.Contributors.Item.Section(title = year.toString()) + ) + contributors.map { item -> ContributorsUiState.Contributors.Item.User( id = item.id, imageUrl = item.imageUrl, githubUrl = item.githubUrl, - name = item.name, + name = item.name ) - ) - } - } - - return ContributorsUiState.Contributors( - contributors = newList.toPersistentList(), - ) -} \ No newline at end of file + } + }.toPersistentList(), + ) \ No newline at end of file