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
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
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
+```
+
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
+
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;
+}
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