Skip to content

Commit 26ce48e

Browse files
committed
#248 - Baixar o pedido do estoque - feature/sp7/#248
1 parent 2e61895 commit 26ce48e

File tree

6 files changed

+122
-4
lines changed

6 files changed

+122
-4
lines changed
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using JSE.Catalogo.API.Services;
2+
using JSE.Core.Utils;
3+
using JSE.MessageBus;
4+
5+
namespace JSE.Catalogo.API.Configuration
6+
{
7+
public static class MessageBusConfig
8+
{
9+
public static void AddMessageBusConfiguration(this IServiceCollection services,
10+
IConfiguration configuration)
11+
{
12+
services.AddMessageBus(configuration.GetMessageQueueConnection("MessageBus"))
13+
.AddHostedService<CatalogoIntegrationHandler>();
14+
}
15+
}
16+
}

src/services/JSE.Catalogo.API/JSE.Catalogo.API.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929
<ItemGroup>
3030
<ProjectReference Include="..\..\building blocks\JSE.Core\JSE.Core.csproj" />
31+
<ProjectReference Include="..\..\building blocks\JSE.MessageBus\JSE.MessageBus.csproj" />
3132
<ProjectReference Include="..\..\building blocks\JSE.WebAPI.Core\JSE.WebAPI.Core.csproj" />
3233
<ProjectReference Include="..\JSE.Identidade.API\JSE.Identidade.API.csproj" />
3334
</ItemGroup>

src/services/JSE.Catalogo.API/Models/Produto.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,22 @@ namespace JSE.Catalogo.API.Models
55
public class Produto : Entity, IAggregateRoot
66
{
77
public string Nome { get; set; }
8-
public string Descricao { get; set; }
8+
public string Descricao { get; set; }
99
public bool Ativo { get; set; }
1010
public decimal Valor { get; set; }
1111
public DateTime DataCadastro { get; set; }
1212
public string Imagem { get; set; }
1313
public int QuantidadeEstoque { get; set; }
14+
15+
public void RetirarEstoque(int quantidade)
16+
{
17+
if (QuantidadeEstoque >= quantidade)
18+
QuantidadeEstoque -= quantidade;
19+
}
20+
21+
public bool EstaDisponivel(int quantidade)
22+
{
23+
return Ativo && QuantidadeEstoque >= quantidade;
24+
}
1425
}
1526
}

src/services/JSE.Catalogo.API/Program.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
.AddUserSecrets(typeof(Program).Assembly).Build();
1414

1515
builder.Services.AddApiConfiguration(configuration);
16+
builder.Services.AddMessageBusConfiguration(configuration);
1617
builder.Services.AddJwtConfiguration(configuration);
1718
builder.Services.AddSwaggerConfiguration();
1819
builder.Services.AddEndpointsApiExplorer();
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
using JSE.Catalogo.API.Models;
2+
using JSE.Core.DomainObjects;
3+
using JSE.Core.Messages.Integration;
4+
using JSE.MessageBus;
5+
6+
namespace JSE.Catalogo.API.Services
7+
{
8+
public class CatalogoIntegrationHandler : BackgroundService
9+
{
10+
private readonly IMessageBus _bus;
11+
private readonly IServiceProvider _serviceProvider;
12+
13+
public CatalogoIntegrationHandler(IServiceProvider serviceProvider, IMessageBus bus)
14+
{
15+
_serviceProvider = serviceProvider;
16+
_bus = bus;
17+
}
18+
protected override Task ExecuteAsync(CancellationToken stoppingToken)
19+
{
20+
SetSubscribers();
21+
return Task.CompletedTask;
22+
}
23+
24+
private void SetSubscribers()
25+
{
26+
_bus.SubscribeAsync<PedidoAutorizadoIntegrationEvent>("PedidoAutorizado", async request =>
27+
await BaixarEstoque(request));
28+
}
29+
30+
private async Task BaixarEstoque(PedidoAutorizadoIntegrationEvent message)
31+
{
32+
using (var scope = _serviceProvider.CreateScope())
33+
{
34+
var produtosComEstoque = new List<Produto>();
35+
var produtoRepository = scope.ServiceProvider.GetRequiredService<IProdutoRepository>();
36+
37+
var idsProdutos = string.Join(",", message.Itens.Select(c => c.Key));
38+
var produtos = await produtoRepository.ObterProdutosPorId(idsProdutos);
39+
40+
if (produtos.Count != message.Itens.Count)
41+
{
42+
CancelarPedidoSemEstoque(message);
43+
return;
44+
}
45+
46+
foreach (var produto in produtos)
47+
{
48+
var quantidadeProduto = message.Itens.FirstOrDefault(p => p.Key == produto.Id).Value;
49+
50+
if (produto.EstaDisponivel(quantidadeProduto))
51+
{
52+
produto.RetirarEstoque(quantidadeProduto);
53+
produtosComEstoque.Add(produto);
54+
}
55+
}
56+
57+
if (produtosComEstoque.Count != message.Itens.Count)
58+
{
59+
CancelarPedidoSemEstoque(message);
60+
return;
61+
}
62+
63+
foreach (var produto in produtosComEstoque)
64+
{
65+
produtoRepository.Atualizar(produto);
66+
}
67+
68+
if (!await produtoRepository.UnitOfWork.Commit())
69+
{
70+
throw new DomainException($"Problemas ao atualizar estoque do pedido {message.PedidoId}");
71+
}
72+
73+
var pedidoBaixado = new PedidoBaixadoEstoqueIntegrationEvent(message.ClienteId, message.PedidoId);
74+
await _bus.PublishAsync(pedidoBaixado);
75+
}
76+
}
77+
78+
public async void CancelarPedidoSemEstoque(PedidoAutorizadoIntegrationEvent message)
79+
{
80+
var pedidoCancelado = new PedidoCanceladoIntegrationEvent(message.ClienteId, message.PedidoId);
81+
await _bus.PublishAsync(pedidoCancelado);
82+
}
83+
}
84+
}

src/services/JSE.Catalogo.API/appsettings.Development.json

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
{
2-
"ConnectionStrings": {
3-
"DefaultConnection": "Server=.\\SQLEXPRESS;Database=JeffStoreEnterprise;User Id=sa;Password=Asd123!!;Trusted_Connection=true;MultipleActiveResultSets=true;TrustServerCertificate=True;"
4-
},
52
"Logging": {
63
"LogLevel": {
74
"Default": "Information",
85
"Microsoft.AspNetCore": "Warning"
96
}
107
},
118

9+
"ConnectionStrings": {
10+
"DefaultConnection": "Server=.\\SQLEXPRESS;Database=JeffStoreEnterprise;User Id=sa;Password=Asd123!!;Trusted_Connection=true;MultipleActiveResultSets=true;TrustServerCertificate=True;"
11+
},
12+
13+
"MessageQueueConnection": {
14+
"MessageBus": "host=localhost:5672;publisherConfirms=true;timeout=10"
15+
},
16+
1217
"AppSettings": {
1318
"Secret": "F9F52344-59C3-4EAC-90E6-CB47935038BE",
1419
"ExpirationHours": 2,

0 commit comments

Comments
 (0)