diff --git a/app/src/main/java/com/dongguk/telepigeon/di/DataSourceModule.kt b/app/src/main/java/com/dongguk/telepigeon/di/DataSourceModule.kt index 80c31d7..85d6ef5 100644 --- a/app/src/main/java/com/dongguk/telepigeon/di/DataSourceModule.kt +++ b/app/src/main/java/com/dongguk/telepigeon/di/DataSourceModule.kt @@ -2,7 +2,9 @@ package com.dongguk.telepigeon.di import com.dongguk.telepigeon.data.local.datasource.TelePigeonLocalDataSource import com.dongguk.telepigeon.data.local.datasourceimpl.TelePigeonLocalDataSourceImpl +import com.dongguk.telepigeon.data.remote.datasource.ProfileRemoteDataSource import com.dongguk.telepigeon.data.remote.datasource.RoomRemoteDataSource +import com.dongguk.telepigeon.data.remote.datasourceimpl.ProfileRemoteDataSourceImpl import com.dongguk.telepigeon.data.remote.datasourceimpl.RoomRemoteDataSourceImpl import dagger.Binds import dagger.Module @@ -17,6 +19,10 @@ abstract class DataSourceModule { @Singleton abstract fun bindsTelePigeonLocalDataSource(telePigeonLocalDataSourceImpl: TelePigeonLocalDataSourceImpl): TelePigeonLocalDataSource + @Binds + @Singleton + abstract fun bindsProfileRemoteDataSource(profileRemoteDataSourceImpl: ProfileRemoteDataSourceImpl): ProfileRemoteDataSource + @Binds @Singleton abstract fun bindsRoomRemoteDataSource(roomRemoteDataSourceImpl: RoomRemoteDataSourceImpl): RoomRemoteDataSource diff --git a/app/src/main/java/com/dongguk/telepigeon/di/RepositoryModule.kt b/app/src/main/java/com/dongguk/telepigeon/di/RepositoryModule.kt index 5f09bf8..9efadb3 100644 --- a/app/src/main/java/com/dongguk/telepigeon/di/RepositoryModule.kt +++ b/app/src/main/java/com/dongguk/telepigeon/di/RepositoryModule.kt @@ -1,7 +1,9 @@ package com.dongguk.telepigeon.di +import com.dongguk.telepigeon.data.repositoryimpl.ProfileRepositoryImpl import com.dongguk.telepigeon.data.repositoryimpl.RoomRepositoryImpl import com.dongguk.telepigeon.data.repositoryimpl.TelePigeonRepositoryImpl +import com.dongguk.telepigeon.domain.repository.ProfileRepository import com.dongguk.telepigeon.domain.repository.RoomRepository import com.dongguk.telepigeon.domain.repository.TelePigeonRepository import dagger.Binds @@ -17,6 +19,10 @@ abstract class RepositoryModule { @Singleton abstract fun bindsTelePigeonRepository(telePigeonRepositoryImpl: TelePigeonRepositoryImpl): TelePigeonRepository + @Binds + @Singleton + abstract fun bindsProfileRepository(profileRepositoryImpl: ProfileRepositoryImpl): ProfileRepository + @Binds @Singleton abstract fun bindsRoomRepository(roomRepositoryImpl: RoomRepositoryImpl): RoomRepository diff --git a/app/src/main/java/com/dongguk/telepigeon/di/ServiceModule.kt b/app/src/main/java/com/dongguk/telepigeon/di/ServiceModule.kt index 8a2ecd1..f49cee1 100644 --- a/app/src/main/java/com/dongguk/telepigeon/di/ServiceModule.kt +++ b/app/src/main/java/com/dongguk/telepigeon/di/ServiceModule.kt @@ -1,5 +1,6 @@ package com.dongguk.telepigeon.di +import com.dongguk.telepigeon.data.remote.service.ProfileService import com.dongguk.telepigeon.data.remote.service.RoomService import com.dongguk.telepigeon.di.qualifier.TelePigeon import dagger.Module @@ -12,6 +13,13 @@ import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) object ServiceModule { + @Provides + @Singleton + fun providesProfileService( + @TelePigeon retrofit: Retrofit, + ): ProfileService = + retrofit.create(ProfileService::class.java) + @Provides @Singleton fun providesRoomService( diff --git a/data-remote/src/main/java/com/dongguk/telepigeon/data/remote/datasource/ProfileRemoteDataSource.kt b/data-remote/src/main/java/com/dongguk/telepigeon/data/remote/datasource/ProfileRemoteDataSource.kt new file mode 100644 index 0000000..1d88bcf --- /dev/null +++ b/data-remote/src/main/java/com/dongguk/telepigeon/data/remote/datasource/ProfileRemoteDataSource.kt @@ -0,0 +1,18 @@ +package com.dongguk.telepigeon.data.remote.datasource + +import com.dongguk.telepigeon.data.remote.model.request.RequestPutRoomKeywordsExtraDto +import com.dongguk.telepigeon.data.remote.model.response.ResponseGetRoomExtraDto +import com.dongguk.telepigeon.data.remote.model.response.ResponseGetRoomKeywordsDto +import com.dongguk.telepigeon.data.remote.model.response.base.BaseResponseDto +import com.dongguk.telepigeon.data.remote.model.response.base.NullableBaseResponseDto + +interface ProfileRemoteDataSource { + suspend fun getRoomKeywords(roomId: Int): BaseResponseDto + + suspend fun getRoomExtra(roomId: Int): BaseResponseDto + + suspend fun putRoomKeywordsExtra( + roomId: Int, + requestPutRoomKeywordsExtraDto: RequestPutRoomKeywordsExtraDto, + ): NullableBaseResponseDto +} diff --git a/data-remote/src/main/java/com/dongguk/telepigeon/data/remote/datasourceimpl/ProfileRemoteDataSourceImpl.kt b/data-remote/src/main/java/com/dongguk/telepigeon/data/remote/datasourceimpl/ProfileRemoteDataSourceImpl.kt new file mode 100644 index 0000000..6183d82 --- /dev/null +++ b/data-remote/src/main/java/com/dongguk/telepigeon/data/remote/datasourceimpl/ProfileRemoteDataSourceImpl.kt @@ -0,0 +1,25 @@ +package com.dongguk.telepigeon.data.remote.datasourceimpl + +import com.dongguk.telepigeon.data.remote.datasource.ProfileRemoteDataSource +import com.dongguk.telepigeon.data.remote.model.request.RequestPutRoomKeywordsExtraDto +import com.dongguk.telepigeon.data.remote.model.response.ResponseGetRoomExtraDto +import com.dongguk.telepigeon.data.remote.model.response.ResponseGetRoomKeywordsDto +import com.dongguk.telepigeon.data.remote.model.response.base.BaseResponseDto +import com.dongguk.telepigeon.data.remote.model.response.base.NullableBaseResponseDto +import com.dongguk.telepigeon.data.remote.service.ProfileService +import javax.inject.Inject + +class ProfileRemoteDataSourceImpl + @Inject + constructor( + private val profileService: ProfileService, + ) : ProfileRemoteDataSource { + override suspend fun getRoomKeywords(roomId: Int): BaseResponseDto = profileService.getRoomKeywords(roomId = roomId) + + override suspend fun getRoomExtra(roomId: Int): BaseResponseDto = profileService.getRoomExtra(roomId = roomId) + + override suspend fun putRoomKeywordsExtra( + roomId: Int, + requestPutRoomKeywordsExtraDto: RequestPutRoomKeywordsExtraDto, + ): NullableBaseResponseDto = profileService.putRoomKeywordsExtra(roomId = roomId, requestPutRoomKeywordsExtraDto = requestPutRoomKeywordsExtraDto) + } diff --git a/data-remote/src/main/java/com/dongguk/telepigeon/data/remote/datasourceimpl/RoomRemoteDataSourceImpl.kt b/data-remote/src/main/java/com/dongguk/telepigeon/data/remote/datasourceimpl/RoomRemoteDataSourceImpl.kt index cf9d2bc..f72f6ee 100644 --- a/data-remote/src/main/java/com/dongguk/telepigeon/data/remote/datasourceimpl/RoomRemoteDataSourceImpl.kt +++ b/data-remote/src/main/java/com/dongguk/telepigeon/data/remote/datasourceimpl/RoomRemoteDataSourceImpl.kt @@ -23,5 +23,5 @@ class RoomRemoteDataSourceImpl override suspend fun deleteRoom(roomId: Int): NullableBaseResponseDto = roomService.deleteRoom(roomId = roomId) - override suspend fun getRoomInfo(roomId: Int): BaseResponseDto = getRoomInfo(roomId = roomId) + override suspend fun getRoomInfo(roomId: Int): BaseResponseDto = roomService.getRoomInfo(roomId = roomId) } diff --git a/data-remote/src/main/java/com/dongguk/telepigeon/data/remote/model/request/RequestPutRoomKeywordsExtraDto.kt b/data-remote/src/main/java/com/dongguk/telepigeon/data/remote/model/request/RequestPutRoomKeywordsExtraDto.kt new file mode 100644 index 0000000..6b06462 --- /dev/null +++ b/data-remote/src/main/java/com/dongguk/telepigeon/data/remote/model/request/RequestPutRoomKeywordsExtraDto.kt @@ -0,0 +1,16 @@ +package com.dongguk.telepigeon.data.remote.model.request + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class RequestPutRoomKeywordsExtraDto( + @SerialName("keywords") + val keywords: List, + @SerialName("gender") + val gender: String, + @SerialName("ageRange") + val ageRange: String, + @SerialName("relation") + val relation: String, +) diff --git a/data-remote/src/main/java/com/dongguk/telepigeon/data/remote/model/response/ResponseGetRoomExtraDto.kt b/data-remote/src/main/java/com/dongguk/telepigeon/data/remote/model/response/ResponseGetRoomExtraDto.kt new file mode 100644 index 0000000..dbae87a --- /dev/null +++ b/data-remote/src/main/java/com/dongguk/telepigeon/data/remote/model/response/ResponseGetRoomExtraDto.kt @@ -0,0 +1,14 @@ +package com.dongguk.telepigeon.data.remote.model.response + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class ResponseGetRoomExtraDto( + @SerialName("gender") + val gender: String, + @SerialName("ageRange") + val ageRange: String, + @SerialName("relation") + val relation: String, +) diff --git a/data-remote/src/main/java/com/dongguk/telepigeon/data/remote/model/response/ResponseGetRoomKeywordsDto.kt b/data-remote/src/main/java/com/dongguk/telepigeon/data/remote/model/response/ResponseGetRoomKeywordsDto.kt new file mode 100644 index 0000000..24a3c25 --- /dev/null +++ b/data-remote/src/main/java/com/dongguk/telepigeon/data/remote/model/response/ResponseGetRoomKeywordsDto.kt @@ -0,0 +1,10 @@ +package com.dongguk.telepigeon.data.remote.model.response + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class ResponseGetRoomKeywordsDto( + @SerialName("keywords") + val keywords: List, +) diff --git a/data-remote/src/main/java/com/dongguk/telepigeon/data/remote/service/ProfileService.kt b/data-remote/src/main/java/com/dongguk/telepigeon/data/remote/service/ProfileService.kt new file mode 100644 index 0000000..5a780b3 --- /dev/null +++ b/data-remote/src/main/java/com/dongguk/telepigeon/data/remote/service/ProfileService.kt @@ -0,0 +1,36 @@ +package com.dongguk.telepigeon.data.remote.service + +import com.dongguk.telepigeon.data.remote.model.request.RequestPutRoomKeywordsExtraDto +import com.dongguk.telepigeon.data.remote.model.response.ResponseGetRoomExtraDto +import com.dongguk.telepigeon.data.remote.model.response.ResponseGetRoomKeywordsDto +import com.dongguk.telepigeon.data.remote.model.response.base.BaseResponseDto +import com.dongguk.telepigeon.data.remote.model.response.base.NullableBaseResponseDto +import retrofit2.http.Body +import retrofit2.http.GET +import retrofit2.http.PUT +import retrofit2.http.Path + +interface ProfileService { + @GET("$ROOMS/{$ROOM_ID}/$KEYWORDS") + suspend fun getRoomKeywords( + @Path("${ROOM_ID}") roomId: Int, + ): BaseResponseDto + + @GET("$ROOMS/{$ROOM_ID}/$EXTRA") + suspend fun getRoomExtra( + @Path("${ROOM_ID}") roomId: Int, + ): BaseResponseDto + + @PUT("$ROOMS/${ROOM_ID}") + suspend fun putRoomKeywordsExtra( + @Path("${ROOM_ID}") roomId: Int, + @Body requestPutRoomKeywordsExtraDto: RequestPutRoomKeywordsExtraDto, + ): NullableBaseResponseDto + + companion object { + const val ROOMS = "rooms" + const val ROOM_ID = "roomId" + const val KEYWORDS = "keywords" + const val EXTRA = "extra" + } +} diff --git a/data/src/main/java/com/dongguk/telepigeon/data/mapper/ResponseGetRoomExtraDtoMapper.kt b/data/src/main/java/com/dongguk/telepigeon/data/mapper/ResponseGetRoomExtraDtoMapper.kt new file mode 100644 index 0000000..7ec5d6a --- /dev/null +++ b/data/src/main/java/com/dongguk/telepigeon/data/mapper/ResponseGetRoomExtraDtoMapper.kt @@ -0,0 +1,11 @@ +package com.dongguk.telepigeon.data.mapper + +import com.dongguk.telepigeon.data.remote.model.response.ResponseGetRoomExtraDto +import com.dongguk.telepigeon.domain.model.RoomExtraModel + +fun ResponseGetRoomExtraDto.toRoomKeywordExtraModel() = + RoomExtraModel( + gender = this.gender, + ageRange = this.ageRange, + relation = this.relation, + ) diff --git a/data/src/main/java/com/dongguk/telepigeon/data/mapper/ResponseGetRoomKeywordsDtoMapper.kt b/data/src/main/java/com/dongguk/telepigeon/data/mapper/ResponseGetRoomKeywordsDtoMapper.kt new file mode 100644 index 0000000..0cfdf83 --- /dev/null +++ b/data/src/main/java/com/dongguk/telepigeon/data/mapper/ResponseGetRoomKeywordsDtoMapper.kt @@ -0,0 +1,9 @@ +package com.dongguk.telepigeon.data.mapper + +import com.dongguk.telepigeon.data.remote.model.response.ResponseGetRoomKeywordsDto +import com.dongguk.telepigeon.domain.model.RoomKeywordsModel + +fun ResponseGetRoomKeywordsDto.toRoomKeywordModel() = + RoomKeywordsModel( + keywords = this.keywords.joinToString { ", " }, + ) diff --git a/data/src/main/java/com/dongguk/telepigeon/data/mapper/RoomKeywordsExtraModelMapper.kt b/data/src/main/java/com/dongguk/telepigeon/data/mapper/RoomKeywordsExtraModelMapper.kt new file mode 100644 index 0000000..259fcbb --- /dev/null +++ b/data/src/main/java/com/dongguk/telepigeon/data/mapper/RoomKeywordsExtraModelMapper.kt @@ -0,0 +1,12 @@ +package com.dongguk.telepigeon.data.mapper + +import com.dongguk.telepigeon.data.remote.model.request.RequestPutRoomKeywordsExtraDto +import com.dongguk.telepigeon.domain.model.RoomKeywordsExtraModel + +fun RoomKeywordsExtraModel.toRequestPutRoomKeywordsExtraDto() = + RequestPutRoomKeywordsExtraDto( + keywords = this.keywords, + gender = this.gender, + ageRange = this.ageRange, + relation = this.relation, + ) diff --git a/data/src/main/java/com/dongguk/telepigeon/data/repositoryimpl/ProfileRepositoryImpl.kt b/data/src/main/java/com/dongguk/telepigeon/data/repositoryimpl/ProfileRepositoryImpl.kt new file mode 100644 index 0000000..9920c58 --- /dev/null +++ b/data/src/main/java/com/dongguk/telepigeon/data/repositoryimpl/ProfileRepositoryImpl.kt @@ -0,0 +1,35 @@ +package com.dongguk.telepigeon.data.repositoryimpl + +import com.dongguk.telepigeon.data.mapper.toRequestPutRoomKeywordsExtraDto +import com.dongguk.telepigeon.data.mapper.toRoomKeywordExtraModel +import com.dongguk.telepigeon.data.mapper.toRoomKeywordModel +import com.dongguk.telepigeon.data.remote.datasource.ProfileRemoteDataSource +import com.dongguk.telepigeon.domain.model.RoomExtraModel +import com.dongguk.telepigeon.domain.model.RoomKeywordsExtraModel +import com.dongguk.telepigeon.domain.model.RoomKeywordsModel +import com.dongguk.telepigeon.domain.repository.ProfileRepository +import javax.inject.Inject + +class ProfileRepositoryImpl + @Inject + constructor( + private val profileRemoteDataSource: ProfileRemoteDataSource, + ) : ProfileRepository { + override suspend fun getRoomKeywords(roomId: Int): Result = + runCatching { + profileRemoteDataSource.getRoomKeywords(roomId = roomId).data.toRoomKeywordModel() + } + + override suspend fun getRoomExtra(roomId: Int): Result = + runCatching { + profileRemoteDataSource.getRoomExtra(roomId = roomId).data.toRoomKeywordExtraModel() + } + + override suspend fun putRoomKeywordExtra( + roomId: Int, + roomKeywordsExtraModel: RoomKeywordsExtraModel, + ): Result = + runCatching { + profileRemoteDataSource.putRoomKeywordsExtra(roomId = roomId, requestPutRoomKeywordsExtraDto = roomKeywordsExtraModel.toRequestPutRoomKeywordsExtraDto()) + } + } diff --git a/domain/src/main/java/com/dongguk/telepigeon/domain/model/RoomKeywordExtraModel.kt b/domain/src/main/java/com/dongguk/telepigeon/domain/model/RoomExtraModel.kt similarity index 78% rename from domain/src/main/java/com/dongguk/telepigeon/domain/model/RoomKeywordExtraModel.kt rename to domain/src/main/java/com/dongguk/telepigeon/domain/model/RoomExtraModel.kt index 6aa0e03..c99111d 100644 --- a/domain/src/main/java/com/dongguk/telepigeon/domain/model/RoomKeywordExtraModel.kt +++ b/domain/src/main/java/com/dongguk/telepigeon/domain/model/RoomExtraModel.kt @@ -1,6 +1,6 @@ package com.dongguk.telepigeon.domain.model -data class RoomKeywordExtraModel( +data class RoomExtraModel( val gender: String, val ageRange: String, val relation: String, diff --git a/domain/src/main/java/com/dongguk/telepigeon/domain/model/RoomKeywordsExtraModel.kt b/domain/src/main/java/com/dongguk/telepigeon/domain/model/RoomKeywordsExtraModel.kt new file mode 100644 index 0000000..9d34c74 --- /dev/null +++ b/domain/src/main/java/com/dongguk/telepigeon/domain/model/RoomKeywordsExtraModel.kt @@ -0,0 +1,8 @@ +package com.dongguk.telepigeon.domain.model + +data class RoomKeywordsExtraModel( + val keywords: List, + val gender: String, + val ageRange: String, + val relation: String, +) diff --git a/domain/src/main/java/com/dongguk/telepigeon/domain/model/RoomKeywordModel.kt b/domain/src/main/java/com/dongguk/telepigeon/domain/model/RoomKeywordsModel.kt similarity index 70% rename from domain/src/main/java/com/dongguk/telepigeon/domain/model/RoomKeywordModel.kt rename to domain/src/main/java/com/dongguk/telepigeon/domain/model/RoomKeywordsModel.kt index 992b576..dd8df20 100644 --- a/domain/src/main/java/com/dongguk/telepigeon/domain/model/RoomKeywordModel.kt +++ b/domain/src/main/java/com/dongguk/telepigeon/domain/model/RoomKeywordsModel.kt @@ -1,5 +1,5 @@ package com.dongguk.telepigeon.domain.model -data class RoomKeywordModel( +data class RoomKeywordsModel( val keywords: String, ) diff --git a/domain/src/main/java/com/dongguk/telepigeon/domain/repository/ProfileRepository.kt b/domain/src/main/java/com/dongguk/telepigeon/domain/repository/ProfileRepository.kt new file mode 100644 index 0000000..2f6fa9a --- /dev/null +++ b/domain/src/main/java/com/dongguk/telepigeon/domain/repository/ProfileRepository.kt @@ -0,0 +1,16 @@ +package com.dongguk.telepigeon.domain.repository + +import com.dongguk.telepigeon.domain.model.RoomExtraModel +import com.dongguk.telepigeon.domain.model.RoomKeywordsExtraModel +import com.dongguk.telepigeon.domain.model.RoomKeywordsModel + +interface ProfileRepository { + suspend fun getRoomKeywords(roomId: Int): Result + + suspend fun getRoomExtra(roomId: Int): Result + + suspend fun putRoomKeywordExtra( + roomId: Int, + roomKeywordsExtraModel: RoomKeywordsExtraModel, + ): Result +} diff --git a/domain/src/main/java/com/dongguk/telepigeon/domain/usecase/GetRoomExtraUseCase.kt b/domain/src/main/java/com/dongguk/telepigeon/domain/usecase/GetRoomExtraUseCase.kt new file mode 100644 index 0000000..2712e66 --- /dev/null +++ b/domain/src/main/java/com/dongguk/telepigeon/domain/usecase/GetRoomExtraUseCase.kt @@ -0,0 +1,14 @@ +package com.dongguk.telepigeon.domain.usecase + +import com.dongguk.telepigeon.domain.repository.ProfileRepository +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class GetRoomExtraUseCase + @Inject + constructor( + private val profileRepository: ProfileRepository, + ) { + suspend operator fun invoke(roomId: Int) = profileRepository.getRoomExtra(roomId = roomId) + } diff --git a/domain/src/main/java/com/dongguk/telepigeon/domain/usecase/GetRoomKeywordsUseCase.kt b/domain/src/main/java/com/dongguk/telepigeon/domain/usecase/GetRoomKeywordsUseCase.kt new file mode 100644 index 0000000..a890ad7 --- /dev/null +++ b/domain/src/main/java/com/dongguk/telepigeon/domain/usecase/GetRoomKeywordsUseCase.kt @@ -0,0 +1,14 @@ +package com.dongguk.telepigeon.domain.usecase + +import com.dongguk.telepigeon.domain.repository.ProfileRepository +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class GetRoomKeywordsUseCase + @Inject + constructor( + private val profileRepository: ProfileRepository, + ) { + suspend operator fun invoke(roomId: Int) = profileRepository.getRoomKeywords(roomId = roomId) + } diff --git a/domain/src/main/java/com/dongguk/telepigeon/domain/usecase/PutRoomKeywordExtraUseCase.kt b/domain/src/main/java/com/dongguk/telepigeon/domain/usecase/PutRoomKeywordExtraUseCase.kt new file mode 100644 index 0000000..7906597 --- /dev/null +++ b/domain/src/main/java/com/dongguk/telepigeon/domain/usecase/PutRoomKeywordExtraUseCase.kt @@ -0,0 +1,18 @@ +package com.dongguk.telepigeon.domain.usecase + +import com.dongguk.telepigeon.domain.model.RoomKeywordsExtraModel +import com.dongguk.telepigeon.domain.repository.ProfileRepository +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class PutRoomKeywordExtraUseCase + @Inject + constructor( + private val profileRepository: ProfileRepository, + ) { + suspend operator fun invoke( + roomId: Int, + roomKeywordsExtraModel: RoomKeywordsExtraModel, + ) = profileRepository.putRoomKeywordExtra(roomId = roomId, roomKeywordsExtraModel = roomKeywordsExtraModel) + } diff --git a/feature/src/main/java/com/dongguk/telepigeon/feature/setting/keywordsetting/KeywordSettingFragment.kt b/feature/src/main/java/com/dongguk/telepigeon/feature/setting/keywordsetting/KeywordSettingFragment.kt index f8f13bd..e9271b1 100644 --- a/feature/src/main/java/com/dongguk/telepigeon/feature/setting/keywordsetting/KeywordSettingFragment.kt +++ b/feature/src/main/java/com/dongguk/telepigeon/feature/setting/keywordsetting/KeywordSettingFragment.kt @@ -3,16 +3,21 @@ package com.dongguk.telepigeon.feature.setting.keywordsetting import android.os.Bundle import android.view.View import androidx.fragment.app.viewModels +import androidx.lifecycle.flowWithLifecycle +import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import com.dongguk.telepigeon.design.system.component.BottomSheetWithSelectionAdapter import com.dongguk.telepigeon.design.system.component.BottomSheetWithSelectionDialogFragment import com.dongguk.telepigeon.design.system.type.AppBarType import com.dongguk.telepigeon.design.system.type.BottomSheetWithSelectionType -import com.dongguk.telepigeon.feature.R +import com.dongguk.telepigeon.domain.model.RoomKeywordsExtraModel import com.dongguk.telepigeon.feature.databinding.FragmentKeywordSettingBinding import com.dongguk.telpigeon.core.ui.base.BindingFragment import com.dongguk.telpigeon.core.ui.util.fragment.stringOf +import com.dongguk.telpigeon.core.ui.util.view.UiState import com.google.android.material.chip.Chip +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach class KeywordSettingFragment : BindingFragment({ FragmentKeywordSettingBinding.inflate(it) }) { private val keywordSettingViewModel by viewModels() @@ -24,10 +29,22 @@ class KeywordSettingFragment : BindingFragment({ ) { super.onViewCreated(view, savedInstanceState) + intAppBar() initLayout() + collectPutRoomKeywordExtraState() setEtKeywordSettingGenderClickListener() setEtKeywordSettingAgeRangeClickListener() setEtKeywordSettingRelationClickListener() + setBtnKeywordSettingCompleteClickListener() + } + + private fun intAppBar() { + with(binding) { + appbarKeywordSetting.initLayout(appBarType = AppBarType.TITLE, title = stringOf(com.dongguk.telepigeon.core.design.system.R.string.setting_key_word_title)) + appbarKeywordSetting.binding.ivAppBarTelepigeonArrowLeft.setOnClickListener { + findNavController().popBackStack() + } + } } private fun initLayout() { @@ -39,16 +56,23 @@ class KeywordSettingFragment : BindingFragment({ etKeywordSettingGender.editText.setText(keywordSettingViewModel.dummyKeywordExtraModel.gender) etKeywordSettingAgeRange.editText.setText(keywordSettingViewModel.dummyKeywordExtraModel.ageRange) etKeywordSettingRelation.editText.setText(keywordSettingViewModel.dummyKeywordExtraModel.relation) - - binding.appbarKeywordSetting.initLayout(appBarType = AppBarType.TITLE, title = stringOf(com.dongguk.telepigeon.core.design.system.R.string.setting_key_word_title)) - binding.appbarKeywordSetting.binding.ivAppBarTelepigeonArrowLeft.setOnClickListener { - findNavController().popBackStack() - } } setKeywordChip(keywordSettingViewModel.dummyKeywords, keywordSettingViewModel.dummySelectedKeywords) } + private fun collectPutRoomKeywordExtraState() { + keywordSettingViewModel.putRoomKeywordExtraState.flowWithLifecycle(viewLifecycleOwner.lifecycle).onEach { putRoomKeywordExtraState -> + when (putRoomKeywordExtraState) { + is UiState.Success -> { + findNavController().popBackStack() + } + + else -> Unit + } + }.launchIn(viewLifecycleOwner.lifecycleScope) + } + private fun setKeywordChip( keywords: List, selectedKeywords: List, @@ -82,6 +106,20 @@ class KeywordSettingFragment : BindingFragment({ } } + private fun setBtnKeywordSettingCompleteClickListener() { + binding.btnKeywordSettingComplete.setOnClickListener { + keywordSettingViewModel.putRoomKeywordExtra( + roomKeywordsExtraModel = + RoomKeywordsExtraModel( + keywords = getKeywords(), + gender = binding.etKeywordSettingGender.editText.text.toString(), + ageRange = binding.etKeywordSettingAgeRange.editText.text.toString(), + relation = binding.etKeywordSettingRelation.editText.text.toString(), + ), + ) + } + } + private fun showSelectionBottomSheetDialogFragment( bottomSheetWithSelectionType: BottomSheetWithSelectionType, selectionList: List, @@ -93,6 +131,20 @@ class KeywordSettingFragment : BindingFragment({ ).show(childFragmentManager, SELECTION_BOTTOM_SHEET) } + private fun getKeywords(): List { + val keywords = mutableListOf() + with(binding.cgKeywordSettingTotalKeyword) { + for (index in 0..childCount) { + ((getChildAt(index)) as? Chip)?.let { chip -> + if (chip.isChecked) { + keywords.add(chip.text.toString()) + } + } + } + } + return keywords + } + companion object { const val MAX_SELECTION = 3 const val SELECTION_BOTTOM_SHEET = "selectionBottomSheet" diff --git a/feature/src/main/java/com/dongguk/telepigeon/feature/setting/keywordsetting/KeywordSettingViewModel.kt b/feature/src/main/java/com/dongguk/telepigeon/feature/setting/keywordsetting/KeywordSettingViewModel.kt index e2e86e5..da99bde 100644 --- a/feature/src/main/java/com/dongguk/telepigeon/feature/setting/keywordsetting/KeywordSettingViewModel.kt +++ b/feature/src/main/java/com/dongguk/telepigeon/feature/setting/keywordsetting/KeywordSettingViewModel.kt @@ -1,14 +1,41 @@ package com.dongguk.telepigeon.feature.setting.keywordsetting import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import com.dongguk.telepigeon.domain.model.KeywordExtraModel +import com.dongguk.telepigeon.domain.model.RoomKeywordsExtraModel +import com.dongguk.telepigeon.domain.usecase.GetRoomIdUseCase +import com.dongguk.telepigeon.domain.usecase.PutRoomKeywordExtraUseCase +import com.dongguk.telpigeon.core.ui.util.view.UiState import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel class KeywordSettingViewModel @Inject - constructor() : ViewModel() { + constructor( + private val getRoomIdUseCase: GetRoomIdUseCase, + private val putRoomKeywordExtraUseCase: PutRoomKeywordExtraUseCase, + ) : ViewModel() { + private val _putRoomKeywordExtraState = MutableSharedFlow>() + val putRoomKeywordExtraState get() = _putRoomKeywordExtraState.asSharedFlow() + + private val roomId = getRoomIdUseCase() + + fun putRoomKeywordExtra(roomKeywordsExtraModel: RoomKeywordsExtraModel) { + viewModelScope.launch { + _putRoomKeywordExtraState.emit(UiState.Empty) + putRoomKeywordExtraUseCase(roomId = roomId, roomKeywordsExtraModel = roomKeywordsExtraModel).onSuccess { + _putRoomKeywordExtraState.emit(UiState.Success(Unit)) + }.onFailure { exception: Throwable -> + _putRoomKeywordExtraState.emit(UiState.Error(exception.message)) + } + } + } + val dummyKeywords = listOf("운동", "수업", "산책", "영양제", "약", "밥", "일", "회사생활", "공부", "청소", "간식", "꿈") val dummySelectedKeywords = listOf("운동", "영양제", "밥") val dummyKeywordExtraModel = diff --git a/feature/src/main/java/com/dongguk/telepigeon/feature/setting/setting/SettingFragment.kt b/feature/src/main/java/com/dongguk/telepigeon/feature/setting/setting/SettingFragment.kt index a127e6b..a74668f 100644 --- a/feature/src/main/java/com/dongguk/telepigeon/feature/setting/setting/SettingFragment.kt +++ b/feature/src/main/java/com/dongguk/telepigeon/feature/setting/setting/SettingFragment.kt @@ -7,6 +7,7 @@ import android.os.Bundle import android.view.View import androidx.fragment.app.viewModels import androidx.lifecycle.flowWithLifecycle +import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import com.dongguk.telepigeon.design.system.component.BottomSheetWithOneBtnDialogFragment import com.dongguk.telepigeon.design.system.type.BottomSheetWithOneBtnType @@ -15,6 +16,7 @@ import com.dongguk.telepigeon.feature.databinding.FragmentSettingBinding import com.dongguk.telpigeon.core.ui.base.BindingFragment import com.dongguk.telpigeon.core.ui.util.view.UiState import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @AndroidEntryPoint @@ -32,6 +34,8 @@ class SettingFragment : BindingFragment({ FragmentSettin initAdapter() initLayout() collectGetRoomInfoState() + collectGetRoomKeywordsState() + collectGetRoomKeywordExtraState() setBtnSettingKeywordModifyClickListener() setBtnSettingWorrySettingClickListener() } @@ -49,13 +53,6 @@ class SettingFragment : BindingFragment({ FragmentSettin etSettingRoomInfoCode.editText.isEnabled = false etSettingRoomInfoName.editText.isEnabled = false etSettingKeyWordCurrent.editText.isEnabled = false - - // TODO 서버통신 구현 후 collectData 함수로 해당 로직 이동 - etSettingKeyWordCurrent.editText.setText(settingViewModel.dummyRoomKeywordModel.keywords) - - tvSettingKeyWordExtraGenderContent.text = settingViewModel.dummyRoomKeywordExtraModel.gender - tvSettingKeyWordAgeGroupContent.text = settingViewModel.dummyRoomKeywordExtraModel.ageRange - tvSettingKeyWordRelationshipContent.text = settingViewModel.dummyRoomKeywordExtraModel.relation } } @@ -72,7 +69,37 @@ class SettingFragment : BindingFragment({ FragmentSettin else -> Unit } - } + }.launchIn(viewLifecycleOwner.lifecycleScope) + } + + private fun collectGetRoomKeywordsState() { + settingViewModel.getRoomKeywordsState.flowWithLifecycle(viewLifecycleOwner.lifecycle).onEach { getRoomKeywordsState -> + when (getRoomKeywordsState) { + is UiState.Success -> { + with(getRoomKeywordsState.data) { + binding.etSettingKeyWordCurrent.editText.setText(keywords) + } + } + + else -> Unit + } + }.launchIn(viewLifecycleOwner.lifecycleScope) + } + + private fun collectGetRoomKeywordExtraState() { + settingViewModel.getRoomKeywordExtraState.flowWithLifecycle(viewLifecycleOwner.lifecycle).onEach { getRoomKeywordExtraState -> + when (getRoomKeywordExtraState) { + is UiState.Success -> { + with(getRoomKeywordExtraState.data) { + binding.tvSettingKeyWordExtraGenderContent.text = gender + binding.tvSettingKeyWordAgeGroupContent.text = ageRange + binding.tvSettingKeyWordRelationshipContent.text = relation + } + } + + else -> Unit + } + }.launchIn(viewLifecycleOwner.lifecycleScope) } private fun setBtnSettingRoomInfoCopyClickListener(code: String) { diff --git a/feature/src/main/java/com/dongguk/telepigeon/feature/setting/setting/SettingViewModel.kt b/feature/src/main/java/com/dongguk/telepigeon/feature/setting/setting/SettingViewModel.kt index e7a2036..2138f39 100644 --- a/feature/src/main/java/com/dongguk/telepigeon/feature/setting/setting/SettingViewModel.kt +++ b/feature/src/main/java/com/dongguk/telepigeon/feature/setting/setting/SettingViewModel.kt @@ -2,12 +2,14 @@ package com.dongguk.telepigeon.feature.setting.setting import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.dongguk.telepigeon.domain.model.RoomExtraModel import com.dongguk.telepigeon.domain.model.RoomInfoModel -import com.dongguk.telepigeon.domain.model.RoomKeywordExtraModel -import com.dongguk.telepigeon.domain.model.RoomKeywordModel +import com.dongguk.telepigeon.domain.model.RoomKeywordsModel import com.dongguk.telepigeon.domain.model.RoomWorryModel +import com.dongguk.telepigeon.domain.usecase.GetRoomExtraUseCase import com.dongguk.telepigeon.domain.usecase.GetRoomIdUseCase import com.dongguk.telepigeon.domain.usecase.GetRoomInfoUseCase +import com.dongguk.telepigeon.domain.usecase.GetRoomKeywordsUseCase import com.dongguk.telpigeon.core.ui.util.view.UiState import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow @@ -21,14 +23,24 @@ class SettingViewModel constructor( private val getRoomIdUseCase: GetRoomIdUseCase, private val getRoomInfoUseCase: GetRoomInfoUseCase, + private val getRoomKeywordsUseCase: GetRoomKeywordsUseCase, + private val getRoomExtraUseCase: GetRoomExtraUseCase, ) : ViewModel() { private val _getRoomInfoState = MutableStateFlow>(UiState.Empty) val getRoomInfoState get() = _getRoomInfoState.asStateFlow() + private val _getRoomKeywordsState = MutableStateFlow>(UiState.Empty) + val getRoomKeywordsState get() = _getRoomKeywordsState.asStateFlow() + + private val _getRoomKeywordExtraState = MutableStateFlow>(UiState.Empty) + val getRoomKeywordExtraState get() = _getRoomKeywordExtraState.asStateFlow() + + private val roomId = getRoomIdUseCase() + fun getRoomInfo() { viewModelScope.launch { _getRoomInfoState.value = UiState.Loading - getRoomInfoUseCase(roomId = getRoomIdUseCase()).onSuccess { roomInfoModel -> + getRoomInfoUseCase(roomId = roomId).onSuccess { roomInfoModel -> _getRoomInfoState.value = UiState.Success(roomInfoModel) }.onFailure { exception: Throwable -> _getRoomInfoState.value = UiState.Error(exception.message) @@ -36,17 +48,27 @@ class SettingViewModel } } - val dummyRoomKeywordModel = - RoomKeywordModel( - keywords = "운동, 영양제, 밥", - ) + fun getRoomKeywords() { + viewModelScope.launch { + _getRoomKeywordsState.value = UiState.Loading + getRoomKeywordsUseCase(roomId = roomId).onSuccess { roomKeywordsModel -> + _getRoomKeywordsState.value = UiState.Success(roomKeywordsModel) + }.onFailure { exception: Throwable -> + _getRoomKeywordsState.value = UiState.Error(exception.message) + } + } + } - val dummyRoomKeywordExtraModel = - RoomKeywordExtraModel( - gender = "남성", - ageRange = "20대", - relation = "자식", - ) + fun getRoomKeywordExtra() { + viewModelScope.launch { + _getRoomKeywordExtraState.value = UiState.Loading + getRoomExtraUseCase(roomId = roomId).onSuccess { roomExtraModel -> + _getRoomKeywordExtraState.value = UiState.Success(roomExtraModel) + }.onFailure { exception: Throwable -> + _getRoomKeywordExtraState.value = UiState.Error(exception.message) + } + } + } val dummyRoomWorryModel = listOf(