diff --git a/src/main/java/ch/wisv/payments/admin/committees/CommitteeService.java b/src/main/java/ch/wisv/payments/admin/committees/CommitteeService.java index 596232f..0751fe7 100644 --- a/src/main/java/ch/wisv/payments/admin/committees/CommitteeService.java +++ b/src/main/java/ch/wisv/payments/admin/committees/CommitteeService.java @@ -1,6 +1,7 @@ package ch.wisv.payments.admin.committees; import ch.wisv.payments.model.Committee; +import ch.wisv.payments.model.CommitteeEnum; import java.util.List; @@ -9,4 +10,8 @@ public interface CommitteeService { List getAllCommittees(); void addCommittee(Committee committee); + + Committee getCommitteeById(int committeeId); + + Committee getCommittee(CommitteeEnum committeeEnum, int year); } diff --git a/src/main/java/ch/wisv/payments/admin/committees/CommitteeServiceImpl.java b/src/main/java/ch/wisv/payments/admin/committees/CommitteeServiceImpl.java index ed79dd0..3d2d190 100644 --- a/src/main/java/ch/wisv/payments/admin/committees/CommitteeServiceImpl.java +++ b/src/main/java/ch/wisv/payments/admin/committees/CommitteeServiceImpl.java @@ -1,6 +1,8 @@ package ch.wisv.payments.admin.committees; +import ch.wisv.payments.exception.CommitteeNotFoundException; import ch.wisv.payments.model.Committee; +import ch.wisv.payments.model.CommitteeEnum; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DuplicateKeyException; import org.springframework.stereotype.Service; @@ -25,8 +27,19 @@ public List getAllCommittees() { @Override public void addCommittee(Committee committee) { if (committeeRepository.findOneByNameAndYear(committee.getName(), committee.getYear()).isPresent()) { - throw new DuplicateKeyException("Commitee already exists!"); + throw new DuplicateKeyException("Committee already exists!"); } committeeRepository.save(committee); } + + @Override + public Committee getCommitteeById(int committeeId) { + return committeeRepository.findOne(committeeId); + } + + @Override + public Committee getCommittee(CommitteeEnum committeeEnum, int year) { + return committeeRepository.findOneByNameAndYear(committeeEnum, year) + .orElseThrow(CommitteeNotFoundException::new); + } } diff --git a/src/main/java/ch/wisv/payments/admin/products/ProductController.java b/src/main/java/ch/wisv/payments/admin/products/ProductController.java index 9dc4aa3..fe067a2 100644 --- a/src/main/java/ch/wisv/payments/admin/products/ProductController.java +++ b/src/main/java/ch/wisv/payments/admin/products/ProductController.java @@ -4,6 +4,7 @@ import ch.wisv.payments.admin.products.request.ProductGroupRequest; import ch.wisv.payments.admin.products.request.ProductRequest; import ch.wisv.payments.model.Product; +import ch.wisv.payments.model.ProductGroup; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -43,7 +44,7 @@ public String productEdit(@PathVariable Integer productId, Model model) { Product product = productService.getProductById(productId); ProductRequest productRequest = new ProductRequest(); - productRequest.setProductId(product.getId()); + productRequest.setId(product.getId()); productRequest.setName(product.getName()); productRequest.setDescription(product.getDescription()); productRequest.setPrice(product.getPrice()); @@ -58,13 +59,14 @@ public String productEdit(@PathVariable Integer productId, Model model) { model.addAttribute("product", productRequest); - return "edit"; + return "editProduct"; } @PostMapping(value = "/add") - public String addProduct(@ModelAttribute @Validated ProductRequest productRequest) { + public String addProduct(@ModelAttribute @Validated ProductRequest productRequest, RedirectAttributes redirectAttributes) { productService.addProduct(productRequest); + redirectAttributes.addFlashAttribute("message", productRequest.getName() + " successfully added."); return "redirect:/products"; } @@ -72,26 +74,66 @@ public String addProduct(@ModelAttribute @Validated ProductRequest productReques public String editProduct(@ModelAttribute @Validated ProductRequest productRequest, RedirectAttributes redirectAttributes) { productService.editProduct(productRequest); - redirectAttributes.addFlashAttribute("message", productRequest.getName() + " successfully updated!"); - + redirectAttributes.addFlashAttribute("message", productRequest.getName() + " successfully updated."); return "redirect:/products"; } @PostMapping(value = "/delete/{productId}") public String deleteProduct(@PathVariable int productId, RedirectAttributes redirectAttributes) { - try { - productService.deleteProduct(productId); - } catch (RuntimeException e) { - redirectAttributes.addFlashAttribute("error", e.getMessage()); - } + productService.deleteProduct(productId); + redirectAttributes.addFlashAttribute("message", "Product successfully removed."); return "redirect:/products"; } - @PostMapping(value = "/addGroup") - public String addProductGroup(@ModelAttribute @Validated ProductGroupRequest productGroupRequest) { + @PostMapping(value = "/group/add") + public String addProductGroup(@ModelAttribute @Validated ProductGroupRequest productGroupRequest, RedirectAttributes redirectAttributes) { productService.addProductGroup(productGroupRequest); + redirectAttributes.addFlashAttribute("message", "Product group " + productGroupRequest.getName() + " successfully added."); + + return "redirect:/products"; + } + + @GetMapping(value = "/group/edit/{productGroupId}") + public String productGroupEdit(@PathVariable Integer productGroupId, Model model) { + model.addAttribute("committees", committeeService.getAllCommittees()); + + ProductGroup productGroup = productService.getProductGroupById(productGroupId); + ProductGroupRequest productGroupRequest = new ProductGroupRequest(); + + productGroupRequest.setId(productGroup.getId()); + productGroupRequest.setName(productGroup.getName()); + productGroupRequest.setCommitteeId(productGroup.getCommittee().getId()); + productGroupRequest.setDescription(productGroup.getDescription()); + productGroupRequest.setGroupLimit(productGroup.getGroupLimit()); + + model.addAttribute("productGroup", productGroupRequest); + + return "editProductGroup"; + } + + @PostMapping(value = "/group/edit") + public String editProductGroup(@ModelAttribute @Validated ProductGroupRequest productGroupRequest, RedirectAttributes redirectAttributes) { + productService.editProductGroup(productGroupRequest); + + redirectAttributes.addFlashAttribute("message", productGroupRequest.getName() + " successfully updated."); + + return "redirect:/products"; + } + + @PostMapping(value = "/group/delete/{productGroupId}") + public String deleteProductGroup(@PathVariable int productGroupId, RedirectAttributes redirectAttributes) { + productService.deleteProductGroup(productGroupId); + redirectAttributes.addFlashAttribute("message", "Product group successfully removed."); + + return "redirect:/products"; + } + + @ExceptionHandler(RuntimeException.class) + public String formErrorHandler(RuntimeException e, RedirectAttributes redirectAttributes) { + redirectAttributes.addFlashAttribute("error", e.getMessage()); + return "redirect:/products"; } } diff --git a/src/main/java/ch/wisv/payments/admin/products/ProductService.java b/src/main/java/ch/wisv/payments/admin/products/ProductService.java index 9dc8899..1d1e2f6 100644 --- a/src/main/java/ch/wisv/payments/admin/products/ProductService.java +++ b/src/main/java/ch/wisv/payments/admin/products/ProductService.java @@ -38,4 +38,10 @@ public interface ProductService { void addProductGroup(ProductGroupRequest productGroupRequest); void addProductToGroup(Product product, ProductGroup productGroup); + + void deleteProductGroup(int productGroupId); + + ProductGroup getProductGroupById(Integer productGroupId); + + void editProductGroup(ProductGroupRequest productGroupRequest); } diff --git a/src/main/java/ch/wisv/payments/admin/products/ProductServiceImpl.java b/src/main/java/ch/wisv/payments/admin/products/ProductServiceImpl.java index 4304cb3..f04a9ca 100644 --- a/src/main/java/ch/wisv/payments/admin/products/ProductServiceImpl.java +++ b/src/main/java/ch/wisv/payments/admin/products/ProductServiceImpl.java @@ -1,15 +1,14 @@ package ch.wisv.payments.admin.products; -import ch.wisv.payments.admin.committees.CommitteeRepository; +import ch.wisv.payments.admin.committees.CommitteeService; import ch.wisv.payments.admin.products.request.ProductGroupRequest; import ch.wisv.payments.admin.products.request.ProductRequest; -import ch.wisv.payments.exception.CommmitteeNotFoundException; +import ch.wisv.payments.exception.ProductGroupInUseException; import ch.wisv.payments.exception.ProductInUseException; import ch.wisv.payments.model.*; import ch.wisv.payments.rest.OrderService; import ch.wisv.payments.rest.repository.ProductGroupRepository; import ch.wisv.payments.rest.repository.ProductRepository; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @@ -20,14 +19,13 @@ public class ProductServiceImpl implements ProductService { private ProductRepository productRepository; private ProductGroupRepository productGroupRepository; - private CommitteeRepository committeeRepository; + private CommitteeService committeeService; private OrderService orderService; - @Autowired - public ProductServiceImpl(ProductRepository productRepository, ProductGroupRepository productGroupRepository, CommitteeRepository committeeRepository, OrderService orderService) { + public ProductServiceImpl(ProductRepository productRepository, ProductGroupRepository productGroupRepository, CommitteeService committeeService, OrderService orderService) { this.productRepository = productRepository; this.productGroupRepository = productGroupRepository; - this.committeeRepository = committeeRepository; + this.committeeService = committeeService; this.orderService = orderService; } @@ -38,7 +36,7 @@ public List getAllProducts() { @Override public void addProduct(ProductRequest productRequest) { - Committee committee = committeeRepository.findOne(productRequest.getCommitteeId()); + Committee committee = committeeService.getCommitteeById(productRequest.getCommitteeId()); Product product = new Product(committee, productRequest.getName(), productRequest.getDescription(), @@ -56,7 +54,7 @@ public void addProduct(ProductRequest productRequest) { @Override public void addProductGroup(ProductGroupRequest productGroupRequest) { - Committee committee = committeeRepository.findOne(productGroupRequest.getCommitteeId()); + Committee committee = committeeService.getCommitteeById(productGroupRequest.getCommitteeId()); ProductGroup group = new ProductGroup(productGroupRequest.getName(), productGroupRequest.getDescription(), productGroupRequest.getGroupLimit(), committee); @@ -79,9 +77,9 @@ public void addProductToGroup(Product product, ProductGroup productGroup) { @Override public void editProduct(ProductRequest productRequest) { - if (productRequest.getProductId() != 0) { - Committee committee = committeeRepository.findOne(productRequest.getCommitteeId()); - Product product = productRepository.findOne(productRequest.getProductId()); + if (productRequest.getId() != 0) { + Committee committee = committeeService.getCommitteeById(productRequest.getCommitteeId()); + Product product = productRepository.findOne(productRequest.getId()); product.setName(productRequest.getName()); product.setDescription(productRequest.getDescription()); @@ -102,6 +100,17 @@ public void editProduct(ProductRequest productRequest) { } } + @Override + public void deleteProduct(int productId) { + List orders = orderService.getOrdersByProductId(productId); + + if (orders.size() > 0) { + throw new ProductInUseException("Products are already ordered"); + } else { + productRepository.delete(productId); + } + } + @Override public Product getProductById(Integer productId) { return productRepository.findOne(productId); @@ -109,8 +118,7 @@ public Product getProductById(Integer productId) { @Override public Set getProductByCommittee(CommitteeEnum committeeEnum, int year) { - Committee committee = committeeRepository.findOneByNameAndYear(committeeEnum, year) - .orElseThrow(CommmitteeNotFoundException::new); + Committee committee = committeeService.getCommittee(committeeEnum, year); return productRepository.findByCommittee(committee); } @@ -130,13 +138,32 @@ public boolean isProductAvailable(Integer productId) { } @Override - public void deleteProduct(int productId) { - List orders = orderService.getOrdersByProductId(productId); + public ProductGroup getProductGroupById(Integer productGroupId) { + return productGroupRepository.findOne(productGroupId); + } - if (orders.size() > 0) { - throw new ProductInUseException("Products are already ordered"); + @Override + public void editProductGroup(ProductGroupRequest productGroupRequest) { + if (productGroupRequest.getId() != 0) { + Committee committee = committeeService.getCommitteeById(productGroupRequest.getCommitteeId()); + ProductGroup productGroup = productGroupRepository.findOne(productGroupRequest.getId()); + + productGroup.setCommittee(committee); + productGroup.setName(productGroupRequest.getName()); + productGroup.setDescription(productGroupRequest.getDescription()); + productGroup.setGroupLimit(productGroupRequest.getGroupLimit()); + + productGroupRepository.saveAndFlush(productGroup); + } + } + + @Override + public void deleteProductGroup(int productGroupId) { + ProductGroup productGroup = productGroupRepository.findOne(productGroupId); + if (!productGroup.getProducts().isEmpty()) { + throw new ProductGroupInUseException("Product group must be empty"); } else { - productRepository.delete(productId); + productGroupRepository.delete(productGroupId); } } } diff --git a/src/main/java/ch/wisv/payments/admin/products/request/ProductRequest.java b/src/main/java/ch/wisv/payments/admin/products/request/ProductRequest.java index 1e8e674..c9bcd20 100644 --- a/src/main/java/ch/wisv/payments/admin/products/request/ProductRequest.java +++ b/src/main/java/ch/wisv/payments/admin/products/request/ProductRequest.java @@ -10,7 +10,7 @@ public class ProductRequest { @Getter @Setter - int productId; + int id; @Setter @Getter int committeeId; diff --git a/src/main/java/ch/wisv/payments/exception/CommitteeNotFoundException.java b/src/main/java/ch/wisv/payments/exception/CommitteeNotFoundException.java new file mode 100644 index 0000000..411bafd --- /dev/null +++ b/src/main/java/ch/wisv/payments/exception/CommitteeNotFoundException.java @@ -0,0 +1,4 @@ +package ch.wisv.payments.exception; + +public class CommitteeNotFoundException extends RuntimeException { +} diff --git a/src/main/java/ch/wisv/payments/exception/CommmitteeNotFoundException.java b/src/main/java/ch/wisv/payments/exception/CommmitteeNotFoundException.java deleted file mode 100644 index 1c604b1..0000000 --- a/src/main/java/ch/wisv/payments/exception/CommmitteeNotFoundException.java +++ /dev/null @@ -1,4 +0,0 @@ -package ch.wisv.payments.exception; - -public class CommmitteeNotFoundException extends RuntimeException { -} diff --git a/src/main/java/ch/wisv/payments/exception/EmptyOrderException.java b/src/main/java/ch/wisv/payments/exception/EmptyOrderException.java index 21b23a0..ee7c105 100644 --- a/src/main/java/ch/wisv/payments/exception/EmptyOrderException.java +++ b/src/main/java/ch/wisv/payments/exception/EmptyOrderException.java @@ -1,8 +1,8 @@ package ch.wisv.payments.exception; public class EmptyOrderException extends RuntimeException { - public EmptyOrderException(String s) { super(s); } } + diff --git a/src/main/java/ch/wisv/payments/exception/ProductGroupInUseException.java b/src/main/java/ch/wisv/payments/exception/ProductGroupInUseException.java new file mode 100644 index 0000000..99edb80 --- /dev/null +++ b/src/main/java/ch/wisv/payments/exception/ProductGroupInUseException.java @@ -0,0 +1,7 @@ +package ch.wisv.payments.exception; + +public class ProductGroupInUseException extends RuntimeException { + public ProductGroupInUseException(String s) { + super(s); + } +} diff --git a/src/main/resources/templates/edit.html b/src/main/resources/templates/editProduct.html similarity index 95% rename from src/main/resources/templates/edit.html rename to src/main/resources/templates/editProduct.html index 7fd5747..e97889a 100644 --- a/src/main/resources/templates/edit.html +++ b/src/main/resources/templates/editProduct.html @@ -47,9 +47,8 @@

Edit

-
- + +
- +
diff --git a/src/main/resources/templates/editProductGroup.html b/src/main/resources/templates/editProductGroup.html new file mode 100644 index 0000000..32af118 --- /dev/null +++ b/src/main/resources/templates/editProductGroup.html @@ -0,0 +1,92 @@ + + + + + + + + + + + + CH Payments + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
+

Products

+ +
+
+
+

Edit

+
+
+ +
+ +
+ + +
+
+ + +
+
+ + +
+
+ +
+ +
+
+ +
+
+
+
+
+
+ + + + + + diff --git a/src/main/resources/templates/products.html b/src/main/resources/templates/products.html index 156da77..3f6b185 100644 --- a/src/main/resources/templates/products.html +++ b/src/main/resources/templates/products.html @@ -49,8 +49,7 @@

Add products

-
+
- +
-
+
Add products
-
+
@@ -155,8 +154,7 @@

Add Product Group

- +
@@ -218,14 +216,16 @@

Add Product Group

- - - - - - - - + +
+ + + + +
+