From cb4449482894f4ef6c378ba49be97061f22ec245 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20V=C6=B0=C6=A1ng?= Date: Thu, 7 Dec 2023 00:08:41 +0700 Subject: [PATCH] Add purchase history servlet --- .../web/PurchaseHistoryServlet.java | 207 ++++++++++++++++++ 1 file changed, 207 insertions(+) create mode 100644 src/main/java/io/hardingadonis/miu/controller/web/PurchaseHistoryServlet.java diff --git a/src/main/java/io/hardingadonis/miu/controller/web/PurchaseHistoryServlet.java b/src/main/java/io/hardingadonis/miu/controller/web/PurchaseHistoryServlet.java new file mode 100644 index 00000000..fbf18a13 --- /dev/null +++ b/src/main/java/io/hardingadonis/miu/controller/web/PurchaseHistoryServlet.java @@ -0,0 +1,207 @@ +package io.hardingadonis.miu.controller.web; + +import io.hardingadonis.miu.model.*; +import io.hardingadonis.miu.model.detail.OrderStatus; +import io.hardingadonis.miu.services.*; +import java.io.*; +import java.util.*; +import javax.servlet.*; +import javax.servlet.annotation.*; +import javax.servlet.http.*; + +@WebServlet(name = "PurchaseHistoryServlet", urlPatterns = {"/purchase-history"}) +public class PurchaseHistoryServlet extends HttpServlet { + + private static final int ORDER_PER_PAGE = 5; + private static final int PAGES_PER_GROUP = 3; + private static final int MINIMUM_TWO_SIDE = 1; + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + request.setCharacterEncoding("UTF-8"); + response.setContentType("text/html; charset=UTF-8"); + + User user = (User) request.getSession().getAttribute("user"); + String tab = request.getParameter("tab"); + + if ((user == null) || (tab == null)) { + response.sendRedirect("login"); + return; + } + + List orderList = null; + int endPage = 0; + int page = 0; + + switch (tab) { + case "all": { + endPage = (int) Math.ceil(Singleton.orderDAO.countByUserID(user.getID()) / (double) ORDER_PER_PAGE); + page = parsePage(request, endPage); + + orderList = Singleton.orderDAO.getAllWithUserID(user.getID(), (page - 1) * ORDER_PER_PAGE, ORDER_PER_PAGE); + break; + } + + case "processing": { + endPage = (int) Math.ceil(Singleton.orderDAO.countAllWithUserIDAndStatus(user.getID(), OrderStatus.PROCESSING) / (double) ORDER_PER_PAGE); + page = parsePage(request, endPage); + + orderList = Singleton.orderDAO.getAllWithUserIDAndStatus(user.getID(), OrderStatus.PROCESSING, (page - 1) * ORDER_PER_PAGE, ORDER_PER_PAGE); + break; + } + + case "shipping": { + endPage = (int) Math.ceil(Singleton.orderDAO.countAllWithUserIDAndStatus(user.getID(), OrderStatus.SHIPPING) / (double) ORDER_PER_PAGE); + page = parsePage(request, endPage); + + orderList = Singleton.orderDAO.getAllWithUserIDAndStatus(user.getID(), OrderStatus.SHIPPING, (page - 1) * ORDER_PER_PAGE, ORDER_PER_PAGE); + break; + } + + case "done": { + endPage = (int) Math.ceil(Singleton.orderDAO.countAllWithUserIDAndStatus(user.getID(), OrderStatus.DONE) / (double) ORDER_PER_PAGE); + page = parsePage(request, endPage); + + orderList = Singleton.orderDAO.getAllWithUserIDAndStatus(user.getID(), OrderStatus.DONE, (page - 1) * ORDER_PER_PAGE, ORDER_PER_PAGE); + break; + } + + case "canceled": { + endPage = (int) Math.ceil(Singleton.orderDAO.countAllWithUserIDAndStatus(user.getID(), OrderStatus.CANCELED) / (double) ORDER_PER_PAGE); + page = parsePage(request, endPage); + + orderList = Singleton.orderDAO.getAllWithUserIDAndStatus(user.getID(), OrderStatus.CANCELED, (page - 1) * ORDER_PER_PAGE, ORDER_PER_PAGE); + break; + } + } + + String paginationStr = createPagination(tab, page, endPage); + + request.setAttribute("order_list", orderList); + request.setAttribute("pagination_str", paginationStr); + request.setAttribute("end_page", endPage); + + System.out.println(paginationStr); + + request.getRequestDispatcher("/view/web/purchase-history.jsp").forward(request, response); + } + + private static int parsePage(HttpServletRequest request, int endPage) { + try { + int page = Integer.parseInt(request.getParameter("page")); + + if ((page < 1) || (page > endPage)) { + page = 1; + } + + return page; + } catch (NumberFormatException ex) { + return 1; + } + } + + private static String createPrevBtn(String tab, int page) { + StringBuilder prevBtn = new StringBuilder("Trước"); + + return prevBtn.toString(); + } + + private static String createNextBtn(String tab, int page) { + StringBuilder nextBtn = new StringBuilder("Sau"); + + return nextBtn.toString(); + } + + private static String createSingleIndex(String tab, int page, int index) { + StringBuilder singleIndex = new StringBuilder("").append(index).append(""); + + return singleIndex.toString(); + } + + private static String createNormalPagination(String tab, int page, int beginPage, int endPage) { + StringBuilder normalPagination = new StringBuilder(); + + for (int i = beginPage; i <= endPage; i++) { + normalPagination.append(createSingleIndex(tab, page, i)); + } + + return normalPagination.toString(); + } + + private static String createNormalPagination(String tab, int page, int endPage) { + return createNormalPagination(tab, page, 1, endPage); + } + + private static String createManyPagination(String tab, int page, int endPage) { + StringBuilder manyPagination = new StringBuilder(); + + if (page <= PAGES_PER_GROUP + MINIMUM_TWO_SIDE) { + manyPagination.append(createNormalPagination(tab, page, 1, page < 3 ? 3 : page + 1)); + + manyPagination.append("..."); + + manyPagination.append(createSingleIndex(tab, page, endPage)); + } + + if ((page > PAGES_PER_GROUP + MINIMUM_TWO_SIDE) && (page <= endPage - PAGES_PER_GROUP - MINIMUM_TWO_SIDE)) { + manyPagination.append(createSingleIndex(tab, page, 1)); + manyPagination.append("..."); + + manyPagination.append(createSingleIndex(tab, page, page - 1)); + manyPagination.append(createSingleIndex(tab, page, page)); + manyPagination.append(createSingleIndex(tab, page, page + 1)); + + manyPagination.append("..."); + manyPagination.append(createSingleIndex(tab, page, endPage)); + } + + if (page > endPage - PAGES_PER_GROUP - MINIMUM_TWO_SIDE) { + manyPagination.append(createSingleIndex(tab, page, 1)); + + manyPagination.append("..."); + + manyPagination.append(createNormalPagination(tab, page, page - 1, endPage)); + + } + + return manyPagination.toString(); + } + + private static String createPagination(String tab, int page, int endPage) { + StringBuilder pagination = new StringBuilder(); + + if (page != 1) { + pagination.append(createPrevBtn(tab, page)); + } + + if (endPage < PAGES_PER_GROUP + (MINIMUM_TWO_SIDE + 1) * 2) { + pagination.append(createNormalPagination(tab, page, endPage)); + } else { + pagination.append(createManyPagination(tab, page, endPage)); + } + + if (page != endPage) { + pagination.append(createNextBtn(tab, page)); + } + + return pagination.toString(); + } +}