Created
June 22, 2019 23:44
-
-
Save robsonsilv4/bc41a327422d3dc1c90f32647cba5260 to your computer and use it in GitHub Desktop.
Carrinho com Spring Boot e Thymeleaf
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<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> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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