Skip to content

Commit

Permalink
✨Feat: 카테고리 생성/수정/삭제 API v2 변경사항 대응
Browse files Browse the repository at this point in the history
Related to: #346
  • Loading branch information
nahy-512 committed Feb 9, 2025
1 parent 1d6004c commit 100805c
Show file tree
Hide file tree
Showing 8 changed files with 92 additions and 92 deletions.
Original file line number Diff line number Diff line change
@@ -1,23 +1,20 @@
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

class RemoteCategoryDataSource @Inject constructor(
private val apiService: CategoryApiService
) {
suspend fun getCategories(): List<GetCategoryResult> {
suspend fun getCategories(): List<CategoryDTO> {
var categoryResponse = GetCategoryResponse(result = emptyList())
withContext(Dispatchers.IO) {
runCatching {
Expand All @@ -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("")
Expand All @@ -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
Expand Down
44 changes: 10 additions & 34 deletions app/src/main/java/com/mongmong/namo/data/dto/CategoryDTO.kt
Original file line number Diff line number Diff line change
@@ -1,56 +1,32 @@
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
) : BaseResponse()

/** 모든 카테고리 조회 */
class GetCategoryResponse (
val result: List<GetCategoryResult>
val result: List<CategoryDTO>
) : 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,
)
}
}
val isShared: Boolean
)
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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}")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -15,7 +17,7 @@ class CategoryRepositoryImpl @Inject constructor(

override suspend fun getCategories(): List<CategoryModel> {
return remoteCategoryDataSource.getCategories().map {
it.convertToCategory()
it.toModel()
}
}

Expand All @@ -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
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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
)
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.mongmong.namo.domain.model

import com.mongmong.namo.data.dto.CategoryRequestBody
import java.io.Serializable

data class CategoryModel(
Expand All @@ -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(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<FragmentCategoryDetailBinding>(R.layout.fragment_category_detail) {
: BaseFragment<FragmentCategoryDetailBinding>(R.layout.fragment_category_detail), ConfirmDialog.ConfirmDialogInterface {

private lateinit var paletteAdapter: CategoryPaletteRVAdapter

Expand All @@ -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)
Expand All @@ -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 {
Expand All @@ -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 -> {}
}
}
Expand All @@ -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)
// 어댑터 연결
Expand Down Expand Up @@ -129,4 +134,9 @@ class CategoryDetailFragment
}
}
}

override fun onClickYesButton(id: Int) {
// 삭제 진행
viewModel.deleteCategory()
}
}
4 changes: 2 additions & 2 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -193,8 +193,8 @@
<string name="category_detail_share">공개 설정</string>
<string name="category_detail_share_guide">카테고리 일정이 친구에게 공개되지 않습니다.</string>
<string name="category_detail_setting">카테고리 설정</string>
<string name="group_place">장소</string>
<string name="group_money">금액 정산</string>
<string name="dialog_category_delete_title">카테고리를 삭제하시겠어요?</string>
<string name="dialog_category_delete_content">삭제하더라도 카테고리에\n포함된 일정은 삭제되지 않습니다.</string>

<!-- event 관련 String -->
<string name="more_view">더보기</string>
Expand Down

0 comments on commit 100805c

Please sign in to comment.