diff --git a/app/src/main/java/com/mongmong/namo/data/datasource/category/RemoteCategoryDataSource.kt b/app/src/main/java/com/mongmong/namo/data/datasource/category/RemoteCategoryDataSource.kt index bffe549d..32f0abba 100644 --- a/app/src/main/java/com/mongmong/namo/data/datasource/category/RemoteCategoryDataSource.kt +++ b/app/src/main/java/com/mongmong/namo/data/datasource/category/RemoteCategoryDataSource.kt @@ -1,15 +1,12 @@ package com.mongmong.namo.data.datasource.category import android.util.Log -import com.mongmong.namo.data.remote.CategoryApiService +import com.mongmong.namo.data.dto.CategoryBaseResponse +import com.mongmong.namo.data.dto.CategoryDTO import com.mongmong.namo.data.dto.CategoryRequestBody import com.mongmong.namo.data.dto.DeleteCategoryResponse -import com.mongmong.namo.data.dto.EditCategoryResponse -import com.mongmong.namo.data.dto.EditCategoryResult import com.mongmong.namo.data.dto.GetCategoryResponse -import com.mongmong.namo.data.dto.GetCategoryResult -import com.mongmong.namo.data.dto.PostCategoryResponse -import com.mongmong.namo.data.dto.PostCategoryResult +import com.mongmong.namo.data.remote.CategoryApiService import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import javax.inject.Inject @@ -17,7 +14,7 @@ import javax.inject.Inject class RemoteCategoryDataSource @Inject constructor( private val apiService: CategoryApiService ) { - suspend fun getCategories(): List { + suspend fun getCategories(): List { var categoryResponse = GetCategoryResponse(result = emptyList()) withContext(Dispatchers.IO) { runCatching { @@ -32,44 +29,44 @@ class RemoteCategoryDataSource @Inject constructor( return categoryResponse.result } - suspend fun addCategoryToServer( + suspend fun addCategory( category: CategoryRequestBody, - ): PostCategoryResponse { - var categoryResponse = PostCategoryResponse(result = PostCategoryResult(-1)) + ): CategoryBaseResponse { + var categoryResponse = CategoryBaseResponse(result = "") withContext(Dispatchers.IO) { runCatching { apiService.postCategory(category) }.onSuccess { - Log.d("RemoteCategoryDataSource", "addCategoryToServer Success $it") + Log.d("RemoteCategoryDataSource", "addCategory Success $it") categoryResponse = it }.onFailure { - Log.d("RemoteCategoryDataSource", "addCategoryToServer Failure") + Log.d("RemoteCategoryDataSource", "addCategory Failure $it") } } return categoryResponse } - suspend fun editCategoryToServer( + suspend fun editCategory( categoryId: Long, category: CategoryRequestBody - ) : EditCategoryResponse { - var categoryResponse = EditCategoryResponse(result = EditCategoryResult(categoryId)) + ) : CategoryBaseResponse { + var categoryResponse = CategoryBaseResponse(result = "") withContext(Dispatchers.IO) { runCatching { apiService.patchCategory(categoryId, category) }.onSuccess { - Log.d("RemoteCategoryDataSource", "editCategoryToServer Success $it") + Log.d("RemoteCategoryDataSource", "editCategory Success $it") categoryResponse = it }.onFailure { - Log.d("RemoteCategoryDataSource", "editCategoryToServer Failure") + Log.d("RemoteCategoryDataSource", "editCategory Failure $it") } } return categoryResponse } - suspend fun deleteCategoryToServer( + suspend fun deleteCategory( categoryId: Long ) : DeleteCategoryResponse { var categoryResponse = DeleteCategoryResponse("") @@ -78,10 +75,10 @@ class RemoteCategoryDataSource @Inject constructor( runCatching { apiService.deleteCategory(categoryId) }.onSuccess { - Log.d("RemoteCategoryDataSource", "deleteCategoryToServer Success, $it") + Log.d("RemoteCategoryDataSource", "deleteCategory Success, $it") categoryResponse = it }.onFailure { - Log.d("RemoteCategoryDataSource", "deleteCategoryToServer Fail") + Log.d("RemoteCategoryDataSource", "deleteCategory Fail $it") } } return categoryResponse diff --git a/app/src/main/java/com/mongmong/namo/data/dto/CategoryDTO.kt b/app/src/main/java/com/mongmong/namo/data/dto/CategoryDTO.kt index d8ba183b..c2b7b0c7 100644 --- a/app/src/main/java/com/mongmong/namo/data/dto/CategoryDTO.kt +++ b/app/src/main/java/com/mongmong/namo/data/dto/CategoryDTO.kt @@ -1,33 +1,18 @@ package com.mongmong.namo.data.dto -import com.mongmong.namo.domain.model.BaseResponse import com.google.gson.annotations.SerializedName -import com.mongmong.namo.domain.model.CategoryModel - -/** 카테고리 생성 */ -class PostCategoryResponse ( - val result: PostCategoryResult -) : BaseResponse() - -class PostCategoryResult ( - @SerializedName("id") val categoryId: Long = 0 -) +import com.mongmong.namo.domain.model.BaseResponse data class CategoryRequestBody( - val name : String, - val paletteId: Int, - val isShare: Boolean = true + val categoryName : String, + val colorId: Int, + val isShared: Boolean = true ) -/** 카테고리 수정 */ -class EditCategoryResponse ( - val result: EditCategoryResult +data class CategoryBaseResponse( + val result: String ) : BaseResponse() -class EditCategoryResult ( - @SerializedName("id") val categoryId: Long = 0 -) - /** 카테고리 삭제 */ data class DeleteCategoryResponse ( @SerializedName("result") val result : String @@ -35,22 +20,13 @@ data class DeleteCategoryResponse ( /** 모든 카테고리 조회 */ class GetCategoryResponse ( - val result: List + val result: List ) : BaseResponse() -class GetCategoryResult ( +class CategoryDTO ( val categoryId: Long, val categoryName: String, val colorId: Int, val baseCategory: Boolean, - val shared: Boolean -) { - fun convertToCategory(): CategoryModel { - return CategoryModel( - categoryId = this.categoryId, - name = this.categoryName, - colorId = this.colorId, - isShare = this.shared, - ) - } -} \ No newline at end of file + val isShared: Boolean +) \ No newline at end of file diff --git a/app/src/main/java/com/mongmong/namo/data/remote/CategoryApiService.kt b/app/src/main/java/com/mongmong/namo/data/remote/CategoryApiService.kt index 49cd40a6..a1ad264c 100644 --- a/app/src/main/java/com/mongmong/namo/data/remote/CategoryApiService.kt +++ b/app/src/main/java/com/mongmong/namo/data/remote/CategoryApiService.kt @@ -1,10 +1,9 @@ package com.mongmong.namo.data.remote +import com.mongmong.namo.data.dto.CategoryBaseResponse import com.mongmong.namo.data.dto.CategoryRequestBody import com.mongmong.namo.data.dto.DeleteCategoryResponse -import com.mongmong.namo.data.dto.EditCategoryResponse import com.mongmong.namo.data.dto.GetCategoryResponse -import com.mongmong.namo.data.dto.PostCategoryResponse import retrofit2.http.Body import retrofit2.http.DELETE import retrofit2.http.GET @@ -21,14 +20,14 @@ interface CategoryApiService { @POST("categories") suspend fun postCategory( @Body body: CategoryRequestBody - ) : PostCategoryResponse + ) : CategoryBaseResponse // 카테고리 수정 @PATCH("categories/{categoryId}") suspend fun patchCategory( @Path("categoryId") categoryId: Long, @Body body: CategoryRequestBody - ) : EditCategoryResponse + ) : CategoryBaseResponse // 카테고리 삭제 @DELETE("categories/{categoryId}") diff --git a/app/src/main/java/com/mongmong/namo/data/repositoriyImpl/CategoryRepositoryImpl.kt b/app/src/main/java/com/mongmong/namo/data/repositoriyImpl/CategoryRepositoryImpl.kt index 60d402c6..e4161930 100644 --- a/app/src/main/java/com/mongmong/namo/data/repositoriyImpl/CategoryRepositoryImpl.kt +++ b/app/src/main/java/com/mongmong/namo/data/repositoriyImpl/CategoryRepositoryImpl.kt @@ -4,6 +4,8 @@ import android.util.Log import com.mongmong.namo.data.datasource.category.RemoteCategoryDataSource import com.mongmong.namo.domain.model.CategoryModel import com.mongmong.namo.data.remote.NetworkChecker +import com.mongmong.namo.data.utils.mappers.CategoryMapper.toDTO +import com.mongmong.namo.data.utils.mappers.CategoryMapper.toModel import com.mongmong.namo.domain.repositories.CategoryRepository import com.mongmong.namo.presentation.config.Constants.SUCCESS_CODE import javax.inject.Inject @@ -15,7 +17,7 @@ class CategoryRepositoryImpl @Inject constructor( override suspend fun getCategories(): List { return remoteCategoryDataSource.getCategories().map { - it.convertToCategory() + it.toModel() } } @@ -28,20 +30,20 @@ class CategoryRepositoryImpl @Inject constructor( override suspend fun addCategory(category: CategoryModel): Boolean { Log.d("CategoryRepositoryImpl", "addCategory categoryId: ${category.categoryId}\n$category") - return remoteCategoryDataSource.addCategoryToServer(category.convertLocalCategoryToServer()).code == SUCCESS_CODE + return remoteCategoryDataSource.addCategory(category.toDTO()).code == SUCCESS_CODE } override suspend fun editCategory(category: CategoryModel): Boolean { Log.d("CategoryRepositoryImpl", "editCategory $category") - return remoteCategoryDataSource.editCategoryToServer( + return remoteCategoryDataSource.editCategory( category.categoryId, - category.convertLocalCategoryToServer() + category.toDTO() ).code == SUCCESS_CODE } override suspend fun deleteCategory(category: CategoryModel): Boolean { Log.d("CategoryRepositoryImpl", "deleteCategory $category") - return remoteCategoryDataSource.deleteCategoryToServer( + return remoteCategoryDataSource.deleteCategory( category.categoryId ).code == SUCCESS_CODE } diff --git a/app/src/main/java/com/mongmong/namo/data/utils/mappers/CategoryMapper.kt b/app/src/main/java/com/mongmong/namo/data/utils/mappers/CategoryMapper.kt new file mode 100644 index 00000000..f3e30b61 --- /dev/null +++ b/app/src/main/java/com/mongmong/namo/data/utils/mappers/CategoryMapper.kt @@ -0,0 +1,24 @@ +package com.mongmong.namo.data.utils.mappers + +import com.mongmong.namo.data.dto.CategoryDTO +import com.mongmong.namo.data.dto.CategoryRequestBody +import com.mongmong.namo.domain.model.CategoryModel + +object CategoryMapper { + fun CategoryModel.toDTO(): CategoryRequestBody { + return CategoryRequestBody( + categoryName = this.name, + colorId = this.colorId, + isShared = this.isShare + ) + } + + fun CategoryDTO.toModel(): CategoryModel { + return CategoryModel( + categoryId = this.categoryId, + name = this.categoryName, + colorId = this.colorId, + isShare = this.isShared + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/mongmong/namo/domain/model/CategoryModel.kt b/app/src/main/java/com/mongmong/namo/domain/model/CategoryModel.kt index b4f11696..bfabd487 100644 --- a/app/src/main/java/com/mongmong/namo/domain/model/CategoryModel.kt +++ b/app/src/main/java/com/mongmong/namo/domain/model/CategoryModel.kt @@ -1,6 +1,5 @@ package com.mongmong.namo.domain.model -import com.mongmong.namo.data.dto.CategoryRequestBody import java.io.Serializable data class CategoryModel( @@ -10,13 +9,6 @@ data class CategoryModel( var basicCategory: Boolean = false, var isShare: Boolean = false, ) : Serializable { - fun convertLocalCategoryToServer() : CategoryRequestBody { - return CategoryRequestBody( - name = this.name, - paletteId = this.colorId, - isShare = this.isShare - ) - } fun convertCategoryToScheduleCategory() : ScheduleCategoryInfo { return ScheduleCategoryInfo( diff --git a/app/src/main/java/com/mongmong/namo/presentation/ui/home/category/CategoryDetailFragment.kt b/app/src/main/java/com/mongmong/namo/presentation/ui/home/category/CategoryDetailFragment.kt index 86bfe43a..a609adc4 100644 --- a/app/src/main/java/com/mongmong/namo/presentation/ui/home/category/CategoryDetailFragment.kt +++ b/app/src/main/java/com/mongmong/namo/presentation/ui/home/category/CategoryDetailFragment.kt @@ -12,12 +12,13 @@ import com.mongmong.namo.domain.model.CategoryModel import com.mongmong.namo.presentation.config.BaseFragment import com.mongmong.namo.presentation.enums.CategoryColor import com.mongmong.namo.presentation.enums.SuccessType +import com.mongmong.namo.presentation.ui.common.ConfirmDialog import com.mongmong.namo.presentation.ui.home.category.adapter.CategoryPaletteRVAdapter import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint class CategoryDetailFragment - : BaseFragment(R.layout.fragment_category_detail) { + : BaseFragment(R.layout.fragment_category_detail), ConfirmDialog.ConfirmDialogInterface { private lateinit var paletteAdapter: CategoryPaletteRVAdapter @@ -28,7 +29,9 @@ class CategoryDetailFragment val args = this.arguments?.let { CategoryDetailFragmentArgs.fromBundle(it).category } + val isEditMode = args != null binding.isEditMode = (args != null) + viewModel.isEditMode = isEditMode if (args != null) { // 카테고리 편집 viewModel.setCategory(args) @@ -53,20 +56,32 @@ class CategoryDetailFragment Toast.makeText(requireContext(), "카테고리를 입력해주세요", Toast.LENGTH_SHORT).show() return@setOnClickListener } - // 수정 모드 -> 카테고리 update + // 수정 모드 -> 카테고리 편집 if (viewModel.isEditMode) { - updateData() - } - // 생성 모드 -> 카테고리 insert - else { - insertData() + viewModel.editCategory() + return@setOnClickListener } + // 생성 모드 -> 카테고리 추가 + viewModel.addCategory() + } + + // 카테고리 삭제 + binding.categoryDeleteBtn.setOnClickListener { + val dialog = ConfirmDialog( + this@CategoryDetailFragment, + getString(R.string.dialog_category_delete_title), + getString(R.string.dialog_category_delete_content), + getString(R.string.delete), + 0 + ) + // 알림창이 띄워져있는 동안 배경 클릭 막기 + dialog.isCancelable = false + activity?.let { dialog.show(it.supportFragmentManager, "ConfirmDialog") } } } private fun initObservers() { viewModel.color.observe(requireActivity()) { color -> - Log.e("CategoryDetailFrag", "initObservers - color: $color") if (color == null) { initPaletteColorRv(null) } else { @@ -81,6 +96,7 @@ class CategoryDetailFragment when(state) { SuccessType.ADD -> Toast.makeText(requireContext(), "카테고리가 생성되었습니다.", Toast.LENGTH_SHORT).show() SuccessType.EDIT -> Toast.makeText(requireContext(), "카테고리가 수정되었습니다.", Toast.LENGTH_SHORT).show() + SuccessType.DELETE -> Toast.makeText(requireContext(), "카테고리가 삭제되었습니다.", Toast.LENGTH_SHORT).show() else -> {} } } @@ -89,17 +105,6 @@ class CategoryDetailFragment } } - /** 카테고리 추가 */ - private fun insertData() { - // 새 카테고리 등록 - viewModel.addCategory() - } - - private fun updateData() { - // 카테고리 편집 - viewModel.editCategory() - } - private fun initPaletteColorRv(initCategory: CategoryColor?) { val selectedItemPosition = CategoryColor.getAllColors().indexOf(initCategory) // 어댑터 연결 @@ -129,4 +134,9 @@ class CategoryDetailFragment } } } + + override fun onClickYesButton(id: Int) { + // 삭제 진행 + viewModel.deleteCategory() + } } \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0ffdd1d1..5305b462 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -192,8 +192,8 @@ 공개 설정 카테고리 일정이 친구에게 공개되지 않습니다. 카테고리 설정 - 장소 - 금액 정산 + 카테고리를 삭제하시겠어요? + 삭제하더라도 카테고리에\n포함된 일정은 삭제되지 않습니다. 더보기