add entities for Brand, Category, Condition, Image, Platform, and Product with relationships

This commit is contained in:
Vincent Guillet
2025-10-14 14:50:17 +02:00
parent 7769cc7ded
commit de1df47474
7 changed files with 238 additions and 5 deletions

View File

@@ -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<Platform> platforms;
}

View File

@@ -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<Product> products;
}

View File

@@ -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;
}
}

View File

@@ -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<User> 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<Product> products;
}

View File

@@ -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<Product> products;
}

View File

@@ -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<Image> images;
}

View File

@@ -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<Image> images;
@NotNull
@Enumerated(EnumType.STRING)
private Role role = Role.USER;