Skip to content

Commit 68c3f4a

Browse files
authored
[MERGE] #328 -> develop
[οΏ½FEAT/#328] 탐색 λ·° / νŽ˜μ΄μ§• μΆ”κ°€
2 parents 3b06ba1 + 4e3ab37 commit 68c3f4a

14 files changed

Lines changed: 252 additions & 146 deletions

File tree

β€Ždata/search/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.search)
14+
15+
// paging
16+
implementation(libs.androidx.paging.common.android)
1417
}

β€Ždata/search/src/main/java/com/terning/data/search/datasourceimpl/SearchDataSourceImpl.ktβ€Ž

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ class SearchDataSourceImpl @Inject constructor(
1919
request.keyword,
2020
request.sortBy,
2121
request.page,
22-
request.size
2322
)
2423

2524
override suspend fun getSearchViews(): BaseResponse<SearchAnnouncementResponseDto> =

β€Ždata/search/src/main/java/com/terning/data/search/dto/request/SearchRequestDto.ktβ€Ž

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,4 @@ data class SearchRequestDto(
1111
val sortBy: String,
1212
@SerialName("page")
1313
val page: Int,
14-
@SerialName("size")
15-
val size: Int,
1614
)

β€Ždata/search/src/main/java/com/terning/data/search/mapper/SearchResultMapper.ktβ€Ž

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,16 @@ package com.terning.data.search.mapper
33
import com.terning.data.search.dto.response.SearchResultResponseDto
44
import com.terning.domain.search.entity.SearchResult
55

6-
fun SearchResultResponseDto.toSearchResultList(): List<SearchResult> {
7-
return announcements.map {
8-
SearchResult(
9-
internshipAnnouncementId = it.internshipAnnouncementId,
10-
title = it.title,
11-
dDay = it.dDay,
12-
workingPeriod = it.workingPeriod,
13-
companyImage = it.companyImage,
14-
isScrapped = it.isScrapped,
15-
deadline = it.deadline,
16-
startYearMonth = it.startYearMonth,
17-
color = it.color
18-
)
19-
}
20-
}
6+
fun SearchResultResponseDto.SearchAnnouncementDto.toSearchResultList(totalCount: Int): SearchResult =
7+
SearchResult(
8+
totalCount = totalCount,
9+
internshipAnnouncementId = this.internshipAnnouncementId,
10+
title = this.title,
11+
dDay = this.dDay,
12+
workingPeriod = this.workingPeriod,
13+
companyImage = this.companyImage,
14+
isScrapped = this.isScrapped,
15+
deadline = this.deadline,
16+
startYearMonth = this.startYearMonth,
17+
color = this.color,
18+
)
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package com.terning.data.search.pagingsource
2+
3+
import androidx.paging.PagingSource
4+
import androidx.paging.PagingState
5+
import com.terning.data.search.datasource.SearchDataSource
6+
import com.terning.data.search.dto.request.SearchRequestDto
7+
import com.terning.data.search.dto.response.SearchResultResponseDto
8+
9+
class SearchPagingSource(
10+
private val query: String,
11+
private val sortBy: String,
12+
private val dataSource: SearchDataSource,
13+
) : PagingSource<Int, Pair<Int, SearchResultResponseDto.SearchAnnouncementDto>>() {
14+
15+
override suspend fun load(params: LoadParams<Int>): LoadResult<Int, Pair<Int, SearchResultResponseDto.SearchAnnouncementDto>> {
16+
return try {
17+
val nextParamKey = params.key ?: 0
18+
19+
val response = dataSource.getSearch(
20+
request = SearchRequestDto(
21+
keyword = query,
22+
sortBy = sortBy,
23+
page = nextParamKey,
24+
)
25+
)
26+
val totalCount = response.result.totalCount
27+
val hasNextPage = response.result.hasNext
28+
29+
val nextKey = if (hasNextPage) nextParamKey + 1 else null
30+
31+
LoadResult.Page(
32+
data = response.result.announcements.map {
33+
Pair(totalCount, it)
34+
},
35+
prevKey = null,
36+
nextKey = nextKey
37+
)
38+
} catch (e: Exception) {
39+
LoadResult.Error(e)
40+
}
41+
}
42+
43+
override fun getRefreshKey(state: PagingState<Int, Pair<Int, SearchResultResponseDto.SearchAnnouncementDto>>): Int? {
44+
return state.anchorPosition?.let { anchorPosition ->
45+
state.closestPageToPosition(anchorPosition)?.prevKey?.plus(1)
46+
?: state.closestPageToPosition(anchorPosition)?.nextKey?.minus(1)
47+
}
48+
}
49+
}
Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,43 @@
11
package com.terning.data.search.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.search.datasource.SearchDataSource
4-
import com.terning.data.search.dto.request.SearchRequestDto
58
import com.terning.data.search.mapper.toSearchBannerList
69
import com.terning.data.search.mapper.toSearchPopularAnnouncementList
710
import com.terning.data.search.mapper.toSearchResultList
11+
import com.terning.data.search.pagingsource.SearchPagingSource
812
import com.terning.domain.search.entity.SearchBanner
913
import com.terning.domain.search.entity.SearchPopularAnnouncement
1014
import com.terning.domain.search.entity.SearchResult
1115
import com.terning.domain.search.repository.SearchRepository
16+
import kotlinx.coroutines.flow.Flow
17+
import kotlinx.coroutines.flow.map
1218
import javax.inject.Inject
1319

