Skip to content

Commit

Permalink
notificação de bloqueio v1.0
Browse files Browse the repository at this point in the history
  • Loading branch information
giovnnvm committed Aug 3, 2021
1 parent a94cc40 commit e7537fc
Show file tree
Hide file tree
Showing 9 changed files with 130 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import br.com.zupacademy.giovannimoratto.desafioproposta.cartao.CartaoModel;
import br.com.zupacademy.giovannimoratto.desafioproposta.cartao.CartaoRepository;
import br.com.zupacademy.giovannimoratto.desafioproposta.cartao.CartaoStatus;
import br.com.zupacademy.giovannimoratto.desafioproposta.feign.CartoesFeignClient;
import br.com.zupacademy.giovannimoratto.desafioproposta.proposta.PropostaController;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand All @@ -14,6 +16,7 @@
import javax.transaction.Transactional;
import java.util.Optional;

import static br.com.zupacademy.giovannimoratto.desafioproposta.Bloqueio.BloqueioStatus.FALHA;
import static org.springframework.http.HttpStatus.NOT_FOUND;
import static org.springframework.http.HttpStatus.UNPROCESSABLE_ENTITY;

Expand All @@ -31,22 +34,30 @@ public class BloqueioController {
private CartaoRepository cartaoRepository;
@Autowired
private BloqueioRepository bloqueioRepository;
@Autowired
private CartoesFeignClient api;

@PostMapping("/cartoes/bloqueio/{id}")
@Transactional
public ResponseEntity <?> solicitacaoDeBloqueio(@PathVariable Long id,
@RequestHeader(value = "User-Agent") String userAgent,
HttpServletRequest request) {
@RequestHeader(value = "User-Agent") String userAgent,
HttpServletRequest request) {

CartaoModel cartao = verificaSeCartaoExiste(id);
logger.info("Cartão encontrado");
verificaSeCartaoJaEstaBloqueado(cartao);
logger.info("Nenhum bloqueio ativo no cartão");
BloqueioModel cartaoBloqueado = new BloqueioModel(request.getRemoteAddr(), userAgent,
notificaBloqueio(cartao);

BloqueioModel solicitacaoBloqueio = new BloqueioModel(request.getRemoteAddr(), userAgent,
cartao.getNumero(), cartao);

logger.info("Requisição de bloqueio convertida em classe de dominio");
bloqueioRepository.save(cartaoBloqueado);
bloqueioRepository.save(solicitacaoBloqueio);
logger.info("Requisição de bloqueio persistida no banco de dados");
cartao.bloquear();
logger.info("Cartão bloqueado");
cartaoRepository.save(cartao);
logger.info("Status do cartão atualizado no banco de dados");
return ResponseEntity.ok().build();
}

Expand All @@ -58,9 +69,25 @@ private CartaoModel verificaSeCartaoExiste(Long id) {

private void verificaSeCartaoJaEstaBloqueado(CartaoModel cartao) {
logger.info("Verificando se o cartão já está bloqueado...");
Optional <BloqueioModel> optionalBloqueio = bloqueioRepository.findByNumero(cartao.getNumero());
if (optionalBloqueio.isPresent()) {
throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Cartão já está bloqueado");
Optional <CartaoModel> optionalCartao = cartaoRepository.findById(cartao.getId());
if (optionalCartao.get().getStatus().equals(CartaoStatus.BLOQUEADO)) {
throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Este cartão já foi bloqueado");
}
logger.info("Verificando se o cartão possui solicitação de bloqueio...");
BloqueioModel solicitacaoBloqueio = bloqueioRepository.findByNumero(cartao.getNumero()).orElseThrow();
if (solicitacaoBloqueio.isAtivo()) {
throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Já foi solicitado o bloqueio deste cartão");
}
logger.info("Nenhum bloqueio ativo no cartão");
}

private void notificaBloqueio(CartaoModel cartao) {
logger.info("Notificação de tentativa de bloqueio enviada ao cliente");
BloqueioResponse resultado = api.notificacaoDeBloqueio(
cartao.getNumero(), new BloqueioRequest("api-proposta"));
logger.info("Resultado da notificação: {}", resultado.getResultado());
if (resultado.getResultado().equals(FALHA)) {
throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Falha no sistema");
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package br.com.zupacademy.giovannimoratto.desafioproposta.Bloqueio;

import br.com.zupacademy.giovannimoratto.desafioproposta.cartao.CartaoModel;
import com.fasterxml.jackson.annotation.JsonBackReference;
import org.hibernate.annotations.CreationTimestamp;

import javax.persistence.*;
Expand Down Expand Up @@ -28,8 +29,10 @@ public class BloqueioModel {
@CreationTimestamp
private LocalDateTime bloqueadoEm;
@NotNull
@JsonBackReference
@OneToOne(cascade = CascadeType.MERGE, fetch = FetchType.EAGER)
private CartaoModel cartao;
private boolean ativo = false;

@Deprecated
public BloqueioModel() {
Expand All @@ -40,6 +43,7 @@ public BloqueioModel(String ipCliente, String userAgent, String numero, CartaoMo
this.userAgent = userAgent;
this.numero = numero;
this.cartao = cartao;
this.ativo = true;
}

public Long getId() {
Expand All @@ -66,4 +70,7 @@ public CartaoModel getCartao() {
return cartao;
}

public boolean isAtivo() {
return ativo;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package br.com.zupacademy.giovannimoratto.desafioproposta.Bloqueio;

/**
* @Author giovanni.moratto
*/

public class BloqueioRequest {

private final String sistemaResponsavel;

public BloqueioRequest(String sistemaResponsavel) {
this.sistemaResponsavel = sistemaResponsavel;
}

public String getSistemaResponsavel() {
return sistemaResponsavel;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package br.com.zupacademy.giovannimoratto.desafioproposta.Bloqueio;

/**
* @Author giovanni.moratto
*/

public class BloqueioResponse {

private BloqueioStatus resultado;

@Deprecated
public BloqueioResponse() {
}

public BloqueioResponse(BloqueioStatus resultado) {
this.resultado = resultado;
}

public BloqueioStatus getResultado() {
return resultado;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package br.com.zupacademy.giovannimoratto.desafioproposta.Bloqueio;

/**
* @Author giovanni.moratto
*/

public enum BloqueioStatus {
BLOQUEADO,
FALHA;
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package br.com.zupacademy.giovannimoratto.desafioproposta.biometria;

import br.com.zupacademy.giovannimoratto.desafioproposta.cartao.CartaoModel;
import com.fasterxml.jackson.annotation.JsonBackReference;
import org.hibernate.annotations.CreationTimestamp;

import javax.persistence.*;
Expand All @@ -25,6 +26,7 @@ public class BiometriaModel {
private String fingerprint;
@NotNull
@ManyToOne
@JsonBackReference
@JoinColumn(nullable = false)
private CartaoModel cartao;
@CreationTimestamp
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,15 @@
import br.com.zupacademy.giovannimoratto.desafioproposta.biometria.BiometriaModel;
import br.com.zupacademy.giovannimoratto.desafioproposta.proposta.PropostaModel;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonManagedReference;

import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.HashSet;
import java.util.Set;

import static br.com.zupacademy.giovannimoratto.desafioproposta.cartao.CartaoStatus.ATIVO;
import static br.com.zupacademy.giovannimoratto.desafioproposta.cartao.CartaoStatus.BLOQUEADO;
import static javax.persistence.GenerationType.IDENTITY;

/**
Expand All @@ -31,10 +34,14 @@ public class CartaoModel {
@JsonBackReference
@OneToOne(mappedBy = "cartao")
private PropostaModel proposta;
@OneToMany(mappedBy = "cartao")
private Set <BiometriaModel> biometria = new HashSet <>();
@JsonManagedReference
@OneToMany(mappedBy = "cartao", cascade = CascadeType.MERGE, fetch = FetchType.EAGER)
private Set <BiometriaModel> biometrias = new HashSet <>();
@JsonManagedReference
@OneToOne(mappedBy = "cartao")
private BloqueioModel bloqueio;
@Enumerated(EnumType.STRING)
private CartaoStatus status = ATIVO;

/* Constructors */
@Deprecated
Expand All @@ -49,6 +56,12 @@ public CartaoModel(String numero, LocalDateTime emitidoEm, String titular, Integ
this.proposta = proposta;
}

/* Methods */
public void bloquear() {
this.status = BLOQUEADO;
}

/* Getters */
public PropostaModel getProposta() {
return proposta;
}
Expand All @@ -60,4 +73,8 @@ public Long getId() {
public String getNumero() {
return numero;
}

public CartaoStatus getStatus() {
return status;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package br.com.zupacademy.giovannimoratto.desafioproposta.cartao;

/**
* @Author giovanni.moratto
*/

public enum CartaoStatus {
BLOQUEADO,
ATIVO;
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package br.com.zupacademy.giovannimoratto.desafioproposta.feign;

import br.com.zupacademy.giovannimoratto.desafioproposta.Bloqueio.BloqueioRequest;
import br.com.zupacademy.giovannimoratto.desafioproposta.Bloqueio.BloqueioResponse;
import br.com.zupacademy.giovannimoratto.desafioproposta.cartao.AnaliseRequest;
import br.com.zupacademy.giovannimoratto.desafioproposta.cartao.CartaoResponse;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

Expand All @@ -16,4 +19,7 @@ public interface CartoesFeignClient {
@PostMapping("/api/cartoes")
CartaoResponse associaCartao(@RequestBody AnaliseRequest request);

@PostMapping("/api/cartoes/{id}/bloqueios")
BloqueioResponse notificacaoDeBloqueio(@PathVariable("id") String id, @RequestBody BloqueioRequest request);

}

0 comments on commit e7537fc

Please sign in to comment.