Просмотр исходного кода

improving models and creating order service

Vlada645 1 месяц назад
Родитель
Сommit
5baf4e61fd

+ 33 - 0
final project/database/src/main/java/pl/dmss/vmaneliuk/database/model/BugReport.java

@@ -0,0 +1,33 @@
+package pl.dmss.vmaneliuk.database.model;
+
+import jakarta.persistence.*;
+import java.time.LocalDateTime;
+
+@Entity
+@Table(name = "bug_reports")
+public class BugReport {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long reportId;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "user_id", nullable = false)
+    private User user;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "game_id", nullable = false)
+    private Game game;
+
+    @Column(nullable = false)
+    private String title;
+
+    @Column(columnDefinition = "TEXT", nullable = false)
+    private String bodyText;
+
+    private String severityLevel;
+
+    private String reportStatus;
+
+    private LocalDateTime createdAt;
+}

+ 2 - 2
final project/database/src/main/java/pl/dmss/vmaneliuk/database/model/Library.java

@@ -15,8 +15,8 @@ public class Library {
     @JoinColumn(name = "user_id", nullable = false)
     private User user;
 
-    private int totalGameCount;
-    private int totalPlaytimeSum;
+    private Integer totalGameCount;
+    private Integer totalPlaytimeSum;
     private float avgLibraryRating;
 
     public void setUser(User newUser) { user = newUser;}

+ 57 - 0
final project/database/src/main/java/pl/dmss/vmaneliuk/database/model/LibraryItem.java

@@ -0,0 +1,57 @@
+package pl.dmss.vmaneliuk.database.model;
+
+import jakarta.persistence.*;
+import java.time.LocalDateTime;
+
+@Entity
+@Table(name = "library_item")
+public class LibraryItem {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long itemId;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "library_id", nullable = false)
+    private Library library;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "game_id", nullable = false)
+    private Game game;
+
+    private Integer playtimeMinutes;
+
+    private LocalDateTime lastPlayedAt;
+
+    private String ownershipType;
+
+    // Default constructor (required by JPA)
+    public LibraryItem() {
+    }
+
+    // Getters and Setters
+
+    public Long getItemId() {return itemId;}
+
+    public void setItemId(Long itemId) {this.itemId = itemId;}
+
+    public Library getLibrary() {return library;}
+
+    public void setLibrary(Library library) {this.library = library;}
+
+    public Game getGame() {return game;}
+
+    public void setGame(Game game) {this.game = game;}
+
+    public Integer getPlaytimeMinutes() {return playtimeMinutes;}
+
+    public void setPlaytimeMinutes(Integer playtimeMinutes) {this.playtimeMinutes = playtimeMinutes;}
+
+    public LocalDateTime getLastPlayedAt() {return lastPlayedAt;}
+
+    public void setLastPlayedAt(LocalDateTime lastPlayedAt) {this.lastPlayedAt = lastPlayedAt;}
+
+    public String getOwnershipType() {return ownershipType;}
+
+    public void setOwnershipType(String ownershipType) {this.ownershipType = ownershipType;}
+}

+ 73 - 0
final project/database/src/main/java/pl/dmss/vmaneliuk/database/model/Order.java

@@ -0,0 +1,73 @@
+package pl.dmss.vmaneliuk.database.model;
+
+import jakarta.persistence.*;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Entity
+@Table(name = "orders")
+public class Order {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long orderId;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "user_id", nullable = false)
+    private User user;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "game_id", nullable = false)
+    private Game game;
+
+    @Column(nullable = false)
+    private BigDecimal subtotal;
+
+    private BigDecimal discountApplied;
+
+    @Column(nullable = false)
+    private BigDecimal finalPrice;
+
+    @Column(nullable = false)
+    private String paymentStatus;
+
+    @Column(nullable = false)
+    private LocalDateTime orderDate;
+
+    // Default constructor (required by JPA)
+    public Order() {}
+
+    // Getters and Setters
+
+    public Long getOrderId() {return orderId;}
+
+    public void setOrderId(Long orderId) {this.orderId = orderId;}
+
+    public User getUser() {return user;}
+
+    public void setUser(User user) {this.user = user;}
+
+    public Game getGame() {return game;}
+
+    public void setGame(Game game) {this.game = game;}
+
+    public BigDecimal getSubtotal() {return subtotal;}
+
+    public void setSubtotal(BigDecimal subtotal) {this.subtotal = subtotal;}
+
+    public BigDecimal getDiscountApplied() {return discountApplied;}
+
+    public void setDiscountApplied(BigDecimal discountApplied) {this.discountApplied = discountApplied;}
+
+    public BigDecimal getFinalPrice() {return finalPrice;}
+
+    public void setFinalPrice(BigDecimal finalPrice) {this.finalPrice = finalPrice;}
+
+    public String getPaymentStatus() {return paymentStatus;}
+
+    public void setPaymentStatus(String paymentStatus) {this.paymentStatus = paymentStatus;}
+
+    public LocalDateTime getOrderDate() {return orderDate;}
+
+    public void setOrderDate(LocalDateTime orderDate) {this.orderDate = orderDate;}
+}

+ 42 - 11
final project/database/src/main/java/pl/dmss/vmaneliuk/database/model/User.java

@@ -1,22 +1,21 @@
 package pl.dmss.vmaneliuk.database.model;
 
 import jakarta.persistence.*;