1420
class SearchRepositoryImpl @Inject constructor(
1521
private val searchDataSource: SearchDataSource,
1622
) : SearchRepository {
17-
override suspend fun getSearchList(
23+
24+
override fun getSearchList(
1825
query: String,
1926
sortBy: String,
20-
page: Int,
21-
size: Int,
22-
): Result<List<SearchResult>> {
23-
return runCatching {
24-
searchDataSource.getSearch(
25-
SearchRequestDto(
26-
keyword = query,
27-
sortBy = sortBy,
28-
page = page,
29-
size = size
30-
)
31-
).result.toSearchResultList()
27+
): Flow<PagingData<SearchResult>> {
28+
return Pager(
29+
PagingConfig(
30+
pageSize = 10,
31+
enablePlaceholders = false
32+
)
33+
) {
34+
SearchPagingSource(
35+
query = query,
36+
sortBy = sortBy,
37+
dataSource = searchDataSource
38+
)
39+
}.flow.map { pagedData ->
40+
pagedData.map { it.second.toSearchResultList(it.first) }
3241
}
3342
}
3443

@@ -43,7 +52,7 @@ class SearchRepositoryImpl @Inject constructor(
4352
}
4453

4554
override suspend fun getSearchBannersList(): Result<List<SearchBanner>> =
46-
kotlin.runCatching {
55+
runCatching {
4756
searchDataSource.getSearchBanners().result.toSearchBannerList()
4857
}
4958
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
plugins {
22
alias(libs.plugins.terning.kotlin)
3+
}
4+
5+
dependencies {
6+
implementation(libs.paging.common)
37
}

β€Ždomain/search/src/main/java/com/terning/domain/search/entity/SearchResult.ktβ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.terning.domain.search.entity
22

33
data class SearchResult(
4+
val totalCount: Int,
45
val internshipAnnouncementId: Long,
56
val title: String,
67
val dDay: String,

β€Ždomain/search/src/main/java/com/terning/domain/search/repository/SearchRepository.ktβ€Ž

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
package com.terning.domain.search.repository
22

3+
import androidx.paging.PagingData
34
import com.terning.domain.search.entity.SearchBanner
45
import com.terning.domain.search.entity.SearchPopularAnnouncement
56
import com.terning.domain.search.entity.SearchResult
7+
import kotlinx.coroutines.flow.Flow
68

79
interface SearchRepository {
8-
suspend fun getSearchList(
10+
11+
fun getSearchList(
912
query: String,
1013
sortBy: String,
11-
page: Int,
12-
size: Int,
13-
): Result<List<SearchResult>>
14+
): Flow<PagingData<SearchResult>>
1415

1516
suspend fun getSearchViewsList(): Result<List<SearchPopularAnnouncement>>
1617
suspend fun getSearchScrapsList(): Result<List<SearchPopularAnnouncement>>

β€Žfeature/search/build.gradle.ktsβ€Ž

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,8 @@ dependencies {
1414

1515
// feature
1616
implementation(projects.feature.dialog)
17+
18+
// paging
19+
implementation(libs.paging.runtime)
20+
implementation(libs.paging.compose)
1721
}

0 commit comments

Comments
Β (0)