Skip to content

Instantly share code, notes, and snippets.

@robsonsilv4
Created June 22, 2019 23:44
Show Gist options
  • Save robsonsilv4/bc41a327422d3dc1c90f32647cba5260 to your computer and use it in GitHub Desktop.
Save robsonsilv4/bc41a327422d3dc1c90f32647cba5260 to your computer and use it in GitHub Desktop.
Carrinho com Spring Boot e Thymeleaf
<tr th:each="prato : ${pratos.entrySet()}">
<td th:text="${prato.getKey().codigo}"></td>
<td th:text="${prato.getKey().nome}">
<td th:text="${prato.getKey().preco}"></td>
<td th:text="${prato.getKey().quantidade}"></td>
<td><a class="btn btn-danger" th:href="@{/carrinho/remover/{codigo}(codigo = ${prato.getKey().codigo})}">Remover Prato</a></td>
</tr>
<a class="btn btn-primary" th:href="@{'/carrinho/finalizar/'}">Finalizar Pedido</a>
<h2 th:inline="text">Total do Pedido:[[${total}]]</h2>
package com.ufc.br.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.ufc.br.exception.SemPratosSuficienteException;
import com.ufc.br.repository.PratoRepository;
import com.ufc.br.service.CarrinhoService;
@Controller
@RequestMapping("/carrinho")
public class CarrinhoController {
@Autowired
private CarrinhoService carinhoService;
@Autowired
private PratoRepository pratoRepository;
@GetMapping
public ModelAndView carrinho() {
ModelAndView modelAndView = new ModelAndView("/carrinho");
modelAndView.addObject("pratos", carinhoService.getPratosCarrinho());
modelAndView.addObject("total", carinhoService.getTotal().toString());
return modelAndView;
}
@GetMapping("/adicionar/{codigo}")
public ModelAndView adicionar(@PathVariable("codigo") Long codigo) {
pratoRepository.findById(codigo).ifPresent(carinhoService::adicionar);
return carrinho();
}
@GetMapping("/remover/{codigo}")
public ModelAndView removver(@PathVariable("codigo") Long codigo) {
pratoRepository.findById(codigo).ifPresent(carinhoService::remover);
return carrinho();
}
@GetMapping("/finalizar")
public ModelAndView finalizar() {
try {
carinhoService.finalizar();
} catch (SemPratosSuficienteException e) {
return carrinho().addObject("outOfStockMessage", e.getMessage());
}
// Lógica ao finalizar o carrinho
// Como utilizar o HashMap:
// https://www.devmedia.com.br/hashmap-java-trabalhando-com-listas-key-value/29811
return carrinho();
}
}
package com.ufc.br.service;
import java.math.BigDecimal;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import javax.transaction.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.context.annotation.ScopedProxyMode;
import org.springframework.stereotype.Service;
import org.springframework.web.context.WebApplicationContext;
import com.ufc.br.exception.SemPratosSuficienteException;
import com.ufc.br.model.Prato;
import com.ufc.br.repository.PratoRepository;
@Service
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
@Transactional
public class CarrinhoService {
@Autowired
private PratoRepository pratoRepository;
private Map<Prato, Integer> pratos = new HashMap<>();
public void adicionar(Prato prato) {
if (pratos.containsKey(prato)) {
pratos.replace(prato, pratos.get(prato) + 1);
} else {
pratos.put(prato, 1);
}
}
public void remover(Prato prato) {
if (pratos.containsKey(prato)) {
if (pratos.get(prato) > 1)
pratos.replace(prato, pratos.get(prato) - 1);
else if (pratos.get(prato) == 1) {
pratos.remove(prato);
}
}
}
public Map<Prato, Integer> getPratosCarrinho() {
return Collections.unmodifiableMap(pratos);
}
public void finalizar() throws SemPratosSuficienteException {
Optional<Prato> prato;
for (Map.Entry<Prato, Integer> entry : pratos.entrySet()) {
prato = pratoRepository.findById(entry.getKey().getCodigo());
if (prato.get().getQuantidade() < entry.getValue())
throw new SemPratosSuficienteException(prato);
entry.getKey().setQuantidade(prato.get().getQuantidade() - entry.getValue());
}
pratoRepository.saveAll(pratos.keySet());
// pratoRepository.flush();
// pratoRepository.clear();
}
public BigDecimal getTotal() {
return pratos.entrySet().stream()
.map(entry -> entry.getKey().getPreco().multiply(BigDecimal.valueOf(entry.getValue())))
.reduce(BigDecimal::add).orElse(BigDecimal.ZERO);
}
}
package com.ufc.br.exception;
import java.util.Optional;
import com.ufc.br.model.Prato;
@SuppressWarnings("serial")
public class SemPratosSuficienteException extends Exception {
private static final String DEFAULT_MESSAGE = "Sem pratos suficientes no cozinha.";
public SemPratosSuficienteException() {
super(DEFAULT_MESSAGE);
}
public SemPratosSuficienteException(Optional<Prato> prato) {
super(String.format("Sem pratos %s suficientes no cozinha. Apenas %d restantes.", prato.get().getNome(),
prato.get().getQuantidade()));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment