From c0ab281eb6308e63bb8eb04bb4a97a085179cd73 Mon Sep 17 00:00:00 2001 From: kwakjoohyeong Date: Wed, 29 May 2024 00:53:04 +0900 Subject: [PATCH 01/19] feat: Commit API, CommitResponse --- .../app/core/data/api/GithubApi.kt | 10 +++++++ .../app/core/data/api/model/CommitResponse.kt | 29 +++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 core/data/src/main/java/com/droidknights/app/core/data/api/model/CommitResponse.kt diff --git a/core/data/src/main/java/com/droidknights/app/core/data/api/GithubApi.kt b/core/data/src/main/java/com/droidknights/app/core/data/api/GithubApi.kt index 141cbc14..9a48b2b6 100644 --- a/core/data/src/main/java/com/droidknights/app/core/data/api/GithubApi.kt +++ b/core/data/src/main/java/com/droidknights/app/core/data/api/GithubApi.kt @@ -1,8 +1,10 @@ package com.droidknights.app.core.data.api +import com.droidknights.app.core.data.api.model.CommitResponse import com.droidknights.app.core.data.api.model.ContributorResponse import retrofit2.http.GET import retrofit2.http.Path +import retrofit2.http.Query internal interface GithubApi { @@ -11,4 +13,12 @@ internal interface GithubApi { @Path("owner") owner: String, @Path("name") name: String, ): List + + @GET("repos/{owner}/{name}/commits") + suspend fun getCommits( + @Path("owner") owner: String, + @Path("name") name: String, + @Query("author") author: String, + @Query("per_page") perPage: Int, + ): List } diff --git a/core/data/src/main/java/com/droidknights/app/core/data/api/model/CommitResponse.kt b/core/data/src/main/java/com/droidknights/app/core/data/api/model/CommitResponse.kt new file mode 100644 index 00000000..5fc91f1f --- /dev/null +++ b/core/data/src/main/java/com/droidknights/app/core/data/api/model/CommitResponse.kt @@ -0,0 +1,29 @@ +package com.droidknights.app.core.data.api.model + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class CommitResponse( + val commit: Commit, + val author: AuthorInfo, +) + +@Serializable +data class Commit( + val author: Author, +) + +@Serializable +data class Author( + val name: String, + val email: String, + val date: String, +) + +@Serializable +data class AuthorInfo( + @SerialName("login") val name: String, + @SerialName("avatar_url") val imageUrl: String, + @SerialName("html_url") val githubUrl: String, +) \ No newline at end of file From 25e137272cdd398883d184f5ba240407d5e7b9df Mon Sep 17 00:00:00 2001 From: kwakjoohyeong Date: Wed, 29 May 2024 00:53:26 +0900 Subject: [PATCH 02/19] feat: filter to 2024 contributor --- .../DefaultContributorRepository.kt | 25 +++++++++++++++++-- .../app/core/data/api/fake/FakeGithubApi.kt | 15 ++++++++++- .../DefaultContributorRepositoryTest.kt | 24 +++++++++++++++++- 3 files changed, 60 insertions(+), 4 deletions(-) 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 168c411c..599bbe9f 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,6 +4,10 @@ import com.droidknights.app.core.data.api.GithubApi 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 kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.async +import kotlinx.coroutines.awaitAll +import kotlinx.coroutines.withContext import javax.inject.Inject internal class DefaultContributorRepository @Inject constructor( @@ -14,7 +18,24 @@ internal class DefaultContributorRepository @Inject constructor( owner: String, name: String, ): List { - return githubApi.getContributors(owner, name) - .map { it.toData() } + val contributors = githubApi.getContributors(owner, name) + return withContext(Dispatchers.IO) { + contributors.map { contributor -> + async { + val commits = + githubApi.getCommits(owner, name, contributor.name, COUNT_FOR_LAST_COMMIT) + if (commits.any { commit -> commit.commit.author.date.startsWith("2024") }) { + contributor.toData() + } else { + null + } + } + }.awaitAll().filterNotNull() + } + } + + companion object { + private const val COUNT_FOR_LAST_COMMIT = 1 } } + diff --git a/core/data/src/test/java/com/droidknights/app/core/data/api/fake/FakeGithubApi.kt b/core/data/src/test/java/com/droidknights/app/core/data/api/fake/FakeGithubApi.kt index d65035da..ab47cc40 100644 --- a/core/data/src/test/java/com/droidknights/app/core/data/api/fake/FakeGithubApi.kt +++ b/core/data/src/test/java/com/droidknights/app/core/data/api/fake/FakeGithubApi.kt @@ -1,10 +1,23 @@ package com.droidknights.app.core.data.api.fake import com.droidknights.app.core.data.api.GithubApi +import com.droidknights.app.core.data.api.model.CommitResponse import com.droidknights.app.core.data.api.model.ContributorResponse -internal class FakeGithubApi(private val contributors: List) : GithubApi { +internal class FakeGithubApi( + private val contributors: List, + private val commits: List +) : GithubApi { override suspend fun getContributors(owner: String, name: String): List { return contributors } + + override suspend fun getCommits( + owner: String, + name: String, + author: String, + perPage: Int + ): List { + return commits + } } 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 9d0226ba..fd927886 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 @@ -1,6 +1,10 @@ package com.droidknights.app.core.data.repository import com.droidknights.app.core.data.api.fake.FakeGithubApi +import com.droidknights.app.core.data.api.model.Author +import com.droidknights.app.core.data.api.model.AuthorInfo +import com.droidknights.app.core.data.api.model.Commit +import com.droidknights.app.core.data.api.model.CommitResponse import com.droidknights.app.core.data.api.model.ContributorResponse import com.droidknights.app.core.model.Contributor import io.kotest.core.spec.style.BehaviorSpec @@ -9,7 +13,7 @@ import io.kotest.matchers.shouldBe internal class DefaultContributorRepositoryTest : BehaviorSpec() { private val repository: DefaultContributorRepository = DefaultContributorRepository( - githubApi = FakeGithubApi(contributors) + githubApi = FakeGithubApi(contributors, commits) ) init { @@ -36,5 +40,23 @@ internal class DefaultContributorRepositoryTest : BehaviorSpec() { name = "test name", imageUrl = "test image url", githubUrl = "test github url" ) ) + + private val commits = listOf( + CommitResponse( + commit = Commit( + author = Author( + name = "Helena Suarez", + email = "britney.mathis@example.com", + date = "2024/05/31" + ) + + ), + author = AuthorInfo( + name = "Clair Pollard", + imageUrl = "https://search.yahoo.com/search?p=sed", + githubUrl = "http://www.bing.com/search?q=regione" + ) + ) + ) } } From a401545a414f8688552a2c92fe17dab52ce023cf Mon Sep 17 00:00:00 2001 From: kwakjoohyeong Date: Wed, 29 May 2024 01:00:56 +0900 Subject: [PATCH 03/19] =?UTF-8?q?feat:=20=EC=83=81=EC=88=98=ED=99=94=20?= =?UTF-8?q?=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/repository/DefaultContributorRepository.kt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) 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 599bbe9f..ebcf25e2 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 @@ -23,8 +23,12 @@ internal class DefaultContributorRepository @Inject constructor( contributors.map { contributor -> async { val commits = - githubApi.getCommits(owner, name, contributor.name, COUNT_FOR_LAST_COMMIT) - if (commits.any { commit -> commit.commit.author.date.startsWith("2024") }) { + githubApi.getCommits(owner, name, contributor.name, RECENT_COMMIT_COUNT) + if (commits.any { commit -> + commit.commit.author.date.startsWith( + CURRENT_YEAR_PREFIX + ) + }) { contributor.toData() } else { null @@ -35,7 +39,8 @@ internal class DefaultContributorRepository @Inject constructor( } companion object { - private const val COUNT_FOR_LAST_COMMIT = 1 + private const val RECENT_COMMIT_COUNT = 1 + private const val CURRENT_YEAR_PREFIX = "2024" } } From 08df342d9cb77c7385168afa59b44326a516036d Mon Sep 17 00:00:00 2001 From: kwakjoohyeong Date: Wed, 29 May 2024 01:24:14 +0900 Subject: [PATCH 04/19] chore: detekt formatting --- .../app/core/data/repository/DefaultContributorRepository.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 ebcf25e2..2949107a 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 @@ -28,7 +28,8 @@ internal class DefaultContributorRepository @Inject constructor( commit.commit.author.date.startsWith( CURRENT_YEAR_PREFIX ) - }) { + } + ) { contributor.toData() } else { null @@ -43,4 +44,3 @@ internal class DefaultContributorRepository @Inject constructor( private const val CURRENT_YEAR_PREFIX = "2024" } } - From 9ca947f85320a9f9ef21c08141b28530d35b5bab Mon Sep 17 00:00:00 2001 From: kwakjoohyeong Date: Wed, 29 May 2024 12:01:41 +0900 Subject: [PATCH 05/19] Revert "chore: detekt formatting" This reverts commit 08df342d9cb77c7385168afa59b44326a516036d. --- .../app/core/data/repository/DefaultContributorRepository.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 2949107a..ebcf25e2 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 @@ -28,8 +28,7 @@ internal class DefaultContributorRepository @Inject constructor( commit.commit.author.date.startsWith( CURRENT_YEAR_PREFIX ) - } - ) { + }) { contributor.toData() } else { null @@ -44,3 +43,4 @@ internal class DefaultContributorRepository @Inject constructor( private const val CURRENT_YEAR_PREFIX = "2024" } } + From 139f660e5231af2d9b571b2f16191f45cd6254c3 Mon Sep 17 00:00:00 2001 From: kwakjoohyeong Date: Wed, 29 May 2024 12:01:41 +0900 Subject: [PATCH 06/19] =?UTF-8?q?Revert=20"feat:=20=EC=83=81=EC=88=98?= =?UTF-8?q?=ED=99=94=20=EC=9E=91=EC=97=85"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit a401545a414f8688552a2c92fe17dab52ce023cf. --- .../data/repository/DefaultContributorRepository.kt | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) 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 ebcf25e2..599bbe9f 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 @@ -23,12 +23,8 @@ internal class DefaultContributorRepository @Inject constructor( contributors.map { contributor -> async { val commits = - githubApi.getCommits(owner, name, contributor.name, RECENT_COMMIT_COUNT) - if (commits.any { commit -> - commit.commit.author.date.startsWith( - CURRENT_YEAR_PREFIX - ) - }) { + githubApi.getCommits(owner, name, contributor.name, COUNT_FOR_LAST_COMMIT) + if (commits.any { commit -> commit.commit.author.date.startsWith("2024") }) { contributor.toData() } else { null @@ -39,8 +35,7 @@ internal class DefaultContributorRepository @Inject constructor( } companion object { - private const val RECENT_COMMIT_COUNT = 1 - private const val CURRENT_YEAR_PREFIX = "2024" + private const val COUNT_FOR_LAST_COMMIT = 1 } } From 3b6122dd6c105ddc82dfc6c4491c7b363080df41 Mon Sep 17 00:00:00 2001 From: kwakjoohyeong Date: Wed, 29 May 2024 12:01:41 +0900 Subject: [PATCH 07/19] Revert "feat: filter to 2024 contributor" This reverts commit 25e137272cdd398883d184f5ba240407d5e7b9df. --- .../DefaultContributorRepository.kt | 25 ++----------------- .../app/core/data/api/fake/FakeGithubApi.kt | 15 +---------- .../DefaultContributorRepositoryTest.kt | 24 +----------------- 3 files changed, 4 insertions(+), 60 deletions(-) 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 599bbe9f..168c411c 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,10 +4,6 @@ import com.droidknights.app.core.data.api.GithubApi 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 kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.async -import kotlinx.coroutines.awaitAll -import kotlinx.coroutines.withContext import javax.inject.Inject internal class DefaultContributorRepository @Inject constructor( @@ -18,24 +14,7 @@ internal class DefaultContributorRepository @Inject constructor( owner: String, name: String, ): List { - val contributors = githubApi.getContributors(owner, name) - return withContext(Dispatchers.IO) { - contributors.map { contributor -> - async { - val commits = - githubApi.getCommits(owner, name, contributor.name, COUNT_FOR_LAST_COMMIT) - if (commits.any { commit -> commit.commit.author.date.startsWith("2024") }) { - contributor.toData() - } else { - null - } - } - }.awaitAll().filterNotNull() - } - } - - companion object { - private const val COUNT_FOR_LAST_COMMIT = 1 + return githubApi.getContributors(owner, name) + .map { it.toData() } } } - diff --git a/core/data/src/test/java/com/droidknights/app/core/data/api/fake/FakeGithubApi.kt b/core/data/src/test/java/com/droidknights/app/core/data/api/fake/FakeGithubApi.kt index ab47cc40..d65035da 100644 --- a/core/data/src/test/java/com/droidknights/app/core/data/api/fake/FakeGithubApi.kt +++ b/core/data/src/test/java/com/droidknights/app/core/data/api/fake/FakeGithubApi.kt @@ -1,23 +1,10 @@ package com.droidknights.app.core.data.api.fake import com.droidknights.app.core.data.api.GithubApi -import com.droidknights.app.core.data.api.model.CommitResponse import com.droidknights.app.core.data.api.model.ContributorResponse -internal class FakeGithubApi( - private val contributors: List, - private val commits: List -) : GithubApi { +internal class FakeGithubApi(private val contributors: List) : GithubApi { override suspend fun getContributors(owner: String, name: String): List { return contributors } - - override suspend fun getCommits( - owner: String, - name: String, - author: String, - perPage: Int - ): List { - return commits - } } 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 fd927886..9d0226ba 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 @@ -1,10 +1,6 @@ package com.droidknights.app.core.data.repository import com.droidknights.app.core.data.api.fake.FakeGithubApi -import com.droidknights.app.core.data.api.model.Author -import com.droidknights.app.core.data.api.model.AuthorInfo -import com.droidknights.app.core.data.api.model.Commit -import com.droidknights.app.core.data.api.model.CommitResponse import com.droidknights.app.core.data.api.model.ContributorResponse import com.droidknights.app.core.model.Contributor import io.kotest.core.spec.style.BehaviorSpec @@ -13,7 +9,7 @@ import io.kotest.matchers.shouldBe internal class DefaultContributorRepositoryTest : BehaviorSpec() { private val repository: DefaultContributorRepository = DefaultContributorRepository( - githubApi = FakeGithubApi(contributors, commits) + githubApi = FakeGithubApi(contributors) ) init { @@ -40,23 +36,5 @@ internal class DefaultContributorRepositoryTest : BehaviorSpec() { name = "test name", imageUrl = "test image url", githubUrl = "test github url" ) ) - - private val commits = listOf( - CommitResponse( - commit = Commit( - author = Author( - name = "Helena Suarez", - email = "britney.mathis@example.com", - date = "2024/05/31" - ) - - ), - author = AuthorInfo( - name = "Clair Pollard", - imageUrl = "https://search.yahoo.com/search?p=sed", - githubUrl = "http://www.bing.com/search?q=regione" - ) - ) - ) } } From 9620ce2bc6453e8b6d58f751294c12ec054d9d04 Mon Sep 17 00:00:00 2001 From: kwakjoohyeong Date: Wed, 29 May 2024 12:01:42 +0900 Subject: [PATCH 08/19] Revert "feat: Commit API, CommitResponse" This reverts commit c0ab281eb6308e63bb8eb04bb4a97a085179cd73. --- .../app/core/data/api/GithubApi.kt | 10 ------- .../app/core/data/api/model/CommitResponse.kt | 29 ------------------- 2 files changed, 39 deletions(-) delete mode 100644 core/data/src/main/java/com/droidknights/app/core/data/api/model/CommitResponse.kt diff --git a/core/data/src/main/java/com/droidknights/app/core/data/api/GithubApi.kt b/core/data/src/main/java/com/droidknights/app/core/data/api/GithubApi.kt index 9a48b2b6..141cbc14 100644 --- a/core/data/src/main/java/com/droidknights/app/core/data/api/GithubApi.kt +++ b/core/data/src/main/java/com/droidknights/app/core/data/api/GithubApi.kt @@ -1,10 +1,8 @@ package com.droidknights.app.core.data.api -import com.droidknights.app.core.data.api.model.CommitResponse import com.droidknights.app.core.data.api.model.ContributorResponse import retrofit2.http.GET import retrofit2.http.Path -import retrofit2.http.Query internal interface GithubApi { @@ -13,12 +11,4 @@ internal interface GithubApi { @Path("owner") owner: String, @Path("name") name: String, ): List - - @GET("repos/{owner}/{name}/commits") - suspend fun getCommits( - @Path("owner") owner: String, - @Path("name") name: String, - @Query("author") author: String, - @Query("per_page") perPage: Int, - ): List } diff --git a/core/data/src/main/java/com/droidknights/app/core/data/api/model/CommitResponse.kt b/core/data/src/main/java/com/droidknights/app/core/data/api/model/CommitResponse.kt deleted file mode 100644 index 5fc91f1f..00000000 --- a/core/data/src/main/java/com/droidknights/app/core/data/api/model/CommitResponse.kt +++ /dev/null @@ -1,29 +0,0 @@ -package com.droidknights.app.core.data.api.model - -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable - -@Serializable -data class CommitResponse( - val commit: Commit, - val author: AuthorInfo, -) - -@Serializable -data class Commit( - val author: Author, -) - -@Serializable -data class Author( - val name: String, - val email: String, - val date: String, -) - -@Serializable -data class AuthorInfo( - @SerialName("login") val name: String, - @SerialName("avatar_url") val imageUrl: String, - @SerialName("html_url") val githubUrl: String, -) \ No newline at end of file From 490cff84540a509255a145b18958b23058d49dc7 Mon Sep 17 00:00:00 2001 From: kwakjoohyeong Date: Wed, 29 May 2024 16:49:40 +0900 Subject: [PATCH 09/19] =?UTF-8?q?feat:=20Contributors=20json=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/data/src/main/assets/contributors.json | 186 ++++++++++++++++++ .../app/core/data/api/GithubRawApi.kt | 4 + .../core/data/api/fake/AssetsGithubRawApi.kt | 6 + .../core/data/api/fake/FakeGithubRawApi.kt | 6 + 4 files changed, 202 insertions(+) create mode 100644 core/data/src/main/assets/contributors.json diff --git a/core/data/src/main/assets/contributors.json b/core/data/src/main/assets/contributors.json new file mode 100644 index 00000000..e1b3e5a4 --- /dev/null +++ b/core/data/src/main/assets/contributors.json @@ -0,0 +1,186 @@ +[ + { + "id":28249981, + "name":"laco-dev", + "years":[ + 2023 + ] + }, + { + "id":32327475, + "name":"wisemuji", + "years":[ + 2023, + 2024 + ] + }, + { + "id":54518925, + "name":"l2hyunwoo", + "years":[ + 2023 + ] + }, + { + "id":18674395, + "name":"JeonK1", + "years":[ + 2023 + ] + }, + { + "id":93872496, + "name":"KwakEuiJin", + "years":[ + 2023 + ] + }, + { + "id":57751515, + "name":"yuuuzzzin", + "years":[ + 2023 + ] + }, + { + "id":53253298, + "name":"toastmeister1", + "years":[ + 2023 + ] + }, + { + "id":72238126, + "name":"yjyoon-dev", + "years":[ + 2023 + ] + }, + { + "id":84944098, + "name":"Cjsghkd", + "years":[ + 2023 + ] + }, + { + "id":22849063, + "name":"KimReady", + "years":[ + 2024 + ] + }, + { + "id":2144231, + "name":"taehwandev", + "years":[ + 2023, + 2024 + ] + }, + { + "id":37904970, + "name":"sodp5", + "years":[ + 2023 + ] + }, + { + "id":51078673, + "name":"JaesungLeee", + "years":[ + 2023 + ] + }, + { + "id":61337202, + "name":"koreatlwls", + "years":[ + 2023 + ] + }, + { + "id":44341119, + "name":"malibinYun", + "years":[ + 2023 + ] + }, + { + "id":1534926, + "name":"Pluu", + "years":[ + 2023 + ] + }, + { + "id":81838716, + "name":"ParkJong-Hun", + "years":[ + 2024 + ] + }, + { + "id":92064758, + "name":"theo-taehwan", + "years":[ + 2024 + ] + }, + { + "id":52663419, + "name":"jeongth9446", + "years":[ + 2023 + ] + }, + { + "id":4679634, + "name":"kisa002", + "years":[ + 2023 + ] + }, + { + "id":40175383, + "name":"gowoon-choi", + "years":[ + 2023 + ] + }, + { + "id":7759511, + "name":"workspace", + "years":[ + 2023 + ] + }, + { + "id":51016231, + "name":"easyhooon", + "years":[ + 2024 + ] + }, + { + "id":33443660, + "name":"KwonDae", + "years":[ + 2023 + ] + }, + { + "id":35232655, + "name":"HamBP", + "years":[ + 2024 + ] + }, + { + "id":76798309, + "name":"onseok", + "years":[ + 2023 + ] + } +] \ No newline at end of file diff --git a/core/data/src/main/java/com/droidknights/app/core/data/api/GithubRawApi.kt b/core/data/src/main/java/com/droidknights/app/core/data/api/GithubRawApi.kt index c4094b3a..7d5bacc5 100644 --- a/core/data/src/main/java/com/droidknights/app/core/data/api/GithubRawApi.kt +++ b/core/data/src/main/java/com/droidknights/app/core/data/api/GithubRawApi.kt @@ -1,5 +1,6 @@ package com.droidknights.app.core.data.api +import com.droidknights.app.core.data.api.model.ContributionYearResponse import com.droidknights.app.core.data.api.model.SessionResponse import com.droidknights.app.core.data.api.model.SponsorResponse import retrofit2.http.GET @@ -11,4 +12,7 @@ internal interface GithubRawApi { @GET("/droidknights/DroidKnightsApp/main/core/data/src/main/assets/sessions.json") suspend fun getSessions(): List + + @GET("/droidknights/DroidKnightsApp/main/core/data/src/main/assets/contributors.json") + suspend fun getContributors(): List } diff --git a/core/data/src/main/java/com/droidknights/app/core/data/api/fake/AssetsGithubRawApi.kt b/core/data/src/main/java/com/droidknights/app/core/data/api/fake/AssetsGithubRawApi.kt index 57fd18c9..9090fe7d 100644 --- a/core/data/src/main/java/com/droidknights/app/core/data/api/fake/AssetsGithubRawApi.kt +++ b/core/data/src/main/java/com/droidknights/app/core/data/api/fake/AssetsGithubRawApi.kt @@ -2,6 +2,7 @@ package com.droidknights.app.core.data.api.fake import android.content.Context import com.droidknights.app.core.data.api.GithubRawApi +import com.droidknights.app.core.data.api.model.ContributionYearResponse import com.droidknights.app.core.data.api.model.SessionResponse import com.droidknights.app.core.data.api.model.SponsorResponse import kotlinx.serialization.ExperimentalSerializationApi @@ -15,6 +16,7 @@ internal class AssetsGithubRawApi( ) : GithubRawApi { private val sponsors = context.assets.open("sponsors.json") private val sessions = context.assets.open("sessions.json") + private val contributors = context.assets.open("contributors.json") override suspend fun getSponsors(): List { return json.decodeFromStream(sponsors) @@ -23,4 +25,8 @@ internal class AssetsGithubRawApi( override suspend fun getSessions(): List { return json.decodeFromStream(sessions) } + + override suspend fun getContributors(): List { + return json.decodeFromStream(contributors) + } } diff --git a/core/data/src/test/java/com/droidknights/app/core/data/api/fake/FakeGithubRawApi.kt b/core/data/src/test/java/com/droidknights/app/core/data/api/fake/FakeGithubRawApi.kt index 7c81f26a..cee60058 100644 --- a/core/data/src/test/java/com/droidknights/app/core/data/api/fake/FakeGithubRawApi.kt +++ b/core/data/src/test/java/com/droidknights/app/core/data/api/fake/FakeGithubRawApi.kt @@ -1,6 +1,7 @@ package com.droidknights.app.core.data.api.fake import com.droidknights.app.core.data.api.GithubRawApi +import com.droidknights.app.core.data.api.model.ContributionYearResponse import com.droidknights.app.core.data.api.model.SessionResponse import com.droidknights.app.core.data.api.model.SponsorResponse import kotlinx.serialization.ExperimentalSerializationApi @@ -17,6 +18,7 @@ internal class FakeGithubRawApi( ) : GithubRawApi { private val sponsors = File("src/main/assets/sponsors.json") private val sessions = File("src/main/assets/sessions.json") + private val contributors = File("src/main/assets/contributors.json") override suspend fun getSponsors(): List { return json.decodeFromStream(sponsors.inputStream()) @@ -25,4 +27,8 @@ internal class FakeGithubRawApi( override suspend fun getSessions(): List { return json.decodeFromStream(sessions.inputStream()) } + + override suspend fun getContributors(): List { + return json.decodeFromStream(contributors.inputStream()) + } } From f74a697265321c6cc116082122f7b0bb53b050c6 Mon Sep 17 00:00:00 2001 From: kwakjoohyeong Date: Wed, 29 May 2024 16:54:23 +0900 Subject: [PATCH 10/19] =?UTF-8?q?feat:=20contributor=EC=9D=98=20=EA=B8=B0?= =?UTF-8?q?=EC=97=AC=EC=97=B0=EB=8F=84=EB=A5=BC=20=EA=B0=80=EC=A0=B8?= =?UTF-8?q?=EC=98=A4=EB=8A=94=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=9E=91?= =?UTF-8?q?=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../droidknights/app/core/data/api/GithubRawApi.kt | 2 +- .../app/core/data/api/fake/AssetsGithubRawApi.kt | 2 +- .../data/api/model/ContributionYearResponse.kt | 9 +++++++++ .../app/core/data/api/model/ContributorResponse.kt | 1 + .../app/core/data/mapper/ContributorMapper.kt | 3 ++- .../repository/DefaultContributorRepository.kt | 14 ++++++++++++-- .../app/core/data/api/fake/FakeGithubRawApi.kt | 2 +- .../com/droidknights/app/core/model/Contributor.kt | 1 + 8 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 core/data/src/main/java/com/droidknights/app/core/data/api/model/ContributionYearResponse.kt diff --git a/core/data/src/main/java/com/droidknights/app/core/data/api/GithubRawApi.kt b/core/data/src/main/java/com/droidknights/app/core/data/api/GithubRawApi.kt index 7d5bacc5..e3f1dcf5 100644 --- a/core/data/src/main/java/com/droidknights/app/core/data/api/GithubRawApi.kt +++ b/core/data/src/main/java/com/droidknights/app/core/data/api/GithubRawApi.kt @@ -14,5 +14,5 @@ internal interface GithubRawApi { suspend fun getSessions(): List @GET("/droidknights/DroidKnightsApp/main/core/data/src/main/assets/contributors.json") - suspend fun getContributors(): List + suspend fun getContributorWithYears(): List } diff --git a/core/data/src/main/java/com/droidknights/app/core/data/api/fake/AssetsGithubRawApi.kt b/core/data/src/main/java/com/droidknights/app/core/data/api/fake/AssetsGithubRawApi.kt index 9090fe7d..aa3637d7 100644 --- a/core/data/src/main/java/com/droidknights/app/core/data/api/fake/AssetsGithubRawApi.kt +++ b/core/data/src/main/java/com/droidknights/app/core/data/api/fake/AssetsGithubRawApi.kt @@ -26,7 +26,7 @@ internal class AssetsGithubRawApi( return json.decodeFromStream(sessions) } - override suspend fun getContributors(): List { + override suspend fun getContributorWithYears(): List { return json.decodeFromStream(contributors) } } diff --git a/core/data/src/main/java/com/droidknights/app/core/data/api/model/ContributionYearResponse.kt b/core/data/src/main/java/com/droidknights/app/core/data/api/model/ContributionYearResponse.kt new file mode 100644 index 00000000..57391901 --- /dev/null +++ b/core/data/src/main/java/com/droidknights/app/core/data/api/model/ContributionYearResponse.kt @@ -0,0 +1,9 @@ +package com.droidknights.app.core.data.api.model + +import kotlinx.serialization.Serializable + +@Serializable +data class ContributionYearResponse( + val id: Long, + val years: List, +) diff --git a/core/data/src/main/java/com/droidknights/app/core/data/api/model/ContributorResponse.kt b/core/data/src/main/java/com/droidknights/app/core/data/api/model/ContributorResponse.kt index f17a58c1..f120366f 100644 --- a/core/data/src/main/java/com/droidknights/app/core/data/api/model/ContributorResponse.kt +++ b/core/data/src/main/java/com/droidknights/app/core/data/api/model/ContributorResponse.kt @@ -5,6 +5,7 @@ import kotlinx.serialization.Serializable @Serializable internal data class ContributorResponse( + val id: Long, @SerialName("login") val name: String, @SerialName("avatar_url") val imageUrl: String, @SerialName("html_url") val githubUrl: String, diff --git a/core/data/src/main/java/com/droidknights/app/core/data/mapper/ContributorMapper.kt b/core/data/src/main/java/com/droidknights/app/core/data/mapper/ContributorMapper.kt index ce719627..e6bb1961 100644 --- a/core/data/src/main/java/com/droidknights/app/core/data/mapper/ContributorMapper.kt +++ b/core/data/src/main/java/com/droidknights/app/core/data/mapper/ContributorMapper.kt @@ -3,9 +3,10 @@ package com.droidknights.app.core.data.mapper import com.droidknights.app.core.data.api.model.ContributorResponse import com.droidknights.app.core.model.Contributor -internal fun ContributorResponse.toData(): Contributor = +internal fun ContributorResponse.toData(contributeYears: List): Contributor = Contributor( name = this.name, imageUrl = this.imageUrl, githubUrl = this.githubUrl, + contributionYears = contributeYears, ) 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 168c411c..9e831e52 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 @@ -1,6 +1,7 @@ package com.droidknights.app.core.data.repository import com.droidknights.app.core.data.api.GithubApi +import com.droidknights.app.core.data.api.fake.AssetsGithubRawApi import com.droidknights.app.core.data.mapper.toData import com.droidknights.app.core.data.repository.api.ContributorRepository import com.droidknights.app.core.model.Contributor @@ -8,13 +9,22 @@ import javax.inject.Inject internal class DefaultContributorRepository @Inject constructor( private val githubApi: GithubApi, + private val githubRawApi: AssetsGithubRawApi, ) : ContributorRepository { override suspend fun getContributors( owner: String, name: String, ): List { - return githubApi.getContributors(owner, name) - .map { it.toData() } + val contributorResponse = githubApi.getContributors(owner, name) + val contributorWithYearResponse = githubRawApi.getContributorWithYears() + + return contributorResponse.map { contributor -> + val contributionYears = + contributorWithYearResponse.firstOrNull { it.id == contributor.id }?.years + ?: emptyList() + + contributor.toData(contributionYears) + } } } diff --git a/core/data/src/test/java/com/droidknights/app/core/data/api/fake/FakeGithubRawApi.kt b/core/data/src/test/java/com/droidknights/app/core/data/api/fake/FakeGithubRawApi.kt index cee60058..3bae03fe 100644 --- a/core/data/src/test/java/com/droidknights/app/core/data/api/fake/FakeGithubRawApi.kt +++ b/core/data/src/test/java/com/droidknights/app/core/data/api/fake/FakeGithubRawApi.kt @@ -28,7 +28,7 @@ internal class FakeGithubRawApi( return json.decodeFromStream(sessions.inputStream()) } - override suspend fun getContributors(): List { + override suspend fun getContributorWithYears(): List { return json.decodeFromStream(contributors.inputStream()) } } diff --git a/core/model/src/main/java/com/droidknights/app/core/model/Contributor.kt b/core/model/src/main/java/com/droidknights/app/core/model/Contributor.kt index 05e413fb..b006e75b 100644 --- a/core/model/src/main/java/com/droidknights/app/core/model/Contributor.kt +++ b/core/model/src/main/java/com/droidknights/app/core/model/Contributor.kt @@ -4,4 +4,5 @@ data class Contributor( val name: String, val imageUrl: String, val githubUrl: String, + val contributionYears: List ) From dbeb7964575cfd37d0ab40ee6a53f107266fd319 Mon Sep 17 00:00:00 2001 From: kwakjoohyeong Date: Wed, 29 May 2024 16:55:20 +0900 Subject: [PATCH 11/19] =?UTF-8?q?feat:=20=EC=97=B0=EB=8F=84=EC=97=90=20?= =?UTF-8?q?=EB=94=B0=EB=9D=BC=20=ED=95=84=ED=84=B0=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/DefaultContributorRepositoryTest.kt | 12 ++++++++++-- .../core/domain/usecase/GetContributorsUseCase.kt | 10 ++++++++-- .../domain/usecase/GetContributorsUseCaseTest.kt | 3 ++- .../app/feature/contributor/ContributorScreen.kt | 2 ++ .../feature/contributor/ContributorViewModelTest.kt | 3 ++- 5 files changed, 24 insertions(+), 6 deletions(-) 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 9d0226ba..dc1b8e8d 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 @@ -1,15 +1,20 @@ package com.droidknights.app.core.data.repository 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 io.kotest.core.spec.style.BehaviorSpec import io.kotest.matchers.shouldBe +import kotlinx.serialization.json.Json internal class DefaultContributorRepositoryTest : BehaviorSpec() { private val repository: DefaultContributorRepository = DefaultContributorRepository( - githubApi = FakeGithubApi(contributors) + githubApi = FakeGithubApi(contributors), + githubRawApi = FakeGithubRawApi( + json = Json { ignoreUnknownKeys = true }, + ) ) init { @@ -33,7 +38,10 @@ internal class DefaultContributorRepositoryTest : BehaviorSpec() { companion object { private val contributors = listOf( ContributorResponse( - name = "test name", imageUrl = "test image url", githubUrl = "test github url" + name = "test name", + imageUrl = "test image url", + githubUrl = "test github url", + id = 0 ) ) } 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 050052cb..c761206b 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 @@ -7,11 +7,17 @@ import javax.inject.Inject class GetContributorsUseCase @Inject constructor( private val repository: ContributorRepository, ) { - suspend operator fun invoke(): List { + suspend operator fun invoke(year: Int = 2024): List { return repository.getContributors( owner = OWNER, name = NAME, - ) + ).filter { contributor -> + when (year) { + 2023 -> contributor.contributionYears.contains(year) + else -> contributor.contributionYears.contains(year) + || contributor.contributionYears.isEmpty() + } + } } companion object { 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 407a534e..391a0767 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 @@ -32,7 +32,8 @@ internal class GetContributorsUseCaseTest : BehaviorSpec() { Contributor( name = "test name", imageUrl = "test image url", - githubUrl = "test github url" + githubUrl = "test github url", + contributionYears = listOf(2024) ) ) } diff --git a/feature/contributor/src/main/java/com/droidknights/app/feature/contributor/ContributorScreen.kt b/feature/contributor/src/main/java/com/droidknights/app/feature/contributor/ContributorScreen.kt index eb896f08..80e2afb7 100644 --- a/feature/contributor/src/main/java/com/droidknights/app/feature/contributor/ContributorScreen.kt +++ b/feature/contributor/src/main/java/com/droidknights/app/feature/contributor/ContributorScreen.kt @@ -273,11 +273,13 @@ private fun ContributorScreenPreview() { "Contributor1", "https://avatars.githubusercontent.com/u/25101514", "https://github.com/droidknights", + listOf(2024) ), Contributor( "Contributor2", "https://avatars.githubusercontent.com/u/25101514", "https://github.com/droidknights", + listOf(2024) ), ) ), diff --git a/feature/contributor/src/test/java/com/droidknights/app/feature/contributor/ContributorViewModelTest.kt b/feature/contributor/src/test/java/com/droidknights/app/feature/contributor/ContributorViewModelTest.kt index 7f989cc4..27165eed 100644 --- a/feature/contributor/src/test/java/com/droidknights/app/feature/contributor/ContributorViewModelTest.kt +++ b/feature/contributor/src/test/java/com/droidknights/app/feature/contributor/ContributorViewModelTest.kt @@ -37,7 +37,8 @@ internal class ContributorViewModelTest { Contributor( name = "test name", imageUrl = "test image url", - githubUrl = "test github url" + githubUrl = "test github url", + contributionYears = listOf() ) ) } From a12bedad741bbdd751caa9903262e28d9ae97e49 Mon Sep 17 00:00:00 2001 From: kwakjoohyeong Date: Wed, 29 May 2024 17:36:03 +0900 Subject: [PATCH 12/19] =?UTF-8?q?feat:=20named=EC=9D=84=20=ED=86=B5?= =?UTF-8?q?=ED=95=B4=20=EC=B6=94=EC=83=81=ED=99=94=20=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/droidknights/app/core/data/di/ApiModule.kt | 2 ++ .../java/com/droidknights/app/core/data/di/DataModule.kt | 8 +++++--- .../core/data/repository/DefaultContributorRepository.kt | 5 +++-- .../app/core/data/repository/DefaultSessionRepository.kt | 3 ++- .../app/core/data/repository/DefaultSponsorRepository.kt | 3 ++- 5 files changed, 14 insertions(+), 7 deletions(-) diff --git a/core/data/src/main/java/com/droidknights/app/core/data/di/ApiModule.kt b/core/data/src/main/java/com/droidknights/app/core/data/di/ApiModule.kt index f1963b41..640b2267 100644 --- a/core/data/src/main/java/com/droidknights/app/core/data/di/ApiModule.kt +++ b/core/data/src/main/java/com/droidknights/app/core/data/di/ApiModule.kt @@ -13,6 +13,7 @@ import okhttp3.OkHttpClient import retrofit2.Converter import retrofit2.Retrofit import retrofit2.converter.kotlinx.serialization.asConverterFactory +import javax.inject.Named @Module @InstallIn(SingletonComponent::class) @@ -43,6 +44,7 @@ internal object ApiModule { .create(GithubApi::class.java) } + @Named("GithubRawApi") @Provides @Singleton fun provideGitRawApi( diff --git a/core/data/src/main/java/com/droidknights/app/core/data/di/DataModule.kt b/core/data/src/main/java/com/droidknights/app/core/data/di/DataModule.kt index 19ff0423..a04c20db 100644 --- a/core/data/src/main/java/com/droidknights/app/core/data/di/DataModule.kt +++ b/core/data/src/main/java/com/droidknights/app/core/data/di/DataModule.kt @@ -20,6 +20,7 @@ import dagger.hilt.InstallIn import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent import kotlinx.serialization.json.Json +import javax.inject.Named import javax.inject.Singleton @InstallIn(SingletonComponent::class) @@ -48,24 +49,25 @@ internal abstract class DataModule { @Provides @Singleton fun provideSponsorRepository( - githubRawApi: GithubRawApi, + @Named("AssetsGithubRawApi") githubRawApi: GithubRawApi, ): SponsorRepository = DefaultSponsorRepository(githubRawApi) @Provides @Singleton fun provideSessionRepository( - githubRawApi: GithubRawApi, + @Named("AssetsGithubRawApi") githubRawApi: GithubRawApi, sessionDataSource: SessionPreferencesDataSource, ): SessionRepository = DefaultSessionRepository(githubRawApi, sessionDataSource) @Provides @Singleton + @Named("AssetsGithubRawApi") fun provideGithubRawApi( @ApplicationContext context: Context, json: Json, - ): AssetsGithubRawApi = + ): GithubRawApi = AssetsGithubRawApi(context, json) } } 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 9e831e52..9580474c 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 @@ -1,15 +1,16 @@ package com.droidknights.app.core.data.repository import com.droidknights.app.core.data.api.GithubApi -import com.droidknights.app.core.data.api.fake.AssetsGithubRawApi +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 javax.inject.Inject +import javax.inject.Named internal class DefaultContributorRepository @Inject constructor( private val githubApi: GithubApi, - private val githubRawApi: AssetsGithubRawApi, + @Named("AssetsGithubRawApi") private val githubRawApi: GithubRawApi, ) : ContributorRepository { override suspend fun getContributors( diff --git a/core/data/src/main/java/com/droidknights/app/core/data/repository/DefaultSessionRepository.kt b/core/data/src/main/java/com/droidknights/app/core/data/repository/DefaultSessionRepository.kt index 7f9e42cc..7cf1579e 100644 --- a/core/data/src/main/java/com/droidknights/app/core/data/repository/DefaultSessionRepository.kt +++ b/core/data/src/main/java/com/droidknights/app/core/data/repository/DefaultSessionRepository.kt @@ -9,10 +9,11 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.first import javax.inject.Inject +import javax.inject.Named internal class DefaultSessionRepository @Inject constructor( private val githubRawApi: GithubRawApi, - private val sessionDataSource: SessionPreferencesDataSource + @Named("GithubRawApi") private val sessionDataSource: SessionPreferencesDataSource, ) : SessionRepository { private var cachedSessions: List = emptyList() diff --git a/core/data/src/main/java/com/droidknights/app/core/data/repository/DefaultSponsorRepository.kt b/core/data/src/main/java/com/droidknights/app/core/data/repository/DefaultSponsorRepository.kt index 310676fc..f73c399d 100644 --- a/core/data/src/main/java/com/droidknights/app/core/data/repository/DefaultSponsorRepository.kt +++ b/core/data/src/main/java/com/droidknights/app/core/data/repository/DefaultSponsorRepository.kt @@ -5,9 +5,10 @@ import com.droidknights.app.core.data.mapper.toData import com.droidknights.app.core.data.repository.api.SponsorRepository import com.droidknights.app.core.model.Sponsor import javax.inject.Inject +import javax.inject.Named internal class DefaultSponsorRepository @Inject constructor( - private val githubRawApi: GithubRawApi, + @Named("GithubRawApi") private val githubRawApi: GithubRawApi, ) : SponsorRepository { override suspend fun getSponsors(): List { From e4c85cf3e6256f653c02eaf760bc80fed43424d9 Mon Sep 17 00:00:00 2001 From: kwakjoohyeong Date: Wed, 29 May 2024 18:17:31 +0900 Subject: [PATCH 13/19] =?UTF-8?q?Revert=20"feat:=20named=EC=9D=84=20?= =?UTF-8?q?=ED=86=B5=ED=95=B4=20=EC=B6=94=EC=83=81=ED=99=94=20=EC=9E=91?= =?UTF-8?q?=EC=97=85"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit a12bedad741bbdd751caa9903262e28d9ae97e49. --- .../java/com/droidknights/app/core/data/di/ApiModule.kt | 2 -- .../java/com/droidknights/app/core/data/di/DataModule.kt | 8 +++----- .../core/data/repository/DefaultContributorRepository.kt | 5 ++--- .../app/core/data/repository/DefaultSessionRepository.kt | 3 +-- .../app/core/data/repository/DefaultSponsorRepository.kt | 3 +-- 5 files changed, 7 insertions(+), 14 deletions(-) diff --git a/core/data/src/main/java/com/droidknights/app/core/data/di/ApiModule.kt b/core/data/src/main/java/com/droidknights/app/core/data/di/ApiModule.kt index 640b2267..f1963b41 100644 --- a/core/data/src/main/java/com/droidknights/app/core/data/di/ApiModule.kt +++ b/core/data/src/main/java/com/droidknights/app/core/data/di/ApiModule.kt @@ -13,7 +13,6 @@ import okhttp3.OkHttpClient import retrofit2.Converter import retrofit2.Retrofit import retrofit2.converter.kotlinx.serialization.asConverterFactory -import javax.inject.Named @Module @InstallIn(SingletonComponent::class) @@ -44,7 +43,6 @@ internal object ApiModule { .create(GithubApi::class.java) } - @Named("GithubRawApi") @Provides @Singleton fun provideGitRawApi( diff --git a/core/data/src/main/java/com/droidknights/app/core/data/di/DataModule.kt b/core/data/src/main/java/com/droidknights/app/core/data/di/DataModule.kt index a04c20db..19ff0423 100644 --- a/core/data/src/main/java/com/droidknights/app/core/data/di/DataModule.kt +++ b/core/data/src/main/java/com/droidknights/app/core/data/di/DataModule.kt @@ -20,7 +20,6 @@ import dagger.hilt.InstallIn import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent import kotlinx.serialization.json.Json -import javax.inject.Named import javax.inject.Singleton @InstallIn(SingletonComponent::class) @@ -49,25 +48,24 @@ internal abstract class DataModule { @Provides @Singleton fun provideSponsorRepository( - @Named("AssetsGithubRawApi") githubRawApi: GithubRawApi, + githubRawApi: GithubRawApi, ): SponsorRepository = DefaultSponsorRepository(githubRawApi) @Provides @Singleton fun provideSessionRepository( - @Named("AssetsGithubRawApi") githubRawApi: GithubRawApi, + githubRawApi: GithubRawApi, sessionDataSource: SessionPreferencesDataSource, ): SessionRepository = DefaultSessionRepository(githubRawApi, sessionDataSource) @Provides @Singleton - @Named("AssetsGithubRawApi") fun provideGithubRawApi( @ApplicationContext context: Context, json: Json, - ): GithubRawApi = + ): AssetsGithubRawApi = AssetsGithubRawApi(context, json) } } 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 9580474c..9e831e52 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 @@ -1,16 +1,15 @@ package com.droidknights.app.core.data.repository import com.droidknights.app.core.data.api.GithubApi -import com.droidknights.app.core.data.api.GithubRawApi +import com.droidknights.app.core.data.api.fake.AssetsGithubRawApi 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 javax.inject.Inject -import javax.inject.Named internal class DefaultContributorRepository @Inject constructor( private val githubApi: GithubApi, - @Named("AssetsGithubRawApi") private val githubRawApi: GithubRawApi, + private val githubRawApi: AssetsGithubRawApi, ) : ContributorRepository { override suspend fun getContributors( diff --git a/core/data/src/main/java/com/droidknights/app/core/data/repository/DefaultSessionRepository.kt b/core/data/src/main/java/com/droidknights/app/core/data/repository/DefaultSessionRepository.kt index 7cf1579e..7f9e42cc 100644 --- a/core/data/src/main/java/com/droidknights/app/core/data/repository/DefaultSessionRepository.kt +++ b/core/data/src/main/java/com/droidknights/app/core/data/repository/DefaultSessionRepository.kt @@ -9,11 +9,10 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.first import javax.inject.Inject -import javax.inject.Named internal class DefaultSessionRepository @Inject constructor( private val githubRawApi: GithubRawApi, - @Named("GithubRawApi") private val sessionDataSource: SessionPreferencesDataSource, + private val sessionDataSource: SessionPreferencesDataSource ) : SessionRepository { private var cachedSessions: List = emptyList() diff --git a/core/data/src/main/java/com/droidknights/app/core/data/repository/DefaultSponsorRepository.kt b/core/data/src/main/java/com/droidknights/app/core/data/repository/DefaultSponsorRepository.kt index f73c399d..310676fc 100644 --- a/core/data/src/main/java/com/droidknights/app/core/data/repository/DefaultSponsorRepository.kt +++ b/core/data/src/main/java/com/droidknights/app/core/data/repository/DefaultSponsorRepository.kt @@ -5,10 +5,9 @@ import com.droidknights.app.core.data.mapper.toData import com.droidknights.app.core.data.repository.api.SponsorRepository import com.droidknights.app.core.model.Sponsor import javax.inject.Inject -import javax.inject.Named internal class DefaultSponsorRepository @Inject constructor( - @Named("GithubRawApi") private val githubRawApi: GithubRawApi, + private val githubRawApi: GithubRawApi, ) : SponsorRepository { override suspend fun getSponsors(): List { From 03348eba7665207562c391c1dba99e743100eb44 Mon Sep 17 00:00:00 2001 From: kwakjoohyeong Date: Wed, 29 May 2024 19:58:51 +0900 Subject: [PATCH 14/19] =?UTF-8?q?fix:=20hilt=20=EA=B5=AC=ED=98=84=EC=B2=B4?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../droidknights/app/core/data/di/DataModule.kt | 14 +++++++++----- .../repository/DefaultContributorRepository.kt | 4 +++- .../repository/DefaultContributorRepositoryTest.kt | 6 +++--- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/core/data/src/main/java/com/droidknights/app/core/data/di/DataModule.kt b/core/data/src/main/java/com/droidknights/app/core/data/di/DataModule.kt index 19ff0423..20ffb8ea 100644 --- a/core/data/src/main/java/com/droidknights/app/core/data/di/DataModule.kt +++ b/core/data/src/main/java/com/droidknights/app/core/data/di/DataModule.kt @@ -1,6 +1,7 @@ package com.droidknights.app.core.data.di import android.content.Context +import com.droidknights.app.core.data.api.GithubApi import com.droidknights.app.core.data.api.GithubRawApi import com.droidknights.app.core.data.api.fake.AssetsGithubRawApi import com.droidknights.app.core.data.repository.DefaultContributorRepository @@ -26,11 +27,6 @@ import javax.inject.Singleton @Module internal abstract class DataModule { - @Binds - abstract fun bindsContributorRepository( - repository: DefaultContributorRepository, - ): ContributorRepository - @Binds abstract fun bindsSettingsRepository( repository: DefaultSettingsRepository, @@ -60,6 +56,14 @@ internal abstract class DataModule { ): SessionRepository = DefaultSessionRepository(githubRawApi, sessionDataSource) + @Provides + @Singleton + fun provideContributorRepository( + githubApi: GithubApi, + githubRawApi: AssetsGithubRawApi, + ): ContributorRepository = + DefaultContributorRepository(githubApi, githubRawApi) + @Provides @Singleton fun provideGithubRawApi( 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 9e831e52..f9733106 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 @@ -1,15 +1,17 @@ package com.droidknights.app.core.data.repository import com.droidknights.app.core.data.api.GithubApi +import com.droidknights.app.core.data.api.GithubRawApi import com.droidknights.app.core.data.api.fake.AssetsGithubRawApi 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 dagger.hilt.android.qualifiers.ApplicationContext import javax.inject.Inject internal class DefaultContributorRepository @Inject constructor( private val githubApi: GithubApi, - private val githubRawApi: AssetsGithubRawApi, + private val githubRawApi: GithubRawApi ) : ContributorRepository { override suspend fun getContributors( 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 dc1b8e8d..0c944f64 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 @@ -1,5 +1,7 @@ package com.droidknights.app.core.data.repository +import com.droidknights.app.core.data.api.GithubRawApi +import com.droidknights.app.core.data.api.fake.AssetsGithubRawApi 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 @@ -12,9 +14,7 @@ internal class DefaultContributorRepositoryTest : BehaviorSpec() { private val repository: DefaultContributorRepository = DefaultContributorRepository( githubApi = FakeGithubApi(contributors), - githubRawApi = FakeGithubRawApi( - json = Json { ignoreUnknownKeys = true }, - ) + githubRawApi = FakeGithubRawApi() ) init { From 5777131634bd2ac258ad24051c7ce6b9089bddc2 Mon Sep 17 00:00:00 2001 From: kwakjoohyeong Date: Wed, 29 May 2024 20:01:31 +0900 Subject: [PATCH 15/19] =?UTF-8?q?chore:=20detekt=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/data/repository/DefaultContributorRepositoryTest.kt | 3 --- 1 file changed, 3 deletions(-) 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 0c944f64..b9d64d96 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 @@ -1,14 +1,11 @@ package com.droidknights.app.core.data.repository -import com.droidknights.app.core.data.api.GithubRawApi -import com.droidknights.app.core.data.api.fake.AssetsGithubRawApi 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 io.kotest.core.spec.style.BehaviorSpec import io.kotest.matchers.shouldBe -import kotlinx.serialization.json.Json internal class DefaultContributorRepositoryTest : BehaviorSpec() { From 1dde8571206bf63641a89175da59d15618cecd21 Mon Sep 17 00:00:00 2001 From: kwakjoohyeong Date: Wed, 29 May 2024 20:09:58 +0900 Subject: [PATCH 16/19] =?UTF-8?q?chore:=20detekt=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/core/data/repository/DefaultContributorRepository.kt | 2 -- 1 file changed, 2 deletions(-) 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 f9733106..ac0a0afb 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 @@ -2,11 +2,9 @@ package com.droidknights.app.core.data.repository import com.droidknights.app.core.data.api.GithubApi import com.droidknights.app.core.data.api.GithubRawApi -import com.droidknights.app.core.data.api.fake.AssetsGithubRawApi 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 dagger.hilt.android.qualifiers.ApplicationContext import javax.inject.Inject internal class DefaultContributorRepository @Inject constructor( From 4c23d5fd89416f8412b0254531ce43ce138d73f5 Mon Sep 17 00:00:00 2001 From: kwakjoohyeong Date: Wed, 29 May 2024 20:33:58 +0900 Subject: [PATCH 17/19] =?UTF-8?q?test:=20usecase=20=ED=95=84=ED=84=B0=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../usecase/GetContributorsUseCaseTest.kt | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) 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 391a0767..0be2f85b 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 @@ -14,13 +14,26 @@ internal class GetContributorsUseCaseTest : BehaviorSpec() { Given("드로이드나이츠 컨트리뷰터가 존재한다") { val expected = contributors - When("드로이드나이츠 컨트리뷰터를 조회한다") { + When("올해 드로이드나이츠 컨트리뷰터를 조회한다") { val contributors: List = useCase.invoke() Then("드로이드나이츠 컨트리뷰터를 반환한다") { + contributors.size shouldBe 3 + contributors.forEachIndexed { index, contributor -> + contributor.name shouldBe expected[index].name + } + } + } + When("2023년도 컨트리뷰터를 조회한다.") { + val contributors: List = useCase.invoke(2023) + + Then("드로이드나이츠 컨트리뷰터를 반환한다") { + contributors.size shouldBe 1 contributors.all { - it.name == expected[0].name + println(it.name) + println(expected[1].name) + it.name == expected[1].name } } } @@ -34,6 +47,18 @@ internal class GetContributorsUseCaseTest : BehaviorSpec() { imageUrl = "test image url", githubUrl = "test github url", contributionYears = listOf(2024) + ), + Contributor( + name = "test name2", + imageUrl = "test image url2", + githubUrl = "test github url2", + contributionYears = listOf(2023, 2024) + ), + Contributor( + name = "test name2", + imageUrl = "test image url3", + githubUrl = "test github url3", + contributionYears = listOf() ) ) } From 05bcf722df1e8c69db38a364f133a4ef3b560314 Mon Sep 17 00:00:00 2001 From: kwakjoohyeong Date: Fri, 31 May 2024 00:12:55 +0900 Subject: [PATCH 18/19] =?UTF-8?q?feat:=20SerialName=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/core/data/api/model/ContributionYearResponse.kt | 5 +++-- .../app/core/data/api/model/ContributorResponse.kt | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/core/data/src/main/java/com/droidknights/app/core/data/api/model/ContributionYearResponse.kt b/core/data/src/main/java/com/droidknights/app/core/data/api/model/ContributionYearResponse.kt index 57391901..86963a8c 100644 --- a/core/data/src/main/java/com/droidknights/app/core/data/api/model/ContributionYearResponse.kt +++ b/core/data/src/main/java/com/droidknights/app/core/data/api/model/ContributionYearResponse.kt @@ -1,9 +1,10 @@ package com.droidknights.app.core.data.api.model +import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable data class ContributionYearResponse( - val id: Long, - val years: List, + @SerialName("id") val id: Long, + @SerialName("years") val years: List, ) diff --git a/core/data/src/main/java/com/droidknights/app/core/data/api/model/ContributorResponse.kt b/core/data/src/main/java/com/droidknights/app/core/data/api/model/ContributorResponse.kt index f120366f..f7366139 100644 --- a/core/data/src/main/java/com/droidknights/app/core/data/api/model/ContributorResponse.kt +++ b/core/data/src/main/java/com/droidknights/app/core/data/api/model/ContributorResponse.kt @@ -5,7 +5,7 @@ import kotlinx.serialization.Serializable @Serializable internal data class ContributorResponse( - val id: Long, + @SerialName("id") val id: Long, @SerialName("login") val name: String, @SerialName("avatar_url") val imageUrl: String, @SerialName("html_url") val githubUrl: String, From 34cbacba82028db037c783fbced5384604af5134 Mon Sep 17 00:00:00 2001 From: kwakjoohyeong Date: Fri, 31 May 2024 02:43:42 +0900 Subject: [PATCH 19/19] =?UTF-8?q?refactor:=20=EA=B8=B0=EC=97=AC=EC=9E=90?= =?UTF-8?q?=EB=93=A4=EC=9D=98=20=EC=97=B0=EB=8F=84=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EB=A7=88=EC=A7=80=EB=A7=89=20=ED=95=B4=EC=9D=98=20=EA=B8=B0?= =?UTF-8?q?=EC=97=AC=EC=9E=90=EB=A5=BC=20=EA=B0=80=EC=A0=B8=EC=98=A4?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/api/ContributorRepository.kt | 3 ++ .../app/core/data/mapper/ContributorMapper.kt | 4 +- .../data/mapper/ContributorWithYearsMapper.kt | 11 ++++ .../DefaultContributorRepository.kt | 14 ++--- .../domain/usecase/GetContributorsUseCase.kt | 22 +++++--- .../usecase/FakeContributorRepository.kt | 6 +++ .../usecase/GetContributorsUseCaseTest.kt | 51 +++++++++---------- .../app/core/model/Contributor.kt | 2 +- .../app/core/model/ContributorWithYears.kt | 6 +++ .../feature/contributor/ContributorScreen.kt | 5 +- .../contributor/ContributorViewModelTest.kt | 2 +- 11 files changed, 75 insertions(+), 51 deletions(-) create mode 100644 core/data/src/main/java/com/droidknights/app/core/data/mapper/ContributorWithYearsMapper.kt create mode 100644 core/model/src/main/java/com/droidknights/app/core/model/ContributorWithYears.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 59704d49..86313598 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,7 @@ package com.droidknights.app.core.data.repository.api import com.droidknights.app.core.model.Contributor +import com.droidknights.app.core.model.ContributorWithYears interface ContributorRepository { @@ -8,4 +9,6 @@ interface ContributorRepository { owner: String, name: String, ): List + + suspend fun getContributorsWithYears(): List } diff --git a/core/data/src/main/java/com/droidknights/app/core/data/mapper/ContributorMapper.kt b/core/data/src/main/java/com/droidknights/app/core/data/mapper/ContributorMapper.kt index e6bb1961..5bd78a82 100644 --- a/core/data/src/main/java/com/droidknights/app/core/data/mapper/ContributorMapper.kt +++ b/core/data/src/main/java/com/droidknights/app/core/data/mapper/ContributorMapper.kt @@ -3,10 +3,10 @@ package com.droidknights.app.core.data.mapper import com.droidknights.app.core.data.api.model.ContributorResponse import com.droidknights.app.core.model.Contributor -internal fun ContributorResponse.toData(contributeYears: List): Contributor = +internal fun ContributorResponse.toData(): Contributor = Contributor( + id = id, name = this.name, imageUrl = this.imageUrl, githubUrl = this.githubUrl, - contributionYears = contributeYears, ) diff --git a/core/data/src/main/java/com/droidknights/app/core/data/mapper/ContributorWithYearsMapper.kt b/core/data/src/main/java/com/droidknights/app/core/data/mapper/ContributorWithYearsMapper.kt new file mode 100644 index 00000000..042641e3 --- /dev/null +++ b/core/data/src/main/java/com/droidknights/app/core/data/mapper/ContributorWithYearsMapper.kt @@ -0,0 +1,11 @@ +package com.droidknights.app.core.data.mapper + +import com.droidknights.app.core.data.api.model.ContributionYearResponse +import com.droidknights.app.core.model.ContributorWithYears + +internal fun ContributionYearResponse.toData(): ContributorWithYears { + return ContributorWithYears( + id = id, + years = years, + ) +} \ No newline at end of file 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 ac0a0afb..108e86c1 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 @@ -5,6 +5,7 @@ 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.ContributorWithYears import javax.inject.Inject internal class DefaultContributorRepository @Inject constructor( @@ -16,15 +17,10 @@ internal class DefaultContributorRepository @Inject constructor( owner: String, name: String, ): List { - val contributorResponse = githubApi.getContributors(owner, name) - val contributorWithYearResponse = githubRawApi.getContributorWithYears() - - return contributorResponse.map { contributor -> - val contributionYears = - contributorWithYearResponse.firstOrNull { it.id == contributor.id }?.years - ?: emptyList() + return githubApi.getContributors(owner, name).map { it.toData() } + } - contributor.toData(contributionYears) - } + override suspend fun getContributorsWithYears(): List { + return githubRawApi.getContributorWithYears().map { it.toData() } } } 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 c761206b..cb071f6d 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 @@ -7,16 +7,22 @@ import javax.inject.Inject class GetContributorsUseCase @Inject constructor( private val repository: ContributorRepository, ) { - suspend operator fun invoke(year: Int = 2024): List { - return repository.getContributors( + suspend operator fun invoke(): List { + val contributors = repository.getContributors( owner = OWNER, name = NAME, - ).filter { contributor -> - when (year) { - 2023 -> contributor.contributionYears.contains(year) - else -> contributor.contributionYears.contains(year) - || contributor.contributionYears.isEmpty() - } + ) + val contributorsWithYears = repository.getContributorsWithYears() + + val contributionYears = contributorsWithYears.flatMap { it.years }.toSet().sorted() + val latestYear = contributionYears.last() + + return contributors.filter { contributor -> + val years = contributorsWithYears + .find { it.id == contributor.id } + ?.years ?: listOf(latestYear) + + years.contains(latestYear) } } 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 c5a94d87..5c56b475 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 @@ -2,12 +2,18 @@ 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.ContributorWithYears internal class FakeContributorRepository( private val contributors: List, + private val contributorWithYears: List ) : ContributorRepository { override suspend fun getContributors(owner: String, name: String): List { return contributors } + + override suspend fun getContributorsWithYears(): List { + return contributorWithYears + } } 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 0be2f85b..9904574c 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,40 +1,24 @@ package com.droidknights.app.core.domain.usecase import com.droidknights.app.core.model.Contributor +import com.droidknights.app.core.model.ContributorWithYears import io.kotest.core.spec.style.BehaviorSpec import io.kotest.matchers.shouldBe internal class GetContributorsUseCaseTest : BehaviorSpec() { private val useCase: GetContributorsUseCase = GetContributorsUseCase( - repository = FakeContributorRepository(contributors) + repository = FakeContributorRepository(contributors, contributorsWithYears) ) init { Given("드로이드나이츠 컨트리뷰터가 존재한다") { - val expected = contributors - When("올해 드로이드나이츠 컨트리뷰터를 조회한다") { + When("드로이드나이츠 컨트리뷰터를 조회한다") { val contributors: List = useCase.invoke() - Then("드로이드나이츠 컨트리뷰터를 반환한다") { - contributors.size shouldBe 3 - contributors.forEachIndexed { index, contributor -> - contributor.name shouldBe expected[index].name - } - } - } - When("2023년도 컨트리뷰터를 조회한다.") { - val contributors: List = useCase.invoke(2023) - - Then("드로이드나이츠 컨트리뷰터를 반환한다") { - - contributors.size shouldBe 1 - contributors.all { - println(it.name) - println(expected[1].name) - it.name == expected[1].name - } + Then("올해 드로이드나이츠 컨트리뷰터를 반환한다") { + contributors.size shouldBe 2 } } } @@ -43,22 +27,33 @@ internal class GetContributorsUseCaseTest : BehaviorSpec() { companion object { private val contributors = listOf( Contributor( + id = 0L, name = "test name", imageUrl = "test image url", githubUrl = "test github url", - contributionYears = listOf(2024) ), Contributor( + id = 1L, + name = "test name1", + imageUrl = "test image url1", + githubUrl = "test github url1", + ), + Contributor( + id = 2L, name = "test name2", imageUrl = "test image url2", githubUrl = "test github url2", - contributionYears = listOf(2023, 2024) + ) + ) + + private val contributorsWithYears = listOf( + ContributorWithYears( + id = 1L, + listOf(2023, 2024) ), - Contributor( - name = "test name2", - imageUrl = "test image url3", - githubUrl = "test github url3", - contributionYears = listOf() + ContributorWithYears( + id = 2L, + listOf(2023) ) ) } diff --git a/core/model/src/main/java/com/droidknights/app/core/model/Contributor.kt b/core/model/src/main/java/com/droidknights/app/core/model/Contributor.kt index b006e75b..f2e7f35f 100644 --- a/core/model/src/main/java/com/droidknights/app/core/model/Contributor.kt +++ b/core/model/src/main/java/com/droidknights/app/core/model/Contributor.kt @@ -1,8 +1,8 @@ package com.droidknights.app.core.model data class Contributor( + val id: Long, val name: String, val imageUrl: String, val githubUrl: String, - val contributionYears: List ) diff --git a/core/model/src/main/java/com/droidknights/app/core/model/ContributorWithYears.kt b/core/model/src/main/java/com/droidknights/app/core/model/ContributorWithYears.kt new file mode 100644 index 00000000..e25eab70 --- /dev/null +++ b/core/model/src/main/java/com/droidknights/app/core/model/ContributorWithYears.kt @@ -0,0 +1,6 @@ +package com.droidknights.app.core.model + +data class ContributorWithYears( + val id: Long, + val years: List, +) diff --git a/feature/contributor/src/main/java/com/droidknights/app/feature/contributor/ContributorScreen.kt b/feature/contributor/src/main/java/com/droidknights/app/feature/contributor/ContributorScreen.kt index 80e2afb7..785f549c 100644 --- a/feature/contributor/src/main/java/com/droidknights/app/feature/contributor/ContributorScreen.kt +++ b/feature/contributor/src/main/java/com/droidknights/app/feature/contributor/ContributorScreen.kt @@ -270,16 +270,17 @@ private fun ContributorScreenPreview() { uiState = ContributorsUiState.Contributors( persistentListOf( Contributor( + 0L, "Contributor1", "https://avatars.githubusercontent.com/u/25101514", "https://github.com/droidknights", - listOf(2024) ), Contributor( + 1L, "Contributor2", "https://avatars.githubusercontent.com/u/25101514", + "https://github.com/droidknights", - listOf(2024) ), ) ), diff --git a/feature/contributor/src/test/java/com/droidknights/app/feature/contributor/ContributorViewModelTest.kt b/feature/contributor/src/test/java/com/droidknights/app/feature/contributor/ContributorViewModelTest.kt index 27165eed..709a3c15 100644 --- a/feature/contributor/src/test/java/com/droidknights/app/feature/contributor/ContributorViewModelTest.kt +++ b/feature/contributor/src/test/java/com/droidknights/app/feature/contributor/ContributorViewModelTest.kt @@ -35,10 +35,10 @@ internal class ContributorViewModelTest { companion object { private val fakeContributors = listOf( Contributor( + id = 0L, name = "test name", imageUrl = "test image url", githubUrl = "test github url", - contributionYears = listOf() ) ) }