Skip to content

Commit cb0d6ec

Browse files
committed
Correção de Configurações da API de Clientes
1 parent cb2d088 commit cb0d6ec

File tree

13 files changed

+281
-3
lines changed

13 files changed

+281
-3
lines changed

src/api gateways/JSE.Bff.Compras/Configuration/DependencyInjectionConfig.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,13 @@ public static void RegisterServices(this IServiceCollection services)
3232
.AddPolicyHandler(PollyExtensions.EsperarTentar())
3333
.AddTransientHttpErrorPolicy(
3434
p => p.CircuitBreakerAsync(5, TimeSpan.FromSeconds(30)));
35+
36+
services.AddHttpClient<IClienteService, ClienteService>()
37+
.AddHttpMessageHandler<HttpClientAuthorizationDelegatingHandler>()
38+
.AddPolicyHandler(PollyExtensions.EsperarTentar())
39+
.AddTransientHttpErrorPolicy(
40+
p => p.CircuitBreakerAsync(5, TimeSpan.FromSeconds(30)));
41+
3542
}
3643
}
3744
}
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
using JSE.Bff.Compras.Models;
2+
using JSE.Bff.Compras.Services;
3+
using JSE.WebAPI.Core.Controllers;
4+
using Microsoft.AspNetCore.Authorization;
5+
using Microsoft.AspNetCore.Mvc;
6+
using System.Globalization;
7+
8+
namespace JSE.Bff.Compras.Controllers
9+
{
10+
[Authorize]
11+
public class PedidoController : MainController
12+
{
13+
private readonly ICatalogoService _catalogoService;
14+
private readonly ICarrinhoService _carrinhoService;
15+
private readonly IPedidoService _pedidoService;
16+
private readonly IClienteService _clienteService;
17+
18+
public PedidoController(
19+
ICatalogoService catalogoService,
20+
ICarrinhoService carrinhoService,
21+
IPedidoService pedidoService,
22+
IClienteService clienteService)
23+
{
24+
_catalogoService = catalogoService;
25+
_carrinhoService = carrinhoService;
26+
_pedidoService = pedidoService;
27+
_clienteService = clienteService;
28+
}
29+
30+
[HttpPost]
31+
[Route("compras/pedido")]
32+
public async Task<IActionResult> AdicionarPedido(PedidoDTO pedido)
33+
{
34+
var carrinho = await _carrinhoService.ObterCarrinho();
35+
var produtos = await _catalogoService.ObterItens(carrinho.Itens.Select(p => p.ProdutoId));
36+
var endereco = await _clienteService.ObterEndereco();
37+
38+
if (!await ValidarCarrinhoProdutos(carrinho, produtos)) return CustomResponse();
39+
40+
PopularDadosPedido(carrinho, endereco, pedido);
41+
42+
return CustomResponse(await _pedidoService.FinalizarPedido(pedido));
43+
}
44+
45+
[HttpGet("compras/pedido/ultimo")]
46+
public async Task<IActionResult> UltimoPedido()
47+
{
48+
var pedido = await _pedidoService.ObterUltimoPedido();
49+
if (pedido is null)
50+
{
51+
AddProcessingError("Pedido não encontrado!");
52+
return CustomResponse();
53+
}
54+
55+
return CustomResponse(pedido);
56+
}
57+
58+
[HttpGet("compras/pedido/lista-cliente")]
59+
public async Task<IActionResult> ListaPorCliente()
60+
{
61+
var pedidos = await _pedidoService.ObterListaPorClienteId();
62+
63+
return pedidos == null ? NotFound() : CustomResponse(pedidos);
64+
}
65+
66+
private async Task<bool> ValidarCarrinhoProdutos(CarrinhoDTO carrinho, IEnumerable<ItemProdutoDTO> produtos)
67+
{
68+
if (carrinho.Itens.Count != produtos.Count())
69+
{
70+
var itensIndisponiveis = carrinho.Itens.Select(c => c.ProdutoId).Except(produtos.Select(p => p.Id)).ToList();
71+
72+
foreach (var itemId in itensIndisponiveis)
73+
{
74+
var itemCarrinho = carrinho.Itens.FirstOrDefault(c => c.ProdutoId == itemId);
75+
AddProcessingError($"O item {itemCarrinho.Nome} não está mais disponível no catálogo, o remova do carrinho para prosseguir com a compra");
76+
}
77+
78+
return false;
79+
}
80+
81+
foreach (var itemCarrinho in carrinho.Itens)
82+
{
83+
var produtoCatalogo = produtos.FirstOrDefault(p => p.Id == itemCarrinho.ProdutoId);
84+
85+
if (produtoCatalogo.Valor != itemCarrinho.Valor)
86+
{
87+
var msgErro = $"O produto {itemCarrinho.Nome} mudou de valor (de: " +
88+
$"{string.Format(CultureInfo.GetCultureInfo("pt-BR"), "{0:C}", itemCarrinho.Valor)} para: " +
89+
$"{string.Format(CultureInfo.GetCultureInfo("pt-BR"), "{0:C}", produtoCatalogo.Valor)}) desde que foi adicionado ao carrinho.";
90+
91+
AddProcessingError(msgErro);
92+
93+
var responseRemover = await _carrinhoService.RemoverItemCarrinho(itemCarrinho.ProdutoId);
94+
if (ResponsePossuiErros(responseRemover))
95+
{
96+
AddProcessingError($"Não foi possível remover automaticamente o produto {itemCarrinho.Nome} do seu carrinho, _" +
97+
"remova e adicione novamente caso ainda deseje comprar este item");
98+
return false;
99+
}
100+
101+
itemCarrinho.Valor = produtoCatalogo.Valor;
102+
var responseAdicionar = await _carrinhoService.AdicionarItemCarrinho(itemCarrinho);
103+
104+
if (ResponsePossuiErros(responseAdicionar))
105+
{
106+
AddProcessingError($"Não foi possível atualizar automaticamente o produto {itemCarrinho.Nome} do seu carrinho, _" +
107+
"adicione novamente caso ainda deseje comprar este item");
108+
return false;
109+
}
110+
ClearProcessingErrors();
111+
AddProcessingError(msgErro + " Atualizamos o valor em seu carrinho, realize a conferência do pedido e se preferir remova o produto");
112+
113+
return false;
114+
}
115+
}
116+
117+
return true;
118+
}
119+
120+
private void PopularDadosPedido(CarrinhoDTO carrinho, EnderecoDTO endereco, PedidoDTO pedido)
121+
{
122+
pedido.VoucherCodigo = carrinho.Voucher?.Codigo;
123+
pedido.VoucherUtilizado = carrinho.VoucherUtilizado;
124+
pedido.ValorTotal = carrinho.ValorTotal;
125+
pedido.Desconto = carrinho.Desconto;
126+
pedido.PedidoItems = carrinho.Itens;
127+
128+
pedido.Endereco = endereco;
129+
}
130+
}
131+
}

