diff --git a/00-backend/src/main/java/de/htwsaar/webshop/repository/AccountRepository.java b/00-backend/src/main/java/de/htwsaar/webshop/repository/AccountRepository.java new file mode 100644 index 0000000..65109d4 --- /dev/null +++ b/00-backend/src/main/java/de/htwsaar/webshop/repository/AccountRepository.java @@ -0,0 +1,10 @@ +package de.htwsaar.webshop.repository; + +import de.htwsaar.webshop.repository.entities.Account; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface AccountRepository extends JpaRepository { + +} diff --git a/00-backend/src/main/java/de/htwsaar/webshop/repository/ArticleConfigurationRepository.java b/00-backend/src/main/java/de/htwsaar/webshop/repository/ArticleConfigurationRepository.java new file mode 100644 index 0000000..aa4f810 --- /dev/null +++ b/00-backend/src/main/java/de/htwsaar/webshop/repository/ArticleConfigurationRepository.java @@ -0,0 +1,9 @@ +package de.htwsaar.webshop.repository; + +import de.htwsaar.webshop.repository.entities.ArticleConfiguration; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ArticleConfigurationRepository extends JpaRepository { +} diff --git a/00-backend/src/main/java/de/htwsaar/webshop/repository/CustomerRepository.java b/00-backend/src/main/java/de/htwsaar/webshop/repository/CustomerRepository.java new file mode 100644 index 0000000..c126362 --- /dev/null +++ b/00-backend/src/main/java/de/htwsaar/webshop/repository/CustomerRepository.java @@ -0,0 +1,10 @@ +package de.htwsaar.webshop.repository; + +import de.htwsaar.webshop.repository.entities.Customer; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface CustomerRepository extends JpaRepository { + +} diff --git a/00-backend/src/main/java/de/htwsaar/webshop/repository/OrderItemRepository.java b/00-backend/src/main/java/de/htwsaar/webshop/repository/OrderItemRepository.java new file mode 100644 index 0000000..cc66cfb --- /dev/null +++ b/00-backend/src/main/java/de/htwsaar/webshop/repository/OrderItemRepository.java @@ -0,0 +1,10 @@ +package de.htwsaar.webshop.repository; + +import de.htwsaar.webshop.repository.entities.OrderItem; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface OrderItemRepository extends JpaRepository { + +} diff --git a/00-backend/src/main/java/de/htwsaar/webshop/repository/OrderRepository.java b/00-backend/src/main/java/de/htwsaar/webshop/repository/OrderRepository.java new file mode 100644 index 0000000..a2e1c8a --- /dev/null +++ b/00-backend/src/main/java/de/htwsaar/webshop/repository/OrderRepository.java @@ -0,0 +1,9 @@ +package de.htwsaar.webshop.repository; + +import de.htwsaar.webshop.repository.entities.Order; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface OrderRepository extends JpaRepository { +} diff --git a/00-backend/src/main/java/de/htwsaar/webshop/repository/entities/Account.java b/00-backend/src/main/java/de/htwsaar/webshop/repository/entities/Account.java new file mode 100644 index 0000000..61a57e3 --- /dev/null +++ b/00-backend/src/main/java/de/htwsaar/webshop/repository/entities/Account.java @@ -0,0 +1,32 @@ +package de.htwsaar.webshop.repository.entities; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Entity +@Table(name = "Accounts") +public class Account { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "customerId", nullable = false) + private Customer customer; + + @Column(nullable = false, unique = true) + private String email; + + @Column(nullable = false) + private String password; + + @Column(name = "lang_i18n", nullable = false) + private String langI18n; +} diff --git a/00-backend/src/main/java/de/htwsaar/webshop/repository/entities/Article.java b/00-backend/src/main/java/de/htwsaar/webshop/repository/entities/Article.java index 6e7eec5..c146831 100644 --- a/00-backend/src/main/java/de/htwsaar/webshop/repository/entities/Article.java +++ b/00-backend/src/main/java/de/htwsaar/webshop/repository/entities/Article.java @@ -3,19 +3,16 @@ package de.htwsaar.webshop.repository.entities; import jakarta.persistence.*; import jakarta.validation.constraints.Max; import jakarta.validation.constraints.Min; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; +import lombok.*; import java.util.UUID; -@Entity @Getter @Setter @AllArgsConstructor @NoArgsConstructor -@Table(name = "Article") +@Entity +@Table(name = "Articles") public class Article { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/00-backend/src/main/java/de/htwsaar/webshop/repository/entities/ArticleConfiguration.java b/00-backend/src/main/java/de/htwsaar/webshop/repository/entities/ArticleConfiguration.java new file mode 100644 index 0000000..44a7439 --- /dev/null +++ b/00-backend/src/main/java/de/htwsaar/webshop/repository/entities/ArticleConfiguration.java @@ -0,0 +1,29 @@ +package de.htwsaar.webshop.repository.entities; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +/** + * An Article Configuration, for example T-Shirt Sizes (S,M,L,XL) + */ +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Entity +@Table(name = "ArticleConfigurations") +public class ArticleConfiguration { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id", nullable = false) + private Long id; + + @Column(name = "articleId", nullable = false) + private Long articleId; + + @Column(name = "name", nullable = false) + private String name; +} diff --git a/00-backend/src/main/java/de/htwsaar/webshop/repository/entities/Customer.java b/00-backend/src/main/java/de/htwsaar/webshop/repository/entities/Customer.java new file mode 100644 index 0000000..fec34ee --- /dev/null +++ b/00-backend/src/main/java/de/htwsaar/webshop/repository/entities/Customer.java @@ -0,0 +1,35 @@ +package de.htwsaar.webshop.repository.entities; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Entity +@Table(name = "Customers") +public class Customer { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id", nullable = false) + private Long id; + + @Column(name = "name", nullable = false) + private String name; + + @Column(name = "surname", nullable = false) + private String surname; + + @Column(name = "address", nullable = false) + private String address; + + @Column(name = "country", nullable = false) + private String country; + + @Column(name = "zip", nullable = false) + private String zip; +} diff --git a/00-backend/src/main/java/de/htwsaar/webshop/repository/entities/Image.java b/00-backend/src/main/java/de/htwsaar/webshop/repository/entities/Image.java index 80e9eab..f459942 100644 --- a/00-backend/src/main/java/de/htwsaar/webshop/repository/entities/Image.java +++ b/00-backend/src/main/java/de/htwsaar/webshop/repository/entities/Image.java @@ -6,12 +6,12 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -@Entity @Getter @Setter @NoArgsConstructor @AllArgsConstructor -@Table(name = "Image") +@Entity +@Table(name = "Images") public class Image { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/00-backend/src/main/java/de/htwsaar/webshop/repository/entities/Order.java b/00-backend/src/main/java/de/htwsaar/webshop/repository/entities/Order.java new file mode 100644 index 0000000..a8ded50 --- /dev/null +++ b/00-backend/src/main/java/de/htwsaar/webshop/repository/entities/Order.java @@ -0,0 +1,18 @@ +package de.htwsaar.webshop.repository.entities; + +import jakarta.persistence.*; + +@Entity +@Table(name = "Orders") +public class Order { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @MapsId("customerId") + private Customer customer; + + @Column(name = "time") + private Long time; +} diff --git a/00-backend/src/main/java/de/htwsaar/webshop/repository/entities/OrderItem.java b/00-backend/src/main/java/de/htwsaar/webshop/repository/entities/OrderItem.java new file mode 100644 index 0000000..ab89e98 --- /dev/null +++ b/00-backend/src/main/java/de/htwsaar/webshop/repository/entities/OrderItem.java @@ -0,0 +1,51 @@ +package de.htwsaar.webshop.repository.entities; + +import jakarta.persistence.*; +import jakarta.validation.constraints.Min; +import lombok.*; +import org.hibernate.annotations.OnDelete; + +import java.io.Serializable; +import java.util.Objects; + +@Entity +@Table(name = "OrderItems") +public class OrderItem { + + @EmbeddedId + private OrderItemId id; + + @Column(nullable = false) + @Min(value = 1, message = "Amount must be at least 1") + private Integer amount; + + @ManyToOne(fetch = FetchType.LAZY) + @MapsId("orderId") + @JoinColumn(name = "orderId", referencedColumnName = "id", nullable = false) + @OnDelete(action = org.hibernate.annotations.OnDeleteAction.CASCADE) + private Order order; + + @ManyToOne(fetch = FetchType.LAZY) + @MapsId("articleId") + @JoinColumn(name = "articleId", referencedColumnName = "id", nullable = false) + @OnDelete(action = org.hibernate.annotations.OnDeleteAction.SET_NULL) + private Article article; + + @ManyToOne(fetch = FetchType.LAZY) + @MapsId("articleConfId") + @JoinColumn(name = "articleConfId", referencedColumnName = "id") + @OnDelete(action = org.hibernate.annotations.OnDeleteAction.SET_NULL) + private ArticleConfiguration articleConfig; + + @AllArgsConstructor + @NoArgsConstructor + @Getter + @Setter + @EqualsAndHashCode + @Embeddable + class OrderItemId implements Serializable { + private Long orderId; + private Long articleId; + private Long articleConfId; + } +} diff --git a/00-backend/src/main/java/de/htwsaar/webshop/repository/entities/Review.java b/00-backend/src/main/java/de/htwsaar/webshop/repository/entities/Review.java index 8ec9567..84e8cf0 100644 --- a/00-backend/src/main/java/de/htwsaar/webshop/repository/entities/Review.java +++ b/00-backend/src/main/java/de/htwsaar/webshop/repository/entities/Review.java @@ -2,18 +2,18 @@ package de.htwsaar.webshop.repository.entities; import jakarta.persistence.*; import jakarta.validation.constraints.Max; -import jakarta.validation.constraints.Positive; import lombok.AllArgsConstructor; +import jakarta.validation.constraints.PositiveOrZero; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -@Entity -@Getter -@Setter @AllArgsConstructor @NoArgsConstructor -@Table(name = "Review") +@Getter +@Setter +@Entity +@Table(name = "Reviews") public class Review { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -23,11 +23,11 @@ public class Review { @Column(name = "content", nullable = false) private String content; - @Positive - @Column(name = "articleId", nullable = false) - private Long articleId; + @ManyToOne(fetch = FetchType.LAZY) + @MapsId("articleId") + private Article article; - @Positive + @PositiveOrZero @Max(10) @Column(name = "rating", nullable = false) private Integer rating; diff --git a/00-backend/src/main/resources/db/DBv2.sql b/00-backend/src/main/resources/db/DBv2.sql new file mode 100644 index 0000000..7795aad --- /dev/null +++ b/00-backend/src/main/resources/db/DBv2.sql @@ -0,0 +1,20 @@ +DROP TABLE IF EXISTS OrderItems; + +CREATE TABLE IF NOT EXISTS OrderItems( + orderId INTEGER NOT NULL, + articleId INTEGER NOT NULL, + articleConfId INTEGER NULL, + amount INTEGER NOT NULL, + + PRIMARY KEY (orderId, articleId, articleConfId), -- added + CONSTRAINT cAmount CHECK (amount > 0), + FOREIGN KEY (orderId) REFERENCES Orders(id) + ON DELETE CASCADE + ON UPDATE CASCADE, + FOREIGN KEY (articleId) REFERENCES Articles(id) + ON DELETE SET NULL + ON UPDATE CASCADE, + FOREIGN KEY (articleConfId) REFERENCES ArticleConfigurations(id) + ON DELETE SET NULL + ON UPDATE CASCADE +); \ No newline at end of file