From ae4019e34c05977ba1c9d5bc9acd9cfbc12e6316 Mon Sep 17 00:00:00 2001 From: Sean Starkey Date: Sat, 30 May 2026 09:54:09 -0600 Subject: [PATCH] Add JPA entities --- .../seanstarkey/notesvault/entity/Note.java | 56 +++++++++++++++++++ .../notesvault/entity/NoteShare.java | 49 ++++++++++++++++ .../seanstarkey/notesvault/entity/User.java | 41 ++++++++++++++ 3 files changed, 146 insertions(+) create mode 100644 src/main/java/com/seanstarkey/notesvault/entity/Note.java create mode 100644 src/main/java/com/seanstarkey/notesvault/entity/NoteShare.java create mode 100644 src/main/java/com/seanstarkey/notesvault/entity/User.java diff --git a/src/main/java/com/seanstarkey/notesvault/entity/Note.java b/src/main/java/com/seanstarkey/notesvault/entity/Note.java new file mode 100644 index 0000000..3189e46 --- /dev/null +++ b/src/main/java/com/seanstarkey/notesvault/entity/Note.java @@ -0,0 +1,56 @@ +/** + * Note.java + * + * JPA entity representing a user-authored note. + */ +package com.seanstarkey.notesvault.entity; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.hibernate.annotations.UuidGenerator; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import java.time.Instant; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +@Entity +@Table(name = "notes") +@EntityListeners(AuditingEntityListener.class) +@Getter +@Setter +@NoArgsConstructor +public class Note { + + @Id + @UuidGenerator + @Column(updatable = false, nullable = false) + private UUID id; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "owner_id", nullable = false) + private User owner; + + @Column(nullable = false, length = 255) + private String title; + + @Column(nullable = false, columnDefinition = "TEXT") + private String content; + + /** Timestamp set once when the record is first persisted. */ + @CreatedDate + @Column(nullable = false, updatable = false) + private Instant createdAt; + + @LastModifiedDate + @Column(nullable = false) + private Instant updatedAt; + + @OneToMany(mappedBy = "note", cascade = CascadeType.ALL, orphanRemoval = true) + private List shares = new ArrayList<>(); +} diff --git a/src/main/java/com/seanstarkey/notesvault/entity/NoteShare.java b/src/main/java/com/seanstarkey/notesvault/entity/NoteShare.java new file mode 100644 index 0000000..7cc6270 --- /dev/null +++ b/src/main/java/com/seanstarkey/notesvault/entity/NoteShare.java @@ -0,0 +1,49 @@ +/** + * NoteShare.java + * + * JPA entity representing a read-only share grant between a note and a user. + */ +package com.seanstarkey.notesvault.entity; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.hibernate.annotations.UuidGenerator; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import java.time.Instant; +import java.util.UUID; + +@Entity +@Table( + name = "note_shares", + uniqueConstraints = @UniqueConstraint( + name = "uq_note_shares_note_user", + columnNames = {"note_id", "shared_with_user_id"} + ) +) +@EntityListeners(AuditingEntityListener.class) +@Getter +@Setter +@NoArgsConstructor +public class NoteShare { + + @Id + @UuidGenerator + @Column(updatable = false, nullable = false) + private UUID id; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "note_id", nullable = false) + private Note note; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "shared_with_user_id", nullable = false) + private User sharedWith; + + @CreatedDate + @Column(nullable = false, updatable = false) + private Instant createdAt; +} diff --git a/src/main/java/com/seanstarkey/notesvault/entity/User.java b/src/main/java/com/seanstarkey/notesvault/entity/User.java new file mode 100644 index 0000000..52003b7 --- /dev/null +++ b/src/main/java/com/seanstarkey/notesvault/entity/User.java @@ -0,0 +1,41 @@ +/** + * User.java + * + * JPA entity representing an application user. + */ +package com.seanstarkey.notesvault.entity; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.hibernate.annotations.UuidGenerator; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import java.time.Instant; +import java.util.UUID; + +@Entity +@Table(name = "users") +@EntityListeners(AuditingEntityListener.class) +@Getter +@Setter +@NoArgsConstructor +public class User { + + @Id + @UuidGenerator + @Column(updatable = false, nullable = false) + private UUID id; + + @Column(nullable = false, unique = true, length = 100) + private String username; + + @Column(nullable = false) + private String passwordHash; + + @CreatedDate + @Column(nullable = false, updatable = false) + private Instant createdAt; +}