diff --git a/backend/src/main/java/share/fare/backend/exception/FareShareResponseEntityExceptionHandler.java b/backend/src/main/java/share/fare/backend/exception/FareShareResponseEntityExceptionHandler.java index 90273b3..895195b 100644 --- a/backend/src/main/java/share/fare/backend/exception/FareShareResponseEntityExceptionHandler.java +++ b/backend/src/main/java/share/fare/backend/exception/FareShareResponseEntityExceptionHandler.java @@ -69,7 +69,7 @@ public final ResponseEntity userAlreadyInGroupException(Exception @ExceptionHandler(UserIsNotInGroupException.class) public final ResponseEntity userIsNotInGroupException(Exception ex, WebRequest request) { ErrorDetails errorDetails = new ErrorDetails(LocalDateTime.now(), ex.getMessage(), request.getDescription(false), ex.getStackTrace().length); - return new ResponseEntity<>(errorDetails, HttpStatus.CONFLICT); + return new ResponseEntity<>(errorDetails, HttpStatus.FORBIDDEN); } @ExceptionHandler(UserIsNotGroupOwner.class) diff --git a/backend/src/main/java/share/fare/backend/exception/UserIsNotInGroupException.java b/backend/src/main/java/share/fare/backend/exception/UserIsNotInGroupException.java index 119fc05..012bd47 100644 --- a/backend/src/main/java/share/fare/backend/exception/UserIsNotInGroupException.java +++ b/backend/src/main/java/share/fare/backend/exception/UserIsNotInGroupException.java @@ -4,7 +4,7 @@ import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; -@ResponseStatus(HttpStatus.CONFLICT) +@ResponseStatus(HttpStatus.FORBIDDEN) public class UserIsNotInGroupException extends RuntimeException { public UserIsNotInGroupException(String message) { super(message); diff --git a/backend/src/test/java/share/fare/backend/controller/GroupChatControllerTest.java b/backend/src/test/java/share/fare/backend/controller/GroupChatControllerTest.java index ce184a2..9dfc179 100644 --- a/backend/src/test/java/share/fare/backend/controller/GroupChatControllerTest.java +++ b/backend/src/test/java/share/fare/backend/controller/GroupChatControllerTest.java @@ -115,7 +115,7 @@ public void getRecentMessagesUserNotInGroupTest() throws Exception { .param("size", "20") .with(user(testSecondUser)) ) - .andExpect(status().isConflict()) + .andExpect(status().isForbidden()) .andExpect(jsonPath("$.message").value("User " + testSecondUser.getId() + " is not in group " + testGroup.getName())); } } diff --git a/backend/src/test/java/share/fare/backend/controller/GroupInvitationControllerTest.java b/backend/src/test/java/share/fare/backend/controller/GroupInvitationControllerTest.java index c44a7c7..7e12e78 100644 --- a/backend/src/test/java/share/fare/backend/controller/GroupInvitationControllerTest.java +++ b/backend/src/test/java/share/fare/backend/controller/GroupInvitationControllerTest.java @@ -173,7 +173,7 @@ void sendGroupInvitationSenderNotInGroupTest() throws Exception { .principal(() -> String.valueOf(testUser.getId())) .param("receiverId", String.valueOf(testSecondUser.getId())) .param("groupId", String.valueOf(testGroup.getId()))) - .andExpect(status().isConflict()) + .andExpect(status().isForbidden()) .andExpect(jsonPath("$.message").value("Sender does not belong to group.")); } diff --git a/backend/src/test/java/share/fare/backend/controller/GroupMembershipControllerTest.java b/backend/src/test/java/share/fare/backend/controller/GroupMembershipControllerTest.java index c869bc7..2cab320 100644 --- a/backend/src/test/java/share/fare/backend/controller/GroupMembershipControllerTest.java +++ b/backend/src/test/java/share/fare/backend/controller/GroupMembershipControllerTest.java @@ -171,7 +171,7 @@ void removeNonMemberTest() throws Exception { mockMvc.perform(delete(URI + "/{userId}", testGroup.getId(), newUser.getId()) .with(user(testUser)) .principal(() -> String.valueOf(testUser.getId()))) - .andExpect(status().isConflict()); + .andExpect(status().isForbidden()); } @Test diff --git a/backend/src/test/java/share/fare/backend/controller/VoteControllerTest.java b/backend/src/test/java/share/fare/backend/controller/VoteControllerTest.java index cc962a6..122a876 100644 --- a/backend/src/test/java/share/fare/backend/controller/VoteControllerTest.java +++ b/backend/src/test/java/share/fare/backend/controller/VoteControllerTest.java @@ -140,7 +140,7 @@ void addVoteNotGroupMemberTest() throws Exception { .content(objectMapper.writeValueAsString(voteRequest)) .with(user(anotherUser)) .principal(() -> String.valueOf(anotherUser.getId()))) - .andExpect(status().isConflict()) + .andExpect(status().isForbidden()) .andExpect(jsonPath("$.message").value("User with ID: " + anotherUser.getId() +" is not a member of the group")); } diff --git a/frontend/app/(root)/trips/[id]/bill-splitting/page.tsx b/frontend/app/(root)/trips/[id]/bill-splitting/page.tsx index 84ff3f0..3825d7a 100644 --- a/frontend/app/(root)/trips/[id]/bill-splitting/page.tsx +++ b/frontend/app/(root)/trips/[id]/bill-splitting/page.tsx @@ -57,7 +57,7 @@ export default function GroupExpensesPage() { useEffect(() => { if (!trip || !trip.id) return; fetchData(); - }); + }, [trip]); const fetchData = async () => { try { diff --git a/frontend/components/bill-splitting/ExpensesDashboard.tsx b/frontend/components/bill-splitting/ExpensesDashboard.tsx index 508ce87..7992851 100644 --- a/frontend/components/bill-splitting/ExpensesDashboard.tsx +++ b/frontend/components/bill-splitting/ExpensesDashboard.tsx @@ -34,7 +34,7 @@ export default function ExpansesDashboard({ trip }: { trip: Group }) { useEffect(() => { fetchGroupExpenses(); - }, []); + }, [trip]); if (error) { return ( diff --git a/frontend/lib/axiosInstance.ts b/frontend/lib/axiosInstance.ts index 8a4951d..4ab3119 100644 --- a/frontend/lib/axiosInstance.ts +++ b/frontend/lib/axiosInstance.ts @@ -20,4 +20,19 @@ axiosInstance.interceptors.request.use( }, ); +axiosInstance.interceptors.response.use( + (response) => response, + (error) => { + if ( + error.response && + (error.response.status === 403 || error.response.status === 409) + ) { + if (typeof window !== 'undefined') { + window.location.href = '/trips'; + } + } + return Promise.reject(error); + }, +); + export default axiosInstance;