src/api gateways/JSE.Bff.Compras/Extensions/AppServicesSettings.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,7 @@ public class AppServicesSettings
66
public string CarrinhoUrl { get; set; }
77
public string PedidoUrl { get; set; }
88
public string PagamentoUrl { get; set; }
9+
public string ClienteUrl { get; set; }
10+
911
}
1012
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
namespace JSE.Bff.Compras.Models
2+
{
3+
public class EnderecoDTO
4+
{
5+
public string Logradouro { get; set; }
6+
public string Numero { get; set; }
7+
public string Complemento { get; set; }
8+
public string Bairro { get; set; }
9+
public string Cep { get; set; }
10+
public string Cidade { get; set; }
11+
public string Estado { get; set; }
12+
}
13+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
namespace JSE.Bff.Compras.Models
2+
{
3+
public class PedidoDTO
4+
{
5+
#region Pedido
6+
7+
public int Codigo { get; set; }
8+
// Autorizado = 1,
9+
// Pago = 2,
10+
// Recusado = 3,
11+
// Entregue = 4,
12+
// Cancelado = 5
13+
public int Status { get; set; }
14+
public DateTime Data { get; set; }
15+
public decimal ValorTotal { get; set; }
16+
17+
public decimal Desconto { get; set; }
18+
public string VoucherCodigo { get; set; }
19+
public bool VoucherUtilizado { get; set; }
20+
21+
public List<ItemCarrinhoDTO> PedidoItems { get; set; }
22+
23+
#endregion
24+
25+
#region Endereco
26+
27+
public EnderecoDTO Endereco { get; set; }
28+
29+
#endregion
30+
}
31+
}

src/api gateways/JSE.Bff.Compras/Services/CatalogoService.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,16 @@ public async Task<ItemProdutoDTO> ObterPorId(Guid id)
2323

2424
return await DeserializarObjetoResponse<ItemProdutoDTO>(response);
2525
}
26+
27+
public async Task<IEnumerable<ItemProdutoDTO>> ObterItens(IEnumerable<Guid> ids)
28+
{
29+
var idsRequest = string.Join(",", ids);
30+
31+
var response = await _httpClient.GetAsync($"/catalogo/produtos/lista/{idsRequest}/");
32+
33+
TratarErrosResponse(response);
34+
35+
return await DeserializarObjetoResponse<IEnumerable<ItemProdutoDTO>>(response);
36+
}
2637
}
2738
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using JSE.Bff.Compras.Extensions;
2+
using JSE.Bff.Compras.Models;
3+
using Microsoft.Extensions.Options;
4+
using System.Net;
5+
6+
namespace JSE.Bff.Compras.Services
7+
{
8+
9+
public class ClienteService : Service, IClienteService
10+
{
11+
private readonly HttpClient _httpClient;
12+
13+
public ClienteService(HttpClient httpClient, IOptions<AppServicesSettings> settings)
14+
{
15+
_httpClient = httpClient;
16+
_httpClient.BaseAddress = new Uri(settings.Value.ClienteUrl);
17+
}
18+
19+
public async Task<EnderecoDTO> ObterEndereco()
20+
{
21+
var response = await _httpClient.GetAsync("/cliente/endereco/");
22+
23+
if (response.StatusCode == HttpStatusCode.NotFound) return null;
24+
25+
TratarErrosResponse(response);
26+
27+
return await DeserializarObjetoResponse<EnderecoDTO>(response);
28+
}
29+
}
30+
}

src/api gateways/JSE.Bff.Compras/Services/ICatalogoService.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@ namespace JSE.Bff.Compras.Services
55
public interface ICatalogoService
66
{
77
Task<ItemProdutoDTO> ObterPorId(Guid id);
8+
Task<IEnumerable<ItemProdutoDTO>> ObterItens(IEnumerable<Guid> ids);
89
}
910
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using JSE.Bff.Compras.Models;
2+
3+
namespace JSE.Bff.Compras.Services
4+
{
5+
public interface IClienteService
6+
{
7+
Task<EnderecoDTO> ObterEndereco();
8+
}
9+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
using JSE.Bff.Compras.Models;
2+
using JSE.Core.Communication;
23

34
namespace JSE.Bff.Compras.Services
45
{
56
public interface IPedidoService
67
{
8+
Task<ResponseResult> FinalizarPedido(PedidoDTO pedido);
9+
Task<PedidoDTO> ObterUltimoPedido();
10+
Task<IEnumerable<PedidoDTO>> ObterListaPorClienteId();
11+
712
Task<VoucherDTO> ObterVoucherPorCodigo(string codigo);
813
}
914
}

0 commit comments

Comments
 (0)