forked from magnoazneto/orange-talents-04-template-ecommerce
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: cadastro de produto para usuário logado
- Loading branch information
1 parent
812e9c2
commit 04c9929
Showing
9 changed files
with
315 additions
and
4 deletions.
There are no files selected for viewing
52 changes: 52 additions & 0 deletions
52
src/main/java/br/com/zupacademy/william/ecommerce/produto/Produto.java
This file contains 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
package br.com.zupacademy.william.ecommerce.produto; | ||
|
||
import br.com.zupacademy.william.ecommerce.categoria.Categoria; | ||
import br.com.zupacademy.william.ecommerce.produto.caracteristica.ProdutoCaracteristica; | ||
import br.com.zupacademy.william.ecommerce.usuario.Usuario; | ||
import io.jsonwebtoken.lang.Assert; | ||
import org.hibernate.annotations.CreationTimestamp; | ||
|
||
import javax.persistence.*; | ||
import java.math.BigDecimal; | ||
import java.time.LocalDateTime; | ||
import java.util.Set; | ||
|
||
@Entity | ||
public class Produto { | ||
|
||
@Id | ||
@GeneratedValue(strategy = GenerationType.IDENTITY) | ||
private Long id; | ||
|
||
private String nome; | ||
private BigDecimal valor; | ||
private int quantidadeDisponivel; | ||
private String descricao; | ||
|
||
@OneToMany(cascade = CascadeType.ALL) | ||
private Set<ProdutoCaracteristica> caracteristicas; | ||
|
||
@ManyToOne | ||
@JoinColumn(name = "id_categoria") | ||
private Categoria categoria; | ||
|
||
@ManyToOne | ||
@JoinColumn(name = "id_usuario") | ||
private Usuario donoDoProduto; | ||
|
||
@CreationTimestamp | ||
private LocalDateTime instanteCriacao = LocalDateTime.now(); | ||
|
||
public Produto(String nome, BigDecimal valor, int quantidadeDisponivel, String descricao, | ||
Set<ProdutoCaracteristica> caracteristicas, Categoria categoria, Usuario donoDoProduto) { | ||
this.nome = nome; | ||
this.valor = valor; | ||
this.quantidadeDisponivel = quantidadeDisponivel; | ||
this.descricao = descricao; | ||
this.caracteristicas = caracteristicas; | ||
this.categoria = categoria; | ||
this.donoDoProduto = donoDoProduto; | ||
|
||
Assert.isTrue(this.caracteristicas.size() >= 3, "É necessário ao menos 3 características para um produto"); | ||
} | ||
} |
45 changes: 45 additions & 0 deletions
45
src/main/java/br/com/zupacademy/william/ecommerce/produto/ProdutoController.java
This file contains 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
package br.com.zupacademy.william.ecommerce.produto; | ||
|
||
import br.com.zupacademy.william.ecommerce.categoria.Categoria; | ||
import br.com.zupacademy.william.ecommerce.categoria.CategoriaRepository; | ||
import br.com.zupacademy.william.ecommerce.usuario.Usuario; | ||
import br.com.zupacademy.william.ecommerce.validation.ProibeCaracteristicaComNomeIgualValidator; | ||
import org.springframework.beans.factory.annotation.Autowired; | ||
import org.springframework.http.ResponseEntity; | ||
import org.springframework.security.core.annotation.AuthenticationPrincipal; | ||
import org.springframework.web.bind.WebDataBinder; | ||
import org.springframework.web.bind.annotation.*; | ||
|
||
import javax.persistence.EntityNotFoundException; | ||
import javax.validation.Valid; | ||
import java.util.Optional; | ||
|
||
@RestController | ||
@RequestMapping("/produtos") | ||
public class ProdutoController { | ||
|
||
@Autowired | ||
private ProdutoRepository produtoRepository; | ||
|
||
@Autowired | ||
private CategoriaRepository categoriaRepository; | ||
|
||
@InitBinder | ||
public void init(WebDataBinder webDataBinder) { | ||
webDataBinder.addValidators(new ProibeCaracteristicaComNomeIgualValidator()); | ||
} | ||
|
||
@PostMapping | ||
public ResponseEntity criar(@RequestBody @Valid ProdutoInputDto produtoInputDto, | ||
@AuthenticationPrincipal Usuario usuarioLogado) { | ||
Optional<Categoria> possivelCategoria = categoriaRepository.findById(produtoInputDto.getIdCategoria()); | ||
|
||
if (possivelCategoria.isEmpty()) { | ||
throw new EntityNotFoundException(String.format("Não existe uma categoria com id %d", produtoInputDto.getIdCategoria())); | ||
} | ||
|
||
Produto novoProduto = produtoInputDto.toModel(possivelCategoria.get(), usuarioLogado); | ||
produtoRepository.save(novoProduto); | ||
return ResponseEntity.ok().build(); | ||
} | ||
} |
89 changes: 89 additions & 0 deletions
89
src/main/java/br/com/zupacademy/william/ecommerce/produto/ProdutoInputDto.java
This file contains 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
package br.com.zupacademy.william.ecommerce.produto; | ||
|
||
import br.com.zupacademy.william.ecommerce.categoria.Categoria; | ||
import br.com.zupacademy.william.ecommerce.produto.caracteristica.ProdutoCaracteristica; | ||
import br.com.zupacademy.william.ecommerce.produto.caracteristica.ProdutoCaracteristicaInputDto; | ||
import br.com.zupacademy.william.ecommerce.usuario.Usuario; | ||
import br.com.zupacademy.william.ecommerce.validation.annotation.ExistsId; | ||
import com.fasterxml.jackson.annotation.JsonProperty; | ||
import org.hibernate.validator.constraints.Length; | ||
|
||
import javax.validation.Valid; | ||
import javax.validation.constraints.*; | ||
import java.math.BigDecimal; | ||
import java.util.HashSet; | ||
import java.util.List; | ||
import java.util.Set; | ||
import java.util.stream.Collectors; | ||
|
||
public class ProdutoInputDto { | ||
|
||
@NotBlank | ||
private String nome; | ||
|
||
@NotNull | ||
@Positive | ||
private BigDecimal valor; | ||
|
||
@NotNull | ||
@PositiveOrZero | ||
@JsonProperty("quantidade_disponivel") | ||
private int quantidadeDisponivel; | ||
|
||
@NotBlank | ||
@Length(max = 1000) | ||
private String descricao; | ||
|
||
@Size(min = 3, max = 100) | ||
@Valid | ||
private List<ProdutoCaracteristicaInputDto> caracteristicas; | ||
|
||
@ExistsId(domainClass = Categoria.class, fieldName = "id") | ||
@JsonProperty("id_categoria") | ||
private Long idCategoria; | ||
|
||
public ProdutoInputDto(String nome, BigDecimal valor, int quantidadeDisponivel, String descricao, List<ProdutoCaracteristicaInputDto> produtoCaracteristicasInputDto, Long idCategoria) { | ||
this.nome = nome; | ||
this.valor = valor; | ||
this.quantidadeDisponivel = quantidadeDisponivel; | ||
this.descricao = descricao; | ||
this.caracteristicas = produtoCaracteristicasInputDto; | ||
this.idCategoria = idCategoria; | ||
} | ||
|
||
public Produto toModel(Categoria categoriaDoProduto, Usuario donoDoProduto) { | ||
Set<ProdutoCaracteristica> crodutoCaracteristicas = new HashSet<>(); | ||
|
||
if (!this.caracteristicas.isEmpty()) { | ||
crodutoCaracteristicas.addAll(this.caracteristicas.stream() | ||
.map(ProdutoCaracteristicaInputDto::toModel) | ||
.collect(Collectors.toList())); | ||
} | ||
|
||
return new Produto( | ||
this.nome, | ||
this.valor, | ||
this.quantidadeDisponivel, | ||
this.descricao, | ||
crodutoCaracteristicas, | ||
categoriaDoProduto, | ||
donoDoProduto); | ||
} | ||
|
||
public Long getIdCategoria() { | ||
return idCategoria; | ||
} | ||
|
||
public List<ProdutoCaracteristicaInputDto> getCaracteristicas() { | ||
return caracteristicas; | ||
} | ||
|
||
public boolean temCaracteristicasRepetidas() { | ||
List<String> caracteristicasDepoisDoDistinct = this.caracteristicas.stream() | ||
.map(ProdutoCaracteristicaInputDto::getNome) | ||
.distinct() | ||
.collect(Collectors.toList()); | ||
|
||
return (caracteristicasDepoisDoDistinct.size() != this.caracteristicas.size()); | ||
} | ||
} |
6 changes: 6 additions & 0 deletions
6
src/main/java/br/com/zupacademy/william/ecommerce/produto/ProdutoRepository.java
This file contains 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
package br.com.zupacademy.william.ecommerce.produto; | ||
|
||
import org.springframework.data.jpa.repository.JpaRepository; | ||
|
||
public interface ProdutoRepository extends JpaRepository<Produto, Long> { | ||
} |
36 changes: 36 additions & 0 deletions
36
...ava/br/com/zupacademy/william/ecommerce/produto/caracteristica/ProdutoCaracteristica.java
This file contains 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
package br.com.zupacademy.william.ecommerce.produto.caracteristica; | ||
|
||
import javax.persistence.Entity; | ||
import javax.persistence.GeneratedValue; | ||
import javax.persistence.GenerationType; | ||
import javax.persistence.Id; | ||
import java.util.Objects; | ||
|
||
@Entity | ||
public class ProdutoCaracteristica { | ||
|
||
@Id | ||
@GeneratedValue(strategy = GenerationType.IDENTITY) | ||
private Long id; | ||
|
||
private String nome; | ||
private String descricao; | ||
|
||
public ProdutoCaracteristica(String nome, String descricao) { | ||
this.nome = nome; | ||
this.descricao = descricao; | ||
} | ||
|
||
@Override | ||
public boolean equals(Object o) { | ||
if (this == o) return true; | ||
if (o == null || getClass() != o.getClass()) return false; | ||
ProdutoCaracteristica that = (ProdutoCaracteristica) o; | ||
return nome.equals(that.nome); | ||
} | ||
|
||
@Override | ||
public int hashCode() { | ||
return Objects.hash(nome); | ||
} | ||
} |
39 changes: 39 additions & 0 deletions
39
...om/zupacademy/william/ecommerce/produto/caracteristica/ProdutoCaracteristicaInputDto.java
This file contains 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
package br.com.zupacademy.william.ecommerce.produto.caracteristica; | ||
|
||
import javax.validation.constraints.NotBlank; | ||
|
||
public class ProdutoCaracteristicaInputDto { | ||
|
||
@NotBlank | ||
private String nome; | ||
|
||
@NotBlank | ||
private String descricao; | ||
|
||
public ProdutoCaracteristicaInputDto(String nome, String descricao) { | ||
this.nome = nome; | ||
this.descricao = descricao; | ||
} | ||
|
||
public ProdutoCaracteristica toModel() { | ||
return new ProdutoCaracteristica(this.nome, this.descricao); | ||
} | ||
|
||
|
||
|
||
public String getNome() { | ||
return nome; | ||
} | ||
|
||
public void setNome(String nome) { | ||
this.nome = nome; | ||
} | ||
|
||
public String getDescricao() { | ||
return descricao; | ||
} | ||
|
||
public void setDescricao(String descricao) { | ||
this.descricao = descricao; | ||
} | ||
} |
This file contains 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
27 changes: 27 additions & 0 deletions
27
...om/zupacademy/william/ecommerce/validation/ProibeCaracteristicaComNomeIgualValidator.java
This file contains 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
package br.com.zupacademy.william.ecommerce.validation; | ||
|
||
import br.com.zupacademy.william.ecommerce.produto.ProdutoInputDto; | ||
import org.springframework.validation.Errors; | ||
import org.springframework.validation.Validator; | ||
|
||
public class ProibeCaracteristicaComNomeIgualValidator implements Validator { | ||
|
||
@Override | ||
public boolean supports(Class<?> aClass) { | ||
return ProdutoInputDto.class.isAssignableFrom(aClass); | ||
} | ||
|
||
@Override | ||
public void validate(Object target, Errors errors) { | ||
if (errors.hasErrors()) { | ||
return; | ||
} | ||
|
||
ProdutoInputDto request = (ProdutoInputDto) target; | ||
boolean temCaracteristicasRepetidas = request.temCaracteristicasRepetidas(); | ||
|
||
if (temCaracteristicasRepetidas) { | ||
errors.rejectValue("caracteristicas", null, "Características repetidas não são aceitas"); | ||
} | ||
} | ||
} |
This file contains 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