From 02a90563ceb187094db4be631f6208ac18fd172a Mon Sep 17 00:00:00 2001 From: Fiona Friberg Date: Fri, 27 Mar 2026 17:04:58 +0100 Subject: [PATCH 01/13] 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 02/13] 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 03/13] 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 04/13] 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 05/13] 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 06/13] 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 From 673f5cbadacb756f3c3b51112eec6c486e3feb5c Mon Sep 17 00:00:00 2001 From: Fiona Friberg Date: Mon, 30 Mar 2026 09:43:31 +0200 Subject: [PATCH 07/13] refactor: rename SystemUser to User --- src/main/java/org/example/alfs/entities/AuditLog.java | 2 +- src/main/java/org/example/alfs/entities/Ticket.java | 2 +- src/main/java/org/example/alfs/entities/TicketComment.java | 4 ++-- .../org/example/alfs/entities/{SystemUser.java => User.java} | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) rename src/main/java/org/example/alfs/entities/{SystemUser.java => User.java} (89%) diff --git a/src/main/java/org/example/alfs/entities/AuditLog.java b/src/main/java/org/example/alfs/entities/AuditLog.java index d9b17aa..076407b 100644 --- a/src/main/java/org/example/alfs/entities/AuditLog.java +++ b/src/main/java/org/example/alfs/entities/AuditLog.java @@ -41,5 +41,5 @@ public void prePersist() { private Ticket ticket; @ManyToOne - private SystemUser user; + private User user; } diff --git a/src/main/java/org/example/alfs/entities/Ticket.java b/src/main/java/org/example/alfs/entities/Ticket.java index a5744b5..53ad785 100644 --- a/src/main/java/org/example/alfs/entities/Ticket.java +++ b/src/main/java/org/example/alfs/entities/Ticket.java @@ -43,5 +43,5 @@ public void prePersist() { private List attachment; @ManyToOne - private SystemUser assignedHandler; + private User assignedHandler; } diff --git a/src/main/java/org/example/alfs/entities/TicketComment.java b/src/main/java/org/example/alfs/entities/TicketComment.java index 7c5cc90..8a7df3c 100644 --- a/src/main/java/org/example/alfs/entities/TicketComment.java +++ b/src/main/java/org/example/alfs/entities/TicketComment.java @@ -10,7 +10,7 @@ /* Represents comment on a ticket. -The comments are written by a SystemUser. +The comments are written by a User. */ @Entity @Table(name="ticket_comment") @@ -31,5 +31,5 @@ public class TicketComment { private Ticket ticket; @ManyToOne - private SystemUser author; + private User author; } diff --git a/src/main/java/org/example/alfs/entities/SystemUser.java b/src/main/java/org/example/alfs/entities/User.java similarity index 89% rename from src/main/java/org/example/alfs/entities/SystemUser.java rename to src/main/java/org/example/alfs/entities/User.java index 9d9cef2..344590e 100644 --- a/src/main/java/org/example/alfs/entities/SystemUser.java +++ b/src/main/java/org/example/alfs/entities/User.java @@ -10,11 +10,11 @@ Users have different roles such as admin or investigator. */ @Entity -@Table(name="system_user") +@Table(name="users") @Data @AllArgsConstructor @NoArgsConstructor -public class SystemUser { +public class User { @GeneratedValue @Id From 0791b1bd33f4675464fcb92031d20280e0cc35cf Mon Sep 17 00:00:00 2001 From: Fiona Friberg Date: Mon, 30 Mar 2026 10:00:56 +0200 Subject: [PATCH 08/13] add prePersist on TicketComment --- src/main/java/org/example/alfs/entities/TicketComment.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/org/example/alfs/entities/TicketComment.java b/src/main/java/org/example/alfs/entities/TicketComment.java index 8a7df3c..92330a1 100644 --- a/src/main/java/org/example/alfs/entities/TicketComment.java +++ b/src/main/java/org/example/alfs/entities/TicketComment.java @@ -27,6 +27,11 @@ public class TicketComment { private LocalDateTime createdAt; + @PrePersist + public void prePersist() { + createdAt = LocalDateTime.now(); + } + @ManyToOne private Ticket ticket; From a213d26bf18460638ba61c3af27b3d3be80149a6 Mon Sep 17 00:00:00 2001 From: Fiona Friberg Date: Mon, 30 Mar 2026 10:05:48 +0200 Subject: [PATCH 09/13] refactor: replace lombok @Data with @Getter and @Setter in entities --- src/main/java/org/example/alfs/entities/Attachment.java | 7 +++---- src/main/java/org/example/alfs/entities/AuditLog.java | 7 +++---- src/main/java/org/example/alfs/entities/Ticket.java | 7 +++---- src/main/java/org/example/alfs/entities/TicketComment.java | 7 +++---- src/main/java/org/example/alfs/entities/User.java | 7 +++---- 5 files changed, 15 insertions(+), 20 deletions(-) diff --git a/src/main/java/org/example/alfs/entities/Attachment.java b/src/main/java/org/example/alfs/entities/Attachment.java index f60ae00..022797e 100644 --- a/src/main/java/org/example/alfs/entities/Attachment.java +++ b/src/main/java/org/example/alfs/entities/Attachment.java @@ -1,9 +1,7 @@ package org.example.alfs.entities; import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; import java.time.LocalDateTime; @@ -12,7 +10,8 @@ Stores metadata about the file and the file reference s3key. */ @Entity -@Data +@Getter +@Setter @AllArgsConstructor @NoArgsConstructor public class Attachment { diff --git a/src/main/java/org/example/alfs/entities/AuditLog.java b/src/main/java/org/example/alfs/entities/AuditLog.java index 076407b..c61d4ab 100644 --- a/src/main/java/org/example/alfs/entities/AuditLog.java +++ b/src/main/java/org/example/alfs/entities/AuditLog.java @@ -1,9 +1,7 @@ package org.example.alfs.entities; import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; import java.time.LocalDateTime; @@ -14,7 +12,8 @@ */ @Entity @Table(name="audit_log") -@Data +@Getter +@Setter @NoArgsConstructor @AllArgsConstructor public class AuditLog { diff --git a/src/main/java/org/example/alfs/entities/Ticket.java b/src/main/java/org/example/alfs/entities/Ticket.java index 53ad785..9187065 100644 --- a/src/main/java/org/example/alfs/entities/Ticket.java +++ b/src/main/java/org/example/alfs/entities/Ticket.java @@ -1,9 +1,7 @@ package org.example.alfs.entities; import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; import java.time.LocalDateTime; @@ -16,7 +14,8 @@ @Entity @Table(name="ticket") -@Data +@Getter +@Setter @AllArgsConstructor @NoArgsConstructor public class Ticket { diff --git a/src/main/java/org/example/alfs/entities/TicketComment.java b/src/main/java/org/example/alfs/entities/TicketComment.java index 92330a1..93d0027 100644 --- a/src/main/java/org/example/alfs/entities/TicketComment.java +++ b/src/main/java/org/example/alfs/entities/TicketComment.java @@ -1,9 +1,7 @@ package org.example.alfs.entities; import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; import java.time.LocalDateTime; @@ -14,7 +12,8 @@ */ @Entity @Table(name="ticket_comment") -@Data +@Getter +@Setter @AllArgsConstructor @NoArgsConstructor public class TicketComment { diff --git a/src/main/java/org/example/alfs/entities/User.java b/src/main/java/org/example/alfs/entities/User.java index 344590e..6b78186 100644 --- a/src/main/java/org/example/alfs/entities/User.java +++ b/src/main/java/org/example/alfs/entities/User.java @@ -1,9 +1,7 @@ package org.example.alfs.entities; import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; /* Represents a system user. @@ -11,7 +9,8 @@ */ @Entity @Table(name="users") -@Data +@Getter +@Setter @AllArgsConstructor @NoArgsConstructor public class User { From 980a4da4fac9bc515dfa8fb9180405fb7d41c0ba Mon Sep 17 00:00:00 2001 From: Simon Forsberg Date: Mon, 30 Mar 2026 10:59:51 +0200 Subject: [PATCH 10/13] Edit README: adjust heading levels --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8b783b9..f7c68b3 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ # The ALFS Whistleblower Ticket System -### A secure case management system built with Spring Boot for handling whistleblower reports. +## 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: +### Logs should look like this: ```text action = HANDLER_ASSIGNED fieldName = assignedHandler From bce8087ac2d4f60d4ca9567c225efff608ec97dd Mon Sep 17 00:00:00 2001 From: Simon Forsberg Date: Mon, 30 Mar 2026 11:07:09 +0200 Subject: [PATCH 11/13] Update `AuditLog` entity: add column constraints, lazy fetching, and join columns --- src/main/java/org/example/alfs/entities/AuditLog.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/example/alfs/entities/AuditLog.java b/src/main/java/org/example/alfs/entities/AuditLog.java index c61d4ab..eabd823 100644 --- a/src/main/java/org/example/alfs/entities/AuditLog.java +++ b/src/main/java/org/example/alfs/entities/AuditLog.java @@ -11,7 +11,7 @@ Should be written automatically. */ @Entity -@Table(name="audit_log") +@Table(name = "audit_log") @Getter @Setter @NoArgsConstructor @@ -26,19 +26,24 @@ public class AuditLog { private String fieldName; + @Column(length = 4000) private String oldValue; + @Column(length = 4000) private String newValue; private LocalDateTime createdAt; + @PrePersist public void prePersist() { createdAt = LocalDateTime.now(); } - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "ticket_id") private Ticket ticket; - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") private User user; } From 42c24e973cec84dd7218c180a5e917849bbf8b09 Mon Sep 17 00:00:00 2001 From: Simon Forsberg Date: Mon, 30 Mar 2026 11:07:19 +0200 Subject: [PATCH 12/13] Update `Ticket` entity: add column constraints, improve mapping for attachments --- 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 9187065..55f3ff9 100644 --- a/src/main/java/org/example/alfs/entities/Ticket.java +++ b/src/main/java/org/example/alfs/entities/Ticket.java @@ -13,7 +13,7 @@ */ @Entity -@Table(name="ticket") +@Table(name = "ticket") @Getter @Setter @AllArgsConstructor @@ -30,16 +30,18 @@ public class Ticket { private String status; + @Column(nullable = false, unique = true, length = 128, updatable = false) private String reporterToken; private LocalDateTime createdAt; + @PrePersist public void prePersist() { createdAt = LocalDateTime.now(); } - @OneToMany(mappedBy = "ticket") - private List attachment; + @OneToMany(mappedBy = "ticket", cascade = CascadeType.ALL, orphanRemoval = true) + private List attachments; @ManyToOne private User assignedHandler; From 680c9157fec40dfe926e92eeec39f54344c7d0ac Mon Sep 17 00:00:00 2001 From: Simon Forsberg Date: Mon, 30 Mar 2026 11:07:43 +0200 Subject: [PATCH 13/13] Update `User` entity: replace `role` with `Role` enum, rename `password` to `passwordHash` --- src/main/java/org/example/alfs/Role.java | 7 +++++++ src/main/java/org/example/alfs/entities/User.java | 10 +++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 src/main/java/org/example/alfs/Role.java diff --git a/src/main/java/org/example/alfs/Role.java b/src/main/java/org/example/alfs/Role.java new file mode 100644 index 0000000..41dd236 --- /dev/null +++ b/src/main/java/org/example/alfs/Role.java @@ -0,0 +1,7 @@ +package org.example.alfs; + +public enum Role { + REPORTER, + INVESTIGATOR, + ADMIN +} \ No newline at end of file diff --git a/src/main/java/org/example/alfs/entities/User.java b/src/main/java/org/example/alfs/entities/User.java index 6b78186..29b59e1 100644 --- a/src/main/java/org/example/alfs/entities/User.java +++ b/src/main/java/org/example/alfs/entities/User.java @@ -2,13 +2,14 @@ import jakarta.persistence.*; import lombok.*; +import org.example.alfs.Role; /* Represents a system user. Users have different roles such as admin or investigator. */ @Entity -@Table(name="users") +@Table(name = "users") @Getter @Setter @AllArgsConstructor @@ -20,8 +21,11 @@ public class User { private Long id; private String username; - private String password; - private String role; + @Column(name = "password_hash", nullable = false, length = 255) + private String passwordHash; + + @Enumerated(EnumType.STRING) + private Role role; }