Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 079be0ba5c | |||
| b668c9f427 |
78
src/main/java/DAO/OrderItemDao.java
Normal file
78
src/main/java/DAO/OrderItemDao.java
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
package DAO;
|
||||||
|
|
||||||
|
import DTO.Order;
|
||||||
|
import DTO.OrderItem;
|
||||||
|
import util.DataSourceProvider;
|
||||||
|
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.PreparedStatement;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class OrderItemDao {
|
||||||
|
|
||||||
|
public static List<OrderItem> getItemsForOrderId(int id) {
|
||||||
|
List<OrderItem> result = new LinkedList<>();
|
||||||
|
String sql = "select item_name, quantity, price from order_items where ORDER_ID=?";
|
||||||
|
try (Connection con = DataSourceProvider.getDataSource().getConnection();
|
||||||
|
PreparedStatement ps = con.prepareStatement(sql)) {
|
||||||
|
ps.setInt(1, id);
|
||||||
|
try(ResultSet rs = ps.executeQuery()) {
|
||||||
|
while (rs.next()) {
|
||||||
|
OrderItem item = new OrderItem();
|
||||||
|
item.setItemName(rs.getString(1));
|
||||||
|
item.setQuantity(rs.getInt(2));
|
||||||
|
item.setPrice(rs.getInt(3));
|
||||||
|
result.add(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (SQLException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void saveOrderItem(OrderItem item, int orderId) {
|
||||||
|
String sql = "insert into order_items (order_id, item_name, quantity, price) VALUES (?,?,?,?);";
|
||||||
|
try (Connection con = DataSourceProvider.getDataSource().getConnection();
|
||||||
|
PreparedStatement ps = con.prepareStatement(sql)) {
|
||||||
|
ps.setInt(1, orderId);
|
||||||
|
ps.setString(2, item.getItemName());
|
||||||
|
ps.setInt(3, item.getQuantity());
|
||||||
|
ps.setInt(4, item.getPrice());
|
||||||
|
ps.execute();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void saveOrderItems(List<OrderItem> items, int orderId) {
|
||||||
|
for (OrderItem item: items){
|
||||||
|
saveOrderItem(item, orderId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void deleteOrderItemsForOrderId(int id) {
|
||||||
|
String sql = "delete from order_items where ORDER_ID=?";
|
||||||
|
try (Connection con = DataSourceProvider.getDataSource().getConnection();
|
||||||
|
PreparedStatement ps = con.prepareStatement(sql)) {
|
||||||
|
ps.setInt(1, id);
|
||||||
|
ps.executeUpdate();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
package DAO;
|
package DAO;
|
||||||
|
|
||||||
import DTO.Order;
|
import DTO.Order;
|
||||||
|
import Exceptions.ValidationException;
|
||||||
import util.DataSourceProvider;
|
import util.DataSourceProvider;
|
||||||
|
|
||||||
import java.sql.*;
|
import java.sql.*;
|
||||||
@@ -9,18 +10,18 @@ import java.util.List;
|
|||||||
|
|
||||||
public class OrdersDao {
|
public class OrdersDao {
|
||||||
|
|
||||||
static private int nextOrderId = 0;
|
|
||||||
|
|
||||||
public static Order getOrderForId(int id) {
|
public static Order getOrderForId(int id) {
|
||||||
Order order = new Order();
|
Order order = new Order();
|
||||||
String sql = "select 'order_number' from ORDERS where id=?;";
|
String sql = "select order_number from ORDERS where id=?;";
|
||||||
try (Connection connection = DataSourceProvider.getDataSource().getConnection();
|
try (Connection connection = DataSourceProvider.getDataSource().getConnection();
|
||||||
PreparedStatement ps = connection.prepareStatement(sql)) {
|
PreparedStatement ps = connection.prepareStatement(sql)) {
|
||||||
ps.setInt(1, id);
|
ps.setInt(1, id);
|
||||||
try (ResultSet rs = ps.executeQuery()) {
|
try (ResultSet rs = ps.executeQuery()) {
|
||||||
if (rs.next()) {
|
if (rs.next()) {
|
||||||
order.setId(id);
|
order.setId(id);
|
||||||
order.setOrderNumber(rs.getString("order_number"));
|
order.setOrderNumber(rs.getString(1));
|
||||||
|
|
||||||
|
order.setOrderRows(OrderItemDao.getItemsForOrderId(id));
|
||||||
return order;
|
return order;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -39,26 +40,47 @@ public class OrdersDao {
|
|||||||
while(rs.next()) {
|
while(rs.next()) {
|
||||||
Order order = new Order();
|
Order order = new Order();
|
||||||
order.setId(rs.getInt(1));
|
order.setId(rs.getInt(1));
|
||||||
|
|
||||||
order.setOrderNumber(rs.getString(2));
|
order.setOrderNumber(rs.getString(2));
|
||||||
|
|
||||||
|
order.setOrderRows(OrderItemDao.getItemsForOrderId(order.getId()));
|
||||||
orders.add(order);
|
orders.add(order);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
e.printStackTrace();
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return orders;
|
return orders;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void saveOrder(Order order) {
|
public static void saveOrder(Order order) {
|
||||||
order.setId(nextOrderId++);
|
String sql = "insert into orders (order_number) values (?);";
|
||||||
String sql = "insert into orders (id, order_number) values (?, ?);";
|
try (Connection connection = DataSourceProvider.getDataSource().getConnection();
|
||||||
|
PreparedStatement ps = connection.prepareStatement(sql);
|
||||||
|
PreparedStatement call = connection.prepareCall("CALL IDENTITY();")) {
|
||||||
|
ps.setString(1, order.getOrderNumber());
|
||||||
|
ps.executeUpdate();
|
||||||
|
try (ResultSet rs = call.executeQuery()) {
|
||||||
|
if (rs.next()) {
|
||||||
|
order.setId(rs.getInt(1));
|
||||||
|
OrderItemDao.saveOrderItems(order.getOrderRows(), order.getId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void deleteOrderForId(int id) {
|
||||||
|
String sql = "DELETE FROM orders WHERE id=?;";
|
||||||
try (Connection connection = DataSourceProvider.getDataSource().getConnection();
|
try (Connection connection = DataSourceProvider.getDataSource().getConnection();
|
||||||
PreparedStatement ps = connection.prepareStatement(sql)) {
|
PreparedStatement ps = connection.prepareStatement(sql)) {
|
||||||
ps.setInt(1, order.getId());
|
ps.setInt(1, id);
|
||||||
ps.setString(2, order.getOrderNumber());
|
ps.executeUpdate();
|
||||||
ps.execute();
|
OrderItemDao.deleteOrderItemsForOrderId(id);
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
@@ -78,4 +100,15 @@ public class OrdersDao {
|
|||||||
}
|
}
|
||||||
return 0;
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
25
src/main/java/DAO/ReportDao.java
Normal file
25
src/main/java/DAO/ReportDao.java
Normal file
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,10 +1,12 @@
|
|||||||
package DTO;
|
package DTO;
|
||||||
|
import Exceptions.ValidationException;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public @Data class Order {
|
public @Data class Order {
|
||||||
private int id;
|
private int id;
|
||||||
private String orderNumber;
|
private String orderNumber;
|
||||||
private List<OrderItem> orderRows;
|
private List<OrderItem> orderRows = new LinkedList<>();
|
||||||
}
|
}
|
||||||
|
|||||||
14
src/main/java/DTO/Report.java
Normal file
14
src/main/java/DTO/Report.java
Normal file
@@ -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;
|
||||||
|
|
||||||
|
}
|
||||||
10
src/main/java/DTO/ValidationError.java
Normal file
10
src/main/java/DTO/ValidationError.java
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
package DTO;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class ValidationError {
|
||||||
|
private String code;
|
||||||
|
private List<String> arguments;
|
||||||
|
}
|
||||||
16
src/main/java/DTO/ValidationErrors.java
Normal file
16
src/main/java/DTO/ValidationErrors.java
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
package DTO;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class ValidationErrors {
|
||||||
|
|
||||||
|
private List<ValidationError> errors = new LinkedList<>();
|
||||||
|
|
||||||
|
public void addError(ValidationError error) {
|
||||||
|
errors.add(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
13
src/main/java/Exceptions/ValidationException.java
Normal file
13
src/main/java/Exceptions/ValidationException.java
Normal file
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,20 +2,17 @@ package servlet.api;
|
|||||||
|
|
||||||
import DAO.OrdersDao;
|
import DAO.OrdersDao;
|
||||||
import DTO.Order;
|
import DTO.Order;
|
||||||
|
import DTO.ValidationError;
|
||||||
|
import DTO.ValidationErrors;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
|
||||||
import javax.servlet.ServletContextEvent;
|
|
||||||
import javax.servlet.ServletContextListener;
|
|
||||||
import javax.servlet.ServletException;
|
import javax.servlet.ServletException;
|
||||||
import javax.servlet.annotation.WebListener;
|
|
||||||
import javax.servlet.annotation.WebServlet;
|
import javax.servlet.annotation.WebServlet;
|
||||||
import javax.servlet.http.HttpServlet;
|
import javax.servlet.http.HttpServlet;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@WebServlet(urlPatterns = "/api/orders", name="Orders")
|
@WebServlet(urlPatterns = "/api/orders", name="Orders")
|
||||||
@@ -46,8 +43,32 @@ public class Orders extends HttpServlet {
|
|||||||
String orderJson = req.getReader().lines().collect(Collectors.joining(" "));
|
String orderJson = req.getReader().lines().collect(Collectors.joining(" "));
|
||||||
|
|
||||||
Order order = new ObjectMapper().readValue(orderJson, Order.class);
|
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);
|
OrdersDao.saveOrder(order);
|
||||||
resp.getWriter().print(new ObjectMapper().writeValueAsString(order));
|
resp.getWriter().print(new ObjectMapper().writeValueAsString(order));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
|
||||||
|
resp.setContentType("application/json");
|
||||||
|
String idString = req.getParameter("id");
|
||||||
|
if (idString != null) {
|
||||||
|
int id = Integer.parseInt(idString);
|
||||||
|
OrdersDao.deleteOrderForId(id);
|
||||||
|
} else {
|
||||||
|
OrdersDao.deleteAllOrders();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
22
src/main/java/servlet/api/OrdersReport.java
Normal file
22
src/main/java/servlet/api/OrdersReport.java
Normal file
@@ -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()));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,6 +2,10 @@ package servlet.html;
|
|||||||
|
|
||||||
import DAO.OrdersDao;
|
import DAO.OrdersDao;
|
||||||
import DTO.Order;
|
import DTO.Order;
|
||||||
|
import DTO.ValidationError;
|
||||||
|
import DTO.ValidationErrors;
|
||||||
|
import Exceptions.ValidationException;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import servlet.api.Orders;
|
import servlet.api.Orders;
|
||||||
|
|
||||||
import javax.servlet.ServletException;
|
import javax.servlet.ServletException;
|
||||||
@@ -39,6 +43,16 @@ public class OrdersForm extends HttpServlet
|
|||||||
|
|
||||||
Order order = new Order();
|
Order order = new Order();
|
||||||
order.setOrderNumber(orderNumber);
|
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);
|
OrdersDao.saveOrder(order);
|
||||||
resp.getWriter().format("%d", order.getId());
|
resp.getWriter().format("%d", order.getId());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,16 @@
|
|||||||
CREATE TABLE orders (
|
CREATE TABLE orders (
|
||||||
id BIGINT NOT NULL PRIMARY KEY ,
|
id BIGINT NOT NULL PRIMARY KEY IDENTITY,
|
||||||
order_number VARCHAR (255)
|
order_number VARCHAR (255)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
CREATE TABLE order_items (
|
||||||
|
id BIGINT NOT NULL PRIMARY KEY IDENTITY,
|
||||||
|
order_id BIGINT NOT NULL,
|
||||||
|
item_name VARCHAR (255),
|
||||||
|
quantity INT,
|
||||||
|
price INT,
|
||||||
|
FOREIGN KEY (order_id) REFERENCES orders (id)
|
||||||
|
);
|
||||||
|
|
||||||
|
--INSERT INTO orders (order_number) values ('asdf');
|
||||||
|
--INSERT INTO order_items (order_id, item_name, quantity, price) values (0, 'test', 1, 10);
|
||||||
Reference in New Issue
Block a user