From 02a90563ceb187094db4be631f6208ac18fd172a Mon Sep 17 00:00:00 2001 From: Fiona Friberg Date: Fri, 27 Mar 2026 17:04:58 +0100 Subject: [PATCH 1/6] Initial entity model --- .../org/example/alfs/entities/Attachment.java | 37 +++++++++++++++ .../org/example/alfs/entities/AuditLog.java | 45 ++++++++++++++++++ .../org/example/alfs/entities/SystemUser.java | 28 +++++++++++ .../org/example/alfs/entities/Ticket.java | 47 +++++++++++++++++++ .../example/alfs/entities/TicketComment.java | 35 ++++++++++++++ 5 files changed, 192 insertions(+) create mode 100644 src/main/java/org/example/alfs/entities/Attachment.java create mode 100644 src/main/java/org/example/alfs/entities/AuditLog.java create mode 100644 src/main/java/org/example/alfs/entities/SystemUser.java create mode 100644 src/main/java/org/example/alfs/entities/Ticket.java create mode 100644 src/main/java/org/example/alfs/entities/TicketComment.java diff --git a/src/main/java/org/example/alfs/entities/Attachment.java b/src/main/java/org/example/alfs/entities/Attachment.java new file mode 100644 index 0000000..f60ae00 --- /dev/null +++ b/src/main/java/org/example/alfs/entities/Attachment.java @@ -0,0 +1,37 @@ +package org.example.alfs.entities; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +/* +Represent a file uploaded with Ticket. +Stores metadata about the file and the file reference s3key. + */ +@Entity +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Attachment { + + @Id + @GeneratedValue + private Long id; + + private String fileName; + + private String s3Key; + + private LocalDateTime uploadedAt; + + @PrePersist + public void prePersist() { + uploadedAt = LocalDateTime.now(); + } + + @ManyToOne + private Ticket ticket; +} diff --git a/src/main/java/org/example/alfs/entities/AuditLog.java b/src/main/java/org/example/alfs/entities/AuditLog.java new file mode 100644 index 0000000..d9b17aa --- /dev/null +++ b/src/main/java/org/example/alfs/entities/AuditLog.java @@ -0,0 +1,45 @@ +package org.example.alfs.entities; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +/* +Represents audit log for Ticket. +Logs all events such as status change, assignment and comments. +Should be written automatically. + */ +@Entity +@Table(name="audit_log") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class AuditLog { + + @Id + @GeneratedValue + private Long id; + + private String action; + + private String fieldName; + + private String oldValue; + + private String newValue; + + private LocalDateTime createdAt; + @PrePersist + public void prePersist() { + createdAt = LocalDateTime.now(); + } + + @ManyToOne + private Ticket ticket; + + @ManyToOne + private SystemUser user; +} diff --git a/src/main/java/org/example/alfs/entities/SystemUser.java b/src/main/java/org/example/alfs/entities/SystemUser.java new file mode 100644 index 0000000..9d9cef2 --- /dev/null +++ b/src/main/java/org/example/alfs/entities/SystemUser.java @@ -0,0 +1,28 @@ +package org.example.alfs.entities; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/* +Represents a system user. +Users have different roles such as admin or investigator. + */ +@Entity +@Table(name="system_user") +@Data +@AllArgsConstructor +@NoArgsConstructor +public class SystemUser { + + @GeneratedValue + @Id + private Long id; + + private String username; + private String password; + + private String role; + +} diff --git a/src/main/java/org/example/alfs/entities/Ticket.java b/src/main/java/org/example/alfs/entities/Ticket.java new file mode 100644 index 0000000..a5744b5 --- /dev/null +++ b/src/main/java/org/example/alfs/entities/Ticket.java @@ -0,0 +1,47 @@ +package org.example.alfs.entities; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + + +import java.time.LocalDateTime; +import java.util.List; + +/* +Representing a whistleblower report. +The ticket can be followed by the anonymous reporter by using the reporterToken. + */ + +@Entity +@Table(name="ticket") +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Ticket { + + @Id + @GeneratedValue + private Long id; + + private String title; + + private String description; + + private String status; + + private String reporterToken; + + private LocalDateTime createdAt; + @PrePersist + public void prePersist() { + createdAt = LocalDateTime.now(); + } + + @OneToMany(mappedBy = "ticket") + private List attachment; + + @ManyToOne + private SystemUser assignedHandler; +} diff --git a/src/main/java/org/example/alfs/entities/TicketComment.java b/src/main/java/org/example/alfs/entities/TicketComment.java new file mode 100644 index 0000000..7c5cc90 --- /dev/null +++ b/src/main/java/org/example/alfs/entities/TicketComment.java @@ -0,0 +1,35 @@ +package org.example.alfs.entities; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + + +import java.time.LocalDateTime; + +/* +Represents comment on a ticket. +The comments are written by a SystemUser. + */ +@Entity +@Table(name="ticket_comment") +@Data +@AllArgsConstructor +@NoArgsConstructor +public class TicketComment { + + @Id + @GeneratedValue + private Long id; + + private String message; + + private LocalDateTime createdAt; + + @ManyToOne + private Ticket ticket; + + @ManyToOne + private SystemUser author; +} From 1b0bc2b7b585ea9582e5530c69b6b64c4b2000b7 Mon Sep 17 00:00:00 2001 From: Fiona Friberg Date: Fri, 27 Mar 2026 17:15:54 +0100 Subject: [PATCH 2/6] Update .gitignore --- .gitignore | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/.gitignore b/.gitignore index 963f44d..3f6b5da 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,25 @@ build/ ### jte ### /jte-classes/ + +# Environment variables +.env +.env.local +.env.*.local + +# Logs +logs/ +*.log + +# OS files +.DS_Store +Thumbs.db + +# temp +tmp/ +temp/ + +# secrets +secrets/ +*.key +*.pem From 1cbf5fdf03e17a535b9b69a6f558271104b66633 Mon Sep 17 00:00:00 2001 From: Fiona Friberg Date: Fri, 27 Mar 2026 17:20:50 +0100 Subject: [PATCH 3/6] chore: remove IntelliJ project files from repository --- .idea/.gitignore | 10 ---------- .idea/misc.xml | 6 ------ .idea/modules.xml | 8 -------- .idea/project-backend-alfs.iml | 9 --------- .idea/vcs.xml | 6 ------ 5 files changed, 39 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/project-backend-alfs.iml delete mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index ab1f416..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Ignored default folder with query files -/queries/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml -# Editor-based HTTP Client requests -/httpRequests/ diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index a20905f..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index c7ce9f1..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/project-backend-alfs.iml b/.idea/project-backend-alfs.iml deleted file mode 100644 index d6ebd48..0000000 --- a/.idea/project-backend-alfs.iml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1dd..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From 7abc014be601ab4bd2bd3dd360e55b4e62f92990 Mon Sep 17 00:00:00 2001 From: Fiona Friberg Date: Fri, 27 Mar 2026 17:22:27 +0100 Subject: [PATCH 4/6] Initial README --- README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/README.md b/README.md index e69de29..8b783b9 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,14 @@ +# The ALFS Whistleblower Ticket System + +### A secure case management system built with Spring Boot for handling whistleblower reports. +The system allows anonymous reporting, secure file uploads, role-based access control, and full audit logging. + +#### Logs should look like this: +```text +action = HANDLER_ASSIGNED +fieldName = assignedHandler +oldValue = null +newValue = userId:5 +createdAt = 2026-03-27 +``` + From 3d94f7971e6b1385c787f78bdcfeddae560a2dba Mon Sep 17 00:00:00 2001 From: Fiona Friberg Date: Fri, 27 Mar 2026 17:23:30 +0100 Subject: [PATCH 5/6] add data jpa dependency --- pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pom.xml b/pom.xml index a147010..72ea7f6 100644 --- a/pom.xml +++ b/pom.xml @@ -87,6 +87,10 @@ spring-boot-starter-webmvc-test test + + org.springframework.boot + spring-boot-starter-data-jpa + From fd03ed2ceef1c6acc16d77af5b1345bfb51fefe8 Mon Sep 17 00:00:00 2001 From: Fiona Friberg Date: Fri, 27 Mar 2026 17:25:32 +0100 Subject: [PATCH 6/6] ci: ensure jte directory exists for CI build --- src/main/jte/placeholder.jte | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/main/jte/placeholder.jte diff --git a/src/main/jte/placeholder.jte b/src/main/jte/placeholder.jte new file mode 100644 index 0000000..666c406 --- /dev/null +++ b/src/main/jte/placeholder.jte @@ -0,0 +1 @@ +<%-- This is a placeholder jte file for CI test --%> \ No newline at end of file