From dcc852d272b47ec9f7b787cdd2a6faddb13ccb30 Mon Sep 17 00:00:00 2001 From: Jetulio Date: Sun, 2 Nov 2025 15:39:06 -0300 Subject: [PATCH] fix: ajustes no retorno de categorias para melhor interacao com o front --- .../DTO/UserExpenseDivisionDTO.java | 2 +- .../controller/ExpenseController.java | 8 --- .../controller/GroupController.java | 10 +++ .../projection/GroupExpenseProjection.java | 4 ++ .../repository/ExpenseRepository.java | 68 +++++++++++-------- .../finboostplus/service/ExpenseService.java | 5 +- 6 files changed, 58 insertions(+), 39 deletions(-) diff --git a/backend/finboostplus_server/src/main/java/com/finboostplus/DTO/UserExpenseDivisionDTO.java b/backend/finboostplus_server/src/main/java/com/finboostplus/DTO/UserExpenseDivisionDTO.java index 2ef33b9..95978c3 100644 --- a/backend/finboostplus_server/src/main/java/com/finboostplus/DTO/UserExpenseDivisionDTO.java +++ b/backend/finboostplus_server/src/main/java/com/finboostplus/DTO/UserExpenseDivisionDTO.java @@ -8,5 +8,5 @@ import com.finboostplus.projection.UserExpenseDivisionProjection; public record UserExpenseDivisionDTO(Long expenseId, String title, String description, Long groupId, String groupName, - Status status, BigDecimal total, Instant createdAt, List memberList) { + Status status, BigDecimal total, Long categoryId, String categoryName, Instant createdAt, List memberList) { } diff --git a/backend/finboostplus_server/src/main/java/com/finboostplus/controller/ExpenseController.java b/backend/finboostplus_server/src/main/java/com/finboostplus/controller/ExpenseController.java index de09567..2e0ed8b 100644 --- a/backend/finboostplus_server/src/main/java/com/finboostplus/controller/ExpenseController.java +++ b/backend/finboostplus_server/src/main/java/com/finboostplus/controller/ExpenseController.java @@ -1,7 +1,5 @@ package com.finboostplus.controller; -import java.util.List; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -20,7 +18,6 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import com.finboostplus.DTO.CategoryDTO; import com.finboostplus.DTO.ExpenseCreateDTO; import com.finboostplus.DTO.ExpenseUpdateDTO; import com.finboostplus.DTO.UserExpenseDivisionDTO; @@ -50,11 +47,6 @@ public ResponseEntity createNewExpense(@Valid @RequestBody ExpenseCreate : new ResponseEntity("", HttpStatus.BAD_REQUEST); } - @GetMapping("/categories") - public ResponseEntity> getCategory(){ - return ResponseEntity.ok(categoryService.findAllCategories()); - } - @GetMapping("{expenseId}") public ResponseEntity getExpenseDetails(@PathVariable Long groupId, @PathVariable Long expenseId) { diff --git a/backend/finboostplus_server/src/main/java/com/finboostplus/controller/GroupController.java b/backend/finboostplus_server/src/main/java/com/finboostplus/controller/GroupController.java index 04d7d7f..06f44b7 100644 --- a/backend/finboostplus_server/src/main/java/com/finboostplus/controller/GroupController.java +++ b/backend/finboostplus_server/src/main/java/com/finboostplus/controller/GroupController.java @@ -21,6 +21,7 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import com.finboostplus.DTO.CategoryDTO; import com.finboostplus.DTO.GroupCreateDTO; import com.finboostplus.DTO.GroupDetailsDTO; import com.finboostplus.DTO.GroupMemberDTO; @@ -30,6 +31,7 @@ import com.finboostplus.model.Group; import com.finboostplus.projection.GroupProjection; import com.finboostplus.repository.UserRepository; +import com.finboostplus.service.CategoryService; import com.finboostplus.service.ExpenseService; import com.finboostplus.service.GroupMemberService; import com.finboostplus.service.GroupService; @@ -50,12 +52,20 @@ public class GroupController { @Autowired GroupMemberService groupMemberService; + @Autowired + CategoryService categoryService; + @Autowired ExpenseService expenseService; @Autowired UserRepository userRepository; + @GetMapping("/expenses/categories") + public ResponseEntity> getCategory() { + return ResponseEntity.ok(categoryService.findAllCategories()); + } + @GetMapping public ResponseEntity> listUserGroupsPaged( @RequestParam(name = "page", defaultValue = "0") int page, diff --git a/backend/finboostplus_server/src/main/java/com/finboostplus/projection/GroupExpenseProjection.java b/backend/finboostplus_server/src/main/java/com/finboostplus/projection/GroupExpenseProjection.java index 06dba1c..93854da 100644 --- a/backend/finboostplus_server/src/main/java/com/finboostplus/projection/GroupExpenseProjection.java +++ b/backend/finboostplus_server/src/main/java/com/finboostplus/projection/GroupExpenseProjection.java @@ -10,6 +10,10 @@ public interface GroupExpenseProjection { BigDecimal getPartialValue(); + Long getCategoryId(); + + String getCategoryName(); + Long getGroupId(); String getGroupName(); diff --git a/backend/finboostplus_server/src/main/java/com/finboostplus/repository/ExpenseRepository.java b/backend/finboostplus_server/src/main/java/com/finboostplus/repository/ExpenseRepository.java index 8a5fcc0..1ec7ead 100644 --- a/backend/finboostplus_server/src/main/java/com/finboostplus/repository/ExpenseRepository.java +++ b/backend/finboostplus_server/src/main/java/com/finboostplus/repository/ExpenseRepository.java @@ -78,27 +78,30 @@ public interface ExpenseRepository extends JpaRepository { @Query(nativeQuery = true, countQuery = "Select count(*) from user_expense_divisions", value = """ SELECT - E.ID AS EXPENSE_ID, - E.TITLE AS TITLE, - G.ID AS GROUP_ID, - G.NAME AS GROUP_NAME, - UED.PARTIAL_VALUE AS PARTIAL_VALUE, - UED.STATUS AS STATUS, - E.DEADLINE_DATE AS DEADLINE_DATE, - G.ICON + E.ID AS EXPENSE_ID, + E.TITLE AS TITLE, + G.ID AS GROUP_ID, + G.NAME AS GROUP_NAME, + UED.PARTIAL_VALUE AS PARTIAL_VALUE, + C.ID AS CATEGORY_ID, + C.Name AS CATEGORY_NAME, + UED.STATUS AS STATUS, + E.DEADLINE_DATE AS DEADLINE_DATE, + G.ICON FROM - EXPENSES E - INNER JOIN USER_EXPENSE_DIVISIONS UED ON UED.EXPENSE_ID = E.ID - INNER JOIN GROUPS G ON G.ID = E.GROUP_ID + EXPENSES E + INNER JOIN USER_EXPENSE_DIVISIONS UED ON UED.EXPENSE_ID = E.ID + INNER JOIN GROUPS G ON G.ID = E.GROUP_ID + INNER JOIN CATEGORIES C ON C.ID = E.CATEGORY_ID WHERE - G.ID = :groupId - AND UED.USER_ID = :memberId + G.ID = :groupId + AND UED.USER_ID = :memberId ORDER BY CASE - WHEN E.DEADLINE_DATE < NOW() THEN 1 - WHEN DATE(E.DEADLINE_DATE) = DATE(NOW()) THEN 2 - WHEN E.DEADLINE_DATE > NOW() THEN 3 - ELSE 4 + WHEN E.DEADLINE_DATE < NOW() THEN 1 + WHEN DATE(E.DEADLINE_DATE) = DATE(NOW()) THEN 2 + WHEN E.DEADLINE_DATE > NOW() THEN 3 + ELSE 4 END, E.DEADLINE_DATE ASC """) @@ -106,18 +109,21 @@ WHEN E.DEADLINE_DATE > NOW() THEN 3 @Query(nativeQuery = true, countQuery = "Select count(*) from user_expense_divisions", value = """ SELECT - E.ID AS EXPENSE_ID, - E.TITLE AS TITLE, - G.ID AS GROUP_ID, - G.NAME AS GROUP_NAME, - UED.PARTIAL_VALUE AS PARTIAL_VALUE, - UED.STATUS AS STATUS, - E.DEADLINE_DATE AS DEADLINE_DATE, - G.ICON + E.ID AS EXPENSE_ID, + E.TITLE AS TITLE, + G.ID AS GROUP_ID, + G.NAME AS GROUP_NAME, + UED.PARTIAL_VALUE AS PARTIAL_VALUE, + C.ID AS CATEGORY_ID, + C.Name AS CATEGORY_NAME, + UED.STATUS AS STATUS, + E.DEADLINE_DATE AS DEADLINE_DATE, + G.ICON FROM - EXPENSES E - INNER JOIN USER_EXPENSE_DIVISIONS UED ON UED.EXPENSE_ID = E.ID - INNER JOIN GROUPS G ON G.ID = E.GROUP_ID + EXPENSES E + INNER JOIN USER_EXPENSE_DIVISIONS UED ON UED.EXPENSE_ID = E.ID + INNER JOIN GROUPS G ON G.ID = E.GROUP_ID + INNER JOIN CATEGORIES C ON C.ID = E.CATEGORY_ID WHERE G.ID = :groupId AND UED.USER_ID = :memberId @@ -141,6 +147,8 @@ Page getAllGroupExpensesFiltered(Long memberId, Lo G.ID AS GROUP_ID, G.NAME AS GROUP_NAME, COALESCE(UED_USER.PARTIAL_VALUE, 0) AS PARTIAL_VALUE, + C.ID AS CATEGORY_ID, + C.Name AS CATEGORY_NAME, COALESCE(E.VALUE, 0) AS TOTAL, COALESCE(E.VALUE, 0) - COALESCE(UED_PAID.TOTAL_PAID, 0) AS REMAINING_VALUE, E.DEADLINE_DATE AS DEADLINE_DATE, @@ -148,6 +156,7 @@ Page getAllGroupExpensesFiltered(Long memberId, Lo UED_USER.STATUS AS STATUS FROM EXPENSES E INNER JOIN GROUPS G ON G.ID = E.GROUP_ID + INNER JOIN CATEGORIES C ON C.ID = E.CATEGORY_ID LEFT JOIN ( SELECT EXPENSE_ID, PARTIAL_VALUE, STATUS, USER_ID @@ -183,6 +192,8 @@ Page getAllGroupExpensesOfAllMembers(Long userI G.ID AS GROUP_ID, G.NAME AS GROUP_NAME, COALESCE(UED_USER.PARTIAL_VALUE, 0) AS PARTIAL_VALUE, + C.ID AS CATEGORY_ID, + C.Name AS CATEGORY_NAME, COALESCE(E.VALUE, 0) AS TOTAL, COALESCE(E.VALUE, 0) - COALESCE(UED_PAID.TOTAL_PAID, 0) AS REMAINING_VALUE, E.DEADLINE_DATE AS DEADLINE_DATE, @@ -190,6 +201,7 @@ Page getAllGroupExpensesOfAllMembers(Long userI UED_USER.STATUS AS STATUS FROM EXPENSES E INNER JOIN GROUPS G ON G.ID = E.GROUP_ID + INNER JOIN CATEGORIES C ON C.ID = E.CATEGORY_ID LEFT JOIN ( SELECT EXPENSE_ID, PARTIAL_VALUE, STATUS, USER_ID diff --git a/backend/finboostplus_server/src/main/java/com/finboostplus/service/ExpenseService.java b/backend/finboostplus_server/src/main/java/com/finboostplus/service/ExpenseService.java index d028c9f..84e4072 100644 --- a/backend/finboostplus_server/src/main/java/com/finboostplus/service/ExpenseService.java +++ b/backend/finboostplus_server/src/main/java/com/finboostplus/service/ExpenseService.java @@ -152,16 +152,17 @@ public UserExpenseDivisionDTO getExpenseInfoDetails(Long groupId, Long expenseId .doesUserHasAnyAuthority(user.getId(), groupId, AUTHLEVELS); if (!hasAuthority) { throw new ForbiddenResourceException( - "Usuário não tem permissão para visualizar detelhes da despesa"); + "Acesso negado"); } Group group = groupRepository.findById(groupId) .orElseThrow(() -> new GroupNotFoundException("Grupo não encontrado")); Expense expense = expenseRepository.findById(expenseId).orElseThrow( () -> new ForbiddenResourceException("Despesa nao encontrada")); + Category category = expense.getCategory(); List memberList = getExpenseDivisionDetails(group.getId(), expenseId); return new UserExpenseDivisionDTO(expense.getId(), expense.getTitle(), expense.getDescription(), groupId, group.getName(), expense.getStatus(), - expense.getValue(), expense.getCreatedAt(), memberList); + expense.getValue(), category.getId(), category.getName(), expense.getCreatedAt(), memberList); } private List getExpenseDivisionDetails(Long groupId, Long expenseId) {