diff --git a/src/main/java/DAO/OrderItemDao.java b/src/main/java/DAO/OrderItemDao.java index ebc54a6..27fbfd2 100644 --- a/src/main/java/DAO/OrderItemDao.java +++ b/src/main/java/DAO/OrderItemDao.java @@ -65,4 +65,14 @@ public class OrderItemDao { throw new RuntimeException(e); } } + + public static void deleteAllOrderItems() { + String sql = "delete from order_items"; + try (Connection con = DataSourceProvider.getDataSource().getConnection(); + PreparedStatement ps = con.prepareStatement(sql)) { + ps.executeUpdate(); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } } diff --git a/src/main/java/DAO/OrdersDao.java b/src/main/java/DAO/OrdersDao.java index f7d300c..2e42cee 100644 --- a/src/main/java/DAO/OrdersDao.java +++ b/src/main/java/DAO/OrdersDao.java @@ -1,6 +1,7 @@ package DAO; import DTO.Order; +import Exceptions.ValidationException; import util.DataSourceProvider; import java.sql.*; @@ -19,6 +20,7 @@ public class OrdersDao { if (rs.next()) { order.setId(id); order.setOrderNumber(rs.getString(1)); + order.setOrderRows(OrderItemDao.getItemsForOrderId(id)); return order; } @@ -38,14 +40,16 @@ public class OrdersDao { while(rs.next()) { Order order = new Order(); order.setId(rs.getInt(1)); + order.setOrderNumber(rs.getString(2)); + order.setOrderRows(OrderItemDao.getItemsForOrderId(order.getId())); orders.add(order); } } } catch (SQLException e) { - e.printStackTrace(); + throw new RuntimeException(e); } @@ -96,4 +100,15 @@ public class OrdersDao { } return 0; } + + public static void deleteAllOrders() { + String sql = "delete from orders;"; + try (Connection connection = DataSourceProvider.getDataSource().getConnection(); + PreparedStatement ps = connection.prepareStatement(sql)) { + OrderItemDao.deleteAllOrderItems(); + ps.executeUpdate(); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } } \ No newline at end of file diff --git a/src/main/java/DAO/ReportDao.java b/src/main/java/DAO/ReportDao.java new file mode 100644 index 0000000..cc3a0d7 --- /dev/null +++ b/src/main/java/DAO/ReportDao.java @@ -0,0 +1,25 @@ +package DAO; + +import DTO.Order; +import DTO.OrderItem; +import DTO.Report; + +public class ReportDao { + public static Report getReport() { + Report report = new Report(); + report.setCount(OrdersDao.getCount()); + report.setTurnoverWithoutVAT(0); + int itemCount = 0; + for (Order order: OrdersDao.getAllOrders()) { + for (OrderItem orderItem: order.getOrderRows()) { + int turnover = report.getTurnoverWithoutVAT() + (orderItem.getPrice() * orderItem.getQuantity()); + report.setTurnoverWithoutVAT(turnover); + itemCount++; + } + } + report.setAverageOrderAmount(report.getTurnoverWithoutVAT() / itemCount); + report.setTurnoverVAT((int)(report.getTurnoverWithoutVAT() * 0.2)); + report.setTurnoverWithVAT(report.getTurnoverVAT() + report.getTurnoverWithoutVAT()); + return report; + } +} diff --git a/src/main/java/DTO/Order.java b/src/main/java/DTO/Order.java index abb43fc..67d99fd 100644 --- a/src/main/java/DTO/Order.java +++ b/src/main/java/DTO/Order.java @@ -1,4 +1,5 @@ package DTO; +import Exceptions.ValidationException; import lombok.Data; import java.util.LinkedList; diff --git a/src/main/java/DTO/Report.java b/src/main/java/DTO/Report.java new file mode 100644 index 0000000..0b6c3cd --- /dev/null +++ b/src/main/java/DTO/Report.java @@ -0,0 +1,14 @@ +package DTO; + +import lombok.Data; + +@Data +public class Report { + + private Integer count; + private Integer averageOrderAmount; + private Integer turnoverWithoutVAT; + private Integer turnoverVAT; + private Integer turnoverWithVAT; + +} diff --git a/src/main/java/DTO/ValidationError.java b/src/main/java/DTO/ValidationError.java new file mode 100644 index 0000000..4e21e67 --- /dev/null +++ b/src/main/java/DTO/ValidationError.java @@ -0,0 +1,10 @@ +package DTO; + +import lombok.Data; +import java.util.List; + +@Data +public class ValidationError { + private String code; + private List arguments; +} diff --git a/src/main/java/DTO/ValidationErrors.java b/src/main/java/DTO/ValidationErrors.java new file mode 100644 index 0000000..6d6975b --- /dev/null +++ b/src/main/java/DTO/ValidationErrors.java @@ -0,0 +1,16 @@ +package DTO; + +import lombok.Data; + +import java.util.LinkedList; +import java.util.List; + +@Data +public class ValidationErrors { + + private List errors = new LinkedList<>(); + + public void addError(ValidationError error) { + errors.add(error); + } +} diff --git a/src/main/java/Exceptions/ValidationException.java b/src/main/java/Exceptions/ValidationException.java new file mode 100644 index 0000000..d6a3c40 --- /dev/null +++ b/src/main/java/Exceptions/ValidationException.java @@ -0,0 +1,13 @@ +package Exceptions; + +import DTO.ValidationError; +import lombok.Getter; +import lombok.Setter; + +public class ValidationException extends Exception { + @Getter private ValidationError error = new ValidationError(); + + public ValidationException(String code) { + error.setCode(code); + } +} diff --git a/src/main/java/servlet/api/Orders.java b/src/main/java/servlet/api/Orders.java index 746e46c..913de72 100644 --- a/src/main/java/servlet/api/Orders.java +++ b/src/main/java/servlet/api/Orders.java @@ -2,20 +2,17 @@ package servlet.api; import DAO.OrdersDao; import DTO.Order; +import DTO.ValidationError; +import DTO.ValidationErrors; import com.fasterxml.jackson.databind.ObjectMapper; -import javax.servlet.ServletContextEvent; -import javax.servlet.ServletContextListener; import javax.servlet.ServletException; -import javax.servlet.annotation.WebListener; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.stream.Collectors; @WebServlet(urlPatterns = "/api/orders", name="Orders") @@ -46,6 +43,18 @@ public class Orders extends HttpServlet { String orderJson = req.getReader().lines().collect(Collectors.joining(" ")); Order order = new ObjectMapper().readValue(orderJson, Order.class); + + if (order.getOrderNumber().length() < 2) { + resp.setStatus(400, "orderNumber parameter is empty"); + resp.setContentType("application/json"); + ValidationErrors errors = new ValidationErrors(); + ValidationError error = new ValidationError(); + error.setCode("too_short_number"); + errors.addError(error); + resp.getWriter().print(new ObjectMapper().writeValueAsString(errors)); + return; + } + OrdersDao.saveOrder(order); resp.getWriter().print(new ObjectMapper().writeValueAsString(order)); @@ -58,6 +67,8 @@ public class Orders extends HttpServlet { if (idString != null) { int id = Integer.parseInt(idString); OrdersDao.deleteOrderForId(id); + } else { + OrdersDao.deleteAllOrders(); } } } diff --git a/src/main/java/servlet/api/OrdersReport.java b/src/main/java/servlet/api/OrdersReport.java new file mode 100644 index 0000000..8fec805 --- /dev/null +++ b/src/main/java/servlet/api/OrdersReport.java @@ -0,0 +1,22 @@ +package servlet.api; + +import DAO.ReportDao; +import com.fasterxml.jackson.databind.ObjectMapper; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@WebServlet(urlPatterns = "/api/orders/report", name="OrdersReport") +public class OrdersReport extends HttpServlet { + private static final long serialVersionUID = 1L; + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + resp.setContentType("application/json"); + resp.getWriter().print(new ObjectMapper().writeValueAsString(ReportDao.getReport())); + } +} diff --git a/src/main/java/servlet/html/OrdersForm.java b/src/main/java/servlet/html/OrdersForm.java index 558086d..6df1290 100644 --- a/src/main/java/servlet/html/OrdersForm.java +++ b/src/main/java/servlet/html/OrdersForm.java @@ -2,6 +2,10 @@ package servlet.html; import DAO.OrdersDao; import DTO.Order; +import DTO.ValidationError; +import DTO.ValidationErrors; +import Exceptions.ValidationException; +import com.fasterxml.jackson.databind.ObjectMapper; import servlet.api.Orders; import javax.servlet.ServletException; @@ -39,6 +43,16 @@ public class OrdersForm extends HttpServlet Order order = new Order(); order.setOrderNumber(orderNumber); + if (order.getOrderNumber().length() < 2) { + resp.setStatus(400, "orderNumber parameter is empty"); + resp.setContentType("application/json"); + ValidationErrors errors = new ValidationErrors(); + ValidationError error = new ValidationError(); + error.setCode("too_short_number"); + errors.addError(error); + resp.getWriter().print(new ObjectMapper().writeValueAsString(errors)); + return; + } OrdersDao.saveOrder(order); resp.getWriter().format("%d", order.getId()); }