Skip to content

Commit

Permalink
feature: notificação via e-mail de pedido editado
Browse files Browse the repository at this point in the history
  • Loading branch information
Brunobento1990 committed Apr 6, 2024
1 parent 764914d commit ee727f3
Show file tree
Hide file tree
Showing 13 changed files with 185 additions and 37 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,5 +27,7 @@ public void Configure(EntityTypeBuilder<MovimentacaoDeProduto> builder)
builder.Property(x => x.ProdutoId)
.IsRequired();
builder.HasIndex(x => x.ProdutoId);
builder.Property(x => x.Observacao)
.HasMaxLength(255);
}
}
4 changes: 2 additions & 2 deletions Mensageria/Interfaces/IMovimentacaoDeProdutoService.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
using Domain.Pkg.Entities;
using Mensageria.Model;

namespace Mensageria.Interfaces;

public interface IMovimentacaoDeProdutoService
{
Task MovimentarProdutosAsync(Pedido pedido, string referer);
Task MovimentarProdutosAsync(IList<MovimentacaoDeEstoqueDto> movimentacaoDeEstoqueDtos, string referer);
}
8 changes: 8 additions & 0 deletions Mensageria/Interfaces/INotificarPedidoEditadoService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
using Mensageria.Model;

namespace Mensageria.Interfaces;

public interface INotificarPedidoEditadoService
{
Task NotificarAsync(NotificarPedidoEditadoModel notificarPedidoEditadoModel);
}
3 changes: 2 additions & 1 deletion Mensageria/Ioc/DependencyInjectConsumer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ public static void InjectConsumer(this IServiceCollection services)
{
services.AddHostedService<PedidoCreatePdfConsumer>();
services.AddHostedService<ProdutosMaisVendidosConsumer>();
services.AddHostedService<MovimentacaoDeProdutosConsumer>();
services.AddHostedService<PedidoEntregueConsumer>();
services.AddHostedService<TopUsuariosConsumer>();
services.AddHostedService<EditItemPedidoConsumer>();
}
}
1 change: 1 addition & 0 deletions Mensageria/Ioc/DependencyInjectServices.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,6 @@ public static void InjectServices(this IServiceCollection services)
services.AddScoped<IEmailService, EmailService>();
services.AddScoped<ICachedService, CachedService>();
services.AddScoped<ITopUsuarioService, TopUsuarioService>();
services.AddScoped<INotificarPedidoEditadoService, NotificarPedidoEditadoService>();
}
}
2 changes: 1 addition & 1 deletion Mensageria/Mensageria.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Domain.Pkg" Version="1.0.59" />
<PackageReference Include="Domain.Pkg" Version="1.0.60" />
<PackageReference Include="dotenv.net" Version="3.1.3" />
<PackageReference Include="HarfBuzzSharp.NativeAssets.Linux" Version="7.3.0.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.3" />
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,20 @@

using Mensageria.Interfaces;
using Mensageria.Model;
using RabbitMQ.Client.Events;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System.Text;
using System.Text.Json;
using Mensageria.Interfaces;
using Mensageria.Model;

namespace Mensageria.Mensageria.Consumers;

