Skip to content

Commit

Permalink
chore: merge #8 na main
Browse files Browse the repository at this point in the history
Adiciona endpoint de inicia-preparo
  • Loading branch information
Perkles authored Sep 6, 2024
2 parents 50bf2c1 + 4569ec7 commit 96f7d16
Show file tree
Hide file tree
Showing 21 changed files with 315 additions and 20 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package com.fiap.mspedidoapi.application.controllers.cozinha.pedidos.preparo;

import com.fiap.mspedidoapi.application.controllers.cozinha.pedidos.preparo.requests.StoreIniciaPreparoProdutoRequest;
import com.fiap.mspedidoapi.application.response.GenericResponse;
import com.fiap.mspedidoapi.application.response.PresenterResponse;
import com.fiap.mspedidoapi.domain.generic.output.OutputInterface;
import com.fiap.mspedidoapi.domain.output.pedido.PedidoProntoOutput;
import com.fiap.mspedidoapi.domain.presenters.pedido.PedidoProntoPresenter;
import com.fiap.mspedidoapi.domain.useCase.pedido.IniciaPreparoPedidoUseCase;
import com.fiap.mspedidoapi.infra.adpter.repository.pedido.PreparaPedidoRepository;
import com.fiap.mspedidoapi.infra.kafka.producers.PreparaPedidoProducer;
import com.fiap.mspedidoapi.infra.repository.PedidosMongoRepository;
import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
@RequestMapping("cozinha/pedido")
public class IniciaPreparoPedidoController {
private final PedidosMongoRepository pedidosMongoRepository;
@Value("${spring.kafka.producer.bootstrap-servers}")
private String servers;

@PostMapping("/inicia-preparo")
@Operation(tags = {"cozinha"})
public ResponseEntity<Object> iniciaPreparoPedido(@RequestBody StoreIniciaPreparoProdutoRequest iniciaPreparoProdutoRequest) {
IniciaPreparoPedidoUseCase useCase = new IniciaPreparoPedidoUseCase(
new PreparaPedidoRepository(pedidosMongoRepository),
new PreparaPedidoProducer(servers));
useCase.execute(iniciaPreparoProdutoRequest.uuid(), iniciaPreparoProdutoRequest.tempoDePreparo());
OutputInterface outputInterface = useCase.getOutputInterface();

if (outputInterface.getOutputStatus().getCode() != 200) {
return new GenericResponse().response(outputInterface);
}

PedidoProntoPresenter presenter = new PedidoProntoPresenter((PedidoProntoOutput) outputInterface);
return new PresenterResponse().response(presenter);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.fiap.mspedidoapi.application.controllers.cozinha.pedidos.preparo.requests;

import java.util.UUID;

public record StoreIniciaPreparoProdutoRequest(
UUID uuid,
Integer tempoDePreparo
){}
Original file line number Diff line number Diff line change
Expand Up @@ -23,19 +23,21 @@ public class PedidoEntity {
@Enumerated(EnumType.STRING)
private StatusPagamento statusPagamento;
private List<ProdutoEntity> produtos;
private Integer tempoDePreparoEmMinutos;
private Float total;

public PedidoEntity(UUID clienteUuid) {
this.clienteUuid = clienteUuid;
this.produtos = new ArrayList<>();
}

public PedidoEntity(UUID pedidoId, UUID clienteId, StatusPedido statusPedido, StatusPagamento statusPagamento, Float valorTotal) {
public PedidoEntity(UUID pedidoId, UUID clienteId, StatusPedido statusPedido, StatusPagamento statusPagamento, Integer tempoDePreparoEmMinutos, Float valorTotal) {
this.pedidoId = pedidoId;
this.clienteUuid = clienteId;
this.statusPedido = statusPedido;
this.statusPagamento = statusPagamento;
this.total = valorTotal;
this.tempoDePreparoEmMinutos = tempoDePreparoEmMinutos;
this.produtos = new ArrayList<>();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.fiap.mspedidoapi.domain.exception.pedido;

public class PedidoNaoEncontradoException extends Exception {
public PedidoNaoEncontradoException(String message) {
super(message);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.fiap.mspedidoapi.domain.gateway.pedido;

import com.fiap.mspedidoapi.domain.entity.pedido.PedidoEntity;
import com.fiap.mspedidoapi.domain.exception.pedido.PedidoNaoEncontradoException;

import java.util.UUID;

public interface PreparaPedidoInterface {
PedidoEntity encontraPedidoPorUuid(UUID pedidoUuid) throws PedidoNaoEncontradoException;
PedidoEntity movePedidoParaEmPreparacao(UUID pedidoUuid, Integer tempoDePreparoEmMinutos) throws PedidoNaoEncontradoException;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.fiap.mspedidoapi.domain.gateway.producers;

import com.fiap.mspedidoapi.domain.output.pedido.PedidoEmPreparacaoOutput;

public interface PreparaPedidoProducerInterface {
void send(PedidoEmPreparacaoOutput pedidoEmPreparacaoOutput);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.fiap.mspedidoapi.domain.output.pedido;

import com.fiap.mspedidoapi.domain.entity.pedido.PedidoEntity;
import com.fiap.mspedidoapi.domain.generic.output.OutputInterface;
import com.fiap.mspedidoapi.domain.generic.output.OutputStatus;
import lombok.Data;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;

@Data
@RequiredArgsConstructor
@Getter
@Setter
public class PedidoEmPreparacaoOutput implements OutputInterface {
private PedidoEntity pedido;
private OutputStatus outputStatus;

public PedidoEmPreparacaoOutput(PedidoEntity pedido, OutputStatus outputStatus) {
this.pedido = pedido;
this.outputStatus = outputStatus;
}

@Override
public Object getBody() {
return this.pedido;
}

@Override
public OutputStatus getOutputStatus() {
return this.outputStatus;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package com.fiap.mspedidoapi.domain.useCase.pedido;

import com.fiap.mspedidoapi.domain.entity.pedido.PedidoEntity;
import com.fiap.mspedidoapi.domain.enums.pedido.StatusPedido;
import com.fiap.mspedidoapi.domain.exception.pedido.PedidoNaoEncontradoException;
import com.fiap.mspedidoapi.domain.gateway.pedido.PreparaPedidoInterface;
import com.fiap.mspedidoapi.domain.gateway.producers.PreparaPedidoProducerInterface;
import com.fiap.mspedidoapi.domain.generic.output.OutputError;
import com.fiap.mspedidoapi.domain.generic.output.OutputInterface;
import com.fiap.mspedidoapi.domain.generic.output.OutputStatus;
import com.fiap.mspedidoapi.domain.output.pedido.PedidoEmPreparacaoOutput;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

import java.util.UUID;

@Getter
@RequiredArgsConstructor
public class IniciaPreparoPedidoUseCase {

private final PreparaPedidoInterface preparaPedidoInterface;
private final PreparaPedidoProducerInterface preparaPedidoProducerInterface;
private OutputInterface outputInterface;

public void execute(UUID pedidoUUID, Integer tempoDePreparoEmMinutos) {
try {

if(tempoDePreparoEmMinutos <= 0){
this.outputInterface = new OutputError(
"Error",
new OutputStatus(404, "Falha", "Tempo de preparo precisa ser positivo")
);
return;
}

PedidoEntity pedidoEncontrado = preparaPedidoInterface.encontraPedidoPorUuid(pedidoUUID);

if(pedidoEncontrado.getStatusPedido() != StatusPedido.RECEBIDO) {
this.outputInterface = new OutputError(
"Error",
new OutputStatus(404, "Status invalido", "Pedido precisa estar com status RECEBIDO para dar inicio ao preparo")
);
return;
}

PedidoEntity pedidoEmPreparacao = preparaPedidoInterface.movePedidoParaEmPreparacao(pedidoUUID, tempoDePreparoEmMinutos);
this.outputInterface = new PedidoEmPreparacaoOutput(
pedidoEmPreparacao,
new OutputStatus(200, "OK", "Pedido atualizado.")
);

}catch (PedidoNaoEncontradoException e) {
System.out.println("Pedido nao enconstrado");
this.outputInterface = new OutputError(
e.getMessage(),
new OutputStatus(404, "Not found", "Pedido não encontrado")
);
} catch (Exception e) {
outputInterface = new OutputError(
e.getMessage(),
new OutputStatus(500, "Internal Server Error", "Erro no servidor")
);
} finally {
if (this.preparaPedidoProducerInterface != null
&& this.outputInterface instanceof PedidoEmPreparacaoOutput &&
this.outputInterface.getOutputStatus().getCode() == 200
) {
this.preparaPedidoProducerInterface.send((PedidoEmPreparacaoOutput) outputInterface);
}
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import com.fiap.mspedidoapi.domain.entity.pedido.PedidoEntity;
import com.fiap.mspedidoapi.domain.entity.pedido.ProdutoEntity;
import com.fiap.mspedidoapi.domain.gateway.pedido.BuscaListaPedidoInterface;
import com.fiap.mspedidoapi.infra.collection.pedido.Pedido;
import com.fiap.mspedidoapi.infra.collection.pedido.items.Produto;
import com.fiap.mspedidoapi.infra.repository.PedidosMongoRepository;
import lombok.RequiredArgsConstructor;
Expand Down Expand Up @@ -41,6 +40,7 @@ public List<PedidoEntity> findListaPedidos() {
pedidoCollection.getClienteUuid(),
pedidoCollection.getStatusPedido(),
pedidoCollection.getStatusPagamento(),
pedidoCollection.getTempoDePreparo(),
pedidoCollection.getTotal()
);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package com.fiap.mspedidoapi.infra.adpter.repository.pedido;

import com.fiap.mspedidoapi.domain.enums.pedido.StatusPedido;
import com.fiap.mspedidoapi.domain.exception.pedido.PedidoNaoEncontradoException;
import com.fiap.mspedidoapi.domain.gateway.pedido.PreparaPedidoInterface;
import com.fiap.mspedidoapi.infra.collection.pedido.Pedido;
import com.fiap.mspedidoapi.infra.repository.PedidosMongoRepository;
import lombok.RequiredArgsConstructor;

import java.util.Optional;
import java.util.UUID;

@RequiredArgsConstructor
public class PreparaPedidoRepository implements PreparaPedidoInterface{
public final PedidosMongoRepository pedidosMongoRepository;

@Override
public com.fiap.mspedidoapi.domain.entity.pedido.PedidoEntity encontraPedidoPorUuid(UUID pedidoUuid) throws PedidoNaoEncontradoException {
Optional<Pedido> pedidoEncontrado = pedidosMongoRepository.findByUuidPedido(pedidoUuid);
if(pedidoEncontrado.isPresent()){
Pedido pedidoModel = pedidoEncontrado.get();
return new com.fiap.mspedidoapi.domain.entity.pedido.PedidoEntity(
pedidoModel.getUuidPedido(),
pedidoModel.getClienteUuid(),
pedidoModel.getStatusPedido(),
pedidoModel.getStatusPagamento(),
pedidoModel.getTempoDePreparo(),
pedidoModel.getTotal()
);
}else{
throw new PedidoNaoEncontradoException("Pedido não encontrado");
}
}

@Override
public com.fiap.mspedidoapi.domain.entity.pedido.PedidoEntity movePedidoParaEmPreparacao(UUID pedidoUuid, Integer tempoDePreparoEmMinutos) throws PedidoNaoEncontradoException {
Optional<Pedido> pedido = pedidosMongoRepository.findByUuidPedido(pedidoUuid);
if(pedido.isPresent()){
Pedido pedidoModel = pedido.get();
pedidoModel.setTempoDePreparo(tempoDePreparoEmMinutos);
pedidoModel.setStatusPedido(StatusPedido.EM_PREPARACAO);
pedidosMongoRepository.save(pedidoModel);

return new com.fiap.mspedidoapi.domain.entity.pedido.PedidoEntity(
pedidoModel.getUuidPedido(),
pedidoModel.getClienteUuid(),
pedidoModel.getStatusPedido(),
pedidoModel.getStatusPagamento(),
pedidoModel.getTempoDePreparo(),
pedidoModel.getTotal()
);
}else{
throw new PedidoNaoEncontradoException("Pedido não encontrado");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ public class Pedido {
private StatusPedido statusPedido;
@Field("status_pagamento")
private StatusPagamento statusPagamento;
@Field("tempo_preparo")
private int tempoDePreparo;
private Float total;
private List<Produto> produtos;
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,7 @@ public class KafkaProducerResolver {
public String getEntregaProducer() {
return KafkaTopicsEnum.entrega.name();
}
public String getPedidoProducer() {
return KafkaTopicsEnum.pedido.name();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.fiap.mspedidoapi.infra.kafka.producers;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fiap.mspedidoapi.domain.gateway.producers.PreparaPedidoProducerInterface;
import com.fiap.mspedidoapi.domain.output.pedido.PedidoEmPreparacaoOutput;
import com.fiap.mspedidoapi.infra.dependecy.kafka.resolvers.producers.KafkaProducerResolver;
import com.fiap.mspedidoapi.infra.dependecy.kafka.resolvers.producers.KafkaSenderConfig;

import java.util.UUID;

public class PreparaPedidoProducer extends KafkaSenderConfig implements PreparaPedidoProducerInterface {
private final ObjectMapper objectMapper = new ObjectMapper();

public PreparaPedidoProducer(String servers) {
super(servers, new KafkaProducerResolver().getPedidoProducer());
}

@Override
public void send(PedidoEmPreparacaoOutput pedidoEmPreparacaoOutput) {
try {
ObjectNode jsonNode = objectMapper.createObjectNode();
jsonNode.put("uuid_pedido", pedidoEmPreparacaoOutput.getPedido().getPedidoId().toString());
jsonNode.put("status_pedido", pedidoEmPreparacaoOutput.getPedido().getStatusPedido().toString());
jsonNode.put("numero_pedido", pedidoEmPreparacaoOutput.getPedido().getNumeroPedido());
jsonNode.put("tempo_preparo", pedidoEmPreparacaoOutput.getPedido().getTempoDePreparoEmMinutos());
String json = jsonNode.toString();
send(UUID.randomUUID().toString(), json);
} catch (Exception e) {
e.printStackTrace();
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,13 @@

import com.fiap.mspedidoapi.infra.collection.pedido.Pedido;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;

import java.util.Optional;
import java.util.UUID;

public interface PedidosMongoRepository extends MongoRepository<Pedido, String> {

@Query("{'uuid_pedido': ?0}")
Optional<Pedido> findByUuidPedido(UUID uuidPedido);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

import com.fiap.mspedidoapi.domain.entity.entrega.Entrega;
import com.fiap.mspedidoapi.domain.enums.pedido.StatusPedido;
import com.fiap.mspedidoapi.infra.adpter.repository.pedido.PedidoProntoRepository;
import com.fiap.mspedidoapi.infra.collection.pedido.Pedido;
import com.fiap.mspedidoapi.infra.repository.PedidosMongoRepository;
import com.fiap.mspedidoapi.infra.adpter.repository.pedido.PedidoProntoRepository;
import io.cucumber.java.Before;
import io.cucumber.java.en.Given;
import io.cucumber.java.en.Then;
Expand All @@ -17,7 +17,9 @@

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

public class PedidoProntoRepositorySteps {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@

import java.util.UUID;

import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;

public class PedidoEntityTest {
private PedidoEntity pedidoEntity;
Expand Down Expand Up @@ -36,7 +39,7 @@ public void testConstructorWithAllFields() {
StatusPagamento statusPagamento = StatusPagamento.AGUARDANDO_PAGAMENTO;
Float total = 100.0f;

PedidoEntity pedidoEntityFull = new PedidoEntity(pedidoId, clienteId, statusPedido, statusPagamento, total);
PedidoEntity pedidoEntityFull = new PedidoEntity(pedidoId, clienteId, statusPedido, statusPagamento, 20, total);

assertNotNull(pedidoEntityFull);
assertEquals(pedidoId, pedidoEntityFull.getPedidoId());
Expand Down
Loading

0 comments on commit 96f7d16

Please sign in to comment.