From c083dd3725ae4ef032c8664ab22d62834c17fbd7 Mon Sep 17 00:00:00 2001 From: Jandson Date: Tue, 30 Nov 2021 10:31:47 -0300 Subject: [PATCH 01/10] pom modificado, lista-receitas mapeada --- pom.xml | 5 ++++ .../controller/ReceitaController.java | 23 +++++++++++++++ .../codar/receitas/model/Ingredientes.java | 20 +++++++++++++ .../br/com/codar/receitas/model/Medida.java | 7 +++++ .../br/com/codar/receitas/model/Receita.java | 28 +++++++++++++++++++ .../repository/ReceitaRepository.java | 9 ++++++ .../receitas/service/ReceitaService.java | 18 ++++++++++++ src/main/resources/application.properties | 2 ++ 8 files changed, 112 insertions(+) create mode 100644 src/main/java/br/com/codar/receitas/controller/ReceitaController.java create mode 100644 src/main/java/br/com/codar/receitas/model/Ingredientes.java create mode 100644 src/main/java/br/com/codar/receitas/model/Medida.java create mode 100644 src/main/java/br/com/codar/receitas/model/Receita.java create mode 100644 src/main/java/br/com/codar/receitas/repository/ReceitaRepository.java create mode 100644 src/main/java/br/com/codar/receitas/service/ReceitaService.java diff --git a/pom.xml b/pom.xml index f4e27e4..1d0c559 100644 --- a/pom.xml +++ b/pom.xml @@ -44,6 +44,11 @@ spring-boot-starter-test test + + org.projectlombok + lombok + true + 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..9bdccea --- /dev/null +++ b/src/main/java/br/com/codar/receitas/controller/ReceitaController.java @@ -0,0 +1,23 @@ +package br.com.codar.receitas.controller; +import br.com.codar.receitas.service.ReceitaService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + + +@Controller +@RequestMapping("receitas") +public class ReceitaController { + + @Autowired + private ReceitaService receitaService; + + @GetMapping("lista") + public String lista(Model model) { + model.addAttribute("receitas", receitaService.listar()); + return "lista-receitas"; + } + +} diff --git a/src/main/java/br/com/codar/receitas/model/Ingredientes.java b/src/main/java/br/com/codar/receitas/model/Ingredientes.java new file mode 100644 index 0000000..a44851a --- /dev/null +++ b/src/main/java/br/com/codar/receitas/model/Ingredientes.java @@ -0,0 +1,20 @@ +package br.com.codar.receitas.model; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Entity +@Data +@NoArgsConstructor +public class Ingredientes { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + private String nome; + private Integer quantidade; + @Enumerated(EnumType.STRING) + private Medida medida; + +} diff --git a/src/main/java/br/com/codar/receitas/model/Medida.java b/src/main/java/br/com/codar/receitas/model/Medida.java new file mode 100644 index 0000000..3d8f0eb --- /dev/null +++ b/src/main/java/br/com/codar/receitas/model/Medida.java @@ -0,0 +1,7 @@ +package br.com.codar.receitas.model; + +public enum Medida { + GRAMA, + MILILITRO, + UNIDADE; +} 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..8957d6d --- /dev/null +++ b/src/main/java/br/com/codar/receitas/model/Receita.java @@ -0,0 +1,28 @@ +package br.com.codar.receitas.model; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import java.time.LocalDate; +import java.util.List; + +@Entity +@Data +@NoArgsConstructor +public class Receita { + @Id + @GeneratedValue(strategy = javax.persistence.GenerationType.IDENTITY) + private Long id; + private String nome; + @Lob + private String linkFoto; + private Integer tempoPreparo; + private Integer rendimento; + @OneToMany(cascade = CascadeType.ALL) + private List ingredientes; + private LocalDate dataPublicacao = LocalDate.now(); + private String modoPreparo; + private Boolean revisar; + +} diff --git a/src/main/java/br/com/codar/receitas/repository/ReceitaRepository.java b/src/main/java/br/com/codar/receitas/repository/ReceitaRepository.java new file mode 100644 index 0000000..0bdf1ec --- /dev/null +++ b/src/main/java/br/com/codar/receitas/repository/ReceitaRepository.java @@ -0,0 +1,9 @@ +package br.com.codar.receitas.repository; + +import br.com.codar.receitas.model.Receita; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ReceitaRepository extends JpaRepository { +} diff --git a/src/main/java/br/com/codar/receitas/service/ReceitaService.java b/src/main/java/br/com/codar/receitas/service/ReceitaService.java new file mode 100644 index 0000000..e8596ee --- /dev/null +++ b/src/main/java/br/com/codar/receitas/service/ReceitaService.java @@ -0,0 +1,18 @@ +package br.com.codar.receitas.service; + +import br.com.codar.receitas.model.Receita; +import br.com.codar.receitas.repository.ReceitaRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class ReceitaService { + @Autowired + private ReceitaRepository repository; + + public List listar() { + return repository.findAll(); + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 3469e0c..81e9e03 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -8,3 +8,5 @@ spring.datasource.password=password spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=update spring.jpa.database-platform=org.hibernate.dialect.H2Dialect +spring.h2.console.enabled=true +spring.h2.console.path=/h2 From e5fc5a46e7965e2c496af8b484bf65d01a27d25f Mon Sep 17 00:00:00 2001 From: Jandson Date: Tue, 30 Nov 2021 11:46:03 -0300 Subject: [PATCH 02/10] cadastro e detalhe receita mapeados. --- .../controller/ReceitaController.java | 21 ++++++++++++++++++- .../receitas/service/ReceitaService.java | 8 +++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/main/java/br/com/codar/receitas/controller/ReceitaController.java b/src/main/java/br/com/codar/receitas/controller/ReceitaController.java index 9bdccea..04047c1 100644 --- a/src/main/java/br/com/codar/receitas/controller/ReceitaController.java +++ b/src/main/java/br/com/codar/receitas/controller/ReceitaController.java @@ -1,12 +1,14 @@ package br.com.codar.receitas.controller; +import br.com.codar.receitas.model.Receita; import br.com.codar.receitas.service.ReceitaService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; - @Controller @RequestMapping("receitas") public class ReceitaController { @@ -20,4 +22,21 @@ public String lista(Model model) { return "lista-receitas"; } + @GetMapping("nova") + public String nova(Receita receita) { + return "cadastro-receita"; + } + + @PostMapping + public String salvar(Receita receita) { + Receita receitaSalva = receitaService.salvar(receita); + return "redirect:/receitas/detalhe/" + receitaSalva.getId(); + } + + @GetMapping("detalhe/{id}") + public String detalhe(@PathVariable(value = "id") Long id, Model model) { + model.addAttribute("receita", receitaService.buscarPorId(id)); + return "detalhe-receita"; + } + } diff --git a/src/main/java/br/com/codar/receitas/service/ReceitaService.java b/src/main/java/br/com/codar/receitas/service/ReceitaService.java index e8596ee..bfcc58e 100644 --- a/src/main/java/br/com/codar/receitas/service/ReceitaService.java +++ b/src/main/java/br/com/codar/receitas/service/ReceitaService.java @@ -15,4 +15,12 @@ public class ReceitaService { public List listar() { return repository.findAll(); } + + public Receita salvar(Receita receita) { + return repository.save(receita); + } + + public Receita buscarPorId(Long id) { + return repository.findById(id).get(); + } } From 745e8ae5e69ec80399b569566ce17c0293d21ce0 Mon Sep 17 00:00:00 2001 From: Jandson Date: Wed, 1 Dec 2021 13:37:22 -0300 Subject: [PATCH 03/10] =?UTF-8?q?valida=C3=A7=C3=B5es=20adicionadas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ReceitaController.java | 13 +++++-- .../receitas/controller/form/ReceitaForm.java | 36 +++++++++++++++++++ .../codar/receitas/model/Ingredientes.java | 12 +++++++ .../br/com/codar/receitas/model/Receita.java | 12 +++++++ src/main/resources/application.properties | 2 +- .../static/js/receita-ingrediente.js | 9 ++++- .../resources/templates/cadastro-receita.html | 2 +- 7 files changed, 80 insertions(+), 6 deletions(-) create mode 100644 src/main/java/br/com/codar/receitas/controller/form/ReceitaForm.java diff --git a/src/main/java/br/com/codar/receitas/controller/ReceitaController.java b/src/main/java/br/com/codar/receitas/controller/ReceitaController.java index 04047c1..c85a21d 100644 --- a/src/main/java/br/com/codar/receitas/controller/ReceitaController.java +++ b/src/main/java/br/com/codar/receitas/controller/ReceitaController.java @@ -1,14 +1,18 @@ package br.com.codar.receitas.controller; +import br.com.codar.receitas.controller.form.ReceitaForm; import br.com.codar.receitas.model.Receita; import br.com.codar.receitas.service.ReceitaService; 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.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; +import javax.validation.Valid; + @Controller @RequestMapping("receitas") public class ReceitaController { @@ -23,13 +27,16 @@ public String lista(Model model) { } @GetMapping("nova") - public String nova(Receita receita) { + public String nova(ReceitaForm receitaForm) { return "cadastro-receita"; } @PostMapping - public String salvar(Receita receita) { - Receita receitaSalva = receitaService.salvar(receita); + public String salvar(@Valid ReceitaForm receitaForm, BindingResult result) { + if (result.hasErrors()) { + return "cadastro-receita"; + } + Receita receitaSalva = receitaService.salvar(receitaForm.converter()); return "redirect:/receitas/detalhe/" + receitaSalva.getId(); } 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..3f01b82 --- /dev/null +++ b/src/main/java/br/com/codar/receitas/controller/form/ReceitaForm.java @@ -0,0 +1,36 @@ +package br.com.codar.receitas.controller.form; + +import br.com.codar.receitas.model.Ingredientes; +import br.com.codar.receitas.model.Receita; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.*; +import java.util.List; + +@Data +@NoArgsConstructor +public class ReceitaForm { + @NotNull @NotEmpty + private String nome; + + private String linkFoto; + + @NotNull @Min(10) @Max(360) + private Integer tempoPreparo; + + @NotNull @Min(1) @Max(50) + private Integer rendimento; + + @NotEmpty + private List ingredientes; + + @NotNull @Size(min = 20, max = 1000) + private String modoPreparo; + private Boolean revisar; + + public Receita converter() { + return new Receita(nome, linkFoto, tempoPreparo, rendimento, ingredientes, modoPreparo, revisar); + } + +} diff --git a/src/main/java/br/com/codar/receitas/model/Ingredientes.java b/src/main/java/br/com/codar/receitas/model/Ingredientes.java index a44851a..ef8e81e 100644 --- a/src/main/java/br/com/codar/receitas/model/Ingredientes.java +++ b/src/main/java/br/com/codar/receitas/model/Ingredientes.java @@ -4,6 +4,10 @@ import lombok.NoArgsConstructor; import javax.persistence.*; +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; @Entity @Data @@ -12,9 +16,17 @@ public class Ingredientes { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + @NotNull @NotEmpty private String nome; + @Min(1) @Max(1000) private Integer quantidade; + @NotNull @Enumerated(EnumType.STRING) private Medida medida; + public Ingredientes(String nome, Integer quantidade, Medida medida) { + setNome(nome); + setQuantidade(quantidade); + setMedida(medida); + } } diff --git a/src/main/java/br/com/codar/receitas/model/Receita.java b/src/main/java/br/com/codar/receitas/model/Receita.java index 8957d6d..833708c 100644 --- a/src/main/java/br/com/codar/receitas/model/Receita.java +++ b/src/main/java/br/com/codar/receitas/model/Receita.java @@ -4,6 +4,7 @@ import lombok.NoArgsConstructor; import javax.persistence.*; +import javax.validation.constraints.NotNull; import java.time.LocalDate; import java.util.List; @@ -22,7 +23,18 @@ public class Receita { @OneToMany(cascade = CascadeType.ALL) private List ingredientes; private LocalDate dataPublicacao = LocalDate.now(); + @Column(length = 1000) private String modoPreparo; private Boolean revisar; + public Receita (String nome, String linkFoto, Integer tempoPreparo, Integer rendimento, List ingredientes, String modoPreparo, Boolean revisar) { + setNome(nome); + setLinkFoto(linkFoto); + setTempoPreparo(tempoPreparo); + setRendimento(rendimento); + setIngredientes(ingredientes); + setModoPreparo(modoPreparo); + setRevisar(revisar); + } + } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 81e9e03..b460f20 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -2,7 +2,7 @@ spring.datasource.url=jdbc:h2:mem:testdb spring.datasource.driverClassName=org.h2.Driver spring.datasource.username=sa -spring.datasource.password=password +spring.datasource.password= # JPA / Hibernate spring.jpa.show-sql=true diff --git a/src/main/resources/static/js/receita-ingrediente.js b/src/main/resources/static/js/receita-ingrediente.js index 2fb06e0..eaabcb0 100644 --- a/src/main/resources/static/js/receita-ingrediente.js +++ b/src/main/resources/static/js/receita-ingrediente.js @@ -10,7 +10,7 @@ function adicionarIngrediente() { let medida = $("#ingredientesMedida").val(); let deleteButton = "" - if(nome && quantidade && medida) { + if(isValid(nome, quantidade, medida)) { let linha = "" + getCelula(nome, 'nome') + getCelula(quantidade, 'quantidade') + @@ -21,9 +21,16 @@ function adicionarIngrediente() { $("#tabelaIngredientes").append(linha); $('#ingredienteForm').trigger("reset"); $('#modalIngrediente').modal('hide'); + } else { + alert("Preencha todos os campos!"); } } + +function isValid(nome, quantidade, medida) { + return nome != "" && nome != null && quantidade >= 1 && quantidade <= 1000 && medida != "Selecione um tipo de medida..."; +} + function removerIngrediente(el) { $(el).closest("tr").remove(); } \ 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..46fe681 100644 --- a/src/main/resources/templates/cadastro-receita.html +++ b/src/main/resources/templates/cadastro-receita.html @@ -16,7 +16,7 @@ -
+