diff --git a/src/main/java/mate/academy/Main.java b/src/main/java/mate/academy/Main.java index df492aecc..da8cd70e4 100644 --- a/src/main/java/mate/academy/Main.java +++ b/src/main/java/mate/academy/Main.java @@ -2,16 +2,25 @@ import java.time.LocalDate; import java.time.LocalDateTime; +import mate.academy.exception.RegistrationException; +import mate.academy.lib.Injector; import mate.academy.model.CinemaHall; import mate.academy.model.Movie; import mate.academy.model.MovieSession; +import mate.academy.model.User; +import mate.academy.security.AuthenticationService; import mate.academy.service.CinemaHallService; import mate.academy.service.MovieService; import mate.academy.service.MovieSessionService; +import mate.academy.service.OrderService; +import mate.academy.service.ShoppingCartService; public class Main { - public static void main(String[] args) { - MovieService movieService = null; + private static Injector injector = Injector.getInstance("mate.academy"); + + public static void main(String[] args) throws RegistrationException { + MovieService movieService = + (MovieService) injector.getInstance(MovieService.class); Movie fastAndFurious = new Movie("Fast and Furious"); fastAndFurious.setDescription("An action film about street racing, heists, and spies."); @@ -27,7 +36,8 @@ public static void main(String[] args) { secondCinemaHall.setCapacity(200); secondCinemaHall.setDescription("second hall with capacity 200"); - CinemaHallService cinemaHallService = null; + CinemaHallService cinemaHallService = + (CinemaHallService) injector.getInstance(CinemaHallService.class); cinemaHallService.add(firstCinemaHall); cinemaHallService.add(secondCinemaHall); @@ -44,12 +54,28 @@ public static void main(String[] args) { yesterdayMovieSession.setMovie(fastAndFurious); yesterdayMovieSession.setShowTime(LocalDateTime.now().minusDays(1L)); - MovieSessionService movieSessionService = null; + MovieSessionService movieSessionService = + (MovieSessionService) injector.getInstance(MovieSessionService.class); movieSessionService.add(tomorrowMovieSession); movieSessionService.add(yesterdayMovieSession); System.out.println(movieSessionService.get(yesterdayMovieSession.getId())); System.out.println(movieSessionService.findAvailableSessions( fastAndFurious.getId(), LocalDate.now())); + + AuthenticationService authenticationService = + (AuthenticationService) injector.getInstance(AuthenticationService.class); + + User newUser = authenticationService.register("email", "password"); + + ShoppingCartService shoppingCartService = + (ShoppingCartService) injector.getInstance(ShoppingCartService.class); + + shoppingCartService.addSession(yesterdayMovieSession, newUser); + shoppingCartService.addSession(tomorrowMovieSession, newUser); + + OrderService orderService = (OrderService) injector.getInstance(OrderService.class); + System.out.println(orderService.completeOrder(shoppingCartService.getByUser(newUser))); + System.out.println(orderService.getOrdersHistory(newUser)); } } diff --git a/src/main/java/mate/academy/dao/OrderDao.java b/src/main/java/mate/academy/dao/OrderDao.java new file mode 100644 index 000000000..a406dd5a8 --- /dev/null +++ b/src/main/java/mate/academy/dao/OrderDao.java @@ -0,0 +1,11 @@ +package mate.academy.dao; + +import java.util.List; +import mate.academy.model.Order; +import mate.academy.model.User; + +public interface OrderDao { + Order add(Order order); + + List getByUser(User user); +} diff --git a/src/main/java/mate/academy/dao/impl/OrderDaoImpl.java b/src/main/java/mate/academy/dao/impl/OrderDaoImpl.java new file mode 100644 index 000000000..a6a4d010d --- /dev/null +++ b/src/main/java/mate/academy/dao/impl/OrderDaoImpl.java @@ -0,0 +1,52 @@ +package mate.academy.dao.impl; + +import java.util.List; +import mate.academy.dao.OrderDao; +import mate.academy.exception.DataProcessingException; +import mate.academy.lib.Dao; +import mate.academy.model.Order; +import mate.academy.model.User; +import mate.academy.util.HibernateUtil; +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.hibernate.query.Query; + +@Dao +public class OrderDaoImpl implements OrderDao { + @Override + public Order add(Order order) { + Session session = null; + Transaction transaction = null; + try { + session = HibernateUtil.getSessionFactory().openSession(); + transaction = session.beginTransaction(); + session.persist(order); + transaction.commit(); + return order; + } catch (Exception e) { + if (transaction != null) { + transaction.rollback(); + } + throw new DataProcessingException("can't add new order: " + order, e); + } finally { + if (session != null) { + session.close(); + } + } + } + + @Override + public List getByUser(User user) { + try (Session session = HibernateUtil.getSessionFactory().openSession()) { + Query getByUserQuery = session.createQuery("FROM Order o " + + "LEFT JOIN FETCH o.ticketList t " + + "LEFT JOIN FETCH t.movieSession ms " + + "LEFT JOIN FETCH ms.cinemaHall " + + "LEFT JOIN FETCH ms.movie " + + "WHERE o.user.id = :id"); + return getByUserQuery.setParameter("id", user.getId()).getResultList(); + } catch (Exception e) { + throw new DataProcessingException("Can't find order by user: " + user, e); + } + } +} diff --git a/src/main/java/mate/academy/model/Order.java b/src/main/java/mate/academy/model/Order.java new file mode 100644 index 000000000..44b309ec1 --- /dev/null +++ b/src/main/java/mate/academy/model/Order.java @@ -0,0 +1,72 @@ +package mate.academy.model; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToMany; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; +import java.time.LocalDateTime; +import java.util.List; + +@Entity +@Table(name = "orders") +public class Order { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + @OneToMany + private List ticketList; + @OneToOne + @JoinColumn(name = "user_id") + private User user; + private LocalDateTime orderTime; + + public Order() { + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public List getTicketList() { + return ticketList; + } + + public void setTicketList(List ticketList) { + this.ticketList = ticketList; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public LocalDateTime getOrderTime() { + return orderTime; + } + + public void setOrderTime(LocalDateTime orderTime) { + this.orderTime = orderTime; + } + + @Override + public String toString() { + return "Order{" + + "id=" + id + + ", ticketList=" + + ticketList + + ", user=" + user + + ", orderTime=" + orderTime + + '}'; + } +} diff --git a/src/main/java/mate/academy/service/OrderService.java b/src/main/java/mate/academy/service/OrderService.java new file mode 100644 index 000000000..511364933 --- /dev/null +++ b/src/main/java/mate/academy/service/OrderService.java @@ -0,0 +1,12 @@ +package mate.academy.service; + +import java.util.List; +import mate.academy.model.Order; +import mate.academy.model.ShoppingCart; +import mate.academy.model.User; + +public interface OrderService { + Order completeOrder(ShoppingCart shoppingCart); + + List getOrdersHistory(User user); +} diff --git a/src/main/java/mate/academy/service/impl/OrderServiceImpl.java b/src/main/java/mate/academy/service/impl/OrderServiceImpl.java new file mode 100644 index 000000000..9be91fd81 --- /dev/null +++ b/src/main/java/mate/academy/service/impl/OrderServiceImpl.java @@ -0,0 +1,35 @@ +package mate.academy.service.impl; + +import java.time.LocalDateTime; +import java.util.List; +import mate.academy.dao.OrderDao; +import mate.academy.lib.Inject; +import mate.academy.lib.Service; +import mate.academy.model.Order; +import mate.academy.model.ShoppingCart; +import mate.academy.model.User; +import mate.academy.service.OrderService; +import mate.academy.service.ShoppingCartService; + +@Service +public class OrderServiceImpl implements OrderService { + @Inject + private OrderDao orderDao; + @Inject + private ShoppingCartService shoppingCartService; + + @Override + public Order completeOrder(ShoppingCart shoppingCart) { + Order order = new Order(); + order.setUser(shoppingCart.getUser()); + order.setTicketList(shoppingCart.getTickets()); + order.setOrderTime(LocalDateTime.now()); + shoppingCartService.clearShoppingCart(shoppingCart); + return orderDao.add(order); + } + + @Override + public List getOrdersHistory(User user) { + return orderDao.getByUser(user); + } +} diff --git a/src/main/resources/hibernate.cfg.xml b/src/main/resources/hibernate.cfg.xml new file mode 100644 index 000000000..a96283769 --- /dev/null +++ b/src/main/resources/hibernate.cfg.xml @@ -0,0 +1,19 @@ + + + com.mysql.cj.jdbc.Driver + jdbc:mysql://localhost:3306/mate + root + password3452 + true + create-drop + org.hibernate.dialect.MySQL8Dialect + + + + + + + + + +