Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FEAT/#52] 검색뷰 / 정보 조회 API 구현 #53

Merged
merged 3 commits into from
Jul 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@ package co.orange.data.dataSource

import co.orange.data.dto.BaseResponse
import co.orange.data.dto.response.ProductDetailDto
import co.orange.data.dto.response.SearchInfoDto

interface DeviceDataSource {
suspend fun getProductDetail(id: String): BaseResponse<ProductDetailDto>

suspend fun getSearchInfo(): BaseResponse<SearchInfoDto>
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package co.orange.data.dataSourceImpl
import co.orange.data.dataSource.DeviceDataSource
import co.orange.data.dto.BaseResponse
import co.orange.data.dto.response.ProductDetailDto
import co.orange.data.dto.response.SearchInfoDto
import co.orange.data.service.DeviceService
import javax.inject.Inject

Expand All @@ -12,4 +13,6 @@ data class DeviceDataSourceImpl
private val deviceService: DeviceService,
) : DeviceDataSource {
override suspend fun getProductDetail(id: String): BaseResponse<ProductDetailDto> = deviceService.getProductDetail(id)

override suspend fun getSearchInfo(): BaseResponse<SearchInfoDto> = deviceService.getSearchInfo()
}
15 changes: 15 additions & 0 deletions data/src/main/java/co/orange/data/dto/response/SearchInfoDto.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package co.orange.data.dto.response

import co.orange.domain.entity.response.SearchInfoModel
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class SearchInfoDto(
@SerialName("topSearchedList")
val topSearchedList: List<String>,
@SerialName("recentlyViewedList")
val recentlyViewedList: List<ProductDto>,
) {
fun toModel() = SearchInfoModel(topSearchedList, recentlyViewedList.map { it.toModel() })
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package co.orange.data.repositoryImpl

import co.orange.data.dataSource.DeviceDataSource
import co.orange.domain.entity.response.ProductDetailModel
import co.orange.domain.entity.response.SearchInfoModel
import co.orange.domain.repository.DeviceRepository
import javax.inject.Inject

Expand All @@ -14,4 +15,9 @@ class DeviceRepositoryImpl
runCatching {
deviceDataSource.getProductDetail(id).data.toModel()
}

override suspend fun getSearchInfo(): Result<SearchInfoModel> =
runCatching {
deviceDataSource.getSearchInfo().data.toModel()
}
}
4 changes: 4 additions & 0 deletions data/src/main/java/co/orange/data/service/DeviceService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package co.orange.data.service

import co.orange.data.dto.BaseResponse
import co.orange.data.dto.response.ProductDetailDto
import co.orange.data.dto.response.SearchInfoDto
import retrofit2.http.GET
import retrofit2.http.Path

Expand All @@ -10,4 +11,7 @@ interface DeviceService {
suspend fun getProductDetail(
@Path("id") id: String,
): BaseResponse<ProductDetailDto>

@GET("/api/v1/search")
suspend fun getSearchInfo(): BaseResponse<SearchInfoDto>
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package co.orange.domain.entity.response

data class SearchModel(
data class SearchInfoModel(
val topSearchedList: List<String>,
val recentViewedList: List<ProductModel>,
)
val recentlyViewedList: List<ProductModel>,
)
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package co.orange.domain.repository

import co.orange.domain.entity.response.ProductDetailModel
import co.orange.domain.entity.response.SearchInfoModel

interface DeviceRepository {
suspend fun getProductDetail(id: String): Result<ProductDetailModel>

suspend fun getSearchInfo(): Result<SearchInfoModel>
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,7 @@ class SearchActivity :
initRecentAdapter()
initResultAdapter()
setDebounceSearch()
setKeywordList()
setRecentList()
observeGetSearchViewInfoState()
observeGetSearchResultState()
}

Expand Down Expand Up @@ -129,12 +128,19 @@ class SearchActivity :
}
}

private fun setKeywordList() {
keywordAdapter.addList(viewModel.mockSearchModel.topSearchedList)
}
private fun observeGetSearchViewInfoState() {
viewModel.getSearchInfoState.flowWithLifecycle(lifecycle).distinctUntilChanged()
.onEach { state ->
when (state) {
is UiState.Success -> {
keywordAdapter.addList(state.data.topSearchedList)
recentAdapter.addList(state.data.recentlyViewedList)
}

private fun setRecentList() {
recentAdapter.addList(viewModel.mockSearchModel.recentViewedList)
is UiState.Failure -> toast(stringOf(R.string.error_msg))
else -> return@onEach
}
}.launchIn(lifecycleScope)
}

private fun observeGetSearchResultState() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ package co.orange.presentation.search
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import co.orange.core.state.UiState
import co.orange.domain.entity.response.ProductModel
import co.orange.domain.entity.response.SearchModel
import co.orange.domain.entity.response.SearchInfoModel
import co.orange.domain.entity.response.SearchResultModel
import co.orange.domain.repository.DeviceRepository
import co.orange.domain.repository.SearchRepository
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
Expand All @@ -18,10 +18,31 @@ class SearchViewModel
@Inject
constructor(
private val searchRepository: SearchRepository,
private val deviceRepository: DeviceRepository,
) : ViewModel() {
private val _getSearchInfoState = MutableStateFlow<UiState<SearchInfoModel>>(UiState.Empty)
val getSearchInfoState: StateFlow<UiState<SearchInfoModel>> = _getSearchInfoState

private val _getSearchResultState = MutableStateFlow<UiState<SearchResultModel>>(UiState.Empty)
val getSearchResultState: StateFlow<UiState<SearchResultModel>> = _getSearchResultState

init {
getSearchInfoFromServer()
}

private fun getSearchInfoFromServer() {
_getSearchInfoState.value = UiState.Loading
viewModelScope.launch {
deviceRepository.getSearchInfo()
.onSuccess {
_getSearchInfoState.value = UiState.Success(it)
}
.onFailure {
_getSearchInfoState.value = UiState.Failure(it.message.toString())
}
}
}

fun getSearchResultFromServer(keyword: String) {
_getSearchResultState.value = UiState.Loading
viewModelScope.launch {
Expand All @@ -34,29 +55,4 @@ class SearchViewModel
}
}
}

var mockSearchModel =
SearchModel(
listOf("향수", "이승준", "곰인형", "성년의 날 선물", "멀티비타민"),
listOf(
ProductModel(
"1",
0,
"퓨어 오일 퍼퓸 10 ml 긴제목테스트트트트트",
"https://github.com/Marchbreeze/Marchbreeze/assets/97405341/cd2c0454-92b4-41e7-ae2f-319f83e2426f",
54000,
48900,
12,
),
ProductModel(
"2",
0,
"퓨어 오일 퍼퓸 10 ml 긴제목테스트트트트트",
"https://github.com/Marchbreeze/Marchbreeze/assets/97405341/cd2c0454-92b4-41e7-ae2f-319f83e2426f",
54000,
48900,
34,
),
),
)
}
Loading