-
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 
 @Entity
 @Table(name = "users")
 public class User {
+
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long userId;
 
-
     @Column(nullable = false)
     private String fullName;
 
-    @Column(nullable = false)
+    @Column(nullable = false, unique = true)
     private String email;
 
     @Column(nullable = false)
@@ -27,15 +26,47 @@ public class User {
     private BigDecimal walletBalance;
     private BigDecimal totalSpent;
 
-    @OneToOne(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY )
+    @OneToOne(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
     private Library library;
 
-    public void setMemberSince(LocalDateTime now) { memberSince = now;}
-    public void setAccountStatus(String status) {accountStatus = status;}
-    public void setWalletBalance(BigDecimal newWalletBalance) {walletBalance = newWalletBalance;}
-    public void setTotalSpent(BigDecimal spent) { totalSpent = spent;}
+    // Default constructor (required by JPA)
+    public User() {}
+
+    // Getters and Setters
+
+    public Long getUserId() {return userId;}
+
+    public void setUserId(Long userId) {this.userId = userId;}
+
+    public String getFullName() {return fullName;}
+
+    public void setFullName(String fullName) {this.fullName = fullName;}
+
+    public String getEmail() {return email;}
+
+    public void setEmail(String email) {this.email = email;}
+
+    public String getPasswordHash() {return passwordHash;}
+
+    public void setPasswordHash(String passwordHash) {this.passwordHash = passwordHash;}
+
+    public String getAccountStatus() {return accountStatus;}
+
+    public void setAccountStatus(String accountStatus) {this.accountStatus = accountStatus;}
+
+    public LocalDateTime getMemberSince() {return memberSince;}
+
+    public void setMemberSince(LocalDateTime memberSince) {this.memberSince = memberSince;}
+
+    public BigDecimal getWalletBalance() {return walletBalance;}
+
+    public void setWalletBalance(BigDecimal walletBalance) {this.walletBalance = walletBalance;}
+
+    public BigDecimal getTotalSpent() {return totalSpent;}
+
+    public void setTotalSpent(BigDecimal totalSpent) {this.totalSpent = totalSpent;}
 
-    public void setLibrary(Library library) {
-    }
-}
+    public Library getLibrary() {return library;}
 
+    public void setLibrary(Library library) {this.library = library;}
+}

+ 9 - 0
final project/database/src/main/java/pl/dmss/vmaneliuk/database/repository/BugReportRepository.java

@@ -0,0 +1,9 @@
+package pl.dmss.vmaneliuk.database.repository;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+import pl.dmss.vmaneliuk.database.model.BugReport;
+
+@Repository
+public interface BugReportRepository extends JpaRepository<BugReport, Long> {
+}

+ 9 - 0
final project/database/src/main/java/pl/dmss/vmaneliuk/database/repository/LibraryItemRepository.java

@@ -0,0 +1,9 @@
+package pl.dmss.vmaneliuk.database.repository;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+import pl.dmss.vmaneliuk.database.model.LibraryItem;
+
+@Repository
+public interface LibraryItemRepository extends JpaRepository<LibraryItem, Long> {
+}

+ 9 - 0
final project/database/src/main/java/pl/dmss/vmaneliuk/database/repository/OrderRepository.java

@@ -0,0 +1,9 @@
+package pl.dmss.vmaneliuk.database.repository;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+import pl.dmss.vmaneliuk.database.model.Order;
+
+@Repository
+public interface OrderRepository extends JpaRepository<Order, Long> {
+}

+ 47 - 0
final project/database/src/main/java/pl/dmss/vmaneliuk/database/services/OrderService.java

@@ -0,0 +1,47 @@
+package pl.dmss.vmaneliuk.database.services;
+
+import pl.dmss.vmaneliuk.database.model.*;
+import pl.dmss.vmaneliuk.database.repository.*;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import java.time.LocalDateTime;
+
+@Service
+public class OrderService {
+
+    private final OrderRepository orderRepository;
+    private final UserRepository userRepository;
+    private final LibraryItemRepository libraryItemRepository;
+
+    public OrderService(OrderRepository orderRepository, UserRepository userRepository, LibraryItemRepository libraryItemRepository) {
+        this.orderRepository = orderRepository;
+        this.userRepository = userRepository;
+        this.libraryItemRepository = libraryItemRepository;
+    }
+
+    @Transactional
+    public Order placeOrder(User user, Game game, Order order) {
+        // 1. Update user's wallet balance and spending history
+        user.setWalletBalance(user.getWalletBalance().subtract(order.getFinalPrice()));
+        user.setTotalSpent(user.getTotalSpent().add(order.getFinalPrice()));
+        userRepository.save(user);
+
+        // 2. Save the order details
+        order.setUser(user);
+        order.setGame(game);
+        order.setOrderDate(LocalDateTime.now());
+        order.setPaymentStatus("COMPLETED");
+        Order savedOrder = orderRepository.save(order);
+
+        // 3. Add the game to the user's library
+        LibraryItem item = new LibraryItem();
+        item.setLibrary((Library) user.getLibrary());
+        item.setGame(game);
+        item.setPlaytimeMinutes(0);
+        item.setLastPlayedAt(null);
+        item.setOwnershipType("PURCHASED");
+        libraryItemRepository.save(item);
+
+        return savedOrder;
+    }
+}