From b3d5b5ad115759c88a8c49e8da8495a2b883ceeb Mon Sep 17 00:00:00 2001 From: Cedric Date: Tue, 31 Dec 2024 01:14:28 +0100 Subject: [PATCH] Bugfix, support for Expense without AppUser id --- .../controller/ExpenseListController.java | 25 +++++++++- .../xpensely_server/model/ExpenseInput.java | 50 +++++++++++++++++++ .../services/ExpenseListService.java | 23 ++++++--- 3 files changed, 89 insertions(+), 9 deletions(-) create mode 100644 src/main/java/de/zendric/app/xpensely_server/model/ExpenseInput.java diff --git a/src/main/java/de/zendric/app/xpensely_server/controller/ExpenseListController.java b/src/main/java/de/zendric/app/xpensely_server/controller/ExpenseListController.java index d0329fa..1fc6a4e 100644 --- a/src/main/java/de/zendric/app/xpensely_server/controller/ExpenseListController.java +++ b/src/main/java/de/zendric/app/xpensely_server/controller/ExpenseListController.java @@ -19,6 +19,7 @@ import org.springframework.web.bind.annotation.RestController; import de.zendric.app.xpensely_server.model.AppUser; import de.zendric.app.xpensely_server.model.Expense; +import de.zendric.app.xpensely_server.model.ExpenseInput; import de.zendric.app.xpensely_server.model.ExpenseList; import de.zendric.app.xpensely_server.model.InviteRequest; import de.zendric.app.xpensely_server.services.ExpenseListService; @@ -95,9 +96,23 @@ class ExpenseListController { @PostMapping public ResponseEntity create(@RequestBody ExpenseList expenseList) { try { - ExpenseList savedItem = (ExpenseList) expenseListService.save(expenseList); + // Fetch or persist the `owner` AppUser + if (expenseList.getOwner() != null) { + AppUser existingOwner = userService.getUser(expenseList.getOwner().getId()); + if (existingOwner == null) { + throw new IllegalArgumentException("Owner does not exist."); + } + expenseList.setOwner(existingOwner); + } else { + throw new IllegalArgumentException("Owner is required."); + } + + expenseList.setSharedWith(null); + + ExpenseList savedItem = expenseListService.createList(expenseList); return new ResponseEntity<>(savedItem, HttpStatus.CREATED); } catch (Exception e) { + e.printStackTrace(); return new ResponseEntity<>(null, HttpStatus.EXPECTATION_FAILED); } } @@ -115,8 +130,11 @@ class ExpenseListController { @PostMapping("/{id}/add") public ResponseEntity addExpenseToList( @PathVariable("id") Long expenseListId, - @RequestBody Expense expense) { + @RequestBody ExpenseInput expenseInput) { try { + AppUser expenseOwner = userService.getUserByName(expenseInput.getOwner()); + Expense expense = expenseInput.convertToExpense(expenseOwner.getId()); + Expense addedExpense = expenseListService.addExpenseToList(expenseListId, expense); return new ResponseEntity<>(addedExpense, HttpStatus.CREATED); } catch (Exception e) { @@ -153,6 +171,9 @@ class ExpenseListController { if (list.getSharedWith() != null) { return ResponseEntity.status(HttpStatus.IM_USED).body("List has already been shared"); } + if (list.getOwner().getId() == inviteRequest.getUserId()) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("You cant join your own List"); + } AppUser user = null; try { user = userService.getUser(inviteRequest.getUserId()); diff --git a/src/main/java/de/zendric/app/xpensely_server/model/ExpenseInput.java b/src/main/java/de/zendric/app/xpensely_server/model/ExpenseInput.java new file mode 100644 index 0000000..5d8418f --- /dev/null +++ b/src/main/java/de/zendric/app/xpensely_server/model/ExpenseInput.java @@ -0,0 +1,50 @@ +package de.zendric.app.xpensely_server.model; + +import java.time.LocalDate; + +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +public class ExpenseInput { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String title; + + private String owner; + + private Double amount; + private Double deviation; + + private LocalDate date; + + private ExpenseList expenseList; + + public Expense convertToExpense(Long userId) { + AppUser appUser = new AppUser(); + appUser.setId(userId); + appUser.setUsername(owner); + + Expense expense = new Expense(); + expense.setAmount(amount); + expense.setDate(date); + expense.setDeviation(deviation); + expense.setExpenseList(expenseList); + expense.setId(id); + expense.setOwner(appUser); + expense.setTitle(title); + + return expense; + } +} diff --git a/src/main/java/de/zendric/app/xpensely_server/services/ExpenseListService.java b/src/main/java/de/zendric/app/xpensely_server/services/ExpenseListService.java index f80ee3b..c37733f 100644 --- a/src/main/java/de/zendric/app/xpensely_server/services/ExpenseListService.java +++ b/src/main/java/de/zendric/app/xpensely_server/services/ExpenseListService.java @@ -98,15 +98,20 @@ public class ExpenseListService { } public Expense addExpenseToList(Long expenseListId, Expense expense) { + // find expenseList ExpenseList expenseList = repository.findById(expenseListId) .orElseThrow(() -> new RuntimeException("ExpenseList not found with id: " + expenseListId)); + // get all added expenses HashSet existingId = new HashSet<>(); for (Expense e : expenseList.getExpenses()) { existingId.add(e.getId()); } + // add the new expense expenseList.addExpense(expense); + // save repository.save(expenseList); - Expense newExpense = expense; + + Expense newExpense = new Expense(); for (Expense e : expenseList.getExpenses()) { if (!existingId.contains(e.getId())) { newExpense = e; @@ -137,14 +142,18 @@ public class ExpenseListService { public String generateInviteCode(Long listId) { ExpenseList list = repository.findById(listId) .orElseThrow(() -> new RuntimeException("List not found")); + String inviteCode; + if (list.getInviteCode() == null || list.getInviteCodeExpiration().isBefore(LocalDateTime.now())) { - String inviteCode = UUID.randomUUID().toString().substring(0, 6).toUpperCase(); - LocalDateTime expirationTime = LocalDateTime.now().plusWeeks(1); - - list.setInviteCode(inviteCode); - list.setInviteCodeExpiration(expirationTime); - repository.save(list); + inviteCode = UUID.randomUUID().toString().substring(0, 6).toUpperCase(); + LocalDateTime expirationTime = LocalDateTime.now().plusWeeks(1); + list.setInviteCode(inviteCode); + list.setInviteCodeExpiration(expirationTime); + repository.save(list); + } else { + inviteCode = list.getInviteCode(); + } return inviteCode; }