From 53bf8898d70dcf3499c73782a6b2e9395285b802 Mon Sep 17 00:00:00 2001 From: Bruno Date: Fri, 16 Feb 2024 20:52:11 -0300 Subject: [PATCH] fix --- OpenAdm.Api/Controllers/CarrinhoController.cs | 77 ++++++++ ...onarioController.cs => LoginController.cs} | 24 ++- .../Interfaces/ICarrinhoService.cs | 12 ++ .../Interfaces/ILoginUsuarioService.cs | 9 + .../Interfaces/ITokenService.cs | 2 + .../Models/Carrinhos/CarrinhoViewModel.cs | 17 ++ .../Models/Carrinhos/PesoCarrinhoViewModel.cs | 7 + .../QuantidadeProdutoCarrinhoViewModel.cs | 7 + .../Carrinhos/TamanhoCarrinhoViewModel.cs | 7 + .../Logins/ResponseLoginUsuarioViewModel.cs | 9 + .../Models/Usuarios/UsuarioViewModel.cs | 25 +++ OpenAdm.Application/Services/BannerService.cs | 6 +- .../Services/CarrinhoService.cs | 185 ++++++++++++++++++ .../Services/LoginFuncionarioService.cs | 2 +- .../Services/LoginUsuarioService.cs | 30 +++ OpenAdm.Application/Services/PedidoService.cs | 4 +- OpenAdm.Application/Services/TokenService.cs | 45 ++++- OpenAdm.Domain/Entities/Funcionario.cs | 9 +- OpenAdm.Domain/Entities/ItensPedido.cs | 27 ++- OpenAdm.Domain/Entities/Parceiro.cs | 6 +- OpenAdm.Domain/Entities/Pedido.cs | 71 ++++++- OpenAdm.Domain/Entities/TabelaDePreco.cs | 4 + OpenAdm.Domain/Errors/CodigoErrors.cs | 26 +++ OpenAdm.Domain/Errors/ContextErrorMessage.cs | 9 - OpenAdm.Domain/Errors/DomainErrorMessage.cs | 14 -- OpenAdm.Domain/Errors/GenericError.cs | 8 - OpenAdm.Domain/Exceptions/ExceptionApi.cs | 2 +- .../Interfaces/ICarrinhoRepository.cs | 10 + .../Interfaces/ILoginUsuarioRepository.cs | 8 + .../Interfaces/IProdutoRepository.cs | 1 + .../Model/Carrinho/AddCarrinhoModel.cs | 8 + .../Model/Carrinho/AddPesoCarrinho.cs | 7 + .../Model/Carrinho/AddTamanhoCarrinho.cs | 7 + .../Model/Carrinho/CarrinhoModel.cs | 7 + .../Model/Pedidos/PedidoPorPesoModel.cs | 21 ++ .../Model/Pedidos/PedidoPorTamanhoModel.cs | 21 ++ .../Validations/ValidationDecimal.cs | 15 ++ OpenAdm.Domain/Validations/ValidationGuid.cs | 15 ++ .../Validations/ValidationString.cs | 8 +- OpenAdm.Infra/Cached/Cached/ProdutoCached.cs | 5 + .../Factories/Factory/DomainFactory.cs | 2 +- .../Services/DiscordHttpService.cs | 8 +- .../Repositories/CarrinhoRepository.cs | 51 +++++ .../Repositories/LoginUsuarioRepository.cs | 20 ++ .../Repositories/ProdutoRepository.cs | 62 ++++++ OpenAdm.IoC/DependencyInjectRepositories.cs | 2 + OpenAdm.IoC/DependencyInjectyApplication.cs | 2 + .../Domain/Builder/ItensPedidoBuilder.cs | 78 ++++++++ OpenAdm.Test/Domain/Builder/PedidoBuilder.cs | 6 + .../Domain/Builder/TabelaDePrecoBuilder.cs | 38 ++++ OpenAdm.Test/Domain/Test/ItensPedidoTest.cs | 57 ++++++ OpenAdm.Test/Domain/Test/PedidoTest.cs | 83 ++++++++ OpenAdm.Test/Domain/Test/TabelaDePrecoTest.cs | 28 +++ .../Infra/Test/DiscordHttpServiceTest.cs | 9 +- 54 files changed, 1144 insertions(+), 79 deletions(-) create mode 100644 OpenAdm.Api/Controllers/CarrinhoController.cs rename OpenAdm.Api/Controllers/{LoginFuncionarioController.cs => LoginController.cs} (60%) create mode 100644 OpenAdm.Application/Interfaces/ICarrinhoService.cs create mode 100644 OpenAdm.Application/Interfaces/ILoginUsuarioService.cs create mode 100644 OpenAdm.Application/Models/Carrinhos/CarrinhoViewModel.cs create mode 100644 OpenAdm.Application/Models/Carrinhos/PesoCarrinhoViewModel.cs create mode 100644 OpenAdm.Application/Models/Carrinhos/QuantidadeProdutoCarrinhoViewModel.cs create mode 100644 OpenAdm.Application/Models/Carrinhos/TamanhoCarrinhoViewModel.cs create mode 100644 OpenAdm.Application/Models/Logins/ResponseLoginUsuarioViewModel.cs create mode 100644 OpenAdm.Application/Models/Usuarios/UsuarioViewModel.cs create mode 100644 OpenAdm.Application/Services/CarrinhoService.cs create mode 100644 OpenAdm.Application/Services/LoginUsuarioService.cs create mode 100644 OpenAdm.Domain/Errors/CodigoErrors.cs delete mode 100644 OpenAdm.Domain/Errors/ContextErrorMessage.cs delete mode 100644 OpenAdm.Domain/Errors/DomainErrorMessage.cs delete mode 100644 OpenAdm.Domain/Errors/GenericError.cs create mode 100644 OpenAdm.Domain/Interfaces/ICarrinhoRepository.cs create mode 100644 OpenAdm.Domain/Interfaces/ILoginUsuarioRepository.cs create mode 100644 OpenAdm.Domain/Model/Carrinho/AddCarrinhoModel.cs create mode 100644 OpenAdm.Domain/Model/Carrinho/AddPesoCarrinho.cs create mode 100644 OpenAdm.Domain/Model/Carrinho/AddTamanhoCarrinho.cs create mode 100644 OpenAdm.Domain/Model/Carrinho/CarrinhoModel.cs create mode 100644 OpenAdm.Domain/Model/Pedidos/PedidoPorPesoModel.cs create mode 100644 OpenAdm.Domain/Model/Pedidos/PedidoPorTamanhoModel.cs create mode 100644 OpenAdm.Domain/Validations/ValidationDecimal.cs create mode 100644 OpenAdm.Domain/Validations/ValidationGuid.cs create mode 100644 OpenAdm.Infra/Repositories/CarrinhoRepository.cs create mode 100644 OpenAdm.Infra/Repositories/LoginUsuarioRepository.cs create mode 100644 OpenAdm.Test/Domain/Builder/ItensPedidoBuilder.cs create mode 100644 OpenAdm.Test/Domain/Builder/TabelaDePrecoBuilder.cs create mode 100644 OpenAdm.Test/Domain/Test/ItensPedidoTest.cs create mode 100644 OpenAdm.Test/Domain/Test/PedidoTest.cs create mode 100644 OpenAdm.Test/Domain/Test/TabelaDePrecoTest.cs diff --git a/OpenAdm.Api/Controllers/CarrinhoController.cs b/OpenAdm.Api/Controllers/CarrinhoController.cs new file mode 100644 index 0000000..050f5d9 --- /dev/null +++ b/OpenAdm.Api/Controllers/CarrinhoController.cs @@ -0,0 +1,77 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Cors; +using Microsoft.AspNetCore.Mvc; +using OpenAdm.Application.Interfaces; +using OpenAdm.Domain.Model.Carrinho; + +namespace OpenAdm.Api.Controllers; + +[ApiController] +[Route("carrinho")] +[Authorize(AuthenticationSchemes = "Bearer")] +public class CarrinhoController : ControllerBaseApi +{ + private readonly ICarrinhoService _carrinhoService; + + public CarrinhoController(ICarrinhoService carrinhoService) + { + _carrinhoService = carrinhoService; + } + + [EnableCors("iscasluneoriginwithpost")] + [HttpPut("adicionar")] + public async Task AdicionarCarinho(AddCarrinhoModel addCarrinhoDto) + { + try + { + await _carrinhoService.AdicionarProdutoAsync(addCarrinhoDto); + return Ok(new { message = "Produto adicionado com sucesso!" }); + } + catch (Exception ex) + { + return await HandleErrorAsync(ex); + } + } + + [HttpGet("get-carrinho")] + public async Task GetCarrinho() + { + try + { + var result = await _carrinhoService.GetCarrinhoAsync(); + return Ok(result); + } + catch (Exception ex) + { + return await HandleErrorAsync(ex); + } + } + + [HttpGet("get-carrinho-count")] + public async Task GetCarrinhoCount() + { + try + { + var result = await _carrinhoService.GetCountCarrinhoAsync(); + return Ok(result); + } + catch (Exception ex) + { + return await HandleErrorAsync(ex); + } + } + + [HttpDelete("delete-produto-carrinho")] + public async Task DeleteProdutCarrinho([FromQuery] Guid produtoId) + { + try + { + var result = await _carrinhoService.DeleteProdutoCarrinhoAsync(produtoId); + return Ok(); + } + catch (Exception ex) + { + return await HandleErrorAsync(ex); + } + } +} diff --git a/OpenAdm.Api/Controllers/LoginFuncionarioController.cs b/OpenAdm.Api/Controllers/LoginController.cs similarity index 60% rename from OpenAdm.Api/Controllers/LoginFuncionarioController.cs rename to OpenAdm.Api/Controllers/LoginController.cs index c5feb61..4cd1477 100644 --- a/OpenAdm.Api/Controllers/LoginFuncionarioController.cs +++ b/OpenAdm.Api/Controllers/LoginController.cs @@ -7,12 +7,15 @@ namespace OpenAdm.Api.Controllers; [ApiController] [Route("login")] -public class LoginFuncionarioController : ControllerBaseApi +public class LoginController : ControllerBaseApi { private readonly ILoginFuncionarioService _loginFuncionarioService; + private readonly ILoginUsuarioService _loginUsuarioService; private readonly ConfiguracaoDeToken _configGenerateToken; - public LoginFuncionarioController(ILoginFuncionarioService loginFuncionarioService) + public LoginController( + ILoginFuncionarioService loginFuncionarioService, + ILoginUsuarioService loginUsuarioService) { var key = VariaveisDeAmbiente.GetVariavel("JWT_KEY"); var issue = VariaveisDeAmbiente.GetVariavel("JWT_ISSUE"); @@ -20,10 +23,11 @@ public LoginFuncionarioController(ILoginFuncionarioService loginFuncionarioServi var expirate = DateTime.Now.AddHours(int.Parse(VariaveisDeAmbiente.GetVariavel("JWT_EXPIRATION"))); _configGenerateToken = new ConfiguracaoDeToken(key, issue, audience, expirate); _loginFuncionarioService = loginFuncionarioService; + _loginUsuarioService = loginUsuarioService; } [HttpPost("funcionario")] - public async Task Login(RequestLogin requestLogin) + public async Task LoginFuncionario(RequestLogin requestLogin) { try { @@ -35,4 +39,18 @@ public async Task Login(RequestLogin requestLogin) return await HandleErrorAsync(ex); } } + + [HttpPost("usuario")] + public async Task LoginUsuario(RequestLogin requestLogin) + { + try + { + var responselogin = await _loginUsuarioService.LoginAsync(requestLogin, _configGenerateToken); + return Ok(responselogin); + } + catch (Exception ex) + { + return await HandleErrorAsync(ex); + } + } } diff --git a/OpenAdm.Application/Interfaces/ICarrinhoService.cs b/OpenAdm.Application/Interfaces/ICarrinhoService.cs new file mode 100644 index 0000000..9fc1dc2 --- /dev/null +++ b/OpenAdm.Application/Interfaces/ICarrinhoService.cs @@ -0,0 +1,12 @@ +using OpenAdm.Application.Models.Carrinhos; +using OpenAdm.Domain.Model.Carrinho; + +namespace OpenAdm.Application.Interfaces; + +public interface ICarrinhoService +{ + Task AdicionarProdutoAsync(AddCarrinhoModel addCarrinhoModel); + Task> GetCarrinhoAsync(); + Task GetCountCarrinhoAsync(); + Task DeleteProdutoCarrinhoAsync(Guid produtoId); +} diff --git a/OpenAdm.Application/Interfaces/ILoginUsuarioService.cs b/OpenAdm.Application/Interfaces/ILoginUsuarioService.cs new file mode 100644 index 0000000..36b7013 --- /dev/null +++ b/OpenAdm.Application/Interfaces/ILoginUsuarioService.cs @@ -0,0 +1,9 @@ +using OpenAdm.Application.Models.Logins; +using OpenAdm.Application.Models.Tokens; + +namespace OpenAdm.Application.Interfaces; + +public interface ILoginUsuarioService +{ + Task LoginAsync(RequestLogin requestLogin, ConfiguracaoDeToken configuracaoDeToken); +} diff --git a/OpenAdm.Application/Interfaces/ITokenService.cs b/OpenAdm.Application/Interfaces/ITokenService.cs index e2f7384..302235e 100644 --- a/OpenAdm.Application/Interfaces/ITokenService.cs +++ b/OpenAdm.Application/Interfaces/ITokenService.cs @@ -1,4 +1,5 @@ using OpenAdm.Application.Models.Tokens; +using OpenAdm.Application.Models.Usuarios; namespace OpenAdm.Application.Interfaces; @@ -6,4 +7,5 @@ public interface ITokenService { string GenerateToken(object obj, ConfiguracaoDeToken configGenerateToken); bool IsFuncionario(); + UsuarioViewModel GetTokenUsuarioViewModel(); } diff --git a/OpenAdm.Application/Models/Carrinhos/CarrinhoViewModel.cs b/OpenAdm.Application/Models/Carrinhos/CarrinhoViewModel.cs new file mode 100644 index 0000000..da8a905 --- /dev/null +++ b/OpenAdm.Application/Models/Carrinhos/CarrinhoViewModel.cs @@ -0,0 +1,17 @@ +using OpenAdm.Application.Models.Categorias; + +namespace OpenAdm.Application.Models.Carrinhos; + +public class CarrinhoViewModel +{ + public Guid Id { get; set; } + public long Numero { get; set; } + public string Descricao { get; set; } = string.Empty; + public string? EspecificacaoTecnica { get; set; } + public string Foto { get; set; } = string.Empty; + public List? Tamanhos { get; set; } = new(); + public List? Pesos { get; set; } = new(); + public Guid CategoriaId { get; set; } + public CategoriaViewModel? Categoria { get; set; } = null!; + public string? Referencia { get; set; } +} diff --git a/OpenAdm.Application/Models/Carrinhos/PesoCarrinhoViewModel.cs b/OpenAdm.Application/Models/Carrinhos/PesoCarrinhoViewModel.cs new file mode 100644 index 0000000..98fa07e --- /dev/null +++ b/OpenAdm.Application/Models/Carrinhos/PesoCarrinhoViewModel.cs @@ -0,0 +1,7 @@ +namespace OpenAdm.Application.Models.Carrinhos; + +public class PesoCarrinhoViewModel : BaseModel +{ + public string Descricao { get; set; } = string.Empty; + public QuantidadeProdutoCarrinhoViewModel PrecoProduto { get; set; } = new(); +} diff --git a/OpenAdm.Application/Models/Carrinhos/QuantidadeProdutoCarrinhoViewModel.cs b/OpenAdm.Application/Models/Carrinhos/QuantidadeProdutoCarrinhoViewModel.cs new file mode 100644 index 0000000..e3ba3e0 --- /dev/null +++ b/OpenAdm.Application/Models/Carrinhos/QuantidadeProdutoCarrinhoViewModel.cs @@ -0,0 +1,7 @@ +namespace OpenAdm.Application.Models.Carrinhos; + +public class QuantidadeProdutoCarrinhoViewModel +{ + public Guid Id { get; set; } + public decimal Quantidade { get; set; } +} diff --git a/OpenAdm.Application/Models/Carrinhos/TamanhoCarrinhoViewModel.cs b/OpenAdm.Application/Models/Carrinhos/TamanhoCarrinhoViewModel.cs new file mode 100644 index 0000000..6e0ba38 --- /dev/null +++ b/OpenAdm.Application/Models/Carrinhos/TamanhoCarrinhoViewModel.cs @@ -0,0 +1,7 @@ +namespace OpenAdm.Application.Models.Carrinhos; + +public class TamanhoCarrinhoViewModel : BaseModel +{ + public string Descricao { get; set; } = string.Empty; + public QuantidadeProdutoCarrinhoViewModel PrecoProduto { get; set; } = new(); +} diff --git a/OpenAdm.Application/Models/Logins/ResponseLoginUsuarioViewModel.cs b/OpenAdm.Application/Models/Logins/ResponseLoginUsuarioViewModel.cs new file mode 100644 index 0000000..154e1fe --- /dev/null +++ b/OpenAdm.Application/Models/Logins/ResponseLoginUsuarioViewModel.cs @@ -0,0 +1,9 @@ +using OpenAdm.Application.Models.Usuarios; + +namespace OpenAdm.Application.Models.Logins; + +public class ResponseLoginUsuarioViewModel(UsuarioViewModel usuario, string token) +{ + public UsuarioViewModel Usuario { get; set; } = usuario; + public string Token { get; set; } = token; +} diff --git a/OpenAdm.Application/Models/Usuarios/UsuarioViewModel.cs b/OpenAdm.Application/Models/Usuarios/UsuarioViewModel.cs new file mode 100644 index 0000000..2c3f4d4 --- /dev/null +++ b/OpenAdm.Application/Models/Usuarios/UsuarioViewModel.cs @@ -0,0 +1,25 @@ +using OpenAdm.Domain.Entities; + +namespace OpenAdm.Application.Models.Usuarios; + +public class UsuarioViewModel : BaseModel +{ + public string Nome { get; set; } = string.Empty; + public string Email { get; set; } = string.Empty; + public string? Telefone { get; set; } + public string? Cnpj { get; set; } + + public UsuarioViewModel ToModel(Usuario entity) + { + Id = entity.Id; + DataDeCriacao = entity.DataDeCriacao; + DataDeAtualizacao = entity.DataDeAtualizacao; + Email = entity.Email; + Numero = entity.Numero; + Telefone = entity.Telefone; + Nome = entity.Nome; + Cnpj = entity.Cnpj; + + return this; + } +} diff --git a/OpenAdm.Application/Services/BannerService.cs b/OpenAdm.Application/Services/BannerService.cs index 5cd4854..c05aa87 100644 --- a/OpenAdm.Application/Services/BannerService.cs +++ b/OpenAdm.Application/Services/BannerService.cs @@ -27,7 +27,7 @@ public async Task CreateBannerAsync(BannerCreateDto bannerCreat public async Task DeleteBannerAsync(Guid id) { var banner = await _bannerRepository.GetBannerByIdAsync(id) - ?? throw new ExceptionApi(GenericError.RegistroNotFound); + ?? throw new ExceptionApi(CodigoErrors.RegistroNotFound); var result = await _bannerRepository.DeleteAsync(banner); @@ -37,7 +37,7 @@ public async Task DeleteBannerAsync(Guid id) public async Task EditBannerAsync(BannerEditDto bannerEditDto) { var banner = await _bannerRepository.GetBannerByIdAsync(bannerEditDto.Id) - ?? throw new ExceptionApi(GenericError.RegistroNotFound); + ?? throw new ExceptionApi(CodigoErrors.RegistroNotFound); banner.Update(bannerEditDto.Foto, bannerEditDto.Ativo); @@ -49,7 +49,7 @@ public async Task EditBannerAsync(BannerEditDto bannerEditDto) public async Task GetBannerByIdAsync(Guid id) { var banner = await _bannerRepository.GetBannerByIdAsync(id) - ?? throw new ExceptionApi(GenericError.RegistroNotFound); + ?? throw new ExceptionApi(CodigoErrors.RegistroNotFound); return new BannerViewModel().ToModel(banner); } diff --git a/OpenAdm.Application/Services/CarrinhoService.cs b/OpenAdm.Application/Services/CarrinhoService.cs new file mode 100644 index 0000000..e47e405 --- /dev/null +++ b/OpenAdm.Application/Services/CarrinhoService.cs @@ -0,0 +1,185 @@ +using OpenAdm.Application.Interfaces; +using OpenAdm.Application.Models.Carrinhos; +using OpenAdm.Application.Models.Categorias; +using OpenAdm.Domain.Interfaces; +using OpenAdm.Domain.Model.Carrinho; +using System.Text; + +namespace OpenAdm.Application.Services; + +public class CarrinhoService : ICarrinhoService +{ + private readonly ICarrinhoRepository _carrinhoRepository; + private readonly IProdutoRepository _produtoRepository; + private readonly string _key; + + public CarrinhoService(ICarrinhoRepository carrinhoRepository, IProdutoRepository produtoRepository, ITokenService tokenService) + { + _carrinhoRepository = carrinhoRepository; + _produtoRepository = produtoRepository; + _key = tokenService.GetTokenUsuarioViewModel().Id.ToString(); + } + + public async Task AdicionarProdutoAsync(AddCarrinhoModel addCarrinhoModel) + { + var carrinho = await _carrinhoRepository.GetCarrinhoAsync(_key); + + if(carrinho.UsuarioId == Guid.Empty) + carrinho.UsuarioId = Guid.Parse(_key); + + var addProduto = carrinho? + .Produtos + .FirstOrDefault(x => x.ProdutoId == addCarrinhoModel.ProdutoId); + + if (addProduto == null) + { + addProduto = new() + { + ProdutoId = addCarrinhoModel.ProdutoId, + Pesos = addCarrinhoModel.Pesos, + Tamanhos = addCarrinhoModel.Tamanhos + }; + + carrinho?.Produtos.Add(addProduto); + } + else + { + AddPesosCarrinho(addCarrinhoModel.Pesos, addProduto); + AddTamanhosCarrinho(addCarrinhoModel.Tamanhos, addProduto); + } + + await _carrinhoRepository.AdicionarProdutoAsync(carrinho, _key); + + return true; + } + + public async Task DeleteProdutoCarrinhoAsync(Guid produtoId) + { + var carrinho = await _carrinhoRepository.GetCarrinhoAsync(_key); + + if (carrinho.UsuarioId == Guid.Empty) + carrinho.UsuarioId = Guid.Parse(_key); + + var produto = carrinho.Produtos.FirstOrDefault(x => x.ProdutoId == produtoId); + + if (produto != null) + { + carrinho.Produtos.Remove(produto); + await _carrinhoRepository.AdicionarProdutoAsync(carrinho, _key); + } + + return true; + } + + public async Task> GetCarrinhoAsync() + { + var carrinhosViewModels = new List(); + + var carrinho = await _carrinhoRepository.GetCarrinhoAsync(_key); + + var produtosIds = carrinho.Produtos.Select(x => x.ProdutoId).ToList(); + + var produtos = await _produtoRepository.GetProdutosByListIdAsync(produtosIds); + + foreach (var produto in produtos) + { + var carrinhoViewModel = new CarrinhoViewModel() + { + Categoria = new CategoriaViewModel().ToModel(produto.Categoria), + CategoriaId = produto.CategoriaId, + Descricao = produto.Descricao, + EspecificacaoTecnica = produto.EspecificacaoTecnica, + Foto = Encoding.UTF8.GetString(produto.Foto), + Id = produto.Id, + Referencia = produto.Referencia, + Numero = produto.Numero + }; + + carrinhoViewModel.Tamanhos = produto.Tamanhos.OrderBy(x => x.Numero).Select(x => new TamanhoCarrinhoViewModel() + { + Id = x.Id, + Descricao = x.Descricao, + Numero = x.Numero, + PrecoProduto = new QuantidadeProdutoCarrinhoViewModel() + { + Quantidade = (decimal)(carrinho? + .Produtos? + .FirstOrDefault(pr => pr.ProdutoId == produto.Id)? + .Tamanhos.FirstOrDefault(ps => ps.TamanhoId == x.Id)? + .Quantidade ?? 0) + } + }).ToList(); + + carrinhoViewModel.Pesos = produto.Pesos.OrderBy(x => x.Numero).Select(x => new PesoCarrinhoViewModel() + { + Id = x.Id, + Descricao = x.Descricao, + Numero = x.Numero, + PrecoProduto = new QuantidadeProdutoCarrinhoViewModel() + { + Quantidade = (decimal)(carrinho? + .Produtos? + .FirstOrDefault(pr => pr.ProdutoId == produto.Id)? + .Pesos.FirstOrDefault(ps => ps.PesoId == x.Id)? + .Quantidade ?? 0) + } + }).ToList(); + + carrinhosViewModels.Add(carrinhoViewModel); + } + + return carrinhosViewModels; + } + + public async Task GetCountCarrinhoAsync() + { + return await _carrinhoRepository.GetCountCarrinhoAsync(_key); + } + + private static void AddPesosCarrinho(List pesos, AddCarrinhoModel addProduto) + { + foreach (var pesoCarrinho in pesos) + { + var peso = addProduto + .Pesos + .FirstOrDefault(ps => ps.PesoId == pesoCarrinho.PesoId); + + if (peso == null) + { + peso = new() + { + PesoId = pesoCarrinho.PesoId, + Quantidade = pesoCarrinho.Quantidade + }; + + addProduto.Pesos.Add(peso); + } + else + { + peso.Quantidade += pesoCarrinho.Quantidade; + } + } + } + private static void AddTamanhosCarrinho(List tamanhos, AddCarrinhoModel addProduto) + { + foreach (var tamanhoCarrinho in tamanhos) + { + var tamanho = addProduto.Tamanhos.FirstOrDefault(tm => tm.TamanhoId == tamanhoCarrinho.TamanhoId); + + if (tamanho == null) + { + tamanho = new() + { + TamanhoId = tamanhoCarrinho.TamanhoId, + Quantidade = tamanhoCarrinho.Quantidade + }; + + addProduto.Tamanhos.Add(tamanho); + } + else + { + tamanho.Quantidade += tamanhoCarrinho.Quantidade; + } + } + } +} diff --git a/OpenAdm.Application/Services/LoginFuncionarioService.cs b/OpenAdm.Application/Services/LoginFuncionarioService.cs index cb5f957..3d73da7 100644 --- a/OpenAdm.Application/Services/LoginFuncionarioService.cs +++ b/OpenAdm.Application/Services/LoginFuncionarioService.cs @@ -20,7 +20,7 @@ public async Task LoginFuncionarioAsync(Reque var funcionario = await _loginFuncionarioRepository.GetFuncionarioByEmailAsync(requestLogin.Email); if (funcionario == null || !Verify(requestLogin.Senha, funcionario.Senha)) - throw new ExceptionApi(DomainErrorMessage.ErrorEmailOuSenhaInvalido); + throw new ExceptionApi(CodigoErrors.ErrorEmailOuSenhaInvalido); var funcionarioViewModel = new FuncionarioViewModel().ToModel(funcionario); var token = _tokenService.GenerateToken(funcionarioViewModel, configGenerateToken); diff --git a/OpenAdm.Application/Services/LoginUsuarioService.cs b/OpenAdm.Application/Services/LoginUsuarioService.cs new file mode 100644 index 0000000..d8e2f8b --- /dev/null +++ b/OpenAdm.Application/Services/LoginUsuarioService.cs @@ -0,0 +1,30 @@ +using OpenAdm.Application.Interfaces; +using OpenAdm.Application.Models.Logins; +using OpenAdm.Application.Models.Tokens; +using OpenAdm.Application.Models.Usuarios; +using OpenAdm.Domain.Errors; +using OpenAdm.Domain.Exceptions; +using OpenAdm.Domain.Interfaces; +using static BCrypt.Net.BCrypt; + +namespace OpenAdm.Application.Services; + +public class LoginUsuarioService(ILoginUsuarioRepository loginUsuarioRepository, ITokenService tokenService) + : ILoginUsuarioService +{ + private readonly ILoginUsuarioRepository _loginUsuarioRepository = loginUsuarioRepository; + private readonly ITokenService _tokenService = tokenService; + + public async Task LoginAsync(RequestLogin requestLogin, ConfiguracaoDeToken configuracaoDeToken) + { + var usuario = await _loginUsuarioRepository.LoginAsync(requestLogin.Email); + + if (usuario == null || !Verify(requestLogin.Senha, usuario.Senha)) + throw new ExceptionApi(CodigoErrors.ErrorEmailOuSenhaInvalido); + + var usuarioViewModel = new UsuarioViewModel().ToModel(usuario); + var token = _tokenService.GenerateToken(usuarioViewModel, configuracaoDeToken); + + return new(usuarioViewModel, token); + } +} diff --git a/OpenAdm.Application/Services/PedidoService.cs b/OpenAdm.Application/Services/PedidoService.cs index 63771e7..88b9196 100644 --- a/OpenAdm.Application/Services/PedidoService.cs +++ b/OpenAdm.Application/Services/PedidoService.cs @@ -16,7 +16,7 @@ public class PedidoService(IPedidoRepository pedidoRepository) public async Task DeletePedidoAsync(Guid id) { var pedido = await _pedidoRepository.GetPedidoByIdAsync(id) - ?? throw new ExceptionApi(GenericError.RegistroNotFound); + ?? throw new ExceptionApi(CodigoErrors.RegistroNotFound); return await _pedidoRepository.DeleteAsync(pedido); } @@ -35,7 +35,7 @@ public async Task> GetPaginacaoAsync(Paginac public async Task UpdateStatusPedidoAsync(UpdateStatusPedidoDto updateStatusPedidoDto) { var pedido = await _pedidoRepository.GetPedidoByIdAsync(updateStatusPedidoDto.PedidoId) - ?? throw new ExceptionApi(GenericError.RegistroNotFound); + ?? throw new ExceptionApi(CodigoErrors.RegistroNotFound); pedido.UpdateStatus(updateStatusPedidoDto.StatusPedido); diff --git a/OpenAdm.Application/Services/TokenService.cs b/OpenAdm.Application/Services/TokenService.cs index 540b0bc..f96f6af 100644 --- a/OpenAdm.Application/Services/TokenService.cs +++ b/OpenAdm.Application/Services/TokenService.cs @@ -2,7 +2,7 @@ using Microsoft.IdentityModel.Tokens; using OpenAdm.Application.Interfaces; using OpenAdm.Application.Models.Tokens; -using OpenAdm.Domain.Entities; +using OpenAdm.Application.Models.Usuarios; using OpenAdm.Domain.Exceptions; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; @@ -33,6 +33,49 @@ public string GenerateToken(object obj, ConfiguracaoDeToken configGenerateToken) return tokenString; } + public UsuarioViewModel GetTokenUsuarioViewModel() + { + if (_httpContextAccessor?.HttpContext?.User.Identity is not ClaimsIdentity claimsIdentity + || !claimsIdentity.Claims.Any()) + throw new ExceptionApi(nameof(claimsIdentity)); + + var id = claimsIdentity.Claims.FirstOrDefault(c => c.Type == "Id")?.Value + ?? throw new ExceptionApi("token inválido"); + var numero = claimsIdentity.Claims.FirstOrDefault(c => c.Type == "Numero")?.Value + ?? throw new ExceptionApi("token inválido"); + var nome = claimsIdentity.Claims.FirstOrDefault(c => c.Type == "Nome")?.Value + ?? throw new ExceptionApi("token inválido"); + var email = claimsIdentity.Claims.FirstOrDefault(c => c.Type == "Email")?.Value + ?? throw new ExceptionApi("token inválido"); + + var dataDeCriacao = claimsIdentity.Claims.FirstOrDefault(c => c.Type == "DataDeCriacao")?.Value + ?? throw new ExceptionApi("token inválido"); + + var dataDeAtualizacao = claimsIdentity.Claims.FirstOrDefault(c => c.Type == "DataDeAtualizacao")?.Value + ?? throw new ExceptionApi("token inválido"); + + var telefone = claimsIdentity.Claims.FirstOrDefault(c => c.Type == "Telefone")?.Value; + var cnpj = claimsIdentity.Claims.FirstOrDefault(c => c.Type == "Cnpj")?.Value; + + if (!DateTime.TryParse(dataDeCriacao, out DateTime newDataDeCriacao)) + throw new ExceptionApi("token inválido"); + + if (!DateTime.TryParse(dataDeAtualizacao, out DateTime newDataDeAtualizacao)) + throw new ExceptionApi("token inválido"); + + return new UsuarioViewModel() + { + Id = Guid.Parse(id), + Nome = nome, + Email = email, + Numero = long.Parse(numero), + DataDeCriacao = newDataDeCriacao, + DataDeAtualizacao = newDataDeAtualizacao, + Telefone = telefone, + Cnpj = cnpj + }; + } + public bool IsFuncionario() { if (_httpContextAccessor?.HttpContext?.User.Identity is not ClaimsIdentity claimsIdentity diff --git a/OpenAdm.Domain/Entities/Funcionario.cs b/OpenAdm.Domain/Entities/Funcionario.cs index 6464547..f9799c7 100644 --- a/OpenAdm.Domain/Entities/Funcionario.cs +++ b/OpenAdm.Domain/Entities/Funcionario.cs @@ -1,5 +1,4 @@ - -using OpenAdm.Domain.Errors; +using OpenAdm.Domain.Errors; using OpenAdm.Domain.Validations; namespace OpenAdm.Domain.Entities; @@ -9,9 +8,9 @@ public sealed class Funcionario : BaseEntity public Funcionario(Guid id, DateTime dataDeCriacao, DateTime dataDeAtualizacao, long numero, string email, string senha, string nome, string? telefone, byte[]? avatar) : base(id, dataDeCriacao, dataDeAtualizacao, numero) { - ValidationString.ValidateWithLength(email, 255, DomainErrorMessage.ErrorEmailInvalido); - ValidationString.ValidateWithLength(nome, 255, DomainErrorMessage.ErrorNomeInvalido); - ValidationString.ValidateWithLength(senha, 1000, DomainErrorMessage.ErrorNomeInvalido); + ValidationString.ValidateWithLength(email, 255, CodigoErrors.ErrorEmailInvalido); + ValidationString.ValidateWithLength(nome, 255, CodigoErrors.ErrorNomeInvalido); + ValidationString.ValidateWithLength(senha, 1000, CodigoErrors.ErrorNomeInvalido); ValidationString.ValidateTelefone(telefone); Email = email; diff --git a/OpenAdm.Domain/Entities/ItensPedido.cs b/OpenAdm.Domain/Entities/ItensPedido.cs index b55ad3f..15d5d39 100644 --- a/OpenAdm.Domain/Entities/ItensPedido.cs +++ b/OpenAdm.Domain/Entities/ItensPedido.cs @@ -1,21 +1,28 @@  +using OpenAdm.Domain.Validations; + namespace OpenAdm.Domain.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) + 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) { + ValidationDecimal.ValidDecimalNullAndZero(quantidade); + ValidationDecimal.ValidDecimalNullAndZero(valorUnitario); + ValidationGuid.ValidGuidNullAndEmpty(pedidoId); + ValidationGuid.ValidGuidNullAndEmpty(produtoId); + PesoId = pesoId; TamanhoId = tamanhoId; PedidoId = pedidoId; diff --git a/OpenAdm.Domain/Entities/Parceiro.cs b/OpenAdm.Domain/Entities/Parceiro.cs index 066bdf7..7b1602c 100644 --- a/OpenAdm.Domain/Entities/Parceiro.cs +++ b/OpenAdm.Domain/Entities/Parceiro.cs @@ -16,9 +16,9 @@ public Parceiro( string cnpj) : base(id, dataDeCriacao, dataDeAtualizacao, numero) { - ValidationString.ValidateWithLength(cnpj, length: 14, message: DomainErrorMessage.ErrorCnpj); - ValidationString.ValidateWithLength(razaoSocial, message: DomainErrorMessage.ErrorRazaoSocial); - ValidationString.ValidateWithLength(nomeFantasia, message: DomainErrorMessage.ErrorRazaoSocial); + ValidationString.ValidateWithLength(cnpj, length: 14, message: CodigoErrors.ErrorCnpj); + ValidationString.ValidateWithLength(razaoSocial, message: CodigoErrors.ErrorRazaoSocial); + ValidationString.ValidateWithLength(nomeFantasia, message: CodigoErrors.ErrorRazaoSocial); RazaoSocial = razaoSocial; NomeFantasia = nomeFantasia; diff --git a/OpenAdm.Domain/Entities/Pedido.cs b/OpenAdm.Domain/Entities/Pedido.cs index 45cf218..0023e84 100644 --- a/OpenAdm.Domain/Entities/Pedido.cs +++ b/OpenAdm.Domain/Entities/Pedido.cs @@ -1,14 +1,23 @@ - -using OpenAdm.Domain.Enums; +using OpenAdm.Domain.Enums; using OpenAdm.Domain.Errors; using OpenAdm.Domain.Exceptions; +using OpenAdm.Domain.Model.Pedidos; +using OpenAdm.Domain.Validations; namespace OpenAdm.Domain.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) + public Pedido( + Guid id, + DateTime dataDeCriacao, + DateTime dataDeAtualizacao, + long numero, + StatusPedido statusPedido, + Guid usuarioId) + : base(id, dataDeCriacao, dataDeAtualizacao, numero) { + ValidationGuid.ValidGuidNullAndEmpty(usuarioId); StatusPedido = statusPedido; UsuarioId = usuarioId; } @@ -17,13 +26,65 @@ public Pedido(Guid id, DateTime dataDeCriacao, DateTime dataDeAtualizacao, long public Guid UsuarioId { get; private set; } public Usuario Usuario { get; set; } = null!; public decimal ValorTotal { get { return ItensPedido.Sum(x => x.ValorTotal); } } - public List ItensPedido { get; set; } = new(); + public IList ItensPedido { get; set; } = new List(); public void UpdateStatus(StatusPedido statusPedido) { if (StatusPedido == StatusPedido.Entregue) - throw new ExceptionApi(DomainErrorMessage.StatusDoPedidoEntregue); + throw new ExceptionApi(CodigoErrors.StatusDoPedidoEntregue); StatusPedido = statusPedido; } + + public void ProcessarItensPedido( + IList pedidoPorPesoModels, + IList pedidoPorTamanhoModels, + TabelaDePreco tabelaDePreco) + { + if (pedidoPorPesoModels.Count == 0 && pedidoPorTamanhoModels.Count == 0) + throw new ExceptionApi(CodigoErrors.PedidoSemItens); + + if (tabelaDePreco == null || tabelaDePreco.ItensTabelaDePreco.Count == 0) + throw new Exception(CodigoErrors.PedidoSemItens); + + foreach (var pedidoPorTamanhoModel in pedidoPorTamanhoModels) + { + var valorUnitario = tabelaDePreco + .ItensTabelaDePreco + .FirstOrDefault(item => item.ProdutoId == pedidoPorTamanhoModel.ProdutoId && item.TamanhoId == pedidoPorTamanhoModel.TamanhoId)?.ValorUnitario ?? 0; + + ItensPedido.Add(new ItensPedido( + id: Guid.NewGuid(), + dataDeCriacao: DataDeCriacao, + dataDeAtualizacao: DataDeAtualizacao, + numero: 0, + pesoId: null, + tamanhoId: pedidoPorTamanhoModel.TamanhoId, + produtoId: pedidoPorTamanhoModel.ProdutoId, + pedidoId: Id, + valorUnitario: + valorUnitario, + quantidade: pedidoPorTamanhoModel.Quantidade)); + }; + + foreach (var pedidoPorPesoModel in pedidoPorPesoModels) + { + var valorUnitario = tabelaDePreco + .ItensTabelaDePreco + .FirstOrDefault(item => item.ProdutoId == pedidoPorPesoModel.ProdutoId && item.PesoId == pedidoPorPesoModel.PesoId)?.ValorUnitario ?? 0; + + ItensPedido.Add(new ItensPedido( + id: Guid.NewGuid(), + dataDeCriacao: DataDeCriacao, + dataDeAtualizacao: DataDeAtualizacao, + numero: 0, + pesoId: pedidoPorPesoModel.PesoId, + tamanhoId: null, + produtoId: pedidoPorPesoModel.ProdutoId, + pedidoId: Id, + valorUnitario: + valorUnitario, + quantidade: pedidoPorPesoModel.Quantidade)); + }; + } } \ No newline at end of file diff --git a/OpenAdm.Domain/Entities/TabelaDePreco.cs b/OpenAdm.Domain/Entities/TabelaDePreco.cs index a35602f..bc6f494 100644 --- a/OpenAdm.Domain/Entities/TabelaDePreco.cs +++ b/OpenAdm.Domain/Entities/TabelaDePreco.cs @@ -1,4 +1,7 @@  +using OpenAdm.Domain.Errors; +using OpenAdm.Domain.Validations; + namespace OpenAdm.Domain.Entities; public sealed class TabelaDePreco : BaseEntity @@ -12,6 +15,7 @@ public TabelaDePreco( bool ativaEcommerce) : base(id, dataDeCriacao, dataDeAtualizacao, numero) { + ValidationString.ValidateWithLength(descricao, message: CodigoErrors.DescricaoTabelaDePrecoInvalida); Descricao = descricao; AtivaEcommerce = ativaEcommerce; } diff --git a/OpenAdm.Domain/Errors/CodigoErrors.cs b/OpenAdm.Domain/Errors/CodigoErrors.cs new file mode 100644 index 0000000..efff294 --- /dev/null +++ b/OpenAdm.Domain/Errors/CodigoErrors.cs @@ -0,0 +1,26 @@ +namespace OpenAdm.Domain.Errors; + +public static class CodigoErrors +{ + public const string ErrorGeneric = "APIERROR000"; + public const string ErrorCnpj = "APIERROR001"; + public const string ErrorRazaoSocial = "APIERROR002"; + public const string ErrorNomeFantasia = "APIERROR003"; + public const string OrigemDaRequisicaoInvalida = "APIERROR004"; + public const string ConfiguracaoDoParceiroNull = "APIERROR005"; + public const string StringDeConexaoInvalida = "APIERROR006"; + public const string ErrorEmailInvalido = "APIERROR007"; + public const string ErrorNomeInvalido = "APIERROR008"; + public const string ErrorSenhaInvalido = "APIERROR009"; + public const string ErrorTelefoneInvalido = "APIERROR010"; + public const string ErrorEmailOuSenhaInvalido = "APIERROR011"; + public const string ContextInjetadoIncorretamente = "APIERROR012"; + public const string RegistroNotFound = "APIERROR013"; + public const string StatusDoPedidoEntregue = "APIERROR014"; + public const string MessageDiscordInvalida = "APIERROR015"; + public const string WebHookIdDiscordInvalido = "APIERROR015"; + public const string WebHookTokenDiscordInvalido = "APIERROR016"; + public const string PedidoSemItens = "APIERROR017"; + public const string TabelaDePrecoInvalida = "APIERROR018"; + public const string DescricaoTabelaDePrecoInvalida = "APIERROR019"; +} diff --git a/OpenAdm.Domain/Errors/ContextErrorMessage.cs b/OpenAdm.Domain/Errors/ContextErrorMessage.cs deleted file mode 100644 index 75e033e..0000000 --- a/OpenAdm.Domain/Errors/ContextErrorMessage.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace OpenAdm.Domain.Errors; - -public static class ContextErrorMessage -{ - public const string OrigemDaRequisicaoInvalida = "APIERROR004"; - public const string ConfiguracaoDoParceiroNull = "APIERROR005"; - public const string StringDeConexaoInvalida = "APIERROR006"; - public const string ContextInjetadoIncorretamente = "APIERROR012"; -} diff --git a/OpenAdm.Domain/Errors/DomainErrorMessage.cs b/OpenAdm.Domain/Errors/DomainErrorMessage.cs deleted file mode 100644 index 344f197..0000000 --- a/OpenAdm.Domain/Errors/DomainErrorMessage.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace OpenAdm.Domain.Errors; - -public static class DomainErrorMessage -{ - public const string ErrorCnpj = "APIERROR001"; - public const string ErrorRazaoSocial = "APIERROR002"; - public const string ErrorNomeFantasia = "APIERROR003"; - public const string ErrorEmailInvalido = "APIERROR007"; - public const string ErrorNomeInvalido = "APIERROR008"; - public const string ErrorSenhaInvalido = "APIERROR009"; - public const string ErrorTelefoneInvalido = "APIERROR010"; - public const string ErrorEmailOuSenhaInvalido = "APIERROR011"; - public const string StatusDoPedidoEntregue = "APIERROR014"; -} diff --git a/OpenAdm.Domain/Errors/GenericError.cs b/OpenAdm.Domain/Errors/GenericError.cs deleted file mode 100644 index 9640ca2..0000000 --- a/OpenAdm.Domain/Errors/GenericError.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace OpenAdm.Domain.Errors; - -public static class GenericError -{ - public const string Error = - "Ocorreu um erro interno, tente novamente mais tarde, ou entre em contato com o suporte!"; - public const string RegistroNotFound = "APIERROR013"; -} diff --git a/OpenAdm.Domain/Exceptions/ExceptionApi.cs b/OpenAdm.Domain/Exceptions/ExceptionApi.cs index b8349e2..e113f06 100644 --- a/OpenAdm.Domain/Exceptions/ExceptionApi.cs +++ b/OpenAdm.Domain/Exceptions/ExceptionApi.cs @@ -2,7 +2,7 @@ namespace OpenAdm.Domain.Exceptions; -public class ExceptionApi(string? message = GenericError.Error) +public class ExceptionApi(string? message = CodigoErrors.ErrorGeneric) : Exception(message) { } diff --git a/OpenAdm.Domain/Interfaces/ICarrinhoRepository.cs b/OpenAdm.Domain/Interfaces/ICarrinhoRepository.cs new file mode 100644 index 0000000..47e5fa4 --- /dev/null +++ b/OpenAdm.Domain/Interfaces/ICarrinhoRepository.cs @@ -0,0 +1,10 @@ +using OpenAdm.Domain.Model.Carrinho; + +namespace OpenAdm.Domain.Interfaces; + +public interface ICarrinhoRepository +{ + Task AdicionarProdutoAsync(CarrinhoModel carrinhoModel, string key); + Task GetCarrinhoAsync(string key); + Task GetCountCarrinhoAsync(string key); +} diff --git a/OpenAdm.Domain/Interfaces/ILoginUsuarioRepository.cs b/OpenAdm.Domain/Interfaces/ILoginUsuarioRepository.cs new file mode 100644 index 0000000..5f085b0 --- /dev/null +++ b/OpenAdm.Domain/Interfaces/ILoginUsuarioRepository.cs @@ -0,0 +1,8 @@ +using OpenAdm.Domain.Entities; + +namespace OpenAdm.Domain.Interfaces; + +public interface ILoginUsuarioRepository +{ + Task LoginAsync(string email); +} diff --git a/OpenAdm.Domain/Interfaces/IProdutoRepository.cs b/OpenAdm.Domain/Interfaces/IProdutoRepository.cs index 330ea9d..73bb41e 100644 --- a/OpenAdm.Domain/Interfaces/IProdutoRepository.cs +++ b/OpenAdm.Domain/Interfaces/IProdutoRepository.cs @@ -7,5 +7,6 @@ public interface IProdutoRepository : IGenericRepository { Task> GetProdutosMaisVendidosAsync(); Task> GetProdutosByCategoriaIdAsync(Guid categoriaId); + Task> GetProdutosByListIdAsync(List ids); Task> GetProdutosAsync(int page); } diff --git a/OpenAdm.Domain/Model/Carrinho/AddCarrinhoModel.cs b/OpenAdm.Domain/Model/Carrinho/AddCarrinhoModel.cs new file mode 100644 index 0000000..1897d0b --- /dev/null +++ b/OpenAdm.Domain/Model/Carrinho/AddCarrinhoModel.cs @@ -0,0 +1,8 @@ +namespace OpenAdm.Domain.Model.Carrinho; + +public class AddCarrinhoModel +{ + public Guid ProdutoId { get; set; } + public List Tamanhos { get; set; } = new(); + public List Pesos { get; set; } = new(); +} diff --git a/OpenAdm.Domain/Model/Carrinho/AddPesoCarrinho.cs b/OpenAdm.Domain/Model/Carrinho/AddPesoCarrinho.cs new file mode 100644 index 0000000..deb433f --- /dev/null +++ b/OpenAdm.Domain/Model/Carrinho/AddPesoCarrinho.cs @@ -0,0 +1,7 @@ +namespace OpenAdm.Domain.Model.Carrinho; + +public class AddPesoCarrinho +{ + public Guid PesoId { get; set; } + public decimal Quantidade { get; set; } +} diff --git a/OpenAdm.Domain/Model/Carrinho/AddTamanhoCarrinho.cs b/OpenAdm.Domain/Model/Carrinho/AddTamanhoCarrinho.cs new file mode 100644 index 0000000..0ea1e54 --- /dev/null +++ b/OpenAdm.Domain/Model/Carrinho/AddTamanhoCarrinho.cs @@ -0,0 +1,7 @@ +namespace OpenAdm.Domain.Model.Carrinho; + +public class AddTamanhoCarrinho +{ + public Guid TamanhoId { get; set; } + public decimal Quantidade { get; set; } +} diff --git a/OpenAdm.Domain/Model/Carrinho/CarrinhoModel.cs b/OpenAdm.Domain/Model/Carrinho/CarrinhoModel.cs new file mode 100644 index 0000000..f721fdb --- /dev/null +++ b/OpenAdm.Domain/Model/Carrinho/CarrinhoModel.cs @@ -0,0 +1,7 @@ +namespace OpenAdm.Domain.Model.Carrinho; + +public class CarrinhoModel +{ + public Guid UsuarioId { get; set; } + public List Produtos { get; set; } = new(); +} diff --git a/OpenAdm.Domain/Model/Pedidos/PedidoPorPesoModel.cs b/OpenAdm.Domain/Model/Pedidos/PedidoPorPesoModel.cs new file mode 100644 index 0000000..e09da93 --- /dev/null +++ b/OpenAdm.Domain/Model/Pedidos/PedidoPorPesoModel.cs @@ -0,0 +1,21 @@ +using OpenAdm.Domain.Validations; + +namespace OpenAdm.Domain.Model.Pedidos; + +public class PedidoPorPesoModel +{ + public PedidoPorPesoModel(Guid produtoId, Guid pesoId, decimal quantidade) + { + ValidationGuid.ValidGuidNullAndEmpty(produtoId); + ValidationGuid.ValidGuidNullAndEmpty(pesoId); + ValidationDecimal.ValidDecimalNullAndZero(quantidade); + + ProdutoId = produtoId; + PesoId = pesoId; + Quantidade = quantidade; + } + + public Guid ProdutoId { get; private set; } + public Guid PesoId { get; private set; } + public decimal Quantidade { get; private set; } +} diff --git a/OpenAdm.Domain/Model/Pedidos/PedidoPorTamanhoModel.cs b/OpenAdm.Domain/Model/Pedidos/PedidoPorTamanhoModel.cs new file mode 100644 index 0000000..6b0d1d8 --- /dev/null +++ b/OpenAdm.Domain/Model/Pedidos/PedidoPorTamanhoModel.cs @@ -0,0 +1,21 @@ +using OpenAdm.Domain.Validations; + +namespace OpenAdm.Domain.Model.Pedidos; + +public class PedidoPorTamanhoModel +{ + public PedidoPorTamanhoModel(Guid produtoId, Guid tamanhoId, decimal quantidade) + { + ValidationGuid.ValidGuidNullAndEmpty(produtoId); + ValidationGuid.ValidGuidNullAndEmpty(tamanhoId); + ValidationDecimal.ValidDecimalNullAndZero(quantidade); + + ProdutoId = produtoId; + TamanhoId = tamanhoId; + Quantidade = quantidade; + } + + public Guid ProdutoId { get; private set; } + public Guid TamanhoId { get; private set; } + public decimal Quantidade { get; private set; } +} diff --git a/OpenAdm.Domain/Validations/ValidationDecimal.cs b/OpenAdm.Domain/Validations/ValidationDecimal.cs new file mode 100644 index 0000000..3c0f98e --- /dev/null +++ b/OpenAdm.Domain/Validations/ValidationDecimal.cs @@ -0,0 +1,15 @@ +using OpenAdm.Domain.Errors; +using OpenAdm.Domain.Exceptions; + +namespace OpenAdm.Domain.Validations; + +public class ValidationDecimal +{ + public static void ValidDecimalNullAndZero(decimal? value, string message = CodigoErrors.ErrorGeneric) + { + if (value == null || value.Value <= 0) + { + throw new ExceptionApi(message); + } + } +} diff --git a/OpenAdm.Domain/Validations/ValidationGuid.cs b/OpenAdm.Domain/Validations/ValidationGuid.cs new file mode 100644 index 0000000..f3abf48 --- /dev/null +++ b/OpenAdm.Domain/Validations/ValidationGuid.cs @@ -0,0 +1,15 @@ +using OpenAdm.Domain.Errors; +using OpenAdm.Domain.Exceptions; + +namespace OpenAdm.Domain.Validations; + +public static class ValidationGuid +{ + public static void ValidGuidNullAndEmpty(Guid? guid, string message = CodigoErrors.ErrorGeneric) + { + if (guid == null || guid.Value == Guid.Empty) + { + throw new ExceptionApi(message); + } + } +} diff --git a/OpenAdm.Domain/Validations/ValidationString.cs b/OpenAdm.Domain/Validations/ValidationString.cs index d85c979..cff6d86 100644 --- a/OpenAdm.Domain/Validations/ValidationString.cs +++ b/OpenAdm.Domain/Validations/ValidationString.cs @@ -6,25 +6,25 @@ namespace OpenAdm.Domain.Validations; public class ValidationString { - public static void Validate(string? value, string message = GenericError.Error) + public static void Validate(string? value, string message = CodigoErrors.ErrorGeneric) { if (string.IsNullOrWhiteSpace(value)) throw new ExceptionApi(message); } - public static void ValidateWithLength(string? value, int length = 255, string message = GenericError.Error) + public static void ValidateWithLength(string? value, int length = 255, string message = CodigoErrors.ErrorGeneric) { if (string.IsNullOrWhiteSpace(value) || value.Length > length) throw new ExceptionApi(message); } - public static void ValidateLength(string? value, int length = 255, string message = GenericError.Error) + public static void ValidateLength(string? value, int length = 255, string message = CodigoErrors.ErrorGeneric) { if (!string.IsNullOrWhiteSpace(value) && value.Length > length) throw new ExceptionApi(message); } - public static void ValidateTelefone(string? value, string message = DomainErrorMessage.ErrorTelefoneInvalido) + public static void ValidateTelefone(string? value, string message = CodigoErrors.ErrorTelefoneInvalido) { const int length = 14; const string pattern = "^[0-9]+$"; diff --git a/OpenAdm.Infra/Cached/Cached/ProdutoCached.cs b/OpenAdm.Infra/Cached/Cached/ProdutoCached.cs index 5de8cc7..c8ad742 100644 --- a/OpenAdm.Infra/Cached/Cached/ProdutoCached.cs +++ b/OpenAdm.Infra/Cached/Cached/ProdutoCached.cs @@ -82,4 +82,9 @@ public async Task> GetProdutosByCategoriaIdAsync(Guid categoriaId return produtos ?? new List(); } + + public async Task> GetProdutosByListIdAsync(List ids) + { + return await _produtoRepository.GetProdutosByListIdAsync(ids); + } } diff --git a/OpenAdm.Infra/Factories/Factory/DomainFactory.cs b/OpenAdm.Infra/Factories/Factory/DomainFactory.cs index 15d47bc..c416c25 100644 --- a/OpenAdm.Infra/Factories/Factory/DomainFactory.cs +++ b/OpenAdm.Infra/Factories/Factory/DomainFactory.cs @@ -19,7 +19,7 @@ public DomainFactory(IHttpContextAccessor httpContextAccessor) public string GetDomainParceiro() { if (string.IsNullOrWhiteSpace(_dominio)) - throw new ExceptionApi(ContextErrorMessage.OrigemDaRequisicaoInvalida); + throw new ExceptionApi(CodigoErrors.OrigemDaRequisicaoInvalida); return _dominio; } diff --git a/OpenAdm.Infra/HttpService/Services/DiscordHttpService.cs b/OpenAdm.Infra/HttpService/Services/DiscordHttpService.cs index 0e9fbeb..c7766cd 100644 --- a/OpenAdm.Infra/HttpService/Services/DiscordHttpService.cs +++ b/OpenAdm.Infra/HttpService/Services/DiscordHttpService.cs @@ -1,7 +1,7 @@ using OpenAdm.Infra.HttpService.Interfaces; using System.Net.Http.Headers; using OpenAdm.Infra.Model; -using OpenAdm.Domain.Exceptions; +using OpenAdm.Domain.Errors; namespace OpenAdm.Infra.HttpService.Services; @@ -13,13 +13,13 @@ public class DiscordHttpService(IHttpClientFactory httpClientFactory) public async Task NotifyExceptionAsync(string message, string webHookId, string webHookToken) { if (string.IsNullOrWhiteSpace(message)) - throw new ExceptionApi("Mensagem para notificação inválida!"); + throw new Exception(CodigoErrors.MessageDiscordInvalida); if (string.IsNullOrWhiteSpace(webHookId)) - throw new ExceptionApi("Web hook ID do discord inválido!"); + throw new Exception(CodigoErrors.WebHookIdDiscordInvalido); if (string.IsNullOrWhiteSpace(webHookToken)) - throw new ExceptionApi("Web hook token do discord inválido!"); + throw new Exception(CodigoErrors.WebHookTokenDiscordInvalido); var url = $"{webHookId}/{webHookToken}"; var httpClient = _httpClientFactory.CreateClient("Discord"); diff --git a/OpenAdm.Infra/Repositories/CarrinhoRepository.cs b/OpenAdm.Infra/Repositories/CarrinhoRepository.cs new file mode 100644 index 0000000..d2cd6df --- /dev/null +++ b/OpenAdm.Infra/Repositories/CarrinhoRepository.cs @@ -0,0 +1,51 @@ +using Microsoft.Extensions.Caching.Distributed; +using OpenAdm.Domain.Interfaces; +using OpenAdm.Domain.Model.Carrinho; +using System.Text.Json; + +namespace OpenAdm.Infra.Repositories; + +public class CarrinhoRepository : ICarrinhoRepository +{ + private readonly IDistributedCache _distributedCache; + private readonly DistributedCacheEntryOptions _options; + private static readonly double _absolutExpiration = 24; + private static readonly double _slidingExpiration = 12; + + public CarrinhoRepository(IDistributedCache distributedCache) + { + _options = new DistributedCacheEntryOptions() + .SetAbsoluteExpiration(TimeSpan.FromHours(_absolutExpiration)) + .SetSlidingExpiration(TimeSpan.FromHours(_slidingExpiration)); + + _distributedCache = distributedCache; + } + + public async Task AdicionarProdutoAsync(CarrinhoModel carrinhoModel, string key) + { + await _distributedCache + .SetStringAsync(key, JsonSerializer.Serialize(carrinhoModel), _options); + + return true; + } + + public async Task GetCarrinhoAsync(string key) + { + var carrinhoString = await _distributedCache.GetStringAsync(key); + + var carrinho = carrinhoString == null ? + new CarrinhoModel() : + JsonSerializer.Deserialize(carrinhoString); + + return carrinho ?? new(); + } + + public async Task GetCountCarrinhoAsync(string key) + { + var carrinho = await GetCarrinhoAsync(key); + + if (carrinho == null) return 0; + + return carrinho.Produtos.Select(x => x.ProdutoId).ToList().Count; + } +} diff --git a/OpenAdm.Infra/Repositories/LoginUsuarioRepository.cs b/OpenAdm.Infra/Repositories/LoginUsuarioRepository.cs new file mode 100644 index 0000000..dc17216 --- /dev/null +++ b/OpenAdm.Infra/Repositories/LoginUsuarioRepository.cs @@ -0,0 +1,20 @@ +using Microsoft.EntityFrameworkCore; +using OpenAdm.Domain.Entities; +using OpenAdm.Domain.Interfaces; +using OpenAdm.Infra.Context; + +namespace OpenAdm.Infra.Repositories; + +public class LoginUsuarioRepository(ParceiroContext parceiroContext) + : ILoginUsuarioRepository +{ + private readonly ParceiroContext _parceiroContext = parceiroContext; + + public async Task LoginAsync(string email) + { + return await _parceiroContext + .Usuarios + .AsNoTracking() + .FirstOrDefaultAsync(x => x.Email == email); + } +} diff --git a/OpenAdm.Infra/Repositories/ProdutoRepository.cs b/OpenAdm.Infra/Repositories/ProdutoRepository.cs index 9bbc60d..5a692ea 100644 --- a/OpenAdm.Infra/Repositories/ProdutoRepository.cs +++ b/OpenAdm.Infra/Repositories/ProdutoRepository.cs @@ -4,6 +4,7 @@ using OpenAdm.Domain.Model; using OpenAdm.Infra.Context; using OpenAdm.Infra.Extensions.IQueryable; +using System.Linq; namespace OpenAdm.Infra.Repositories; @@ -32,12 +33,21 @@ public async Task> GetProdutosAsync(int page) .Take(_take) .ToListAsync(); + var produtosIds = produtos.Select(x => x.Id).ToList(); var tamanhos = await _parceiroContext .TamanhosProdutos .AsNoTracking() + .Where(x => produtosIds.Contains(x.ProdutoId)) .Include(x => x.Tamanho) .ToListAsync(); + var pesos = await _parceiroContext + .PesosProdutos + .AsNoTracking() + .Include(x => x.Peso) + .Where(x => produtosIds.Contains(x.ProdutoId)) + .ToListAsync(); + if (produtos.Count > 0) { produtos.ForEach(produto => @@ -47,6 +57,13 @@ public async Task> GetProdutosAsync(int page) .Where(x => x.ProdutoId == produto.Id) .Select(tm => new Tamanho(tm.Tamanho.Id, tm.Tamanho.DataDeCriacao, tm.Tamanho.DataDeAtualizacao, tm.Tamanho.Numero, tm.Tamanho.Descricao)) .ToList(); + + produto.Pesos = pesos + .Where(x => x.ProdutoId == produto.Id) + .Select(tm => + new Peso(tm.Peso.Id, tm.Peso.DataDeCriacao, tm.Peso.DataDeAtualizacao, tm.Peso.Numero, tm.Peso.Descricao) + ) + .ToList(); }); } @@ -105,10 +122,20 @@ public async Task> GetProdutosByCategoriaIdAsync(Guid categoriaId .Where(x => x.CategoriaId == categoriaId) .ToListAsync(); + var produtosIds = produtos.Select(x => x.Id).ToList(); + var tamanhos = await _parceiroContext .TamanhosProdutos .AsNoTracking() .Include(x => x.Tamanho) + .Where(x => produtosIds.Contains(x.ProdutoId)) + .ToListAsync(); + + var pesos = await _parceiroContext + .PesosProdutos + .AsNoTracking() + .Include(x => x.Peso) + .Where(x => produtosIds.Contains(x.ProdutoId)) .ToListAsync(); if (produtos.Count > 0) @@ -122,9 +149,44 @@ public async Task> GetProdutosByCategoriaIdAsync(Guid categoriaId new Tamanho(tm.Tamanho.Id, tm.Tamanho.DataDeCriacao, tm.Tamanho.DataDeAtualizacao, tm.Tamanho.Numero, tm.Tamanho.Descricao) ) .ToList(); + + produto.Pesos = pesos + .Where(x => x.ProdutoId == produto.Id) + .Select(tm => + new Peso(tm.Peso.Id, tm.Peso.DataDeCriacao, tm.Peso.DataDeAtualizacao, tm.Peso.Numero, tm.Peso.Descricao) + ) + .ToList(); }); } return produtos; } + + public async Task> GetProdutosByListIdAsync(List ids) + { + var produtos = await _parceiroContext + .Produtos + .AsQueryable() + .Include(x => x.Categoria) + .Include(x => x.Pesos) + .Include(x => x.Tamanhos) + .Where(x => ids.Contains(x.Id)) + .AsNoTracking() + .ToListAsync(); + + produtos.ForEach(produto => + { + produto.Categoria.Produtos = new(); + produto.Pesos.ForEach(peso => + { + peso.Produtos = new(); + }); + produto.Tamanhos.ForEach(tamanho => + { + tamanho.Produtos = new(); + }); + }); + + return produtos; + } } diff --git a/OpenAdm.IoC/DependencyInjectRepositories.cs b/OpenAdm.IoC/DependencyInjectRepositories.cs index 4538d15..babab1d 100644 --- a/OpenAdm.IoC/DependencyInjectRepositories.cs +++ b/OpenAdm.IoC/DependencyInjectRepositories.cs @@ -25,6 +25,8 @@ public static void InjectRepositories(this IServiceCollection services, string c services.AddTransient(); services.AddScoped(); + services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); diff --git a/OpenAdm.IoC/DependencyInjectyApplication.cs b/OpenAdm.IoC/DependencyInjectyApplication.cs index 1dc1a9b..8bd413c 100644 --- a/OpenAdm.IoC/DependencyInjectyApplication.cs +++ b/OpenAdm.IoC/DependencyInjectyApplication.cs @@ -15,5 +15,7 @@ public static void InjectServices(this IServiceCollection services) services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); + services.AddScoped(); } } diff --git a/OpenAdm.Test/Domain/Builder/ItensPedidoBuilder.cs b/OpenAdm.Test/Domain/Builder/ItensPedidoBuilder.cs new file mode 100644 index 0000000..1d2bbb7 --- /dev/null +++ b/OpenAdm.Test/Domain/Builder/ItensPedidoBuilder.cs @@ -0,0 +1,78 @@ +using OpenAdm.Domain.Entities; + +namespace OpenAdm.Test.Domain.Builder; + +public class ItensPedidoBuilder +{ + private readonly Guid _id; + private readonly DateTime _created; + private readonly DateTime _update; + private readonly long _numero; + private Guid? _pesoId; + private Guid? _tamanhoId; + private Guid _produtoId; + private Guid _pedidoId; + private decimal _quantidade; + private decimal _valorUnitario; + + public ItensPedidoBuilder() + { + _id = Guid.NewGuid(); + _created = DateTime.Now; + _update = DateTime.Now; + var faker = new Faker(); + + _pesoId = null; + _tamanhoId = null; + + _produtoId = Guid.NewGuid(); + _pedidoId = Guid.NewGuid(); + _quantidade = faker.Random.Decimal(1, 100); + _valorUnitario = faker.Random.Decimal(1, 100); + } + + public static ItensPedidoBuilder Init() => new(); + + public ItensPedidoBuilder SemQuantidade(int? quantidade) + { + _quantidade = quantidade == null ? 0 : quantidade.Value; + return this; + } + + public ItensPedidoBuilder SemValorUnitario(int? valorUnitario) + { + _valorUnitario = valorUnitario == null ? 0 : valorUnitario.Value; + return this; + } + + public ItensPedidoBuilder SemProdutoId(Guid? produtoId) + { + _produtoId = produtoId == null ? Guid.Empty : produtoId.Value; + return this; + } + + public ItensPedidoBuilder SemPedidoId(Guid? pedidoId) + { + _pedidoId = pedidoId == null ? Guid.Empty : pedidoId.Value; + return this; + } + + public ItensPedido Build() + { + return new ItensPedido(_id, _created, _update, _numero, _pesoId, _tamanhoId, _produtoId, _pedidoId, _valorUnitario, _quantidade); + } + + public static IList BuildItens() + { + var item1 = Init().Build(); + var item2 = Init().Build(); + var item3 = Init().Build(); + + return new List() + { + item1, + item2, + item3 + }; + } +} diff --git a/OpenAdm.Test/Domain/Builder/PedidoBuilder.cs b/OpenAdm.Test/Domain/Builder/PedidoBuilder.cs index cac9242..c461ba8 100644 --- a/OpenAdm.Test/Domain/Builder/PedidoBuilder.cs +++ b/OpenAdm.Test/Domain/Builder/PedidoBuilder.cs @@ -40,6 +40,12 @@ public Pedido Build() return pedido; } + public PedidoBuilder SemUsuario(Guid? usuarioId) + { + _usuarioId = usuarioId == null ? Guid.Empty : usuarioId.Value; + return this; + } + public UpdateStatusPedidoDto BuildStatusPedidoDto() { return new UpdateStatusPedidoDto() diff --git a/OpenAdm.Test/Domain/Builder/TabelaDePrecoBuilder.cs b/OpenAdm.Test/Domain/Builder/TabelaDePrecoBuilder.cs new file mode 100644 index 0000000..2ade07e --- /dev/null +++ b/OpenAdm.Test/Domain/Builder/TabelaDePrecoBuilder.cs @@ -0,0 +1,38 @@ +using OpenAdm.Domain.Entities; +using OpenAdm.Domain.Model.Pedidos; + +namespace OpenAdm.Test.Domain.Builder; + +public class TabelaDePrecoBuilder +{ + private readonly Guid _id; + private readonly DateTime _created; + private readonly DateTime _update; + private readonly long _numero; + private readonly bool _ativaEcommerce; + private string _descricao; + + public TabelaDePrecoBuilder() + { + _id = Guid.NewGuid(); + _created = DateTime.Now; + _update = DateTime.Now; + var faker = new Faker(); + _numero = faker.Random.Long(1, 10000); + _descricao = faker.Person.FirstName; + _ativaEcommerce = true; + } + + public static TabelaDePrecoBuilder Init() => new(); + + public TabelaDePrecoBuilder SemDescricao(string descricao) + { + _descricao = descricao; + return this; + } + + public TabelaDePreco Build() + { + return new TabelaDePreco(_id, _created, _update, _numero, _descricao, _ativaEcommerce); + } +} diff --git a/OpenAdm.Test/Domain/Test/ItensPedidoTest.cs b/OpenAdm.Test/Domain/Test/ItensPedidoTest.cs new file mode 100644 index 0000000..d6a3fca --- /dev/null +++ b/OpenAdm.Test/Domain/Test/ItensPedidoTest.cs @@ -0,0 +1,57 @@ +using ExpectedObjects; +using OpenAdm.Domain.Entities; +using OpenAdm.Domain.Exceptions; +using OpenAdm.Test.Domain.Builder; + +namespace OpenAdm.Test.Domain.Test; + +public class ItensPedidoTest +{ + [Theory] + [InlineData(null)] + [InlineData(0)] + public void NaoDeveCriarItemPedidoSemQuantidade(int? quantidade) + { + Assert.Throws(() => ItensPedidoBuilder.Init().SemQuantidade(quantidade).Build()); + } + + [Theory] + [InlineData(null)] + [InlineData(0)] + public void NaoDeveCriarItemPedidoSemValorUnitario(int? valorUnitario) + { + Assert.Throws(() => ItensPedidoBuilder.Init().SemValorUnitario(valorUnitario).Build()); + } + + [Fact] + public void NaoDeveCriarItemPedidoSemPedidoId() + { + Assert.Throws(() => ItensPedidoBuilder.Init().SemPedidoId(Guid.Empty).Build()); + } + + [Fact] + public void NaoDeveCriarItemPedidoSemProdutoId() + { + Assert.Throws(() => ItensPedidoBuilder.Init().SemProdutoId(Guid.Empty).Build()); + } + + [Fact] + public void DeveCriarItemPedido() + { + var dto = ItensPedidoBuilder.Init().Build(); + + var itemPedido = new ItensPedido( + dto.Id, + dto.DataDeCriacao, + dto.DataDeAtualizacao, + dto.Numero, + dto.PesoId, + dto.TamanhoId, + dto.ProdutoId, + dto.PedidoId, + dto.ValorUnitario, + dto.Quantidade); + + dto.ToExpectedObject().ShouldMatch(itemPedido); + } +} diff --git a/OpenAdm.Test/Domain/Test/PedidoTest.cs b/OpenAdm.Test/Domain/Test/PedidoTest.cs new file mode 100644 index 0000000..eb78ecb --- /dev/null +++ b/OpenAdm.Test/Domain/Test/PedidoTest.cs @@ -0,0 +1,83 @@ +using OpenAdm.Domain.Entities; +using OpenAdm.Domain.Exceptions; +using OpenAdm.Domain.Model.Pedidos; +using OpenAdm.Test.Domain.Builder; + +namespace OpenAdm.Test.Domain.Test; + +public class PedidoTest +{ + [Fact] + public void NaoDeveCriarPedidoSemUsuario() + { + Assert.Throws(() => PedidoBuilder.Init().SemUsuario(Guid.Empty).Build()); + Assert.Throws(() => PedidoBuilder.Init().SemUsuario(null).Build()); + } + + [Fact] + public void DeveProcessarItensPedidoCorretamente() + { + var pedidoPorPesoModel = new PedidoPorPesoModel(Guid.NewGuid(), Guid.NewGuid(), 1); + var pedidoPorTamanhoModel = new PedidoPorTamanhoModel(Guid.NewGuid(), Guid.NewGuid(), 1); + var tabelaDePreco = TabelaDePrecoBuilder.Init().Build(); + + tabelaDePreco.ItensTabelaDePreco.AddRange(new List() + { + new ( + Guid.NewGuid(), + tabelaDePreco.DataDeCriacao, + tabelaDePreco.DataDeAtualizacao, + 0, + pedidoPorPesoModel.ProdutoId, + 2, + tabelaDePreco.Id, + null, + pedidoPorPesoModel.PesoId), + new ( + Guid.NewGuid(), + tabelaDePreco.DataDeCriacao, + tabelaDePreco.DataDeAtualizacao, + 0, + pedidoPorTamanhoModel.ProdutoId, + 2, + tabelaDePreco.Id, + pedidoPorTamanhoModel.TamanhoId, + null) + }); + + var pedido = PedidoBuilder.Init().Build(); + + pedido.ProcessarItensPedido( + new List() { pedidoPorPesoModel }, + new List() { pedidoPorTamanhoModel }, + tabelaDePreco); + + var item1 = pedido + .ItensPedido + .FirstOrDefault(x => x.ProdutoId == pedidoPorPesoModel.ProdutoId && x.PesoId == pedidoPorPesoModel.PesoId); + + var item2 = pedido + .ItensPedido + .FirstOrDefault(x => x.ProdutoId == pedidoPorTamanhoModel.ProdutoId && x.TamanhoId == pedidoPorTamanhoModel.TamanhoId); + + + var vlrUnitario1 = tabelaDePreco + .ItensTabelaDePreco + .FirstOrDefault(x => x.ProdutoId == pedidoPorPesoModel.ProdutoId && x.PesoId == pedidoPorPesoModel.PesoId)?.ValorUnitario ?? 0; + + var vlrUnitario2 = tabelaDePreco + .ItensTabelaDePreco + .FirstOrDefault(x => x.ProdutoId == pedidoPorPesoModel.ProdutoId && x.PesoId == pedidoPorPesoModel.PesoId)?.ValorUnitario ?? 0; + + + Assert.NotNull(item1); + Assert.NotNull(item2); + Assert.Equal(pedidoPorPesoModel.PesoId, item1.PesoId); + Assert.Equal(pedidoPorTamanhoModel.TamanhoId, item2.TamanhoId); + Assert.Equal(vlrUnitario1, item1.ValorUnitario); + Assert.Equal(vlrUnitario2, item2.ValorUnitario); + Assert.Equal(pedidoPorPesoModel.Quantidade, item1.Quantidade); + Assert.Equal(pedidoPorTamanhoModel.Quantidade, item2.Quantidade); + + } +} diff --git a/OpenAdm.Test/Domain/Test/TabelaDePrecoTest.cs b/OpenAdm.Test/Domain/Test/TabelaDePrecoTest.cs new file mode 100644 index 0000000..72d9ce0 --- /dev/null +++ b/OpenAdm.Test/Domain/Test/TabelaDePrecoTest.cs @@ -0,0 +1,28 @@ +using ExpectedObjects; +using OpenAdm.Domain.Entities; +using OpenAdm.Domain.Exceptions; +using OpenAdm.Test.Domain.Builder; + +namespace OpenAdm.Test.Domain.Test; + +public class TabelaDePrecoTest +{ + [Theory] + [InlineData(null)] + [InlineData("")] + [InlineData(" ")] + public void NaoDeveCriarTabelaDePrecoSemDescricao(string descricao) + { + Assert.Throws(() => TabelaDePrecoBuilder.Init().SemDescricao(descricao).Build()); + } + + [Fact] + public void DeveCriarTabelaDePreco() + { + var dto = TabelaDePrecoBuilder.Init().Build(); + + var tebaleDePreco = new TabelaDePreco(dto.Id, dto.DataDeCriacao, dto.DataDeAtualizacao, dto.Numero, dto.Descricao, dto.AtivaEcommerce); + + dto.ToExpectedObject().ShouldMatch(tebaleDePreco); + } +} diff --git a/OpenAdm.Test/Infra/Test/DiscordHttpServiceTest.cs b/OpenAdm.Test/Infra/Test/DiscordHttpServiceTest.cs index 2b1048e..7a01158 100644 --- a/OpenAdm.Test/Infra/Test/DiscordHttpServiceTest.cs +++ b/OpenAdm.Test/Infra/Test/DiscordHttpServiceTest.cs @@ -1,5 +1,4 @@ -using OpenAdm.Domain.Exceptions; -using OpenAdm.Infra.HttpService.Services; +using OpenAdm.Infra.HttpService.Services; namespace OpenAdm.Test.Infra.Test; @@ -14,7 +13,7 @@ public async Task NaoDeveNotificarDiscordSemMensage(string message) var httpClientFactory = new Mock(); var discordHttpService = new DiscordHttpService(httpClientFactory.Object); - await Assert.ThrowsAnyAsync( + await Assert.ThrowsAnyAsync( async () => await discordHttpService.NotifyExceptionAsync(message, "", "")); } @@ -27,7 +26,7 @@ public async Task NaoDeveNotificarDiscordSemWebHookId(string webHookId) var httpClientFactory = new Mock(); var discordHttpService = new DiscordHttpService(httpClientFactory.Object); - await Assert.ThrowsAnyAsync( + await Assert.ThrowsAnyAsync( async () => await discordHttpService.NotifyExceptionAsync("Teste", webHookId, "")); } @@ -40,7 +39,7 @@ public async Task NaoDeveNotificarDiscordSemWebHookToken(string webHookToken) var httpClientFactory = new Mock(); var discordHttpService = new DiscordHttpService(httpClientFactory.Object); - await Assert.ThrowsAnyAsync( + await Assert.ThrowsAnyAsync( async () => await discordHttpService.NotifyExceptionAsync("Teste", "123", webHookToken)); } }