diff --git a/src/main/java/br/com/codar/receitas/controller/ReceitaController.java b/src/main/java/br/com/codar/receitas/controller/ReceitaController.java new file mode 100644 index 0000000..2b23ea3 --- /dev/null +++ b/src/main/java/br/com/codar/receitas/controller/ReceitaController.java @@ -0,0 +1,78 @@ +package br.com.codar.receitas.controller; + + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +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.bind.annotation.RequestMethod; +import org.springframework.web.servlet.ModelAndView; + +import java.util.Optional; + +import javax.validation.Valid; + +import br.com.codar.receitas.controller.form.IngredienteForm; +import br.com.codar.receitas.controller.form.ReceitaForm; +import br.com.codar.receitas.model.Receita; + +@Controller +@RequestMapping("/receitas") +public class ReceitaController { + private final ModelAndView modelAndView = new ModelAndView("cadastro-receita"); + private final ReceitaRepository receitaRepository; + + public ReceitaController(final ReceitaRepository receitaRepository) { + this.receitaRepository = receitaRepository; + } + + @GetMapping("/lista") + public String lista(final Model model) { + Iterable receitas = receitaRepository.findAll(); + + model.addAttribute("receitas", receitas); + + return "lista-receitas"; + + } + + @GetMapping + public ModelAndView nova() { + return modelAndView; + } + + @GetMapping("/nova") + public String nova(final Model model) { + model.addAttribute("receitaForm", new ReceitaForm()); + model.addAttribute("ingredienteForm", new IngredienteForm()); + return "cadastro-receita"; + } + + @RequestMapping(method = RequestMethod.POST) + public String salvar(@Valid final ReceitaForm receitaForm, final BindingResult result, final Model model) { + if (result.hasErrors()){ + model.addAttribute(new IngredienteForm()); + return "cadastro-receita"; + } + Receita receita = receitaForm.converte(); + receitaRepository.save(receita); + String sucesso = "Salvo com sucesso"; + receitaForm.limparCampos(); + model.addAttribute("sucesso", sucesso); + model.addAttribute("receitaForm", receitaForm); + return "cadastro-receita"; + + } + + @GetMapping("/detalhe/{id}") + public ModelAndView detalhe(@PathVariable("id") final Long id) { + Optional receita = receitaRepository.findById(id); + ModelAndView modelAndView = new ModelAndView("detalhe-receita"); + modelAndView.addObject("receita", receita.orElse(null)); + return modelAndView; + + } + +} \ No newline at end of file diff --git a/src/main/java/br/com/codar/receitas/controller/ReceitaRepository.java b/src/main/java/br/com/codar/receitas/controller/ReceitaRepository.java new file mode 100644 index 0000000..5d2e6b9 --- /dev/null +++ b/src/main/java/br/com/codar/receitas/controller/ReceitaRepository.java @@ -0,0 +1,10 @@ +package br.com.codar.receitas.controller; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import br.com.codar.receitas.model.Receita; +@Repository +public interface ReceitaRepository extends JpaRepository { + +} diff --git a/src/main/java/br/com/codar/receitas/controller/form/IngredienteForm.java b/src/main/java/br/com/codar/receitas/controller/form/IngredienteForm.java new file mode 100644 index 0000000..c207aae --- /dev/null +++ b/src/main/java/br/com/codar/receitas/controller/form/IngredienteForm.java @@ -0,0 +1,52 @@ +package br.com.codar.receitas.controller.form; + +import org.hibernate.validator.constraints.Range; + +import javax.validation.constraints.NotEmpty; + +public class IngredienteForm { + + private Long id; + @NotEmpty(message = "Informe o nome do ingrediente") + private String nomeIngrediente; + + @Range(min = 1, max = 1000, message = "A quantidade deve ser informada entre 1 a 1000") + private Integer quantidade; + @NotEmpty(message = "Selecione uma medida") + private String medida; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getNomeIngrediente() { + return nomeIngrediente; + } + + public void setNomeIngrediente(String nomeIngrediente) { + this.nomeIngrediente = nomeIngrediente; + } + + public Integer getQuantidade() { + return quantidade; + } + + public void setQuantidade(Integer quantidade) { + this.quantidade = quantidade; + } + + public String getMedida() { + return medida; + } + + public void setMedida(String medida) { + this.medida = medida; + } + + +} diff --git a/src/main/java/br/com/codar/receitas/controller/form/ReceitaForm.java b/src/main/java/br/com/codar/receitas/controller/form/ReceitaForm.java new file mode 100644 index 0000000..b08e26f --- /dev/null +++ b/src/main/java/br/com/codar/receitas/controller/form/ReceitaForm.java @@ -0,0 +1,122 @@ +package br.com.codar.receitas.controller.form; + +import org.hibernate.validator.constraints.Length; +import org.hibernate.validator.constraints.Range; + +import java.util.ArrayList; +import java.util.List; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +import br.com.codar.receitas.model.Ingrediente; +import br.com.codar.receitas.model.Receita; + +public class ReceitaForm { + + private Long id; + @NotEmpty(message = "Informe o nome da receita") + @Length(min = 5, max = 20) + private String nome; + + private String linkFoto; + @NotNull(message = "Informe o tempo de preparo") + @Range(min = 10, max = 360) + + private Integer tempoPreparo; + @NotNull(message = "Informe o Rendimento") + @Range(min = 1, max = 50) + private Integer rendimento; + + @NotNull(message = "Informe o modo de preparo") + @Length(min = 10, max = 360) + private String modoPreparo; + + @Size(min = 1, message = "A receita deve conter pelo menos um ingrediente") + private List ingredientes = new ArrayList<>(); + + private Boolean revisar; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getNome() { + return nome; + } + + public void setNome(String nome) { + this.nome = nome; + } + + public String getLinkFoto() { + return linkFoto; + } + + public void setLinkFoto(String linkFoto) { + this.linkFoto = linkFoto; + } + + public Integer getTempoPreparo() { + return tempoPreparo; + } + + public void setTempoPreparo(Integer tempoPreparo) { + this.tempoPreparo = tempoPreparo; + } + + public Integer getRendimento() { + return rendimento; + } + + public void setRendimento(Integer rendimento) { + this.rendimento = rendimento; + } + + public String getModoPreparo() { + return modoPreparo; + } + + public void setModoPreparo(String modoPreparo) { + this.modoPreparo = modoPreparo; + } + + + public Boolean getRevisar() { + return revisar; + } + + public List getIngredientes() { + return ingredientes; + } + + public void setIngredientes(List ingredientes) { + this.ingredientes = ingredientes; + } + + public void setRevisar(Boolean revisar) { + this.revisar = revisar; + } + + public Receita converte() { + return new Receita(id, nome, linkFoto, tempoPreparo, rendimento, ingredientes, modoPreparo, revisar); + } + + public void limparCampos(){ + this.nome = ""; + this.linkFoto = ""; + this.tempoPreparo = 0; + this.rendimento = 0; + this.ingredientes.clear(); + this.modoPreparo = ""; + this.revisar = true; + } + + +} diff --git a/src/main/java/br/com/codar/receitas/model/Ingrediente.java b/src/main/java/br/com/codar/receitas/model/Ingrediente.java new file mode 100644 index 0000000..8dcf4b6 --- /dev/null +++ b/src/main/java/br/com/codar/receitas/model/Ingrediente.java @@ -0,0 +1,86 @@ +package br.com.codar.receitas.model; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; + +@Entity +public class Ingrediente { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + private String nome; + private Integer quantidade; + private String medida; + + @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) + @JoinColumn(name = "receita_id") + private Receita receita; + + public Ingrediente(String nome, Integer quantidade, String medida) { + this.nome = nome; + this.quantidade = quantidade; + this.medida = medida; + } + + public Ingrediente() { + + } + + public Ingrediente(Long id, String nome, Integer quantidade, Receita receita) { + + this.id = id; + this.nome = nome; + this.quantidade = quantidade; + this.receita = receita; + + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getNome() { + return nome; + } + + public void setNome(String nome) { + this.nome = nome; + } + + public Integer getQuantidade() { + return quantidade; + } + + public void setQuantidade(Integer quantidade) { + this.quantidade = quantidade; + } + + public String getMedida() { + return medida; + } + + public void setMedida(String medida) { + this.medida = medida; + } + + public Receita getReceita() { + return receita; + } + + public void setReceita(Receita receita) { + this.receita = receita; + } + +} + diff --git a/src/main/java/br/com/codar/receitas/model/Receita.java b/src/main/java/br/com/codar/receitas/model/Receita.java new file mode 100644 index 0000000..0af2fce --- /dev/null +++ b/src/main/java/br/com/codar/receitas/model/Receita.java @@ -0,0 +1,130 @@ +package br.com.codar.receitas.model; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.OneToMany; +import javax.validation.constraints.NotEmpty; + +@Entity +public class Receita { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String nome; + private String linkFoto; + + private Integer tempoPreparo; + private Integer rendimento; + + private String modoPreparo; + + @NotEmpty(message = "Nao pode ser nula") + @OneToMany(cascade = CascadeType.ALL) + @JoinColumn(name = "receita_id", referencedColumnName = "id") + private List ingredientes = new ArrayList<>(); + private Boolean revisar; + private LocalDateTime dataPublicacao = LocalDateTime.now(); + + public Receita(Long id, String nome, String linkFoto, Integer tempoPreparo, Integer rendimento, List ingredientes, String modoPreparo, Boolean revisar) { + this.id = id; + this.nome = nome; + this.linkFoto = linkFoto; + this.tempoPreparo = tempoPreparo; + this.rendimento = rendimento; + this.ingredientes = ingredientes; + this.modoPreparo = modoPreparo; + this.revisar = revisar; + } + + + public List getIngredientes() { + return ingredientes; + } + + public void setIngredientes(List ingredientes) { + this.ingredientes = ingredientes; + } + + + public LocalDateTime getDataPublicacao() { + return dataPublicacao; + } + + public void setDataPublicacao(LocalDateTime dataPublicacao) { + this.dataPublicacao = dataPublicacao; + } + + public Receita() { + + } + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getNome() { + return nome; + } + + public void setNome(String nome) { + this.nome = nome; + } + + public String getLinkFoto() { + return linkFoto; + } + + public void setLinkFoto(String linkFoto) { + this.linkFoto = linkFoto; + } + + public Integer getTempoPreparo() { + return tempoPreparo; + } + + public void setTempoPreparo(Integer tempoPreparo) { + this.tempoPreparo = tempoPreparo; + } + + public Integer getRendimento() { + return rendimento; + } + + public void setRendimento(Integer rendimento) { + this.rendimento = rendimento; + } + + public String getModoPreparo() { + return modoPreparo; + } + + public void setModoPreparo(String modoPreparo) { + this.modoPreparo = modoPreparo; + } + + + public Boolean getRevisar() { + return revisar; + } + + public void setRevisar(Boolean revisar) { + this.revisar = revisar; + } + + +} diff --git a/src/main/resources/static/js/receita-ingrediente.js b/src/main/resources/static/js/receita-ingrediente.js index 2fb06e0..d3e5df8 100644 --- a/src/main/resources/static/js/receita-ingrediente.js +++ b/src/main/resources/static/js/receita-ingrediente.js @@ -26,4 +26,16 @@ function adicionarIngrediente() { function removerIngrediente(el) { $(el).closest("tr").remove(); -} \ No newline at end of file +} + +$("#adicionar").on("click", function (e) { + const form = $("#ingredienteForm")[0]; + const isValid = form.checkValidity(); + if (!isValid) { + e.preventDefault(); + e.stopPropagation(); + } + adicionarIngrediente(form); + form.classList.add('was-validated'); + return false; // For testing only to stay on this page +}); \ No newline at end of file diff --git a/src/main/resources/templates/cadastro-receita.html b/src/main/resources/templates/cadastro-receita.html index 1f981f1..5d69d89 100644 --- a/src/main/resources/templates/cadastro-receita.html +++ b/src/main/resources/templates/cadastro-receita.html @@ -10,13 +10,14 @@
-
+