Skip to content

Instantly share code, notes, and snippets.

@parzibyte
Created September 4, 2019 18:45
Show Gist options
  • Save parzibyte/2077a7651349e9252d0dfd9a7fa05a6e to your computer and use it in GitHub Desktop.
Save parzibyte/2077a7651349e9252d0dfd9a7fa05a6e to your computer and use it in GitHub Desktop.
package me.parzibyte.sistemaventasspringboot;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import javax.validation.Valid;
@Controller
@RequestMapping(path = "/productos")
public class ProductosController {
@Autowired
private ProductosRepository productosRepository;
@GetMapping(value = "/agregar")
public String agregarProducto(Model model) {
model.addAttribute("producto", new Producto());
return "productos/agregar_producto";
}
@GetMapping(value = "/mostrar")
public String mostrarProductos(Model model) {
model.addAttribute("productos", productosRepository.findAll());
return "productos/ver_productos";
}
@PostMapping(value = "/eliminar")
public String eliminarProducto(@ModelAttribute Producto producto, RedirectAttributes redirectAttrs) {
redirectAttrs
.addFlashAttribute("mensaje", "Eliminado correctamente")
.addFlashAttribute("clase", "warning");
productosRepository.deleteById(producto.getId());
return "redirect:/productos/mostrar";
}
// Se colocó el parámetro ID para eso de los errores, ya sé el id se puede recuperar
// a través del modelo, pero lo que yo quiero es que se vea la misma URL para regresar la vista con
// los errores en lugar de hacer un redirect, ya que si hago un redirect, no se muestran los errores del formulario
// y por eso regreso mejor la vista ;)
@PostMapping(value = "/editar/{id}")
public String actualizarProducto(@ModelAttribute @Valid Producto producto, BindingResult bindingResult, RedirectAttributes redirectAttrs) {
if (bindingResult.hasErrors()) {
if (producto.getId() != null) {
return "productos/editar_producto";
}
return "redirect:/productos/mostrar";
}
Producto posibleProductoExistente = productosRepository.findFirstByCodigo(producto.getCodigo());
if (posibleProductoExistente != null && !posibleProductoExistente.getId().equals(producto.getId())) {
redirectAttrs
.addFlashAttribute("mensaje", "Ya existe un producto con ese código")
.addFlashAttribute("clase", "warning");
return "redirect:/productos/agregar";
}
productosRepository.save(producto);
redirectAttrs
.addFlashAttribute("mensaje", "Editado correctamente")
.addFlashAttribute("clase", "success");
return "redirect:/productos/mostrar";
}
@GetMapping(value = "/editar/{id}")
public String mostrarFormularioEditar(@PathVariable int id, Model model) {
model.addAttribute("producto", productosRepository.findById(id).orElse(null));
return "productos/editar_producto";
}
@PostMapping(value = "/agregar")
public String guardarProducto(@ModelAttribute @Valid Producto producto, BindingResult bindingResult, RedirectAttributes redirectAttrs) {
if (bindingResult.hasErrors()) {
return "productos/agregar_producto";
}
if (productosRepository.findFirstByCodigo(producto.getCodigo()) != null) {
redirectAttrs
.addFlashAttribute("mensaje", "Ya existe un producto con ese código")
.addFlashAttribute("clase", "warning");
return "redirect:/productos/agregar";
}
productosRepository.save(producto);
redirectAttrs
.addFlashAttribute("mensaje", "Agregado correctamente")
.addFlashAttribute("clase", "success");
return "redirect:/productos/agregar";
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment