Skip to content

Commit

Permalink
feat: cadastrar fotos para um produto
Browse files Browse the repository at this point in the history
  • Loading branch information
almeidawilliam committed Apr 28, 2021
1 parent 04c9929 commit 9407491
Show file tree
Hide file tree
Showing 8 changed files with 180 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,17 @@

import br.com.zupacademy.william.ecommerce.categoria.Categoria;
import br.com.zupacademy.william.ecommerce.produto.caracteristica.ProdutoCaracteristica;
import br.com.zupacademy.william.ecommerce.produto.imagem.ProdutoImagem;
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.Objects;
import java.util.Set;
import java.util.stream.Collectors;

@Entity
public class Produto {
Expand All @@ -23,7 +26,7 @@ public class Produto {
private int quantidadeDisponivel;
private String descricao;

@OneToMany(cascade = CascadeType.ALL)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "produto")
private Set<ProdutoCaracteristica> caracteristicas;

@ManyToOne
Expand All @@ -37,6 +40,9 @@ public class Produto {
@CreationTimestamp
private LocalDateTime instanteCriacao = LocalDateTime.now();

@OneToMany(cascade = CascadeType.ALL, mappedBy = "produto")
private Set<ProdutoImagem> imagens;

public Produto(String nome, BigDecimal valor, int quantidadeDisponivel, String descricao,
Set<ProdutoCaracteristica> caracteristicas, Categoria categoria, Usuario donoDoProduto) {
this.nome = nome;
Expand All @@ -49,4 +55,27 @@ public Produto(String nome, BigDecimal valor, int quantidadeDisponivel, String d

Assert.isTrue(this.caracteristicas.size() >= 3, "É necessário ao menos 3 características para um produto");
}

@Deprecated
public Produto() {
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Produto produto = (Produto) o;
return Objects.equals(id, produto.id);
}

@Override
public int hashCode() {
return Objects.hash(id, nome, valor, quantidadeDisponivel, descricao, caracteristicas, categoria, donoDoProduto, instanteCriacao, imagens);
}

public void associarImagens(Set<String> links) {
this.imagens.addAll(links.stream()
.map(link -> new ProdutoImagem(this, link))
.collect(Collectors.toSet()));
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
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 br.com.zupacademy.william.ecommerce.produto.Produto;

import javax.persistence.*;
import java.util.Objects;

@Entity
Expand All @@ -16,6 +15,10 @@ public class ProdutoCaracteristica {
private String nome;
private String descricao;

@ManyToOne
@JoinColumn(name = "id_produto")
private Produto produto;

public ProdutoCaracteristica(String nome, String descricao) {
this.nome = nome;
this.descricao = descricao;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package br.com.zupacademy.william.ecommerce.produto.imagem;

import br.com.zupacademy.william.ecommerce.produto.Produto;

import javax.persistence.*;

@Entity
public class ProdutoImagem {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String link;

@ManyToOne
@JoinColumn(name = "id_produto")
private Produto produto;

public ProdutoImagem(Produto produto, String link) {
this.produto = produto;
this.link = link;
}

@Deprecated
public ProdutoImagem() {

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package br.com.zupacademy.william.ecommerce.produto.imagem;

import br.com.zupacademy.william.ecommerce.produto.Produto;
import br.com.zupacademy.william.ecommerce.produto.ProdutoRepository;
import br.com.zupacademy.william.ecommerce.usuario.Usuario;
import br.com.zupacademy.william.ecommerce.usuario.UsuarioRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.server.ResponseStatusException;

import javax.transaction.Transactional;
import javax.validation.Valid;
import java.util.Optional;
import java.util.Set;

@RestController
@RequestMapping("/produtos")
public class ProdutoImagemController {

@Autowired
private UsuarioRepository usuarioRepository;

@Autowired
private ProdutoRepository produtoRepository;

@Autowired
private UploaderFake uploaderFake;

@Transactional
@PostMapping("/{id}/imagens")
public ResponseEntity adicionaImagem(@PathVariable Long id,
@Valid ProdutoImagemInputDto produtoImagemInputDto,
@AuthenticationPrincipal Usuario usuarioLogado) {
Optional<Produto> possivelProduto = produtoRepository.findById(id);

if (possivelProduto.isEmpty()) {
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Produto não encontrado");
}

Produto produto = possivelProduto.get();
boolean eDonoDoProduto = usuarioLogado.eDonoDoProduto(produto);

if (!eDonoDoProduto) {
// return ResponseEntity.status(HttpStatus.FORBIDDEN).body("Você nao é dono do produto");
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "Você não é dono do produto");
}

Set<String> links = uploaderFake.envia(produtoImagemInputDto.getImagens());
produto.associarImagens(links);

return ResponseEntity.ok().build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package br.com.zupacademy.william.ecommerce.produto.imagem;

import org.springframework.web.multipart.MultipartFile;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.List;

public class ProdutoImagemInputDto {

@Size(min = 1, max = 7)
@NotNull
private List<MultipartFile> imagens;

public ProdutoImagemInputDto(List<MultipartFile> imagens) {
this.imagens = imagens;
}

public List<MultipartFile> getImagens() {
return imagens;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package br.com.zupacademy.william.ecommerce.produto.imagem;

import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

@Component
public class UploaderFake {

public Set<String> envia(List<MultipartFile> imagens) {
return imagens.stream()
.map(imagem -> "http://bucket.io/" + imagem.getOriginalFilename() + ".com")
.collect(Collectors.toSet());
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package br.com.zupacademy.william.ecommerce.usuario;

import br.com.zupacademy.william.ecommerce.produto.Produto;
import org.hibernate.annotations.CreationTimestamp;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.*;

@Entity
public class Usuario implements UserDetails {
Expand All @@ -21,11 +20,14 @@ public class Usuario implements UserDetails {
private String senha;

@ManyToMany(fetch = FetchType.EAGER)
private List<Perfil> perfis = new ArrayList<>();
private Set<Perfil> perfis = new HashSet<>();

@CreationTimestamp
private LocalDateTime instanteCadastro = LocalDateTime.now();

@OneToMany(mappedBy = "donoDoProduto", fetch = FetchType.EAGER)
private List<Produto> produtos;

public Usuario(String login, SenhaLimpa senhaLimpa) {
this.login = login;
this.senha = senhaLimpa.hash();
Expand All @@ -35,6 +37,10 @@ public Usuario(String login, SenhaLimpa senhaLimpa) {
public Usuario() {
}

public boolean eDonoDoProduto(Produto produto) {
return this.produtos.contains(produto);
}

public Long getId() {
return id;
}
Expand Down
6 changes: 5 additions & 1 deletion src/main/resources/messages.properties
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
NotBlank={0} é obrigatório(a)
NotNull={0} é obrigatório(a)
Email={0} deve ser um e-mail válido
UniqueValue={0} já existe no banco de dados
ExistsId={0} não existe no banco de dados
Expand Down Expand Up @@ -28,4 +29,7 @@ produtoInputDto.idCategoria=Categoria do produto

#ProdutoCaracteristicaInputDto
produtoCaracteristicaInputDto.nome=Nome da característica
produtoCaracteristicaInputDto.descricao=Descrição da característica
produtoCaracteristicaInputDto.descricao=Descrição da característica

#FotoProdutoInputDto
produtoImagemInputDto[0-9].imagens=Imagem do produto

0 comments on commit 9407491

Please sign in to comment.