Skip to content

Commit a06bb49

Browse files
authored
[MERGE] #315 -> develop
[FEAT/#315] ๋”ฑ ๋งž๋Š” ์ธํ„ด ๊ณต๊ณ  ํŽ˜์ด์ง• ๊ตฌํ˜„
2 parents 1004f9e + 0042fb4 commit a06bb49

File tree

17 files changed

+214
-91
lines changed

17 files changed

+214
-91
lines changed

โ€Žbuild-logic/src/main/java/terning.kotlin.library.gradle.ktsโ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import com.terning.build_logic.convention.configureCoroutineKotlin
12
import com.terning.build_logic.convention.configureKotlin
23

34
plugins {

โ€Ždata/home/build.gradle.ktsโ€Ž

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,7 @@ android {
1111
dependencies {
1212
// domain
1313
implementation(projects.domain.home)
14+
15+
//paging
16+
implementation(libs.paging.runtime)
1417
}

โ€Ždata/home/src/main/java/com/terning/data/home/datasource/HomeDataSource.ktโ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ interface HomeDataSource {
1212

1313
suspend fun getRecommendIntern(
1414
sortBy: String,
15+
page: Int,
1516
): BaseResponse<HomeRecommendInternResponseDto>
1617

1718
suspend fun getFilteringInfo(): BaseResponse<HomeFilteringInfoResponseDto>

โ€Ždata/home/src/main/java/com/terning/data/home/datasourceimpl/HomeDataSourceImpl.ktโ€Ž

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@ class HomeDataSourceImpl @Inject constructor(
1818

1919
override suspend fun getRecommendIntern(
2020
sortBy: String,
21+
page: Int,
2122
): BaseResponse<HomeRecommendInternResponseDto> =
2223
homeService.getRecommendIntern(
2324
sortBy = sortBy,
25+
page = page
2426
)
2527

2628
override suspend fun getFilteringInfo(): BaseResponse<HomeFilteringInfoResponseDto> =

โ€Ždata/home/src/main/java/com/terning/data/home/dto/response/HomeRecommendInternResponseDto.ktโ€Ž

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import kotlinx.serialization.Serializable
77
data class HomeRecommendInternResponseDto(
88
@SerialName("totalCount")
99
val totalCount: Int,
10+
@SerialName("hasNext")
11+
val hasNextPage: Boolean,
1012
@SerialName("result")
1113
val result: List<Result>
1214
) {
Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,19 @@
11
package com.terning.data.home.mapper
22

33
import com.terning.data.home.dto.response.HomeRecommendInternResponseDto
4-
import com.terning.domain.home.entity.HomeRecommendIntern
4+
import com.terning.domain.home.entity.HomeRecommendedIntern
55

6-
fun HomeRecommendInternResponseDto.toHomeRecommendInternList(): HomeRecommendIntern =
7-
HomeRecommendIntern(
8-
totalCount = this.totalCount,
9-
homeRecommendInternDetail = this.result.map {
10-
it.toHomeRecommendInternDetail()
11-
}
12-
)
136

14-
fun HomeRecommendInternResponseDto.Result.toHomeRecommendInternDetail(): HomeRecommendIntern.HomeRecommendInternDetail =
15-
HomeRecommendIntern.HomeRecommendInternDetail(
7+
fun HomeRecommendInternResponseDto.Result.toHomeRecommendedIntern(totalCount: Int): HomeRecommendedIntern =
8+
HomeRecommendedIntern(
9+
totalCount = totalCount,
1610
internshipAnnouncementId = this.internshipAnnouncementId,
17-
title = this.title,
11+
companyImage = this.companyImage,
1812
dDay = this.dDay,
19-
deadline = deadline,
13+
title = this.title,
2014
workingPeriod = this.workingPeriod,
21-
startYearMonth = this.startYearMonth,
22-
companyImage = this.companyImage,
2315
isScrapped = this.isScrapped,
2416
color = this.color,
17+
deadline = this.deadline,
18+
startYearMonth = this.startYearMonth,
2519
)
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.terning.data.home.pagingsource
2+
3+
import androidx.paging.PagingSource
4+
import androidx.paging.PagingState
5+
import com.terning.data.home.datasource.HomeDataSource
6+
import com.terning.data.home.dto.response.HomeRecommendInternResponseDto
7+
8+
class HomePagingSource(
9+
private val sortBy: String,
10+
private val dataSource: HomeDataSource
11+
) : PagingSource<Int, Pair<Int, HomeRecommendInternResponseDto.Result>>() {
12+
13+
14+
override suspend fun load(params: LoadParams<Int>): LoadResult<Int, Pair<Int, HomeRecommendInternResponseDto.Result>> {
15+
return try {
16+
val nextParamKey = params.key ?: 0
17+
18+
val response = dataSource.getRecommendIntern(sortBy = sortBy, page = nextParamKey)
19+
val totalCount = response.result.totalCount
20+
val hasNextPage = response.result.hasNextPage
21+
22+
LoadResult.Page(
23+
data = response.result.result.map {
24+
Pair(totalCount, it)
25+
},
26+
prevKey = null, // ๋‹ค์Œ ํŽ˜์ด์ง€ ๋กœ๋”ฉ๋งŒ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค์ •
27+
nextKey = if (hasNextPage) nextParamKey + 1 else null
28+
)
29+
} catch (e: Exception) {
30+
LoadResult.Error(e)
31+
}
32+
}
33+
34+
override fun getRefreshKey(state: PagingState<Int, Pair<Int, HomeRecommendInternResponseDto.Result>>): Int? {
35+
return state.anchorPosition?.let { anchorPosition ->
36+
val anchorPage = state.closestPageToPosition(anchorPosition)
37+
anchorPage?.prevKey?.plus(1) ?: anchorPage?.nextKey?.minus(1)
38+
}
39+
}
40+
}

โ€Ždata/home/src/main/java/com/terning/data/home/repositoryimpl/HomeRepositoryImpl.ktโ€Ž

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,45 @@
11
package com.terning.data.home.repositoryimpl
22

3+
import androidx.paging.Pager
4+
import androidx.paging.PagingConfig
5+
import androidx.paging.PagingData
6+
import androidx.paging.map
37
import com.terning.data.home.datasource.HomeDataSource
48
import com.terning.data.home.dto.request.toChangeFilterRequestDto
59
import com.terning.data.home.mapper.toHomeFilteringInfo
6-
import com.terning.data.home.mapper.toHomeRecommendInternList
10+
import com.terning.data.home.mapper.toHomeRecommendedIntern
711
import com.terning.data.home.mapper.toHomeUpcomingInternList
12+
import com.terning.data.home.pagingsource.HomePagingSource
813
import com.terning.domain.home.entity.ChangeFilteringRequestModel
914
import com.terning.domain.home.entity.HomeFilteringInfo
10-
import com.terning.domain.home.entity.HomeRecommendIntern
15+
import com.terning.domain.home.entity.HomeRecommendedIntern
1116
import com.terning.domain.home.entity.HomeUpcomingIntern
1217
import com.terning.domain.home.repository.HomeRepository
18+
import kotlinx.coroutines.flow.Flow
19+
import kotlinx.coroutines.flow.map
1320
import javax.inject.Inject
1421

1522
class HomeRepositoryImpl @Inject constructor(
1623
private val homeDataSource: HomeDataSource,
1724
) : HomeRepository {
25+
1826
override suspend fun getHomeUpcomingInternList(): Result<HomeUpcomingIntern> =
1927
runCatching {
2028
homeDataSource.getUpcomingIntern().result.toHomeUpcomingInternList()
2129
}
2230

23-
override suspend fun getRecommendIntern(
24-
sortBy: String,
25-
): Result<HomeRecommendIntern> =
26-
runCatching {
27-
homeDataSource.getRecommendIntern(
31+
override fun getRecommendIntern(sortBy: String): Flow<PagingData<HomeRecommendedIntern>> {
32+
return Pager(
33+
PagingConfig(pageSize = 10)
34+
) {
35+
HomePagingSource(
2836
sortBy = sortBy,
29-
).result.toHomeRecommendInternList()
37+
dataSource = homeDataSource
38+
)
39+
}.flow.map { pagedData ->
40+
pagedData.map { it.second.toHomeRecommendedIntern(it.first) }
3041
}
42+
}
3143

3244
override suspend fun getFilteringInfo(): Result<HomeFilteringInfo> =
3345
runCatching {

โ€Ždata/home/src/main/java/com/terning/data/home/service/HomeService.ktโ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ interface HomeService {
1818
@GET("api/v1/home")
1919
suspend fun getRecommendIntern(
2020
@Query("sortBy") sortBy: String,
21+
@Query("page") page: Int,
2122
): BaseResponse<HomeRecommendInternResponseDto>
2223

2324
@GET("api/v1/filters")
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
11
plugins {
22
alias(libs.plugins.terning.kotlin)
3+
}
4+
5+
dependencies {
6+
implementation(libs.paging.common)
7+
implementation(libs.coroutines.core)
8+
implementation(libs.coroutines.test)
39
}

0 commit comments

Comments
ย (0)