diff --git a/backend/finboostplus_server/src/main/java/com/finboostplus/DTO/GroupDetailsDTO.java b/backend/finboostplus_server/src/main/java/com/finboostplus/DTO/GroupDetailsDTO.java index 733d9e6..f95707d 100644 --- a/backend/finboostplus_server/src/main/java/com/finboostplus/DTO/GroupDetailsDTO.java +++ b/backend/finboostplus_server/src/main/java/com/finboostplus/DTO/GroupDetailsDTO.java @@ -2,6 +2,6 @@ import java.math.BigDecimal; -public record GroupDetailsDTO(Long id, String name, String description, String icon, String authorization, +public record GroupDetailsDTO(Long id, String name, String description, String icon, String authorization, BigDecimal partial_total, BigDecimal total) { } diff --git a/backend/finboostplus_server/src/main/java/com/finboostplus/DTO/GroupMemberAuthorityDTO.java b/backend/finboostplus_server/src/main/java/com/finboostplus/DTO/GroupMemberAuthorityDTO.java new file mode 100644 index 0000000..3d045d0 --- /dev/null +++ b/backend/finboostplus_server/src/main/java/com/finboostplus/DTO/GroupMemberAuthorityDTO.java @@ -0,0 +1,3 @@ +package com.finboostplus.DTO; + +public record GroupMemberAuthorityDTO(String authority){} 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 54e2fee..c1af294 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 @@ -24,12 +24,14 @@ import com.finboostplus.DTO.CategoryDTO; import com.finboostplus.DTO.GroupCreateDTO; import com.finboostplus.DTO.GroupDetailsDTO; +import com.finboostplus.DTO.GroupMemberAuthorityDTO; import com.finboostplus.DTO.GroupMemberDTO; import com.finboostplus.DTO.GroupMemberResponseDTO; import com.finboostplus.DTO.GroupUpdateDTO; import com.finboostplus.DTO.SwitchAuthorityRequestDTO; import com.finboostplus.model.Group; import com.finboostplus.projection.GroupProjection; +import com.finboostplus.repository.GroupRepository; import com.finboostplus.repository.UserRepository; import com.finboostplus.service.CategoryService; import com.finboostplus.service.ExpenseService; @@ -91,6 +93,12 @@ public ResponseEntity getGroupDetails(@PathVariable Long groupI return new ResponseEntity<>(dto, HttpStatus.OK); } + @GetMapping("/{groupId}/members/{memberId}/authority") + public ResponseEntity getMemberAuthority(@PathVariable Long groupId, @PathVariable Long memberId) { + GroupMemberAuthorityDTO authority = groupService.getMemberAuthority(groupId, memberId); + return ResponseEntity.ok(authority); + } + @PostMapping public ResponseEntity createGroup(@Valid @RequestBody GroupCreateDTO dto) { boolean groupIsCreated = groupService.createNewGroup(dto); diff --git a/backend/finboostplus_server/src/main/java/com/finboostplus/projection/GroupProjection.java b/backend/finboostplus_server/src/main/java/com/finboostplus/projection/GroupProjection.java index 0dab436..1d33eeb 100644 --- a/backend/finboostplus_server/src/main/java/com/finboostplus/projection/GroupProjection.java +++ b/backend/finboostplus_server/src/main/java/com/finboostplus/projection/GroupProjection.java @@ -1,9 +1,10 @@ package com.finboostplus.projection; +import java.math.BigDecimal; import java.time.Instant; public interface GroupProjection { - Long getId(); + Long getGroupId(); String getName(); @@ -15,5 +16,7 @@ public interface GroupProjection { Instant getCreatedAt(); - Double getTotalExpenses(); + BigDecimal getPartial_total(); + + BigDecimal getTotal(); } diff --git a/backend/finboostplus_server/src/main/java/com/finboostplus/repository/GroupRepository.java b/backend/finboostplus_server/src/main/java/com/finboostplus/repository/GroupRepository.java index bcd4092..aff2ede 100644 --- a/backend/finboostplus_server/src/main/java/com/finboostplus/repository/GroupRepository.java +++ b/backend/finboostplus_server/src/main/java/com/finboostplus/repository/GroupRepository.java @@ -9,6 +9,7 @@ import org.springframework.stereotype.Repository; import com.finboostplus.DTO.GroupDetailsDTO; +import com.finboostplus.DTO.GroupMemberAuthorityDTO; import com.finboostplus.model.Group; import com.finboostplus.projection.GroupProjection; @@ -16,29 +17,40 @@ public interface GroupRepository extends JpaRepository { @Query(nativeQuery = true, value = """ SELECT - G.ID, + G.ID AS GROUP_ID, G.NAME, G.DESCRIPTION, GM.AUTH_LEVEL AS AUTHORITY, G.ICON, G.CREATED_AT, - COALESCE(SUM(E.VALUE), 0) AS TOTAL_EXPENSES + COALESCE(SUM(UED.PARTIAL_VALUE), 0) AS PARTIAL_TOTAL, + COALESCE(SUM(E.VALUE), 0) AS TOTAL FROM GROUPS G INNER JOIN GROUP_MEMBERS GM ON GM.GROUP_ID = G.ID LEFT JOIN EXPENSES E ON E.GROUP_ID = G.ID - WHERE - GM.USER_ID = :memberId + AND E.STATUS != 'PAID' -- aplica filtro no join! + LEFT JOIN USER_EXPENSE_DIVISIONS UED ON UED.EXPENSE_ID = E.ID + AND UED.USER_ID = :memberId + AND UED.STATUS != 'PAID' GROUP BY G.ID, G.NAME, G.DESCRIPTION, GM.AUTH_LEVEL, G.ICON, - G.CREATED_AT; + G.CREATED_AT """) Page listUserGroupsPaged(Long memberId, Pageable pageable); + @Query(nativeQuery = true, value = """ + SELECT GM.AUTH_LEVEL AS AUTHORITY + FROM GROUP_MEMBERS AS GM + WHERE GM.GROUP_ID = :groupId + AND GM.USER_ID = :memberId + """) + GroupMemberAuthorityDTO getMemberAuthority(Long groupId, Long memberId); + @Modifying @Query(nativeQuery = true, value = """ DELETE FROM groups @@ -56,12 +68,20 @@ public interface GroupRepository extends JpaRepository { ( SELECT COALESCE(SUM(UED.PARTIAL_VALUE), 0) + FROM + USER_EXPENSE_DIVISIONS UED + WHERE + UED.USER_ID = :userId + AND UED.STATUS != 'PAID' + ) AS PARTIAL_TOTAL, + ( + SELECT + COALESCE(SUM(E.VALUE), 0) FROM EXPENSES E - INNER JOIN USER_EXPENSE_DIVISIONS UED ON E.ID = UED.EXPENSE_ID WHERE E.GROUP_ID = :groupId - AND UED.USER_ID = :userId + AND E.STATUS != 'PAID' ) AS TOTAL FROM GROUPS AS G diff --git a/backend/finboostplus_server/src/main/java/com/finboostplus/service/GroupService.java b/backend/finboostplus_server/src/main/java/com/finboostplus/service/GroupService.java index f9ab98e..1c4a064 100644 --- a/backend/finboostplus_server/src/main/java/com/finboostplus/service/GroupService.java +++ b/backend/finboostplus_server/src/main/java/com/finboostplus/service/GroupService.java @@ -12,6 +12,7 @@ import com.finboostplus.DTO.GroupCreateDTO; import com.finboostplus.DTO.GroupDetailsDTO; +import com.finboostplus.DTO.GroupMemberAuthorityDTO; import com.finboostplus.DTO.GroupMemberResponseDTO; import com.finboostplus.DTO.GroupUpdateDTO; import com.finboostplus.exception.ForbiddenResourceException; @@ -115,6 +116,19 @@ public Group getGroup(Long idGroup) { return group; } + @Transactional(readOnly = true) + public GroupMemberAuthorityDTO getMemberAuthority(Long groupId, Long memberId) { + User user = userRepository + .findByEmailIgnoreCase(userService.authenticated()) + .orElseThrow(() -> new UsernameNotFoundException("Usuário não encontrado!")); + boolean isLoggedUserMemberOfGroup = groupMemberRepository.isUserMemberOfGroup(user.getId(), groupId); + boolean isUserMemberOfGroup = groupMemberRepository.isUserMemberOfGroup(memberId, groupId); + if (isLoggedUserMemberOfGroup && isUserMemberOfGroup) { + return groupRepository.getMemberAuthority(groupId, memberId); + } + throw new ForbiddenResourceException("Acesso negado"); + } + @Transactional(readOnly = true) public GroupDetailsDTO getGroupDetails(Long groupId) { User user = userRepository.findByEmailIgnoreCase(userService.authenticated())