-
Notifications
You must be signed in to change notification settings - Fork 1
Remove and edit producs groups #40
Changes from 2 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -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,7 +59,7 @@ public String productEdit(@PathVariable Integer productId, Model model) { | |
|
||
model.addAttribute("product", productRequest); | ||
|
||
return "edit"; | ||
return "editProduct"; | ||
} | ||
|
||
@PostMapping(value = "/add") | ||
|
@@ -88,9 +89,48 @@ public String deleteProduct(@PathVariable int productId, RedirectAttributes redi | |
return "redirect:/products"; | ||
} | ||
|
||
@PostMapping(value = "/addGroup") | ||
@PostMapping(value = "/group") | ||
public String addProductGroup(@ModelAttribute @Validated ProductGroupRequest productGroupRequest) { | ||
productService.addProductGroup(productGroupRequest); | ||
System.out.println("here"); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Whoops, this is old. |
||
|
||
return "redirect:/products"; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please add RedirectAttributes to show a message on the success of the adding |
||
} | ||
|
||
@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) { | ||
try { | ||
productService.deleteProductGroup(productGroupId); | ||
} catch (RuntimeException e) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Let's add a ExceptionHandler method for this controller, as the logic is the same for all RuntimeExceptions There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Try to have that "redirect" to the current page, so you don't lose a filled in form. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. How would you imagine that? This is a delete endpoint, what should happen? |
||
redirectAttributes.addFlashAttribute("error", e.getMessage()); | ||
} | ||
|
||
return "redirect:/products"; | ||
} | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,6 +4,7 @@ | |
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; | ||
|
@@ -79,9 +80,9 @@ public void addProductToGroup(Product product, ProductGroup productGroup) { | |
|
||
@Override | ||
public void editProduct(ProductRequest productRequest) { | ||
if (productRequest.getProductId() != 0) { | ||
if (productRequest.getId() != 0) { | ||
Committee committee = committeeRepository.findOne(productRequest.getCommitteeId()); | ||
Product product = productRepository.findOne(productRequest.getProductId()); | ||
Product product = productRepository.findOne(productRequest.getId()); | ||
|
||
product.setName(productRequest.getName()); | ||
product.setDescription(productRequest.getDescription()); | ||
|
@@ -102,6 +103,17 @@ public void editProduct(ProductRequest productRequest) { | |
} | ||
} | ||
|
||
@Override | ||
public void deleteProduct(int productId) { | ||
List<Order> 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); | ||
|
@@ -130,13 +142,32 @@ public boolean isProductAvailable(Integer productId) { | |
} | ||
|
||
@Override | ||
public void deleteProduct(int productId) { | ||
List<Order> 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) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why this if? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It was also in the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Hmm, probably because the id's are |
||
Committee committee = committeeRepository.findOne(productGroupRequest.getCommitteeId()); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Let's take the |
||
ProductGroup productGroup = productGroupRepository.findOne(productGroupRequest.getId()); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same for this. Create/use a servicecall |
||
|
||
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); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Servicecall here too There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. So do we want to make a new There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think we can put that in one service. Once we need more functionality that requires a lot more methods, we'll separate them. |
||
if (!productGroup.getProducts().isEmpty()) { | ||
throw new ProductGroupInUseException("Product group must be empty"); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is this really the case? What would break if you remove a group with products in it? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I had previously implemented it in a way where products were removed from the group when the group was removed, but this may be an action where we don't want it to be very easy to perform. I'm also not quite sure which way to go, it made sense to me that since there is a limit involved, you don't want it to be this easy, just like removing a product that is already ordered. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Alright, then perhaps add a section to the editGroup page where you can remove products currently in the group? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We can also add the removal of tickets from a group as a hoothub issue, since this is not very high prioroty. It is also not relevant to editing the product group, it would make more sense to have it in a different page. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Leave it like this for now, and create a HootHub issue to implement this nicely. |
||
} else { | ||
productRepository.delete(productId); | ||
productGroupRepository.delete(productGroupId); | ||
} | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
package ch.wisv.payments.exception; | ||
|
||
public class ProductGroupInUseException extends RuntimeException { | ||
public ProductGroupInUseException(String s) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This constructor is already in There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You unfortunately have to do this to make use of the |
||
super(s); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
<!DOCTYPE html> | ||
<html xmlns:th="http://www.thymeleaf.org"> | ||
<head> | ||
<meta charset="utf-8"> | ||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> | ||
<meta name="viewport" content="width=device-width, initial-scale=1"> | ||
<!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags --> | ||
<meta name="description" content=""> | ||
<meta name="author" content=""> | ||
<link rel="icon" href="../../favicon.ico"> | ||
|
||
<title>CH Payments</title> | ||
|
||
<!-- Bootstrap core CSS --> | ||
<link th:href="@{/webjars/bootstrap/3.3.7-1/css/bootstrap.min.css}" rel="stylesheet"> | ||
<link th:href="@{/webjars/wisvch-bootstrap-theme/0.0.3/dist/css/bootstrap.min.css}" | ||
rel="stylesheet" media="screen"/> | ||
|
||
<!-- Custom styles for this template --> | ||
<link th:href="@{/css/dashboard.css}" rel="stylesheet"> | ||
|
||
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/v/bs/dt-1.10.12/datatables.min.css"/> | ||
|
||
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries --> | ||
<!--[if lt IE 9]> | ||
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> | ||
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> | ||
<![endif]--> | ||
</head> | ||
|
||
<body> | ||
<div th:replace="fragments/header :: header"> | ||
<nav class="navbar navbar-inverse navbar-fixed-top"></nav> | ||
</div> | ||
|
||
<div class="container-fluid"> | ||
<div class="row"> | ||
<div th:replace="fragments/sidebar :: sidebar"></div> | ||
</div> | ||
<div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main"> | ||
<h1 class="page-header">Products</h1> | ||
|
||
<div class="row"> | ||
<div class="panel panel-default"> | ||
<div class="panel-heading"> | ||
<h3 class="panel-title">Edit</h3> | ||
</div> | ||
<div class="panel-body col-lg-12"> | ||
<!--/*@thymesVar id="productGroup" type="ch.wisv.payments.admin.products.request.ProductGroupRequest"*/--> | ||
<form class="form-horizontal" th:action="@{/products/group/edit}" th:object="${productGroup}" | ||
method="post"> | ||
<input type="hidden" th:field="*{id}"> | ||
<div class="form-group"> | ||
<label for="committeeName">Committee</label> | ||
<select class="form-control" th:field="*{committeeId}" id="committeeName"> | ||
<option th:each="committee : ${committees}" | ||
th:value="${committee.id}" | ||
th:text="${committee.getName().getName()} + ' ' + ${committee.year}"> | ||
</option> | ||
</select> | ||
</div> | ||
<div class="form-group"> | ||
<label for="productName">Group Name</label> | ||
<input type="text" class="form-control" th:field="*{name}" id="productName" | ||
placeholder="Name" | ||
required> | ||
</div> | ||
<div class="form-group"> | ||
<label for="productDescription">Description</label> | ||
<input type="text" class="form-control" th:field="*{description}" id="productDescription" | ||
placeholder="Description" required> | ||
</div> | ||
<div class="form-group"> | ||
<label for="groupLimit">Group Limit</label> | ||
<div class="input-group"> | ||
<input type="number" step="1" th:field="*{groupLimit}" class="form-control" | ||
id="groupLimit" | ||
placeholder="Max tickets sold in group"> | ||
</div> | ||
</div> | ||
<button type="submit" class="btn btn-success">Save product group</button> | ||
</form> | ||
</div> | ||
</div> | ||
</div> | ||
</div> | ||
</div> | ||
|
||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> | ||
<script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery.min.js"><\/script>')</script> | ||
<script th:src="@{/webjars/bootstrap/3.3.7-1/js/bootstrap.min.js}"></script> | ||
</body> | ||
</html> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There!