public class MovimentacaoDeProdutosConsumer : BackgroundService
public class EditItemPedidoConsumer : BackgroundService
{
private readonly IModel _channel;
private const string ExchangeName = "pedido-entregue";
private const string ExchangeName = "pedido-editado";
private readonly string _queueName;
private readonly IServiceProvider _provider;

public MovimentacaoDeProdutosConsumer(IModel channel, IServiceProvider provider)
public EditItemPedidoConsumer(IModel channel, IServiceProvider provider)
{
_provider = provider;
_channel = channel;
Expand All @@ -37,16 +36,16 @@ protected override Task ExecuteAsync(CancellationToken stoppingToken)

var body = e.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
var pedidoCreateModel = JsonSerializer.Deserialize<PedidoCreateModel>(message);
var notificacao = JsonSerializer.Deserialize<NotificarPedidoEditadoModel>(message);

if (pedidoCreateModel != null)
if (notificacao != null)
{
using var scope = _provider.CreateScope();

try
{
var service = scope.ServiceProvider.GetRequiredService<IMovimentacaoDeProdutoService>();
await service.MovimentarProdutosAsync(pedidoCreateModel.Pedido, referer);
var service = scope.ServiceProvider.GetRequiredService<INotificarPedidoEditadoService>();
await service.NotificarAsync(notificacao);
}
catch (Exception ex)
{
Expand Down
79 changes: 79 additions & 0 deletions Mensageria/Mensageria/Consumers/PedidoEntregueConsumer.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
using Domain.Pkg.Enum;
using Mensageria.Interfaces;
using Mensageria.Model;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System.Text;
using System.Text.Json;

namespace Mensageria.Mensageria.Consumers;

public class PedidoEntregueConsumer : BackgroundService
{
private readonly IModel _channel;
private const string ExchangeName = "pedido-entregue";
private readonly string _queueName;
private readonly IServiceProvider _provider;
private const string _mensagemDeMovimentacaoEstoque = "Entrega de pedido!";

public PedidoEntregueConsumer(IModel channel, IServiceProvider provider)
{
_provider = provider;
_channel = channel;
_channel.ExchangeDeclare(ExchangeName, ExchangeType.Fanout);
_queueName = _channel.QueueDeclare().QueueName;
_channel.QueueBind(_queueName, ExchangeName, "");
}
protected override Task ExecuteAsync(CancellationToken stoppingToken)
{
var consumer = new EventingBasicConsumer(_channel);

consumer.Received += async (sender, e) =>
{
var headers = e.BasicProperties.Headers;

if (headers.TryGetValue("Referer", out object? value))
{
var referer = Encoding.UTF8.GetString((byte[])value);

var body = e.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
var pedidoCreateModel = JsonSerializer.Deserialize<PedidoCreateModel>(message);

if (pedidoCreateModel != null)
{
using var scope = _provider.CreateScope();

try
{
var service = scope.ServiceProvider.GetRequiredService<IMovimentacaoDeProdutoService>();
var itensMovimentos = pedidoCreateModel
.Pedido
.ItensPedido
.Select(x => new MovimentacaoDeEstoqueDto()
{
TipoMovimentacaoDeProduto = TipoMovimentacaoDeProduto.Saida,
Observacao = _mensagemDeMovimentacaoEstoque,
PesoId = x.PesoId,
ProdutoId = x.ProdutoId,
Quantidade = x.Quantidade,
TamanhoId = x.TamanhoId
}).ToList();
await service.MovimentarProdutosAsync(itensMovimentos, referer);
}
catch (Exception ex)
{
Console.WriteLine($"Erro rabbitMq movimentar o estoque: {ex.Message}");
throw new Exception(ex.Message);
}
}
}

_channel.BasicAck(e.DeliveryTag, false);
};

_channel.BasicConsume(_queueName, false, consumer);

return Task.CompletedTask;
}
}
13 changes: 13 additions & 0 deletions Mensageria/Model/MovimentacaoDeEstoqueDto.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using Domain.Pkg.Enum;

namespace Mensageria.Model;

public class MovimentacaoDeEstoqueDto
{
public Guid ProdutoId { get; set; }
public Guid? PesoId { get; set; }
public Guid? TamanhoId { get; set; }
public decimal Quantidade { get; set; }
public string? Observacao { get; set; }
public TipoMovimentacaoDeProduto TipoMovimentacaoDeProduto { get; set; }
}
9 changes: 9 additions & 0 deletions Mensageria/Model/NotificarPedidoEditadoModel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using Domain.Pkg.Entities;

namespace Mensageria.Model;

public class NotificarPedidoEditadoModel
{
public string EmailEnvio { get; set; } = string.Empty;
public Pedido Pedido { get; set; } = null!;
}
7 changes: 0 additions & 7 deletions Mensageria/Service/CachedService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,9 @@ namespace Mensageria.Service;
public class CachedService : ICachedService
{
private readonly IDistributedCache _distributedCache;
private readonly DistributedCacheEntryOptions _options;
private static readonly double _absolutExpiration = 60;
private static readonly double _slidingExpiration = 30;

public CachedService(IDistributedCache distributedCache)
{
_options = new DistributedCacheEntryOptions()
.SetAbsoluteExpiration(TimeSpan.FromMinutes(_absolutExpiration))
.SetSlidingExpiration(TimeSpan.FromMinutes(_slidingExpiration));

_distributedCache = distributedCache;
}
public async Task RemoveCachedAsync(string key)
Expand Down
34 changes: 19 additions & 15 deletions Mensageria/Service/MovimentacaoDeProdutoService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using Domain.Pkg.Enum;
using Mensageria.Infra.Interfaces;
using Mensageria.Interfaces;
using Mensageria.Model;

namespace Mensageria.Service;

Expand All @@ -18,42 +19,41 @@ public MovimentacaoDeProdutoService(
_estoqueRepository = estoqueRepository;
}

public async Task MovimentarProdutosAsync(Pedido pedido, string referer)
public async Task MovimentarProdutosAsync(IList<MovimentacaoDeEstoqueDto> movimentacaoDeEstoqueDtos, string referer)
{
var date = DateTime.Now;
var produtoIds = pedido
.ItensPedido
var produtoIds = movimentacaoDeEstoqueDtos
.DistinctBy(x => x.ProdutoId)
.Select(x => x.ProdutoId)
.ToList();

var estoques = await _estoqueRepository.GetAllEstoquesAsync(produtoIds, referer);

var movimntosDeProdutos = pedido.ItensPedido
var movimntosDeProdutos = movimentacaoDeEstoqueDtos
.Select(x =>
new MovimentacaoDeProduto(
Guid.NewGuid(),
date,
date,
0,
x.Quantidade,
TipoMovimentacaoDeProduto.Saida,
x.TipoMovimentacaoDeProduto,
x.ProdutoId,
x.TamanhoId,
x.PesoId))
x.PesoId,
x.Observacao))
.ToList();

await _movimentacaoDeProdutoRepository.AddMovimentacaoDeProdutosAsync(movimntosDeProdutos, referer);


var newEstoques = new List<Estoque>();
foreach (var item in pedido.ItensPedido)
foreach (var item in movimentacaoDeEstoqueDtos)
{
bool where(Estoque x) => x.ProdutoId == item.ProdutoId &&
bool where(Estoque x) => x.ProdutoId == item?.ProdutoId &&
x.TamanhoId == item.TamanhoId &&
x.PesoId == item.PesoId;

ProcessarEstoqueItemPedido(estoques, item, newEstoques, date, where);
ProcessarEstoqueItemPedido(estoques, item, newEstoques, date, where, item.TipoMovimentacaoDeProduto);
}

await _estoqueRepository.UpdateEstoqueAsync(estoques, referer);
Expand All @@ -62,35 +62,39 @@ bool where(Estoque x) => x.ProdutoId == item.ProdutoId &&

private static void ProcessarEstoqueItemPedido(
IList<Estoque> estoques,
ItensPedido item,
MovimentacaoDeEstoqueDto item,
List<Estoque> newEstoques,
DateTime date,
Func<Estoque, bool> where)
Func<Estoque, bool> where,
TipoMovimentacaoDeProduto tipoMovimentacaoDeProduto)
{
var estoque = estoques
.FirstOrDefault(where);

if (estoque != null)
{
estoque.UpdateEstoque(item.Quantidade, TipoMovimentacaoDeProduto.Saida);
estoque.UpdateEstoque(item.Quantidade, tipoMovimentacaoDeProduto);
return;
}

estoque = newEstoques.FirstOrDefault(where);

if (estoque != null)
{
estoque.UpdateEstoque(item.Quantidade, TipoMovimentacaoDeProduto.Saida);
estoque.UpdateEstoque(item.Quantidade, tipoMovimentacaoDeProduto);
return;
}

var newQuantidade = tipoMovimentacaoDeProduto == TipoMovimentacaoDeProduto.Entrada ?
item.Quantidade : -item.Quantidade;

estoque = new Estoque(
Guid.NewGuid(),
date,
date,
0,
item.ProdutoId,
-item.Quantidade,
newQuantidade,
item.TamanhoId,
item.PesoId);

Expand Down
39 changes: 39 additions & 0 deletions Mensageria/Service/NotificarPedidoEditadoService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
using Domain.Pkg.Interfaces;
using Domain.Pkg.Model;
using Mensageria.Interfaces;
using Mensageria.Model;

namespace Mensageria.Service;

public sealed class NotificarPedidoEditadoService : INotificarPedidoEditadoService
{
private readonly IEmailService _emailService;
private readonly FromEnvioEmailModel _fromEmailModel;

public NotificarPedidoEditadoService(IEmailService emailService)
{
_fromEmailModel = new FromEnvioEmailModel()
{
Email = VariaveisDeAmbiente.GetVariavel("EMAIL"),
Servidor = VariaveisDeAmbiente.GetVariavel("SERVER"),
Senha = VariaveisDeAmbiente.GetVariavel("SENHA"),
Porta = int.Parse(VariaveisDeAmbiente.GetVariavel("PORT"))
};
_emailService = emailService;
}

public async Task NotificarAsync(NotificarPedidoEditadoModel notificarPedidoEditadoModel)
{
var message = $"Pedido editado!\nN. do pedido : {notificarPedidoEditadoModel.Pedido.Numero}";
var assunto = "Pedido editado!";

var emailModel = new ToEnvioEmailModel()
{
Assunto = assunto,
Email = notificarPedidoEditadoModel.EmailEnvio,
Mensagem = message
};

await _emailService.SendEmail(emailModel, _fromEmailModel);
}
}

0 comments on commit ee727f3

Please sign in to comment.