App 개발 일지/Nutri Capture

Nutri Capture 백엔드 - DeleteDayMeal 이벤트 추가

interfacer_han 2024. 11. 28. 17:59

#1 개요

최근 프론트엔드에서는 DayMealView 테이블만을 사용하므로, NutrientViewModelEvent.kt에 정의해두었던 DeleteMeal()이 사용될 일이 없다. 따라서, DeleteDayMeal() 이벤트를 새로 만든다.

 

#2 코드

#2-1 NutrientViewModelEvent.kt

...

sealed class NutrientViewModelEvent {
    ...
    data class DeleteMeal(val meal: Meal) : NutrientViewModelEvent()
    data class DeleteDayMeal(val dayMeal: DayMealView) : NutrientViewModelEvent()
}

본 게시글의 목적과 별개로, NutrientViewModelEvent에 정의했던 DeleteMeal() 이벤트에 쓸 데 없이 Date형 인수가 있었다. 삭제한다.

 

#2-2 NutrientViewModel.kt

...

class NutrientViewModel(private val repository: MainRepository) : ViewModel() {
    ...

    // (4) View로부터 받은 이벤트 처리
    fun onEvent(event: NutrientViewModelEvent) {
        when (event) {
            ...

            is NutrientViewModelEvent.DeleteDayMeal -> {
                viewModelScope.launch {
                    var deletedRowCount = 0
                    deletedRowCount = repository.deleteDayMeal(event.dayMeal)
                    if (deletedRowCount == 1) {
                        _nutrientScreenState.value.dayMeals.removeIf { it.mealId == event.dayMeal.mealId }
                    }
                }
            }
        }
    }
}

...

 

#2-3 MainRepository.kt

...

class MainRepository(private val dao: MainDAO) {
    ...

    suspend fun deleteMeal(meal: Meal): Int {
        val deletedRowCount = dao.deleteMeal(meal)

        if (deletedRowCount == 0) {
            return 0

        } else {
            val mealCount = dao.getMealCountForDay(meal.dayId)
            if (mealCount == 0) {
                dao.deleteDay(meal.dayId)
            }
            return deletedRowCount
        }
    }

    ...

    suspend fun deleteDayMeal(dayMeal: DayMealView): Int {
        val deletedRowCount = dao.deleteMeal(dayMeal.mealId)

        if (deletedRowCount == 0) {
            return 0

        } else {
            val mealCount = dao.getMealCountForDay(dayMeal.dayId)
            if (mealCount == 0) {
                dao.deleteDay(dayMeal.dayId)
            }
            return deletedRowCount
        }
    }
}

기존에 있던 deleteMeal() 함수를 참조해, deleteDayMeal() 함수를 만들었다.

 

#2-4 MainDAO.kt

...

@Dao
interface MainDAO {
    ...

    @Delete
    suspend fun deleteMeal(meal: Meal): Int

    @Query("DELETE FROM meal_table WHERE meal_id = :mealId")
    suspend fun deleteMeal(mealId: Long): Int

    ...
}

mealId를 인수로 받는 deleteMeal() 함수를 추가한다 (메소드 오버로딩). 위에 있는 deleteMeal()은 #2-3 코드 속 deleteMeal()이 사용하고, 아래에 있는 deleteMeal()은 #2-3 코드 속 deleteDayMeal()이 사용한다.

 

#3 요약

NutrientViewModelEvent.DeleteDayMeal 이벤트를 추가했다.

 

#4 완성된 앱

#4-1 이 게시글 시점의 Commit

 

GitHub - Kanmanemone/nutri-capture-new

Contribute to Kanmanemone/nutri-capture-new development by creating an account on GitHub.

github.com

 

#4-2 본 프로젝트의 가장 최신 Commit

 

GitHub - Kanmanemone/nutri-capture-new

Contribute to Kanmanemone/nutri-capture-new development by creating an account on GitHub.

github.com