From 3bea06fead21cf240be89f3ecff7eb5ce85c381f Mon Sep 17 00:00:00 2001 From: Cedric Hornberger Date: Mon, 4 May 2026 22:36:20 +0200 Subject: [PATCH] feat: add Bean Validation annotations to request models --- .../model/AppUserCreateRequest.java | 10 +++++++--- .../model/ExpenseChangeRequest.java | 19 ++++++++++++++++++- .../xpensely_server/model/ExpenseInput.java | 18 +++++++++++++----- .../xpensely_server/model/InviteRequest.java | 6 +++++- 4 files changed, 43 insertions(+), 10 deletions(-) diff --git a/src/main/java/de/zendric/app/xpensely_server/model/AppUserCreateRequest.java b/src/main/java/de/zendric/app/xpensely_server/model/AppUserCreateRequest.java index 3ae678d..c2f05ed 100644 --- a/src/main/java/de/zendric/app/xpensely_server/model/AppUserCreateRequest.java +++ b/src/main/java/de/zendric/app/xpensely_server/model/AppUserCreateRequest.java @@ -1,21 +1,25 @@ package de.zendric.app.xpensely_server.model; -import jakarta.persistence.Column; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; import lombok.Data; @Data public class AppUserCreateRequest { - @Column(name = "username", nullable = false, unique = true) + @NotBlank(message = "Username is required") + @Size(min = 3, max = 30, message = "Username must be between 3 and 30 characters") + @Pattern(regexp = "^[a-zA-Z0-9_.\\-]+$", message = "Username may only contain letters, digits, underscores, dots, and hyphens") private String username; + @NotBlank(message = "Google ID is required") private String googleId; public AppUser convertToAppUser() { AppUser appUser = new AppUser(); appUser.setGoogleId(googleId); appUser.setUsername(username); - return appUser; } } diff --git a/src/main/java/de/zendric/app/xpensely_server/model/ExpenseChangeRequest.java b/src/main/java/de/zendric/app/xpensely_server/model/ExpenseChangeRequest.java index 65f8edd..20c161b 100644 --- a/src/main/java/de/zendric/app/xpensely_server/model/ExpenseChangeRequest.java +++ b/src/main/java/de/zendric/app/xpensely_server/model/ExpenseChangeRequest.java @@ -2,6 +2,10 @@ package de.zendric.app.xpensely_server.model; import java.time.LocalDate; +import jakarta.validation.constraints.DecimalMin; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -12,12 +16,25 @@ import lombok.NoArgsConstructor; public class ExpenseChangeRequest { private Long id; + + @NotBlank(message = "Title is required") + @Size(max = 100, message = "Title must not exceed 100 characters") private String title; + + @NotBlank(message = "Owner name is required") private String ownerName; + + @NotNull(message = "Amount is required") + @DecimalMin(value = "0.01", message = "Amount must be greater than zero") private Double amount; + private Double personalUseAmount; private Double otherPersonAmount; + + @NotNull(message = "Date is required") private LocalDate date; + + @NotBlank(message = "Category is required") private String category; public Expense convertToExpense(Long userId, ExpenseList expenseList) { @@ -38,4 +55,4 @@ public class ExpenseChangeRequest { return expense; } -} \ No newline at end of file +} 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 index 3fb17ad..1a31fd2 100644 --- a/src/main/java/de/zendric/app/xpensely_server/model/ExpenseInput.java +++ b/src/main/java/de/zendric/app/xpensely_server/model/ExpenseInput.java @@ -2,9 +2,10 @@ package de.zendric.app.xpensely_server.model; import java.time.LocalDate; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; +import jakarta.validation.constraints.DecimalMin; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -16,19 +17,26 @@ import lombok.Setter; @NoArgsConstructor public class ExpenseInput { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + @NotBlank(message = "Title is required") + @Size(max = 100, message = "Title must not exceed 100 characters") private String title; + @NotBlank(message = "Owner is required") private String owner; + @NotNull(message = "Amount is required") + @DecimalMin(value = "0.01", message = "Amount must be greater than zero") private Double amount; + private Double personalUseAmount; private Double otherPersonAmount; + @NotNull(message = "Date is required") private LocalDate date; + + @NotBlank(message = "Category is required") private String category; private ExpenseList expenseList; diff --git a/src/main/java/de/zendric/app/xpensely_server/model/InviteRequest.java b/src/main/java/de/zendric/app/xpensely_server/model/InviteRequest.java index 81ac35a..e572c44 100644 --- a/src/main/java/de/zendric/app/xpensely_server/model/InviteRequest.java +++ b/src/main/java/de/zendric/app/xpensely_server/model/InviteRequest.java @@ -1,5 +1,7 @@ package de.zendric.app.xpensely_server.model; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -8,6 +10,8 @@ import lombok.NoArgsConstructor; @AllArgsConstructor @NoArgsConstructor public class InviteRequest { + + @NotBlank(message = "Invite code is required") + @Size(min = 6, max = 6, message = "Invite code must be exactly 6 characters") private String inviteCode; - private Long userId; }