From 78c9744d2139444636a39bb0d0773a951d43fb3f Mon Sep 17 00:00:00 2001 From: Simon Forsberg Date: Mon, 30 Mar 2026 13:10:49 +0200 Subject: [PATCH 01/10] Add column constraints to `Attachment` entity (`fileName` and `s3Key`) --- src/main/java/org/example/alfs/entities/Attachment.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/org/example/alfs/entities/Attachment.java b/src/main/java/org/example/alfs/entities/Attachment.java index 022797e..53bf491 100644 --- a/src/main/java/org/example/alfs/entities/Attachment.java +++ b/src/main/java/org/example/alfs/entities/Attachment.java @@ -20,8 +20,10 @@ public class Attachment { @GeneratedValue private Long id; + @Column(nullable = false) private String fileName; + @Column(nullable = false) private String s3Key; private LocalDateTime uploadedAt; From 7500e22ad2fdef2782656284a5b608918e9835f5 Mon Sep 17 00:00:00 2001 From: Simon Forsberg Date: Mon, 30 Mar 2026 13:11:09 +0200 Subject: [PATCH 02/10] Update `AuditLog` entity: replace `action` field with `AuditAction` enum --- src/main/java/org/example/alfs/entities/AuditLog.java | 4 +++- src/main/java/org/example/alfs/enums/AuditAction.java | 8 ++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/example/alfs/enums/AuditAction.java diff --git a/src/main/java/org/example/alfs/entities/AuditLog.java b/src/main/java/org/example/alfs/entities/AuditLog.java index eabd823..3633477 100644 --- a/src/main/java/org/example/alfs/entities/AuditLog.java +++ b/src/main/java/org/example/alfs/entities/AuditLog.java @@ -2,6 +2,7 @@ import jakarta.persistence.*; import lombok.*; +import org.example.alfs.enums.AuditAction; import java.time.LocalDateTime; @@ -22,7 +23,8 @@ public class AuditLog { @GeneratedValue private Long id; - private String action; + @Enumerated(EnumType.STRING) + private AuditAction action; private String fieldName; diff --git a/src/main/java/org/example/alfs/enums/AuditAction.java b/src/main/java/org/example/alfs/enums/AuditAction.java new file mode 100644 index 0000000..36076c0 --- /dev/null +++ b/src/main/java/org/example/alfs/enums/AuditAction.java @@ -0,0 +1,8 @@ +package org.example.alfs.enums; + +public enum AuditAction { + CREATED, + UPDATED, + ASSIGNED, + COMMENTED +} \ No newline at end of file From 589c707417070febdab15a8a71bafcbb6de165a2 Mon Sep 17 00:00:00 2001 From: Simon Forsberg Date: Mon, 30 Mar 2026 13:11:17 +0200 Subject: [PATCH 03/10] Move `Role` enum to `enums` package --- src/main/java/org/example/alfs/{ => enums}/Role.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/org/example/alfs/{ => enums}/Role.java (66%) diff --git a/src/main/java/org/example/alfs/Role.java b/src/main/java/org/example/alfs/enums/Role.java similarity index 66% rename from src/main/java/org/example/alfs/Role.java rename to src/main/java/org/example/alfs/enums/Role.java index 41dd236..3024fa1 100644 --- a/src/main/java/org/example/alfs/Role.java +++ b/src/main/java/org/example/alfs/enums/Role.java @@ -1,4 +1,4 @@ -package org.example.alfs; +package org.example.alfs.enums; public enum Role { REPORTER, From f21cdf2bc2de18278f766c432b75ad854861e314 Mon Sep 17 00:00:00 2001 From: Simon Forsberg Date: Mon, 30 Mar 2026 13:11:45 +0200 Subject: [PATCH 04/10] Enhance `Ticket` entity: introduce `TicketStatus` enum, add column constraints, and refine mappings. --- .../org/example/alfs/entities/Ticket.java | 23 +++++++++++++++++-- .../example/alfs/entities/TicketComment.java | 3 ++- .../org/example/alfs/enums/TicketStatus.java | 8 +++++++ 3 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 src/main/java/org/example/alfs/enums/TicketStatus.java diff --git a/src/main/java/org/example/alfs/entities/Ticket.java b/src/main/java/org/example/alfs/entities/Ticket.java index 55f3ff9..522401d 100644 --- a/src/main/java/org/example/alfs/entities/Ticket.java +++ b/src/main/java/org/example/alfs/entities/Ticket.java @@ -2,6 +2,7 @@ import jakarta.persistence.*; import lombok.*; +import org.example.alfs.enums.TicketStatus; import java.time.LocalDateTime; @@ -24,25 +25,43 @@ public class Ticket { @GeneratedValue private Long id; + @Column(nullable = false, length = 255) private String title; + @Column(columnDefinition = "TEXT") private String description; - private String status; + @Enumerated(EnumType.STRING) + private TicketStatus status; @Column(nullable = false, unique = true, length = 128, updatable = false) private String reporterToken; private LocalDateTime createdAt; + private LocalDateTime updatedAt; + @PrePersist public void prePersist() { createdAt = LocalDateTime.now(); + if (status == null) { + status = TicketStatus.OPEN; + } + } + + @PreUpdate + public void preUpdate() { + updatedAt = LocalDateTime.now(); } @OneToMany(mappedBy = "ticket", cascade = CascadeType.ALL, orphanRemoval = true) private List attachments; @ManyToOne - private User assignedHandler; + @JoinColumn(name = "reporter_id", nullable = true) // null if anonymous + private User reporter; + + @ManyToOne + @JoinColumn(name = "investigator_id", nullable = true) + private User investigator; } diff --git a/src/main/java/org/example/alfs/entities/TicketComment.java b/src/main/java/org/example/alfs/entities/TicketComment.java index 93d0027..cd343fd 100644 --- a/src/main/java/org/example/alfs/entities/TicketComment.java +++ b/src/main/java/org/example/alfs/entities/TicketComment.java @@ -11,7 +11,7 @@ The comments are written by a User. */ @Entity -@Table(name="ticket_comment") +@Table(name = "ticket_comments") @Getter @Setter @AllArgsConstructor @@ -22,6 +22,7 @@ public class TicketComment { @GeneratedValue private Long id; + @Column(nullable = false, length = 2000) private String message; private LocalDateTime createdAt; diff --git a/src/main/java/org/example/alfs/enums/TicketStatus.java b/src/main/java/org/example/alfs/enums/TicketStatus.java new file mode 100644 index 0000000..6442277 --- /dev/null +++ b/src/main/java/org/example/alfs/enums/TicketStatus.java @@ -0,0 +1,8 @@ +package org.example.alfs.enums; + +public enum TicketStatus { + OPEN, + IN_PROGRESS, + RESOLVED, + CLOSED +} From e20da81b8682c091d743633e847b257ce6d297a7 Mon Sep 17 00:00:00 2001 From: Simon Forsberg Date: Mon, 30 Mar 2026 13:11:55 +0200 Subject: [PATCH 05/10] Update `User` entity: add column constraints for `username` and `password`, adjust package for `Role` enum --- src/main/java/org/example/alfs/entities/User.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/example/alfs/entities/User.java b/src/main/java/org/example/alfs/entities/User.java index 29b59e1..3bbf4a5 100644 --- a/src/main/java/org/example/alfs/entities/User.java +++ b/src/main/java/org/example/alfs/entities/User.java @@ -2,7 +2,7 @@ import jakarta.persistence.*; import lombok.*; -import org.example.alfs.Role; +import org.example.alfs.enums.Role; /* Represents a system user. @@ -20,10 +20,11 @@ public class User { @Id private Long id; + @Column(nullable = false, unique = true, length = 100) private String username; - @Column(name = "password_hash", nullable = false, length = 255) - private String passwordHash; + @Column(nullable = false, length = 255) + private String password; @Enumerated(EnumType.STRING) private Role role; From 4e6559d0267ad38cd3857523b47d3729090b2801 Mon Sep 17 00:00:00 2001 From: Simon Forsberg Date: Mon, 30 Mar 2026 13:28:53 +0200 Subject: [PATCH 06/10] Refactor CI workflow: streamline steps, optimize JDK setup, and simplify Maven build command --- .github/workflows/CI.yml | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 8a04a22..12f4ea0 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -9,27 +9,22 @@ name: Java CI with Maven on: - push: - branches: [ "main" ] pull_request: branches: [ "main" ] jobs: build: - runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - name: Set up JDK 25 - uses: actions/setup-java@v4 - with: - java-version: '25' - distribution: 'temurin' - cache: maven - - name: Build with Maven - run: mvn -B package --file pom.xml + - uses: actions/checkout@v4 + + - name: Set up JDK + uses: actions/setup-java@v4 + with: + java-version: '25' + distribution: 'temurin' + cache: maven - # Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive - - name: Update dependency graph - uses: advanced-security/maven-dependency-submission-action@571e99aab1055c2e71a1e2309b9691de18d6b7d6 + - name: Build + run: mvn -B package \ No newline at end of file From 860f0ed5850cb34256f7e26993bf0a4a2586dd56 Mon Sep 17 00:00:00 2001 From: Simon Forsberg Date: Mon, 30 Mar 2026 13:37:38 +0200 Subject: [PATCH 07/10] Update `AuditLog` entity: add column constraints to `action` field --- src/main/java/org/example/alfs/entities/AuditLog.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/example/alfs/entities/AuditLog.java b/src/main/java/org/example/alfs/entities/AuditLog.java index 3633477..103bc9e 100644 --- a/src/main/java/org/example/alfs/entities/AuditLog.java +++ b/src/main/java/org/example/alfs/entities/AuditLog.java @@ -24,6 +24,7 @@ public class AuditLog { private Long id; @Enumerated(EnumType.STRING) + @Column(nullable = false, length = 50) private AuditAction action; private String fieldName; From 2bdfd172d39c8da23d3ca3ac0d353acb96bad240 Mon Sep 17 00:00:00 2001 From: Simon Forsberg Date: Mon, 30 Mar 2026 13:37:48 +0200 Subject: [PATCH 08/10] Enhance `Ticket` entity: add lazy loading for `description`, `reporter`, and `investigator`, refine column constraints, and improve mappings --- src/main/java/org/example/alfs/entities/Ticket.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/example/alfs/entities/Ticket.java b/src/main/java/org/example/alfs/entities/Ticket.java index 522401d..4498445 100644 --- a/src/main/java/org/example/alfs/entities/Ticket.java +++ b/src/main/java/org/example/alfs/entities/Ticket.java @@ -28,10 +28,12 @@ public class Ticket { @Column(nullable = false, length = 255) private String title; - @Column(columnDefinition = "TEXT") + @Lob + @Basic(fetch = FetchType.LAZY) private String description; @Enumerated(EnumType.STRING) + @Column(nullable = false, length = 32) private TicketStatus status; @Column(nullable = false, unique = true, length = 128, updatable = false) @@ -57,11 +59,11 @@ public void preUpdate() { @OneToMany(mappedBy = "ticket", cascade = CascadeType.ALL, orphanRemoval = true) private List attachments; - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "reporter_id", nullable = true) // null if anonymous private User reporter; - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "investigator_id", nullable = true) private User investigator; } From 71ca37c0e142d8e9e8f11d3337754b90c22cb931 Mon Sep 17 00:00:00 2001 From: Simon Forsberg Date: Mon, 30 Mar 2026 13:37:59 +0200 Subject: [PATCH 09/10] Update `TicketComment` entity: rename table to `ticket_comment` to align with naming conventions --- src/main/java/org/example/alfs/entities/TicketComment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/example/alfs/entities/TicketComment.java b/src/main/java/org/example/alfs/entities/TicketComment.java index cd343fd..7c8063a 100644 --- a/src/main/java/org/example/alfs/entities/TicketComment.java +++ b/src/main/java/org/example/alfs/entities/TicketComment.java @@ -11,7 +11,7 @@ The comments are written by a User. */ @Entity -@Table(name = "ticket_comments") +@Table(name = "ticket_comment") @Getter @Setter @AllArgsConstructor From 97b96c351a575ae2f936ee5fbcb3d737694fa946 Mon Sep 17 00:00:00 2001 From: Simon Forsberg Date: Mon, 30 Mar 2026 19:00:31 +0200 Subject: [PATCH 10/10] Update `User` entity: rename `password` field to `passwordHash` for clarity --- src/main/java/org/example/alfs/entities/User.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/example/alfs/entities/User.java b/src/main/java/org/example/alfs/entities/User.java index 3bbf4a5..43f85d3 100644 --- a/src/main/java/org/example/alfs/entities/User.java +++ b/src/main/java/org/example/alfs/entities/User.java @@ -24,7 +24,7 @@ public class User { private String username; @Column(nullable = false, length = 255) - private String password; + private String passwordHash; @Enumerated(EnumType.STRING) private Role role;