From de1df474747732cd1915d8986e5aee94706c6c17 Mon Sep 17 00:00:00 2001 From: Vincent Guillet Date: Tue, 14 Oct 2025 14:50:17 +0200 Subject: [PATCH] add entities for Brand, Category, Condition, Image, Platform, and Product with relationships --- .../fr/gameovergne/api/model/app/Brand.java | 30 +++++++++ .../gameovergne/api/model/app/Category.java | 31 ++++++++++ .../gameovergne/api/model/app/Condition.java | 18 ++++++ .../fr/gameovergne/api/model/app/Image.java | 48 ++++++++++++++ .../gameovergne/api/model/app/Platform.java | 34 ++++++++++ .../fr/gameovergne/api/model/app/Product.java | 62 +++++++++++++++++++ .../fr/gameovergne/api/model/user/User.java | 20 ++++-- 7 files changed, 238 insertions(+), 5 deletions(-) create mode 100644 api/src/main/java/fr/gameovergne/api/model/app/Brand.java create mode 100644 api/src/main/java/fr/gameovergne/api/model/app/Category.java create mode 100644 api/src/main/java/fr/gameovergne/api/model/app/Condition.java create mode 100644 api/src/main/java/fr/gameovergne/api/model/app/Image.java create mode 100644 api/src/main/java/fr/gameovergne/api/model/app/Platform.java create mode 100644 api/src/main/java/fr/gameovergne/api/model/app/Product.java diff --git a/api/src/main/java/fr/gameovergne/api/model/app/Brand.java b/api/src/main/java/fr/gameovergne/api/model/app/Brand.java new file mode 100644 index 0000000..fb9bc75 --- /dev/null +++ b/api/src/main/java/fr/gameovergne/api/model/app/Brand.java @@ -0,0 +1,30 @@ +package fr.gameovergne.api.model.app; + +import com.fasterxml.jackson.annotation.JsonManagedReference; +import jakarta.persistence.*; +import jakarta.validation.constraints.NotBlank; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Entity +@Data +@AllArgsConstructor +@NoArgsConstructor +@Table(name = "brands") +public class Brand { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotBlank + @Column(name = "brand_name", length = 30, unique = true) + private String name; + + @OneToMany(mappedBy = "brand", cascade = CascadeType.ALL, orphanRemoval = true) + @JsonManagedReference + private List platforms; +} diff --git a/api/src/main/java/fr/gameovergne/api/model/app/Category.java b/api/src/main/java/fr/gameovergne/api/model/app/Category.java new file mode 100644 index 0000000..7c3133a --- /dev/null +++ b/api/src/main/java/fr/gameovergne/api/model/app/Category.java @@ -0,0 +1,31 @@ +package fr.gameovergne.api.model.app; + +import com.fasterxml.jackson.annotation.JsonManagedReference; +import jakarta.persistence.*; +import jakarta.validation.constraints.NotBlank; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + + +@Entity +@Data +@AllArgsConstructor +@NoArgsConstructor +@Table(name = "categories") +public class Category { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @NotBlank + @Column(name = "category_name", length = 30, unique = true, nullable = false) + private String name; + + @OneToMany(mappedBy = "category", cascade = CascadeType.ALL, orphanRemoval = true) + @JsonManagedReference + private List products; +} diff --git a/api/src/main/java/fr/gameovergne/api/model/app/Condition.java b/api/src/main/java/fr/gameovergne/api/model/app/Condition.java new file mode 100644 index 0000000..59baf30 --- /dev/null +++ b/api/src/main/java/fr/gameovergne/api/model/app/Condition.java @@ -0,0 +1,18 @@ +package fr.gameovergne.api.model.app; + +import lombok.Getter; + +@Getter +public enum Condition { + NEW("Neuf"), + VERY_GOOD("Très bon état"), + GOOD("Bon état"), + POOR("Mauvais état"), + VERY_POOR("Très mauvais état"); + + private final String displayName; + + Condition(String displayName) { + this.displayName = displayName; + } +} diff --git a/api/src/main/java/fr/gameovergne/api/model/app/Image.java b/api/src/main/java/fr/gameovergne/api/model/app/Image.java new file mode 100644 index 0000000..18b5f1e --- /dev/null +++ b/api/src/main/java/fr/gameovergne/api/model/app/Image.java @@ -0,0 +1,48 @@ +package fr.gameovergne.api.model.app; + +import com.fasterxml.jackson.annotation.JsonBackReference; +import fr.gameovergne.api.model.user.User; +import jakarta.persistence.*; +import jakarta.validation.constraints.NotBlank; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Entity +@Data +@AllArgsConstructor +@NoArgsConstructor +@Table(name = "images") +public class Image { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(length = 120, unique = true, nullable = false) + @NotBlank + private String title; + + @Column(length = 255, unique = true, nullable = false) + @NotBlank + private String url; + + @ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}) + @JoinTable( + name = "user_images", + joinColumns = @JoinColumn(name = "image_id"), + inverseJoinColumns = @JoinColumn(name = "user_id") + ) + @JsonBackReference + private List users; + + @ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}) + @JoinTable( + name = "product_images", + joinColumns = @JoinColumn(name = "image_id"), + inverseJoinColumns = @JoinColumn(name = "product_id") + ) + private List products; +} diff --git a/api/src/main/java/fr/gameovergne/api/model/app/Platform.java b/api/src/main/java/fr/gameovergne/api/model/app/Platform.java new file mode 100644 index 0000000..d3ab8bf --- /dev/null +++ b/api/src/main/java/fr/gameovergne/api/model/app/Platform.java @@ -0,0 +1,34 @@ +package fr.gameovergne.api.model.app; + +import com.fasterxml.jackson.annotation.JsonManagedReference; +import jakarta.persistence.*; +import jakarta.validation.constraints.NotBlank; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Entity +@Data +@AllArgsConstructor +@NoArgsConstructor +@Table(name = "platforms") +public class Platform { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotBlank + @Column(name = "platform_name", length = 30, unique = true, nullable = false) + private String name; + + @ManyToOne + @JoinColumn(name = "brand_id") + private Brand brand; + + @OneToMany(mappedBy = "platform", cascade = CascadeType.ALL, orphanRemoval = true) + @JsonManagedReference + private List products; +} diff --git a/api/src/main/java/fr/gameovergne/api/model/app/Product.java b/api/src/main/java/fr/gameovergne/api/model/app/Product.java new file mode 100644 index 0000000..1fb9f83 --- /dev/null +++ b/api/src/main/java/fr/gameovergne/api/model/app/Product.java @@ -0,0 +1,62 @@ +package fr.gameovergne.api.model.app; + +import com.fasterxml.jackson.annotation.JsonBackReference; +import jakarta.persistence.*; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + + +@Entity +@Data +@AllArgsConstructor +@NoArgsConstructor +@Table(name = "products") +public class Product { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotBlank + @Column(name = "product_title", length = 120, unique = true, nullable = false) + private String title; + + @Column(name = "product_description", length = 500) + private String description; + + @NotNull + @Column(name = "product_complete") + private boolean complete = false; + + @NotNull + @Column(name = "product_manual") + private boolean manual = false; // Notice + + @ManyToOne + @JoinColumn(name = "category_id") + @JsonBackReference + private Category category; + + @ManyToOne + @JoinColumn(name = "platform_id") + @JsonBackReference + private Platform platform; + + @NotNull + @Enumerated(EnumType.STRING) + @Column(name = "product_condition") + private Condition condition; + + @ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}) + @JoinTable( + name = "product_images", + joinColumns = @JoinColumn(name = "image_id"), + inverseJoinColumns = @JoinColumn(name = "product_id") + ) + private List images; +} diff --git a/api/src/main/java/fr/gameovergne/api/model/user/User.java b/api/src/main/java/fr/gameovergne/api/model/user/User.java index 80635ee..2b1ffa4 100644 --- a/api/src/main/java/fr/gameovergne/api/model/user/User.java +++ b/api/src/main/java/fr/gameovergne/api/model/user/User.java @@ -1,6 +1,8 @@ package fr.gameovergne.api.model.user; +import com.fasterxml.jackson.annotation.JsonBackReference; import com.fasterxml.jackson.annotation.JsonManagedReference; +import fr.gameovergne.api.model.app.Image; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; @@ -28,26 +30,34 @@ public class User implements UserDetails { private Long id; @NotBlank - @Column(length = 50, nullable = false) + @Column(length = 30, nullable = false) private String firstName; @NotBlank - @Column(length = 50, nullable = false) + @Column(length = 30, nullable = false) private String lastName; - @NotBlank - @Column(length = 50, unique = true, nullable = false) + @Column(length = 0) private String username; @Email @NotBlank - @Column(length = 100, unique = true, nullable = false) + @Column(length = 120, unique = true, nullable = false) private String email; @NotBlank @Column(length = 120, nullable = false) private String password; + @ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}) + @JoinTable( + name = "user_images", + joinColumns = @JoinColumn(name = "image_id"), + inverseJoinColumns = @JoinColumn(name = "user_id") + ) + @JsonBackReference + private List images; + @NotNull @Enumerated(EnumType.STRING) private Role role = Role.USER;