diff --git a/core/model/src/main/java/com/moneymong/moneymong/model/agency/CategoryDeleteRequest.kt b/core/model/src/main/java/com/moneymong/moneymong/model/agency/CategoryDeleteRequest.kt new file mode 100644 index 00000000..85bf4897 --- /dev/null +++ b/core/model/src/main/java/com/moneymong/moneymong/model/agency/CategoryDeleteRequest.kt @@ -0,0 +1,5 @@ +package com.moneymong.moneymong.model.agency + +data class CategoryDeleteRequest( + val categoryId: Long, +) diff --git a/core/model/src/main/java/com/moneymong/moneymong/model/agency/CategoryReadResponse.kt b/core/model/src/main/java/com/moneymong/moneymong/model/agency/CategoryReadResponse.kt index 1625d09b..50a4a317 100644 --- a/core/model/src/main/java/com/moneymong/moneymong/model/agency/CategoryReadResponse.kt +++ b/core/model/src/main/java/com/moneymong/moneymong/model/agency/CategoryReadResponse.kt @@ -6,5 +6,6 @@ data class CategoryReadResponse( ) data class CategoryResponse( + val id: Long, val name: String, ) diff --git a/core/network/src/main/java/com/moneymong/moneymong/network/api/AgencyApi.kt b/core/network/src/main/java/com/moneymong/moneymong/network/api/AgencyApi.kt index f46e9446..4c4dd5a9 100644 --- a/core/network/src/main/java/com/moneymong/moneymong/network/api/AgencyApi.kt +++ b/core/network/src/main/java/com/moneymong/moneymong/network/api/AgencyApi.kt @@ -7,6 +7,7 @@ import com.moneymong.moneymong.model.agency.AgencyJoinResponse import com.moneymong.moneymong.model.agency.AgencyRegisterRequest import com.moneymong.moneymong.model.agency.CategoryCreateRequest import com.moneymong.moneymong.model.agency.CategoryCreateResponse +import com.moneymong.moneymong.model.agency.CategoryDeleteRequest import com.moneymong.moneymong.model.agency.CategoryReadResponse import com.moneymong.moneymong.model.agency.MyAgencyResponse import com.moneymong.moneymong.model.agency.RegisterAgencyResponse @@ -14,6 +15,7 @@ import com.moneymong.moneymong.model.member.InvitationCodeResponse import retrofit2.http.Body import retrofit2.http.DELETE import retrofit2.http.GET +import retrofit2.http.HTTP import retrofit2.http.PATCH import retrofit2.http.POST import retrofit2.http.Path @@ -73,4 +75,9 @@ interface AgencyApi { suspend fun deleteAgency( @Path("agencyId") agencyId: Int ): Result + + @HTTP(method = "DELETE", path = "api/v1/agencies/categories", hasBody = true) + suspend fun deleteCategory( + @Body request: CategoryDeleteRequest + ): Result } \ No newline at end of file diff --git a/data/src/main/java/com/moneymong/moneymong/data/datasource/agency/AgencyRemoteDataSource.kt b/data/src/main/java/com/moneymong/moneymong/data/datasource/agency/AgencyRemoteDataSource.kt index b437c7d6..a7e602fb 100644 --- a/data/src/main/java/com/moneymong/moneymong/data/datasource/agency/AgencyRemoteDataSource.kt +++ b/data/src/main/java/com/moneymong/moneymong/data/datasource/agency/AgencyRemoteDataSource.kt @@ -7,6 +7,7 @@ import com.moneymong.moneymong.model.agency.AgencyJoinResponse import com.moneymong.moneymong.model.agency.AgencyRegisterRequest import com.moneymong.moneymong.model.agency.CategoryCreateRequest import com.moneymong.moneymong.model.agency.CategoryCreateResponse +import com.moneymong.moneymong.model.agency.CategoryDeleteRequest import com.moneymong.moneymong.model.agency.CategoryReadResponse import com.moneymong.moneymong.model.agency.MyAgencyResponse import com.moneymong.moneymong.model.agency.RegisterAgencyResponse @@ -19,4 +20,5 @@ interface AgencyRemoteDataSource { suspend fun agencyCodeNumbers(data: AgencyJoinRequest): Result suspend fun createCategory(request: CategoryCreateRequest): Result suspend fun fetchCategories(agencyId: Long): Result + suspend fun deleteCategory(request: CategoryDeleteRequest): Result } \ No newline at end of file diff --git a/data/src/main/java/com/moneymong/moneymong/data/datasource/agency/AgencyRemoteDataSourceImpl.kt b/data/src/main/java/com/moneymong/moneymong/data/datasource/agency/AgencyRemoteDataSourceImpl.kt index fc2e9e8c..77e88ced 100644 --- a/data/src/main/java/com/moneymong/moneymong/data/datasource/agency/AgencyRemoteDataSourceImpl.kt +++ b/data/src/main/java/com/moneymong/moneymong/data/datasource/agency/AgencyRemoteDataSourceImpl.kt @@ -7,6 +7,7 @@ import com.moneymong.moneymong.model.agency.AgencyJoinResponse import com.moneymong.moneymong.model.agency.AgencyRegisterRequest import com.moneymong.moneymong.model.agency.CategoryCreateRequest import com.moneymong.moneymong.model.agency.CategoryCreateResponse +import com.moneymong.moneymong.model.agency.CategoryDeleteRequest import com.moneymong.moneymong.model.agency.CategoryReadResponse import com.moneymong.moneymong.model.agency.MyAgencyResponse import com.moneymong.moneymong.model.agency.RegisterAgencyResponse @@ -46,4 +47,8 @@ class AgencyRemoteDataSourceImpl @Inject constructor( override suspend fun fetchCategories(agencyId: Long): Result { return agencyApi.fetchCategories(agencyId = agencyId) } + + override suspend fun deleteCategory(request: CategoryDeleteRequest): Result { + return agencyApi.deleteCategory(request = request) + } } \ No newline at end of file diff --git a/data/src/main/java/com/moneymong/moneymong/data/datasource/agency/AgencyRemoteDataSourceMock.kt b/data/src/main/java/com/moneymong/moneymong/data/datasource/agency/AgencyRemoteDataSourceMock.kt index b1ebc95b..bd1a6963 100644 --- a/data/src/main/java/com/moneymong/moneymong/data/datasource/agency/AgencyRemoteDataSourceMock.kt +++ b/data/src/main/java/com/moneymong/moneymong/data/datasource/agency/AgencyRemoteDataSourceMock.kt @@ -7,6 +7,7 @@ import com.moneymong.moneymong.model.agency.AgencyJoinResponse import com.moneymong.moneymong.model.agency.AgencyRegisterRequest import com.moneymong.moneymong.model.agency.CategoryCreateRequest import com.moneymong.moneymong.model.agency.CategoryCreateResponse +import com.moneymong.moneymong.model.agency.CategoryDeleteRequest import com.moneymong.moneymong.model.agency.CategoryReadResponse import com.moneymong.moneymong.model.agency.MyAgencyResponse import com.moneymong.moneymong.model.agency.RegisterAgencyResponse @@ -47,6 +48,10 @@ class AgencyRemoteDataSourceMock : AgencyRemoteDataSource { return Result.success(CategoryReadResponse(agencyId = agencyId, categories = emptyList())) } + override suspend fun deleteCategory(request: CategoryDeleteRequest): Result { + return Result.success(Unit) + } + private companion object { val agenciesMockOfSuccess = listOf( Result.success( diff --git a/data/src/main/java/com/moneymong/moneymong/data/repository/agency/AgencyRepositoryImpl.kt b/data/src/main/java/com/moneymong/moneymong/data/repository/agency/AgencyRepositoryImpl.kt index ffb7591d..bbbef68a 100644 --- a/data/src/main/java/com/moneymong/moneymong/data/repository/agency/AgencyRepositoryImpl.kt +++ b/data/src/main/java/com/moneymong/moneymong/data/repository/agency/AgencyRepositoryImpl.kt @@ -13,6 +13,7 @@ import com.moneymong.moneymong.model.agency.AgencyJoinResponse import com.moneymong.moneymong.model.agency.AgencyRegisterRequest import com.moneymong.moneymong.model.agency.CategoryCreateRequest import com.moneymong.moneymong.model.agency.CategoryCreateResponse +import com.moneymong.moneymong.model.agency.CategoryDeleteRequest import com.moneymong.moneymong.model.agency.CategoryReadResponse import com.moneymong.moneymong.model.agency.MyAgencyResponse import com.moneymong.moneymong.model.agency.RegisterAgencyResponse @@ -58,4 +59,7 @@ class AgencyRepositoryImpl @Inject constructor( override suspend fun fetchCategories(agencyId: Long): Result = agencyRemoteDataSource.fetchCategories(agencyId = agencyId) + + override suspend fun deleteCategory(request: CategoryDeleteRequest): Result = + agencyRemoteDataSource.deleteCategory(request = request) } \ No newline at end of file diff --git a/domain/src/main/java/com/moneymong/moneymong/domain/repository/agency/AgencyRepository.kt b/domain/src/main/java/com/moneymong/moneymong/domain/repository/agency/AgencyRepository.kt index 79a75d63..6932cc01 100644 --- a/domain/src/main/java/com/moneymong/moneymong/domain/repository/agency/AgencyRepository.kt +++ b/domain/src/main/java/com/moneymong/moneymong/domain/repository/agency/AgencyRepository.kt @@ -7,6 +7,7 @@ import com.moneymong.moneymong.model.agency.AgencyJoinResponse import com.moneymong.moneymong.model.agency.AgencyRegisterRequest import com.moneymong.moneymong.model.agency.CategoryCreateRequest import com.moneymong.moneymong.model.agency.CategoryCreateResponse +import com.moneymong.moneymong.model.agency.CategoryDeleteRequest import com.moneymong.moneymong.model.agency.CategoryReadResponse import com.moneymong.moneymong.model.agency.MyAgencyResponse import com.moneymong.moneymong.model.agency.RegisterAgencyResponse @@ -18,9 +19,9 @@ interface AgencyRepository { suspend fun fetchMyAgencyList(): Result> suspend fun fetchAgencyByName(agencyName: String): Result> suspend fun agencyCodeNumbers(data: AgencyJoinRequest): Result - suspend fun saveAgencyId(agencyId: Int) suspend fun fetchAgencyId(): Int suspend fun createCategory(request: CategoryCreateRequest): Result suspend fun fetchCategories(agencyId: Long): Result + suspend fun deleteCategory(request: CategoryDeleteRequest): Result } \ No newline at end of file diff --git a/domain/src/main/java/com/moneymong/moneymong/domain/usecase/agency/DeleteCategoryUseCase.kt b/domain/src/main/java/com/moneymong/moneymong/domain/usecase/agency/DeleteCategoryUseCase.kt new file mode 100644 index 00000000..40594360 --- /dev/null +++ b/domain/src/main/java/com/moneymong/moneymong/domain/usecase/agency/DeleteCategoryUseCase.kt @@ -0,0 +1,12 @@ +package com.moneymong.moneymong.domain.usecase.agency + +import com.moneymong.moneymong.domain.repository.agency.AgencyRepository +import com.moneymong.moneymong.model.agency.CategoryDeleteRequest +import javax.inject.Inject + +class DeleteCategoryUseCase @Inject constructor( + private val agencyRepository: AgencyRepository, +){ + suspend operator fun invoke(request: CategoryDeleteRequest): Result = + agencyRepository.deleteCategory(request = request) +} \ No newline at end of file diff --git a/feature/ledgermanual/src/main/java/com/moneymong/moneymong/ledgermanual/LedgerManualScreen.kt b/feature/ledgermanual/src/main/java/com/moneymong/moneymong/ledgermanual/LedgerManualScreen.kt index f18169da..2cd743ff 100644 --- a/feature/ledgermanual/src/main/java/com/moneymong/moneymong/ledgermanual/LedgerManualScreen.kt +++ b/feature/ledgermanual/src/main/java/com/moneymong/moneymong/ledgermanual/LedgerManualScreen.kt @@ -198,6 +198,7 @@ fun LedgerManualScreen( }, onChangeCategoryValue = viewModel::onChangeCategoryValue, onCategoryCreate = viewModel::createCategory, + onCategoryDelete = viewModel::deleteCategory, ) } diff --git a/feature/ledgermanual/src/main/java/com/moneymong/moneymong/ledgermanual/LedgerManualViewModel.kt b/feature/ledgermanual/src/main/java/com/moneymong/moneymong/ledgermanual/LedgerManualViewModel.kt index 99b91eff..2405eebc 100644 --- a/feature/ledgermanual/src/main/java/com/moneymong/moneymong/ledgermanual/LedgerManualViewModel.kt +++ b/feature/ledgermanual/src/main/java/com/moneymong/moneymong/ledgermanual/LedgerManualViewModel.kt @@ -5,6 +5,7 @@ import com.moneymong.moneymong.android.BaseViewModel import com.moneymong.moneymong.android.util.toMultipart import com.moneymong.moneymong.common.error.MoneyMongError import com.moneymong.moneymong.domain.usecase.agency.CreateCategoryUseCase +import com.moneymong.moneymong.domain.usecase.agency.DeleteCategoryUseCase import com.moneymong.moneymong.ui.isValidPaymentDate import com.moneymong.moneymong.ui.isValidPaymentTime import com.moneymong.moneymong.ui.validateValue @@ -14,6 +15,7 @@ import com.moneymong.moneymong.domain.usecase.ledger.PostLedgerTransactionUseCas import com.moneymong.moneymong.domain.usecase.ocr.PostFileUploadUseCase import com.moneymong.moneymong.domain.usecase.user.FetchUserNicknameUseCase import com.moneymong.moneymong.model.agency.CategoryCreateRequest +import com.moneymong.moneymong.model.agency.CategoryDeleteRequest import com.moneymong.moneymong.model.agency.CategoryResponse import com.moneymong.moneymong.model.ledger.FundType import com.moneymong.moneymong.model.ledger.LedgerTransactionRequest @@ -35,6 +37,7 @@ class LedgerManualViewModel @Inject constructor( private val fetchUserNicknameUseCase: FetchUserNicknameUseCase, private val createCategoryUseCase: CreateCategoryUseCase, private val fetchCategoriesUseCase: FetchCategoriesUseCase, + private val deleteCategoryUseCase: DeleteCategoryUseCase, ) : BaseViewModel(LedgerManualState()) { init { @@ -131,6 +134,21 @@ class LedgerManualViewModel @Inject constructor( } } + fun deleteCategory(category: CategoryResponse) = intent { + val request = CategoryDeleteRequest(categoryId = category.id) + + deleteCategoryUseCase(request = request) + .onSuccess { fetchCategories() } + .onFailure { + reduce { + state.copy( + showBottomSheet = true, + errorMessage = it.message ?: MoneyMongError.UnExpectedError.message + ) + } + } + } + fun onChangeStoreNameValue(value: TextFieldValue) = blockingIntent { val validate = value.text.validateValue(length = 20) if (!validate) { diff --git a/feature/ledgermanual/src/main/java/com/moneymong/moneymong/ledgermanual/view/LedgerManualCategoryBottomSheet.kt b/feature/ledgermanual/src/main/java/com/moneymong/moneymong/ledgermanual/view/LedgerManualCategoryBottomSheet.kt index 9364348c..83c9742f 100644 --- a/feature/ledgermanual/src/main/java/com/moneymong/moneymong/ledgermanual/view/LedgerManualCategoryBottomSheet.kt +++ b/feature/ledgermanual/src/main/java/com/moneymong/moneymong/ledgermanual/view/LedgerManualCategoryBottomSheet.kt @@ -71,6 +71,7 @@ fun LedgerManualCategoryBottomSheet( onDismissRequest: () -> Unit, onChangeCategoryValue: (TextFieldValue) -> Unit, onCategoryCreate: () -> Unit, + onCategoryDelete: (CategoryResponse) -> Unit, ) { var sheetType by remember { mutableStateOf(LedgerManualBottomSheetType.LIST) } @@ -100,7 +101,8 @@ fun LedgerManualCategoryBottomSheet( LedgerManualCategoryBottomSheetContent( categories = categories, onDismissRequest = onDismissRequest, - onClickCreate = { sheetType = LedgerManualBottomSheetType.CREATE } + onClickCreate = { sheetType = LedgerManualBottomSheetType.CREATE }, + onClickDelete = onCategoryDelete, ) } @@ -129,6 +131,7 @@ fun LedgerManualCategoryBottomSheetContent( categories: List?, onDismissRequest: () -> Unit, onClickCreate: () -> Unit, + onClickDelete: (CategoryResponse) -> Unit, ) { val scrollState = rememberScrollState() Column( @@ -179,6 +182,7 @@ fun LedgerManualCategoryBottomSheetContent( MDSOutlineTag( text = it.name, iconResource = R.drawable.ic_close_default, + onClick = { onClickDelete(it) } ) } } @@ -286,11 +290,13 @@ fun LedgerManualCategoryCreateBottomSheetContent( @Preview(showBackground = true) @Composable fun LedgerManualCategoryBottomSheetContentPreview() { - val categories = listOf(CategoryResponse("testTooLongTextOverFlow"), CategoryResponse("test")) + val categories = + listOf(CategoryResponse(1L, "testTooLongTextOverFlow"), CategoryResponse(1L, "test")) LedgerManualCategoryBottomSheetContent( categories = categories, onDismissRequest = {}, + onClickCreate = {}, ) {} }