Skip to content

Commit

Permalink
[feat] #48 회원 필터 정보 변경 api 연결
Browse files Browse the repository at this point in the history
  • Loading branch information
jihyunniiii committed Jul 20, 2023
1 parent 6cfe990 commit 6fc0dab
Show file tree
Hide file tree
Showing 11 changed files with 216 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.sopt.geonppang.data.datasource.remote

import com.sopt.geonppang.data.model.request.RequestFilter
import com.sopt.geonppang.data.model.response.ResponseFilter
import com.sopt.geonppang.data.service.FilterService
import javax.inject.Inject

class FilterDataSource @Inject constructor(
private val filterService: FilterService,
) {
suspend fun setFilter(
requestFilter: RequestFilter
): ResponseFilter = filterService.setFilter(requestFilter)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.sopt.geonppang.data.model.request

import kotlinx.serialization.Serializable

@Serializable
data class RequestFilter(
val mainPurpose: String,
val breadType: BreadType,
val nutrientType: NutrientType
) {
@Serializable
data class BreadType(
val isGlutenFree: Boolean,
val isVegan: Boolean,
val isNutFree: Boolean,
val isSugarFree: Boolean,
)

@Serializable
data class NutrientType(
val isNutrientOpen: Boolean,
val isIngredientOpen: Boolean,
val isNotOpen: Boolean,
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.sopt.geonppang.data.model.response

import com.sopt.geonppang.domain.model.SelectedFilter
import kotlinx.serialization.Serializable

@Serializable
data class ResponseFilter(
val code: Int,
val data: Data,
val message: String
) {
@Serializable
data class Data(
val breadType: BreadType,
val mainPurpose: String,
val memberId: Int,
val nutrientType: NutrientType
)

@Serializable
data class BreadType(
val breadTypeId: Int,
val breadTypeName: String,
val isGlutenFree: Boolean,
val isNutFree: Boolean,
val isSugarFree: Boolean,
val isVegan: Boolean
)

@Serializable
data class NutrientType(
val isIngredientOpen: Boolean,
val isNotOpen: Boolean,
val isNutrientOpen: Boolean,
val nutrientTypeId: Int,
val nutrientTypeName: String
)

fun toSelectedFilter() = SelectedFilter(
mainPurpose = data.mainPurpose,
breadType = SelectedFilter.BreadType(
isGlutenFree = data.breadType.isGlutenFree,
isVegan = data.breadType.isVegan,
isNutFree = data.breadType.isNutFree,
isSugarFree = data.breadType.isSugarFree
),
nutrientType = SelectedFilter.NutrientType(
isIngredientOpen = data.nutrientType.isIngredientOpen,
isNotOpen = data.nutrientType.isNotOpen,
isNutrientOpen = data.nutrientType.isNutrientOpen
)
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.sopt.geonppang.data.repository

import com.sopt.geonppang.data.datasource.remote.FilterDataSource
import com.sopt.geonppang.data.model.request.RequestFilter
import com.sopt.geonppang.domain.model.SelectedFilter
import com.sopt.geonppang.domain.repository.FilterRepository
import javax.inject.Inject

class FilterRepositoryImpl @Inject constructor(
private val filterDataSource: FilterDataSource
) : FilterRepository {
override suspend fun setFilter(requestFilter: RequestFilter): Result<SelectedFilter> =
runCatching {
filterDataSource.setFilter(requestFilter).toSelectedFilter()
}
}
13 changes: 13 additions & 0 deletions app/src/main/java/com/sopt/geonppang/data/service/FilterService.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.sopt.geonppang.data.service

import com.sopt.geonppang.data.model.request.RequestFilter
import com.sopt.geonppang.data.model.response.ResponseFilter
import retrofit2.http.Body
import retrofit2.http.POST

interface FilterService {
@POST("member/types")
suspend fun setFilter(
@Body requestFilter: RequestFilter
): ResponseFilter
}
8 changes: 8 additions & 0 deletions app/src/main/java/com/sopt/geonppang/di/RepositoryModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@ package com.sopt.geonppang.di
import com.sopt.geonppang.data.repository.BakeryRepositoryImpl
import com.sopt.geonppang.data.repository.DetailRepositoryImpl
import com.sopt.geonppang.data.repository.DummyRepositoryImpl
import com.sopt.geonppang.data.repository.FilterRepositoryImpl
import com.sopt.geonppang.data.repository.HomeRepositoryImpl
import com.sopt.geonppang.data.repository.MypageRepositoryImpl
import com.sopt.geonppang.data.repository.SearchRepositoryImpl
import com.sopt.geonppang.domain.repository.BakeryRepository
import com.sopt.geonppang.domain.repository.DetailRepository
import com.sopt.geonppang.domain.repository.DummyRepository
import com.sopt.geonppang.domain.repository.FilterRepository
import com.sopt.geonppang.domain.repository.HomeRepository
import com.sopt.geonppang.domain.repository.MypageRepository
import com.sopt.geonppang.domain.repository.SearchRepository
Expand Down Expand Up @@ -56,4 +58,10 @@ interface RepositoryModule {
fun bindDetailRepository(
detailRepositoryImpl: DetailRepositoryImpl,
): DetailRepository

@Binds
@Singleton
fun bindFilterRepository(
filterRepositoryImpl: FilterRepositoryImpl,
): FilterRepository
}
6 changes: 6 additions & 0 deletions app/src/main/java/com/sopt/geonppang/di/ServiceModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.sopt.geonppang.di
import com.sopt.geonppang.data.service.BakeryService
import com.sopt.geonppang.data.service.DetailService
import com.sopt.geonppang.data.service.DummyService
import com.sopt.geonppang.data.service.FilterService
import com.sopt.geonppang.data.service.HomeService
import com.sopt.geonppang.data.service.MypageService
import com.sopt.geonppang.data.service.SearchService
Expand Down Expand Up @@ -45,4 +46,9 @@ object ServiceModule {
@Provides
fun provideDetailService(retrofit: Retrofit): DetailService =
retrofit.create(DetailService::class.java)

@Singleton
@Provides
fun provideFilterService(retrofit: Retrofit): FilterService =
retrofit.create(FilterService::class.java)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.sopt.geonppang.domain.model

data class SelectedFilter(
val mainPurpose: String,
val breadType: BreadType,
val nutrientType: NutrientType
) {
data class BreadType(
val isGlutenFree: Boolean,
val isVegan: Boolean,
val isNutFree: Boolean,
val isSugarFree: Boolean,
)

data class NutrientType(
val isIngredientOpen: Boolean,
val isNotOpen: Boolean,
val isNutrientOpen: Boolean
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.sopt.geonppang.domain.repository

import com.sopt.geonppang.data.model.request.RequestFilter
import com.sopt.geonppang.domain.model.SelectedFilter

interface FilterRepository {
suspend fun setFilter(
requestFilter: RequestFilter
): Result<SelectedFilter>
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@ import androidx.lifecycle.ViewModelProvider
import com.sopt.geonppang.R
import com.sopt.geonppang.databinding.ActivityFilterBinding
import com.sopt.geonppang.util.binding.BindingActivity
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class FilterActivity : BindingActivity<ActivityFilterBinding>(R.layout.activity_filter) {
private lateinit var viewModel: FilterViewModel
private lateinit var adapter: FilterViewPagerAdapter
Expand Down Expand Up @@ -44,6 +46,7 @@ class FilterActivity : BindingActivity<ActivityFilterBinding>(R.layout.activity_
binding.btnFilterNext.setOnClickListener {
when (binding.vpFilterContainer.currentItem) {
2 -> {
viewModel.setFilter()
startActivity(Intent(this, WelcomeActivity::class.java))
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,27 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.MediatorLiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.sopt.geonppang.data.model.request.RequestFilter
import com.sopt.geonppang.domain.model.SelectedFilter
import com.sopt.geonppang.domain.repository.FilterRepository
import com.sopt.geonppang.presentation.type.BreadFilterType
import com.sopt.geonppang.presentation.type.MainPurposeType
import com.sopt.geonppang.presentation.type.NutrientFilterType
import com.sopt.geonppang.util.UiState
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch
import javax.inject.Inject

@HiltViewModel
class FilterViewModel @Inject constructor(
private val filterRepository: FilterRepository
) : ViewModel() {
private val _selectedFilterState = MutableStateFlow<UiState<SelectedFilter>>(UiState.Loading)
val selectedFilterState get() = _selectedFilterState.asStateFlow()

class FilterViewModel : ViewModel() {
private val _mainPurpose: MutableLiveData<MainPurposeType?> = MutableLiveData()
val mainPurpose: LiveData<MainPurposeType?> = _mainPurpose

Expand Down Expand Up @@ -58,4 +74,35 @@ class FilterViewModel : ViewModel() {
value = nutrientMap.any { it.value }
}
}

fun setFilter() {
viewModelScope.launch {
_mainPurpose.value?.let {
RequestFilter(
it.name,
RequestFilter.BreadType(
breadFilterType.value?.get(BreadFilterType.GLUTENFREE) == true,
breadFilterType.value?.get(BreadFilterType.VEGAN) == true,
breadFilterType.value?.get(BreadFilterType.NUTFREE) == true,
breadFilterType.value?.get(BreadFilterType.SUGARFREE) == true,
),
RequestFilter.NutrientType(
nutrientFilterType.value?.get(NutrientFilterType.NUTRIENT) == true,
nutrientFilterType.value?.get(NutrientFilterType.INGREDIENT) == true,
nutrientFilterType.value?.get(NutrientFilterType.NOT) == true,
)
)
}?.let {
filterRepository.setFilter(
it
)
.onSuccess { selectedFilter ->
_selectedFilterState.value = UiState.Success(selectedFilter)
}
.onFailure { throwable ->
_selectedFilterState.value = UiState.Error(throwable.message)
}
}
}
}
}

0 comments on commit 6fc0dab

Please sign in to comment.