From b4a36380b4b6f827b6c3e8ecd8aba97eae720d16 Mon Sep 17 00:00:00 2001 From: Bruno Date: Sat, 24 Feb 2024 10:16:44 -0300 Subject: [PATCH] feature produtos mais vendidos --- .../IConfiguracaoParceiroRepository.cs | 6 ++ .../IProdutosMaisVendidosRepository.cs | 10 +++ .../AddOrUpdateProdutosMaisVendidosDto.cs | 7 ++ Mensageria/Entities/BaseEntity.cs | 21 ----- Mensageria/Entities/BaseItens.cs | 13 ---- Mensageria/Entities/Categoria.cs | 20 ----- Mensageria/Entities/ItensPedido.cs | 41 ---------- Mensageria/Entities/Pedido.cs | 31 -------- Mensageria/Entities/Peso.cs | 19 ----- Mensageria/Entities/Produto.cs | 33 -------- Mensageria/Entities/ProdutosMaisVendidos.cs | 32 -------- Mensageria/Entities/Tamanho.cs | 19 ----- Mensageria/Entities/Usuario.cs | 29 ------- Mensageria/Infra/Context/OpenAdmContext.cs | 11 +++ Mensageria/Infra/Context/ParceiroContext.cs | 25 ++++++ .../Infra/Factories/FactoryParceiroContext.cs | 27 +++++++ .../Interfaces/IFactoryParceiroContext.cs | 8 ++ .../ConfiguracaoParceiroRepository.cs | 26 +++++++ .../ProdutosMaisVendidosRepository.cs | 40 ++++++++++ .../IPrecessarProdutosMaisVendidos.cs | 8 ++ Mensageria/Mensageria.csproj | 7 ++ .../Consumers/PedidoCreatePdfConsumer.cs | 7 ++ .../Consumers/ProdutosMaisVendidosConsumer.cs | 67 ++++++++++++++++ Mensageria/Model/PedidoCreateModel.cs | 2 +- Mensageria/Program.cs | 15 ++++ .../Service/PrecessarProdutosMaisVendidos.cs | 77 +++++++++++++++++++ 26 files changed, 342 insertions(+), 259 deletions(-) create mode 100644 Mensageria/Domain/Interfaces/IConfiguracaoParceiroRepository.cs create mode 100644 Mensageria/Domain/Interfaces/IProdutosMaisVendidosRepository.cs create mode 100644 Mensageria/Dtos/ProdutosMaisVendidos/AddOrUpdateProdutosMaisVendidosDto.cs delete mode 100644 Mensageria/Entities/BaseEntity.cs delete mode 100644 Mensageria/Entities/BaseItens.cs delete mode 100644 Mensageria/Entities/Categoria.cs delete mode 100644 Mensageria/Entities/ItensPedido.cs delete mode 100644 Mensageria/Entities/Pedido.cs delete mode 100644 Mensageria/Entities/Peso.cs delete mode 100644 Mensageria/Entities/Produto.cs delete mode 100644 Mensageria/Entities/ProdutosMaisVendidos.cs delete mode 100644 Mensageria/Entities/Tamanho.cs delete mode 100644 Mensageria/Entities/Usuario.cs create mode 100644 Mensageria/Infra/Context/OpenAdmContext.cs create mode 100644 Mensageria/Infra/Context/ParceiroContext.cs create mode 100644 Mensageria/Infra/Factories/FactoryParceiroContext.cs create mode 100644 Mensageria/Infra/Interfaces/IFactoryParceiroContext.cs create mode 100644 Mensageria/Infra/Repositories/ConfiguracaoParceiroRepository.cs create mode 100644 Mensageria/Infra/Repositories/ProdutosMaisVendidosRepository.cs create mode 100644 Mensageria/Interfaces/IPrecessarProdutosMaisVendidos.cs create mode 100644 Mensageria/Mensageria/Consumers/ProdutosMaisVendidosConsumer.cs create mode 100644 Mensageria/Service/PrecessarProdutosMaisVendidos.cs diff --git a/Mensageria/Domain/Interfaces/IConfiguracaoParceiroRepository.cs b/Mensageria/Domain/Interfaces/IConfiguracaoParceiroRepository.cs new file mode 100644 index 0000000..b7f15c4 --- /dev/null +++ b/Mensageria/Domain/Interfaces/IConfiguracaoParceiroRepository.cs @@ -0,0 +1,6 @@ +namespace Mensageria.Domain.Interfaces; + +public interface IConfiguracaoParceiroRepository +{ + Task GetConnectionStringParceiroAsync(string referer); +} diff --git a/Mensageria/Domain/Interfaces/IProdutosMaisVendidosRepository.cs b/Mensageria/Domain/Interfaces/IProdutosMaisVendidosRepository.cs new file mode 100644 index 0000000..bc8739f --- /dev/null +++ b/Mensageria/Domain/Interfaces/IProdutosMaisVendidosRepository.cs @@ -0,0 +1,10 @@ +using Domain.Pkg.Entities; + +namespace Mensageria.Domain.Interfaces; + +public interface IProdutosMaisVendidosRepository +{ + Task AddRangeAsync(IList produtosMaisVendidos, string referer); + Task UpdateRangeAsync(IList produtosMaisVendidos, string referer); + Task> GetProdutosMaisVendidosAsync(IList produtosIds, string referer); +} diff --git a/Mensageria/Dtos/ProdutosMaisVendidos/AddOrUpdateProdutosMaisVendidosDto.cs b/Mensageria/Dtos/ProdutosMaisVendidos/AddOrUpdateProdutosMaisVendidosDto.cs new file mode 100644 index 0000000..a366514 --- /dev/null +++ b/Mensageria/Dtos/ProdutosMaisVendidos/AddOrUpdateProdutosMaisVendidosDto.cs @@ -0,0 +1,7 @@ +namespace Mensageria.Dtos.ProdutosMaisVendidos; + +public class AddOrUpdateProdutosMaisVendidosDto +{ + public Guid ProdutoId { get; set; } + public decimal QuantidadeProdutos { get; set; } +} diff --git a/Mensageria/Entities/BaseEntity.cs b/Mensageria/Entities/BaseEntity.cs deleted file mode 100644 index d7db04a..0000000 --- a/Mensageria/Entities/BaseEntity.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace Mensageria.Entities; - -public abstract class BaseEntity -{ - protected BaseEntity( - Guid id, - DateTime dataDeCriacao, - DateTime dataDeAtualizacao, - long numero) - { - Id = id; - DataDeCriacao = dataDeCriacao; - DataDeAtualizacao = dataDeAtualizacao; - Numero = numero; - } - - public Guid Id { get; protected set; } - public DateTime DataDeCriacao { get; protected set; } - public DateTime DataDeAtualizacao { get; protected set; } - public long Numero { get; protected set; } -} diff --git a/Mensageria/Entities/BaseItens.cs b/Mensageria/Entities/BaseItens.cs deleted file mode 100644 index 2742489..0000000 --- a/Mensageria/Entities/BaseItens.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace Mensageria.Entities; - -public abstract class BaseItens : BaseEntity -{ - protected BaseItens(Guid id, DateTime dataDeCriacao, DateTime dataDeAtualizacao, long numero, Guid produtoId) - : base(id, dataDeCriacao, dataDeAtualizacao, numero) - { - ProdutoId = produtoId; - } - - public Guid ProdutoId { get; private set; } - public Produto Produto { get; set; } = null!; -} diff --git a/Mensageria/Entities/Categoria.cs b/Mensageria/Entities/Categoria.cs deleted file mode 100644 index cfaa431..0000000 --- a/Mensageria/Entities/Categoria.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System.Text.Json.Serialization; - -namespace Mensageria.Entities; - -public class Categoria : BaseEntity -{ - [JsonConstructor] - public Categoria(Guid id, DateTime dataDeCriacao, DateTime dataDeAtualizacao, long numero, string descricao, byte[]? foto) - : base(id, dataDeCriacao, dataDeAtualizacao, numero) - { - Descricao = descricao; - Foto = foto; - } - - - - public string Descricao { get; private set; } - public byte[]? Foto { get; private set; } - public List Produtos { get; set; } = new(); -} diff --git a/Mensageria/Entities/ItensPedido.cs b/Mensageria/Entities/ItensPedido.cs deleted file mode 100644 index f7f03e1..0000000 --- a/Mensageria/Entities/ItensPedido.cs +++ /dev/null @@ -1,41 +0,0 @@ -namespace Mensageria.Entities; - -public sealed class ItensPedido : BaseItens -{ - public ItensPedido( - Guid id, - DateTime dataDeCriacao, - DateTime dataDeAtualizacao, - long numero, - Guid? pesoId, - Guid? tamanhoId, - Guid produtoId, - Guid pedidoId, - decimal valorUnitario, - decimal quantidade) - : base(id, dataDeCriacao, dataDeAtualizacao, numero, produtoId) - { - - PesoId = pesoId; - TamanhoId = tamanhoId; - PedidoId = pedidoId; - ValorUnitario = valorUnitario; - Quantidade = quantidade; - } - - public Guid? PesoId { get; private set; } - public Peso? Peso { get; set; } - public Guid? TamanhoId { get; private set; } - public Tamanho? Tamanho { get; set; } - public Guid PedidoId { get; private set; } - public Pedido Pedido { get; set; } = null!; - public decimal ValorUnitario { get; private set; } - public decimal Quantidade { get; private set; } - public decimal ValorTotal - { - get - { - return ValorUnitario * Quantidade; - } - } -} diff --git a/Mensageria/Entities/Pedido.cs b/Mensageria/Entities/Pedido.cs deleted file mode 100644 index 376a308..0000000 --- a/Mensageria/Entities/Pedido.cs +++ /dev/null @@ -1,31 +0,0 @@ -namespace Mensageria.Entities; - -public sealed class Pedido : BaseEntity -{ - public Pedido( - Guid id, - DateTime dataDeCriacao, - DateTime dataDeAtualizacao, - long numero, - StatusPedido statusPedido, - Guid usuarioId) - : base(id, dataDeCriacao, dataDeAtualizacao, numero) - { - StatusPedido = statusPedido; - UsuarioId = usuarioId; - } - - public StatusPedido StatusPedido { get; private set; } - public Guid UsuarioId { get; private set; } - public Usuario Usuario { get; set; } = null!; - public decimal ValorTotal { get { return ItensPedido.Sum(x => x.ValorTotal); } } - public IList ItensPedido { get; set; } = new List(); -} - -public enum StatusPedido -{ - Aberto, - Faturado, - RotaDeEntrega, - Entregue -} diff --git a/Mensageria/Entities/Peso.cs b/Mensageria/Entities/Peso.cs deleted file mode 100644 index f5b717b..0000000 --- a/Mensageria/Entities/Peso.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace Mensageria.Entities; - -public sealed class Peso : BaseEntity -{ - public Peso( - Guid id, - DateTime dataDeCriacao, - DateTime dataDeAtualizacao, - long numero, - string descricao) - : base(id, dataDeCriacao, dataDeAtualizacao, numero) - { - Descricao = descricao; - } - - public string Descricao { get; private set; } - public List ItensPedido { get; set; } = new(); - public List Produtos { get; set; } = new(); -} diff --git a/Mensageria/Entities/Produto.cs b/Mensageria/Entities/Produto.cs deleted file mode 100644 index cbdacec..0000000 --- a/Mensageria/Entities/Produto.cs +++ /dev/null @@ -1,33 +0,0 @@ -namespace Mensageria.Entities; - -public sealed class Produto : BaseEntity -{ - public Produto( - Guid id, - DateTime dataDeCriacao, - DateTime dataDeAtualizacao, - long numero, - string descricao, - string? especificacaoTecnica, - byte[] foto, - Guid categoriaId, - string? referencia) - : base(id, dataDeCriacao, dataDeAtualizacao, numero) - { - Descricao = descricao; - EspecificacaoTecnica = especificacaoTecnica; - Foto = foto; - CategoriaId = categoriaId; - Referencia = referencia; - } - - public string Descricao { get; private set; } - public string? EspecificacaoTecnica { get; private set; } - public byte[] Foto { get; set; } - public List Tamanhos { get; set; } = new(); - public List Pesos { get; set; } = new(); - public Guid CategoriaId { get; private set; } - public Categoria Categoria { get; set; } = null!; - public List ItensPedido { get; set; } = new(); - public string? Referencia { get; private set; } -} diff --git a/Mensageria/Entities/ProdutosMaisVendidos.cs b/Mensageria/Entities/ProdutosMaisVendidos.cs deleted file mode 100644 index b870418..0000000 --- a/Mensageria/Entities/ProdutosMaisVendidos.cs +++ /dev/null @@ -1,32 +0,0 @@ -namespace Mensageria.Entities; - -public sealed class ProdutosMaisVendidos : BaseEntity -{ - public ProdutosMaisVendidos( - Guid id, - DateTime dataDeCriacao, - DateTime dataDeAtualizacao, - long numero, - decimal quantidadeProdutos, - decimal quantidadePedidos, - Guid produtoId) - : base(id, dataDeCriacao, dataDeAtualizacao, numero) - { - QuantidadeProdutos = quantidadeProdutos; - QuantidadePedidos = quantidadePedidos; - ProdutoId = produtoId; - } - - public decimal QuantidadeProdutos { get; private set; } - public decimal QuantidadePedidos { get; private set; } - public Guid ProdutoId { get; private set; } - - public void UpdateQuantidadeProdutos(decimal quantidadeProdutos) - { - if (quantidadeProdutos <= 0) - throw new Exception("Quantidade de produtos inválida!"); - - QuantidadeProdutos += quantidadeProdutos; - QuantidadePedidos++; - } -} diff --git a/Mensageria/Entities/Tamanho.cs b/Mensageria/Entities/Tamanho.cs deleted file mode 100644 index 9716f06..0000000 --- a/Mensageria/Entities/Tamanho.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace Mensageria.Entities; - -public sealed class Tamanho : BaseEntity -{ - public Tamanho( - Guid id, - DateTime dataDeCriacao, - DateTime dataDeAtualizacao, - long numero, - string descricao) - : base(id, dataDeCriacao, dataDeAtualizacao, numero) - { - Descricao = descricao; - } - - public string Descricao { get; private set; } - public List ItensPedido { get; set; } = new(); - public List Produtos { get; set; } = new(); -} diff --git a/Mensageria/Entities/Usuario.cs b/Mensageria/Entities/Usuario.cs deleted file mode 100644 index ff20a7e..0000000 --- a/Mensageria/Entities/Usuario.cs +++ /dev/null @@ -1,29 +0,0 @@ -namespace Mensageria.Entities; - -public sealed class Usuario : BaseEntity -{ - public Usuario( - Guid id, - DateTime dataDeCriacao, - DateTime dataDeAtualizacao, - long numero, - string email, - string senha, - string nome, - string? telefone, - string? cnpj) - : base(id, dataDeCriacao, dataDeAtualizacao, numero) - { - Email = email; - Senha = senha; - Nome = nome; - Telefone = telefone; - Cnpj = cnpj; - } - - public string Email { get; private set; } - public string Senha { get; private set; } - public string Nome { get; private set; } - public string? Telefone { get; private set; } - public string? Cnpj { get; set; } -} diff --git a/Mensageria/Infra/Context/OpenAdmContext.cs b/Mensageria/Infra/Context/OpenAdmContext.cs new file mode 100644 index 0000000..d54b7a7 --- /dev/null +++ b/Mensageria/Infra/Context/OpenAdmContext.cs @@ -0,0 +1,11 @@ +using Domain.Pkg.Entities; +using Microsoft.EntityFrameworkCore; + +namespace Mensageria.Infra.Context; + +public class OpenAdmContext(DbContextOptions options) + : DbContext(options) +{ + public DbSet Parceiros { get; set; } + public DbSet ConfiguracoesParceiro { get; set; } +} diff --git a/Mensageria/Infra/Context/ParceiroContext.cs b/Mensageria/Infra/Context/ParceiroContext.cs new file mode 100644 index 0000000..3642d91 --- /dev/null +++ b/Mensageria/Infra/Context/ParceiroContext.cs @@ -0,0 +1,25 @@ +using Domain.Pkg.Entities; +using Microsoft.EntityFrameworkCore; + +namespace Mensageria.Infra.Context; + +public class ParceiroContext(DbContextOptions options) + : DbContext(options) +{ + public DbSet Banners { get; set; } + public DbSet Funcionarios { get; set; } + public DbSet Categorias { get; set; } + public DbSet Pesos { get; set; } + public DbSet Tamanhos { get; set; } + public DbSet Produtos { get; set; } + public DbSet PesosProdutos { get; set; } + public DbSet TamanhosProdutos { get; set; } + public DbSet Usuarios { get; set; } + public DbSet Pedidos { get; set; } + public DbSet ItensPedidos { get; set; } + public DbSet TabelaDePreco { get; set; } + public DbSet ItensTabelaDePreco { get; set; } + public DbSet ProdutosMaisVendidos { get; set; } + public DbSet ConfiguracoesDeEmail { get; set; } + public DbSet ConfiguracoesDePedidos { get; set; } +} diff --git a/Mensageria/Infra/Factories/FactoryParceiroContext.cs b/Mensageria/Infra/Factories/FactoryParceiroContext.cs new file mode 100644 index 0000000..becec5d --- /dev/null +++ b/Mensageria/Infra/Factories/FactoryParceiroContext.cs @@ -0,0 +1,27 @@ +using Mensageria.Domain.Interfaces; +using Mensageria.Infra.Context; +using Mensageria.Infra.Interfaces; +using Microsoft.EntityFrameworkCore; + +namespace Mensageria.Infra.Factories; + +public class FactoryParceiroContext : IFactoryParceiroContext +{ + private readonly IConfiguracaoParceiroRepository _configuracaoParceiroRepository; + + public FactoryParceiroContext(IConfiguracaoParceiroRepository configuracaoParceiroRepository) + { + _configuracaoParceiroRepository = configuracaoParceiroRepository; + } + + public async Task CreateParceiroContextAsync(string referer) + { + var connectionString = await _configuracaoParceiroRepository.GetConnectionStringParceiroAsync(referer); + + var optionsBuilderParceiro = new DbContextOptionsBuilder(); + + optionsBuilderParceiro.UseNpgsql(connectionString); + + return new ParceiroContext(optionsBuilderParceiro.Options); + } +} diff --git a/Mensageria/Infra/Interfaces/IFactoryParceiroContext.cs b/Mensageria/Infra/Interfaces/IFactoryParceiroContext.cs new file mode 100644 index 0000000..9829463 --- /dev/null +++ b/Mensageria/Infra/Interfaces/IFactoryParceiroContext.cs @@ -0,0 +1,8 @@ +using Mensageria.Infra.Context; + +namespace Mensageria.Infra.Interfaces; + +public interface IFactoryParceiroContext +{ + Task CreateParceiroContextAsync(string referer); +} diff --git a/Mensageria/Infra/Repositories/ConfiguracaoParceiroRepository.cs b/Mensageria/Infra/Repositories/ConfiguracaoParceiroRepository.cs new file mode 100644 index 0000000..df2b6d1 --- /dev/null +++ b/Mensageria/Infra/Repositories/ConfiguracaoParceiroRepository.cs @@ -0,0 +1,26 @@ +using Mensageria.Domain.Interfaces; +using Mensageria.Infra.Context; +using Microsoft.EntityFrameworkCore; + +namespace Mensageria.Infra.Repositories; + +public class ConfiguracaoParceiroRepository : IConfiguracaoParceiroRepository +{ + private readonly OpenAdmContext _openAdmContext; + + public ConfiguracaoParceiroRepository(OpenAdmContext openAdmContext) + { + _openAdmContext = openAdmContext; + } + + public async Task GetConnectionStringParceiroAsync(string referer) + { + return await _openAdmContext + .ConfiguracoesParceiro + .AsNoTracking() + .Where(x => x.DominioSiteAdm == referer || x.DominioSiteEcommerce == referer) + .Select(x => x.ConexaoDb) + .FirstOrDefaultAsync() + ?? throw new Exception("Conexão do parceiro não foi localizada!"); + } +} diff --git a/Mensageria/Infra/Repositories/ProdutosMaisVendidosRepository.cs b/Mensageria/Infra/Repositories/ProdutosMaisVendidosRepository.cs new file mode 100644 index 0000000..74815b1 --- /dev/null +++ b/Mensageria/Infra/Repositories/ProdutosMaisVendidosRepository.cs @@ -0,0 +1,40 @@ +using Domain.Pkg.Entities; +using Mensageria.Domain.Interfaces; +using Mensageria.Infra.Interfaces; +using Microsoft.EntityFrameworkCore; + +namespace Mensageria.Infra.Repositories; + +public class ProdutosMaisVendidosRepository : IProdutosMaisVendidosRepository +{ + private readonly IFactoryParceiroContext _factoryParceiroContext; + + public ProdutosMaisVendidosRepository(IFactoryParceiroContext factoryParceiroContext) + { + _factoryParceiroContext = factoryParceiroContext; + } + + public async Task AddRangeAsync(IList produtosMaisVendidos, string referer) + { + var context = await _factoryParceiroContext.CreateParceiroContextAsync(referer); + await context.AddRangeAsync(produtosMaisVendidos); + await context.SaveChangesAsync(); + } + + public async Task> GetProdutosMaisVendidosAsync(IList produtosIds, string referer) + { + var context = await _factoryParceiroContext.CreateParceiroContextAsync(referer); + + return await context + .ProdutosMaisVendidos + .Where(x => produtosIds.Contains(x.ProdutoId)) + .ToListAsync(); + } + + public async Task UpdateRangeAsync(IList produtosMaisVendidos, string referer) + { + var context = await _factoryParceiroContext.CreateParceiroContextAsync(referer); + context.UpdateRange(produtosMaisVendidos); + await context.SaveChangesAsync(); + } +} diff --git a/Mensageria/Interfaces/IPrecessarProdutosMaisVendidos.cs b/Mensageria/Interfaces/IPrecessarProdutosMaisVendidos.cs new file mode 100644 index 0000000..e1c332d --- /dev/null +++ b/Mensageria/Interfaces/IPrecessarProdutosMaisVendidos.cs @@ -0,0 +1,8 @@ +using Mensageria.Dtos.ProdutosMaisVendidos; + +namespace Mensageria.Interfaces; + +public interface IPrecessarProdutosMaisVendidos +{ + Task ProcessarAsync(IList addOrUpdateProdutosMaisVendidosDtos, string referer); +} diff --git a/Mensageria/Mensageria.csproj b/Mensageria/Mensageria.csproj index 96a480c..f26597c 100644 --- a/Mensageria/Mensageria.csproj +++ b/Mensageria/Mensageria.csproj @@ -9,11 +9,18 @@ + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + diff --git a/Mensageria/Mensageria/Consumers/PedidoCreatePdfConsumer.cs b/Mensageria/Mensageria/Consumers/PedidoCreatePdfConsumer.cs index 6113d6a..e6e5210 100644 --- a/Mensageria/Mensageria/Consumers/PedidoCreatePdfConsumer.cs +++ b/Mensageria/Mensageria/Consumers/PedidoCreatePdfConsumer.cs @@ -29,6 +29,13 @@ protected override Task ExecuteAsync(CancellationToken stoppingToken) consumer.Received += async (sender, e) => { + var headers = e.BasicProperties.Headers; + + if (headers.ContainsKey("Referer")) + { + var refererHeaderValue = Encoding.UTF8.GetString((byte[])headers["Referer"]); + Console.WriteLine($"Referer: {refererHeaderValue}"); + } var body = e.Body.ToArray(); var message = Encoding.UTF8.GetString(body); var pedido = JsonSerializer.Deserialize(message); diff --git a/Mensageria/Mensageria/Consumers/ProdutosMaisVendidosConsumer.cs b/Mensageria/Mensageria/Consumers/ProdutosMaisVendidosConsumer.cs new file mode 100644 index 0000000..6c16bfc --- /dev/null +++ b/Mensageria/Mensageria/Consumers/ProdutosMaisVendidosConsumer.cs @@ -0,0 +1,67 @@ +using RabbitMQ.Client.Events; +using RabbitMQ.Client; +using System.Text; +using System.Text.Json; +using Mensageria.Interfaces; +using Mensageria.Model; +using Mensageria.Dtos.ProdutosMaisVendidos; + +namespace Mensageria.Mensageria.Consumers; + +public class ProdutosMaisVendidosConsumer : BackgroundService +{ + private readonly IModel _channel; + private const string ExchangeName = "produtos-mais-vendidos"; + private readonly string _queueName; + private readonly IServiceProvider _provider; + + public ProdutosMaisVendidosConsumer(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 produtosMaisVendidos = JsonSerializer.Deserialize>(message); + + if (produtosMaisVendidos != null) + { + using var scope = _provider.CreateScope(); + + try + { + var service = scope.ServiceProvider.GetRequiredService(); + await service.ProcessarAsync(produtosMaisVendidos, referer); + } + catch (Exception ex) + { + Console.WriteLine($"Erro rabbitMq adicionar pedido : {ex.Message}"); + throw new Exception(ex.Message); + } + } + } + + _channel.BasicAck(e.DeliveryTag, false); + }; + + _channel.BasicConsume(_queueName, false, consumer); + + return Task.CompletedTask; + } +} diff --git a/Mensageria/Model/PedidoCreateModel.cs b/Mensageria/Model/PedidoCreateModel.cs index 9362edf..71b4ac2 100644 --- a/Mensageria/Model/PedidoCreateModel.cs +++ b/Mensageria/Model/PedidoCreateModel.cs @@ -1,4 +1,4 @@ -using Mensageria.Entities; +using Domain.Pkg.Entities; namespace Mensageria.Model; diff --git a/Mensageria/Program.cs b/Mensageria/Program.cs index 2ea32a2..da4ce7d 100644 --- a/Mensageria/Program.cs +++ b/Mensageria/Program.cs @@ -1,11 +1,17 @@ using dotenv.net; using Mensageria; +using Mensageria.Infra.Context; using Mensageria.Interfaces; using Mensageria.Mensageria; using Mensageria.Mensageria.Consumers; using Mensageria.Service; using QuestPDF.Infrastructure; using RabbitMQ.Client; +using Microsoft.EntityFrameworkCore; +using Mensageria.Domain.Interfaces; +using Mensageria.Infra.Repositories; +using Mensageria.Infra.Interfaces; +using Mensageria.Infra.Factories; var builder = Host.CreateApplicationBuilder(args); @@ -13,6 +19,10 @@ QuestPDF.Settings.License = LicenseType.Community; +AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true); +string connectionString = VariaveisDeAmbiente.GetVariavel("STRING_CONNECTION"); +builder.Services.AddDbContext(opt => opt.UseNpgsql(connectionString)); + builder.Services.AddStackExchangeRedisCache(options => { options.Configuration = VariaveisDeAmbiente.GetVariavel("REDIS_URL"); @@ -24,8 +34,13 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); +builder.Services.AddScoped(); +builder.Services.AddScoped(); +builder.Services.AddScoped(); builder.Services.AddHostedService(); +builder.Services.AddHostedService(); var host = builder.Build(); host.Run(); diff --git a/Mensageria/Service/PrecessarProdutosMaisVendidos.cs b/Mensageria/Service/PrecessarProdutosMaisVendidos.cs new file mode 100644 index 0000000..77c1303 --- /dev/null +++ b/Mensageria/Service/PrecessarProdutosMaisVendidos.cs @@ -0,0 +1,77 @@ +using Domain.Pkg.Entities; +using Mensageria.Domain.Interfaces; +using Mensageria.Dtos.ProdutosMaisVendidos; +using Mensageria.Interfaces; + +namespace Mensageria.Service; + +public class PrecessarProdutosMaisVendidos : IPrecessarProdutosMaisVendidos +{ + private readonly IProdutosMaisVendidosRepository _produtosMaisVendidosRepository; + + public PrecessarProdutosMaisVendidos(IProdutosMaisVendidosRepository produtosMaisVendidosRepository) + { + _produtosMaisVendidosRepository = produtosMaisVendidosRepository; + } + + public async Task ProcessarAsync(IList addOrUpdateProdutosMaisVendidosDtos, string referer) + { + var produtosIds = addOrUpdateProdutosMaisVendidosDtos + .Select(x => x.ProdutoId) + .ToList(); + + var produtosMaisVendidos = await _produtosMaisVendidosRepository.GetProdutosMaisVendidosAsync(produtosIds, referer); + + var add = new List(); + var updates = new List(); + var date = DateTime.Now; + + foreach (var addOrUpdateDto in addOrUpdateProdutosMaisVendidosDtos) + { + var addOrUpdate = produtosMaisVendidos + .FirstOrDefault(x => x.ProdutoId == addOrUpdateDto.ProdutoId); + + if (addOrUpdate == null) + { + var insert = add.FirstOrDefault(x => x.ProdutoId == addOrUpdateDto.ProdutoId); + + if (insert == null) + { + addOrUpdate = new ProdutosMaisVendidos( + Guid.NewGuid(), + date, + date, + 0, + addOrUpdateDto.QuantidadeProdutos, + 1, + addOrUpdateDto.ProdutoId); + + add.Add(addOrUpdate); + } + else + { + insert.UpdateQuantidadeProdutos(addOrUpdateDto.QuantidadeProdutos); + } + + } + else + { + var update = updates.FirstOrDefault(x => x.ProdutoId == addOrUpdateDto.ProdutoId); + + if (update == null) + { + addOrUpdate.UpdateQuantidadeProdutos(addOrUpdateDto.QuantidadeProdutos); + updates.Add(addOrUpdate); + } + else + { + update.UpdateQuantidadeProdutos(addOrUpdateDto.QuantidadeProdutos); + } + + } + } + + await _produtosMaisVendidosRepository.AddRangeAsync(add, referer); + await _produtosMaisVendidosRepository.UpdateRangeAsync(updates, referer); + } +}