diff --git a/OpenAdm.Api/Controllers/UsuarioController.cs b/OpenAdm.Api/Controllers/UsuarioController.cs index a57267b..0d55651 100644 --- a/OpenAdm.Api/Controllers/UsuarioController.cs +++ b/OpenAdm.Api/Controllers/UsuarioController.cs @@ -84,4 +84,15 @@ public async Task UpdateSenha(UpdateSenhaUsuarioDto updateSenhaUs await _usuarioService.TrocarSenhaAsync(updateSenhaUsuarioDto); return Ok(); } + + [Autentica] + [HttpGet("tem-telefone")] + public async Task TemTelefone() + { + var result = await _usuarioService.TemTelefoneCadastradoAsync(); + return Ok(new + { + result + }); + } } diff --git a/OpenAdm.Application/Dtos/Usuarios/CreateUsuarioDto.cs b/OpenAdm.Application/Dtos/Usuarios/CreateUsuarioDto.cs index 8b8a154..f8506d9 100644 --- a/OpenAdm.Application/Dtos/Usuarios/CreateUsuarioDto.cs +++ b/OpenAdm.Application/Dtos/Usuarios/CreateUsuarioDto.cs @@ -3,35 +3,57 @@ using OpenAdm.Application.Models; using System.ComponentModel.DataAnnotations; using OpenAdm.Domain.Exceptions; +using OpenAdm.Domain.Helpers; namespace OpenAdm.Application.Dtos.Usuarios; public class CreateUsuarioDto : BaseModel { - [Required] - [MaxLength(255)] public string Nome { get; set; } = string.Empty; - [Required] - [MaxLength(255)] - [DataType(DataType.EmailAddress)] public string Email { get; set; } = string.Empty; - [Required] - [MaxLength(1000)] public string Senha { get; set; } = string.Empty; - [Required] - [MaxLength(1000)] public string ReSenha { get; set; } = string.Empty; - [MaxLength(15)] - [Required(ErrorMessage = "Informe o seu telefone.")] public string Telefone { get; set; } = string.Empty; - [MaxLength(20)] public string? Cnpj { get; set; } = string.Empty; - [MaxLength(20)] public string? Cpf { get; set; } = string.Empty; + public void Validar() + { + if ((string.IsNullOrWhiteSpace(Cpf) && string.IsNullOrWhiteSpace(Cnpj)) || + !string.IsNullOrWhiteSpace(Cpf) && !string.IsNullOrWhiteSpace(Cnpj)) + { + throw new ExceptionApi("Informe o CPF ou o CNPJ"); + } + + if (string.IsNullOrWhiteSpace(Nome)) + { + throw new ExceptionApi("Informe o nome"); + } + + if (string.IsNullOrWhiteSpace(Telefone)) + { + throw new ExceptionApi("Informe o telefone"); + } + + if (string.IsNullOrWhiteSpace(Senha) || string.IsNullOrWhiteSpace(ReSenha)) + { + throw new ExceptionApi("Senhas inválidas"); + } + + if (!Senha.Equals(ReSenha)) + { + throw new ExceptionApi("As senha não conferem!"); + } + + if(!string.IsNullOrWhiteSpace(Cpf) && !ValidarCnpjECpf.IsCpf(Cpf)) + { + throw new ExceptionApi("CPF inválido!"); + } + } + public Usuario ToEntity() { - if((string.IsNullOrWhiteSpace(Cnpj) && string.IsNullOrWhiteSpace(Cpf)) + if ((string.IsNullOrWhiteSpace(Cnpj) && string.IsNullOrWhiteSpace(Cpf)) || (!string.IsNullOrWhiteSpace(Cnpj) && !string.IsNullOrWhiteSpace(Cpf))) { throw new ExceptionApi("Informe o CNPJ ou o CPF"); diff --git a/OpenAdm.Application/Interfaces/IUsuarioService.cs b/OpenAdm.Application/Interfaces/IUsuarioService.cs index 31bd31c..6078dad 100644 --- a/OpenAdm.Application/Interfaces/IUsuarioService.cs +++ b/OpenAdm.Application/Interfaces/IUsuarioService.cs @@ -16,4 +16,5 @@ public interface IUsuarioService Task TrocarSenhaAsync(UpdateSenhaUsuarioDto updateSenhaUsuarioDto); Task> PaginacaoAsync(PaginacaoUsuarioDto paginacaoUsuarioDto); Task> PaginacaoDropDownAsync(PaginacaoUsuarioDropDown paginacaoUsuarioDropDown); + Task TemTelefoneCadastradoAsync(); } diff --git a/OpenAdm.Application/Services/UsuarioService.cs b/OpenAdm.Application/Services/UsuarioService.cs index e543679..39cbd77 100644 --- a/OpenAdm.Application/Services/UsuarioService.cs +++ b/OpenAdm.Application/Services/UsuarioService.cs @@ -30,11 +30,7 @@ public UsuarioService( public async Task CreateUsuarioAsync(CreateUsuarioDto createUsuarioDto) { - if (!createUsuarioDto.Senha.Equals(createUsuarioDto.ReSenha)) - { - throw new ExceptionApi("As senha não conferem!"); - } - + createUsuarioDto.Validar(); var usuario = await _usuarioRepository.GetUsuarioByEmailAsync(createUsuarioDto.Email); if (usuario != null) @@ -163,4 +159,10 @@ public async Task> PaginacaoDropDownAsync(PaginacaoUsuar Nome = x.Nome }).ToList(); } + + public async Task TemTelefoneCadastradoAsync() + { + var usuario = await _usuarioAutenticado.GetUsuarioAutenticadoAsync(); + return !string.IsNullOrWhiteSpace(usuario.Telefone); + } } diff --git a/OpenAdm.Infra/EntityConfiguration/UsuarioConfiguration.cs b/OpenAdm.Infra/EntityConfiguration/UsuarioConfiguration.cs index 7a1747c..d4964fc 100644 --- a/OpenAdm.Infra/EntityConfiguration/UsuarioConfiguration.cs +++ b/OpenAdm.Infra/EntityConfiguration/UsuarioConfiguration.cs @@ -34,5 +34,9 @@ public void Configure(EntityTypeBuilder builder) .HasMaxLength(15); builder.HasIndex(x => x.Email) .IsUnique(); + builder.HasIndex(x => x.Cpf) + .IsUnique(); + builder.HasIndex(x => x.Cnpj) + .IsUnique(); } } diff --git a/OpenAdm.Infra/Migrations/Parceiro/20241102042033_CpfCnpjUniqueMigraiton.Designer.cs b/OpenAdm.Infra/Migrations/Parceiro/20241102042033_CpfCnpjUniqueMigraiton.Designer.cs new file mode 100644 index 0000000..19a0fe1 --- /dev/null +++ b/OpenAdm.Infra/Migrations/Parceiro/20241102042033_CpfCnpjUniqueMigraiton.Designer.cs @@ -0,0 +1,1352 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using OpenAdm.Infra.Context; + +#nullable disable + +namespace OpenAdm.Infra.Migrations.Parceiro +{ + [DbContext(typeof(ParceiroContext))] + [Migration("20241102042033_CpfCnpjUniqueMigraiton")] + partial class CpfCnpjUniqueMigraiton + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.7") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("OpenAdm.Domain.Entities.Banner", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Ativo") + .HasColumnType("boolean"); + + b.Property("DataDeAtualizacao") + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("DataDeCriacao") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("Foto") + .IsRequired() + .HasColumnType("text"); + + b.Property("NomeFoto") + .IsRequired() + .HasColumnType("text"); + + b.Property("Numero") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Numero")); + + b.HasKey("Id"); + + b.ToTable("Banners"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.Categoria", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DataDeAtualizacao") + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("DataDeCriacao") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("Descricao") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Foto") + .HasColumnType("text"); + + b.Property("NomeFoto") + .HasColumnType("text"); + + b.Property("Numero") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Numero")); + + b.HasKey("Id"); + + b.HasIndex("Descricao"); + + b.ToTable("Categorias"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.ConfiguracaoDeEmail", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Ativo") + .HasColumnType("boolean"); + + b.Property("DataDeAtualizacao") + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("DataDeCriacao") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Numero") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Numero")); + + b.Property("Porta") + .HasColumnType("integer"); + + b.Property("Senha") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Servidor") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.HasKey("Id"); + + b.ToTable("ConfiguracoesDeEmail"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.ConfiguracaoDeFrete", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AlturaEmbalagem") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("CepOrigem") + .IsRequired() + .HasMaxLength(9) + .HasColumnType("character varying(9)"); + + b.Property("ChaveApi") + .IsRequired() + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("CobrarCnpj") + .HasColumnType("boolean"); + + b.Property("CobrarCpf") + .HasColumnType("boolean"); + + b.Property("ComprimentoEmbalagem") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Inativo") + .HasColumnType("boolean"); + + b.Property("LarguraEmbalagem") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Peso") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("ConfiguracoesDeFrete"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.ConfiguracaoDePagamento", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AccessToken") + .IsRequired() + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("CobrarCnpj") + .HasColumnType("boolean"); + + b.Property("CobrarCpf") + .HasColumnType("boolean"); + + b.Property("DataDeAtualizacao") + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("DataDeCriacao") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("Numero") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Numero")); + + b.Property("PublicKey") + .IsRequired() + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.HasKey("Id"); + + b.ToTable("ConfiguracoesDePagamento"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.ConfiguracoesDePedido", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Ativo") + .HasColumnType("boolean"); + + b.Property("DataDeAtualizacao") + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("DataDeCriacao") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("EmailDeEnvio") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Logo") + .HasColumnType("bytea"); + + b.Property("Numero") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Numero")); + + b.Property("PedidoMinimoAtacado") + .HasPrecision(12, 2) + .HasColumnType("numeric(12,2)"); + + b.Property("PedidoMinimoVarejo") + .HasPrecision(12, 2) + .HasColumnType("numeric(12,2)"); + + b.HasKey("Id"); + + b.ToTable("ConfiguracoesDePedidos"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.EnderecoEntregaPedido", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Bairro") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Cep") + .IsRequired() + .HasMaxLength(8) + .HasColumnType("character varying(8)"); + + b.Property("Complemento") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Localidade") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Logradouro") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Numero") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("character varying(10)"); + + b.Property("PedidoId") + .HasColumnType("uuid"); + + b.Property("TipoFrete") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("character varying(10)"); + + b.Property("Uf") + .IsRequired() + .HasMaxLength(2) + .HasColumnType("character varying(2)"); + + b.Property("ValorFrete") + .HasPrecision(12, 2) + .HasColumnType("numeric(12,2)"); + + b.HasKey("Id"); + + b.HasIndex("PedidoId") + .IsUnique(); + + b.ToTable("EnderecosEntregaPedido"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.Estoque", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DataDeAtualizacao") + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("DataDeCriacao") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("Numero") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Numero")); + + b.Property("PesoId") + .HasColumnType("uuid"); + + b.Property("ProdutoId") + .HasColumnType("uuid"); + + b.Property("Quantidade") + .HasPrecision(12, 2) + .HasColumnType("numeric(12,2)"); + + b.Property("TamanhoId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("ProdutoId"); + + b.ToTable("Estoques"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.Fatura", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DataDeAtualizacao") + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("DataDeCriacao") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("DataDeFechamento") + .HasColumnType("timestamp without time zone"); + + b.Property("Numero") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Numero")); + + b.Property("PedidoId") + .HasColumnType("uuid"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("Tipo") + .HasColumnType("integer"); + + b.Property("UsuarioId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("PedidoId") + .IsUnique(); + + b.HasIndex("Tipo"); + + b.HasIndex("UsuarioId"); + + b.ToTable("Faturas"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.Funcionario", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Ativo") + .HasColumnType("boolean"); + + b.Property("Avatar") + .HasColumnType("bytea"); + + b.Property("DataDeAtualizacao") + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("DataDeCriacao") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Nome") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Numero") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Numero")); + + b.Property("Senha") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Telefone") + .HasMaxLength(11) + .HasColumnType("character varying(11)"); + + b.HasKey("Id"); + + b.HasIndex("Email") + .IsUnique(); + + b.ToTable("Funcionarios"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.ItemPedido", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DataDeAtualizacao") + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("DataDeCriacao") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("Numero") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Numero")); + + b.Property("PedidoId") + .HasColumnType("uuid"); + + b.Property("PesoId") + .HasColumnType("uuid"); + + b.Property("ProdutoId") + .HasColumnType("uuid"); + + b.Property("Quantidade") + .HasPrecision(12, 2) + .HasColumnType("numeric(12,2)"); + + b.Property("TamanhoId") + .HasColumnType("uuid"); + + b.Property("ValorUnitario") + .HasPrecision(12, 2) + .HasColumnType("numeric(12,2)"); + + b.HasKey("Id"); + + b.HasIndex("PedidoId"); + + b.HasIndex("PesoId"); + + b.HasIndex("ProdutoId"); + + b.HasIndex("TamanhoId"); + + b.ToTable("ItensPedidos"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.ItemTabelaDePreco", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DataDeAtualizacao") + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("DataDeCriacao") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("Numero") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Numero")); + + b.Property("PesoId") + .HasColumnType("uuid"); + + b.Property("ProdutoId") + .HasColumnType("uuid"); + + b.Property("TabelaDePrecoId") + .HasColumnType("uuid"); + + b.Property("TamanhoId") + .HasColumnType("uuid"); + + b.Property("ValorUnitarioAtacado") + .HasPrecision(12, 2) + .HasColumnType("numeric(12,2)"); + + b.Property("ValorUnitarioVarejo") + .HasPrecision(12, 2) + .HasColumnType("numeric(12,2)"); + + b.HasKey("Id"); + + b.HasIndex("ProdutoId"); + + b.HasIndex("TabelaDePrecoId"); + + b.ToTable("ItensTabelaDePreco"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.LojaParceira", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Contato") + .HasMaxLength(20) + .HasColumnType("character varying(20)"); + + b.Property("DataDeAtualizacao") + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("DataDeCriacao") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("Endereco") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("Facebook") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("Foto") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("Instagram") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("Nome") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("NomeFoto") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("Numero") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Numero")); + + b.HasKey("Id"); + + b.ToTable("LojasParceiras"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.MovimentacaoDeProduto", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DataDeAtualizacao") + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("DataDeCriacao") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("Numero") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Numero")); + + b.Property("Observacao") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("PesoId") + .HasColumnType("uuid"); + + b.Property("ProdutoId") + .HasColumnType("uuid"); + + b.Property("QuantidadeMovimentada") + .HasPrecision(12, 2) + .HasColumnType("numeric(12,2)"); + + b.Property("TamanhoId") + .HasColumnType("uuid"); + + b.Property("TipoMovimentacaoDeProduto") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ProdutoId"); + + b.ToTable("MovimentacoesDeProdutos"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.Parcela", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DataDeAtualizacao") + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("DataDeCriacao") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("DataDePagamento") + .HasColumnType("timestamp without time zone"); + + b.Property("DataDeVencimento") + .HasColumnType("timestamp without time zone"); + + b.Property("Desconto") + .HasPrecision(12, 2) + .HasColumnType("numeric(12,2)"); + + b.Property("FaturaId") + .HasColumnType("uuid"); + + b.Property("IdExterno") + .HasColumnType("text"); + + b.Property("MeioDePagamento") + .HasColumnType("integer"); + + b.Property("Numero") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Numero")); + + b.Property("NumeroDaFatura") + .HasColumnType("integer"); + + b.Property("Observacao") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("Valor") + .HasPrecision(12, 2) + .HasColumnType("numeric(12,2)"); + + b.HasKey("Id"); + + b.HasIndex("FaturaId"); + + b.ToTable("Parcelas"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.Pedido", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DataDeAtualizacao") + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("DataDeCriacao") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("Numero") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Numero")); + + b.Property("StatusPedido") + .HasColumnType("integer"); + + b.Property("UsuarioId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UsuarioId"); + + b.ToTable("Pedidos"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.Peso", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DataDeAtualizacao") + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("DataDeCriacao") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("Descricao") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Numero") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Numero")); + + b.Property("PesoReal") + .HasColumnType("numeric"); + + b.HasKey("Id"); + + b.HasIndex("Descricao"); + + b.ToTable("Pesos"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.PesoProduto", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("PesoId") + .HasColumnType("uuid"); + + b.Property("ProdutoId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("PesoId"); + + b.HasIndex("ProdutoId"); + + b.ToTable("PesosProdutos"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.Produto", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CategoriaId") + .HasColumnType("uuid"); + + b.Property("DataDeAtualizacao") + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("DataDeCriacao") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("Descricao") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("EspecificacaoTecnica") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("NomeFoto") + .HasColumnType("text"); + + b.Property("Numero") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Numero")); + + b.Property("Referencia") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("UrlFoto") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.HasKey("Id"); + + b.HasIndex("CategoriaId"); + + b.HasIndex("Descricao"); + + b.ToTable("Produtos"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.ProdutoMaisVendido", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DataDeAtualizacao") + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("DataDeCriacao") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("Numero") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Numero")); + + b.Property("ProdutoId") + .HasColumnType("uuid"); + + b.Property("QuantidadePedidos") + .HasPrecision(12, 2) + .HasColumnType("numeric(12,2)"); + + b.Property("QuantidadeProdutos") + .HasPrecision(12, 2) + .HasColumnType("numeric(12,2)"); + + b.HasKey("Id"); + + b.ToTable("ProdutosMaisVendidos"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.TabelaDePreco", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AtivaEcommerce") + .HasColumnType("boolean"); + + b.Property("DataDeAtualizacao") + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("DataDeCriacao") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("Descricao") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Numero") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Numero")); + + b.HasKey("Id"); + + b.ToTable("TabelaDePreco"); + + b.HasData( + new + { + Id = new Guid("4b43157b-8029-4e55-be53-1b8d27ea9be2"), + AtivaEcommerce = true, + DataDeAtualizacao = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), + DataDeCriacao = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), + Descricao = "E-commerce", + Numero = 1L + }); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.Tamanho", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DataDeAtualizacao") + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("DataDeCriacao") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("Descricao") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Numero") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Numero")); + + b.Property("PesoReal") + .HasColumnType("numeric"); + + b.HasKey("Id"); + + b.HasIndex("Descricao"); + + b.ToTable("Tamanhos"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.TamanhoProduto", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ProdutoId") + .HasColumnType("uuid"); + + b.Property("TamanhoId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("ProdutoId"); + + b.HasIndex("TamanhoId"); + + b.ToTable("TamanhosProdutos"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.TopUsuario", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DataDeAtualizacao") + .HasColumnType("timestamp without time zone"); + + b.Property("DataDeCriacao") + .HasColumnType("timestamp without time zone"); + + b.Property("Numero") + .HasColumnType("bigint"); + + b.Property("TotalCompra") + .HasColumnType("numeric"); + + b.Property("TotalPedidos") + .HasColumnType("integer"); + + b.Property("Usuario") + .IsRequired() + .HasColumnType("text"); + + b.Property("UsuarioId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.ToTable("TopUsuarios"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.Usuario", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Ativo") + .HasColumnType("boolean"); + + b.Property("Cnpj") + .HasColumnType("text"); + + b.Property("Cpf") + .HasColumnType("text"); + + b.Property("DataDeAtualizacao") + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("DataDeCriacao") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp without time zone") + .HasDefaultValueSql("now()"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Nome") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Numero") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Numero")); + + b.Property("Senha") + .IsRequired() + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("Telefone") + .HasMaxLength(15) + .HasColumnType("character varying(15)"); + + b.HasKey("Id"); + + b.HasIndex("Cnpj") + .IsUnique(); + + b.HasIndex("Cpf") + .IsUnique(); + + b.HasIndex("Email") + .IsUnique(); + + b.ToTable("Usuarios"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.EnderecoEntregaPedido", b => + { + b.HasOne("OpenAdm.Domain.Entities.Pedido", "Pedido") + .WithOne("EnderecoEntrega") + .HasForeignKey("OpenAdm.Domain.Entities.EnderecoEntregaPedido", "PedidoId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Pedido"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.Fatura", b => + { + b.HasOne("OpenAdm.Domain.Entities.Pedido", "Pedido") + .WithOne("Fatura") + .HasForeignKey("OpenAdm.Domain.Entities.Fatura", "PedidoId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("OpenAdm.Domain.Entities.Usuario", "Usuario") + .WithMany() + .HasForeignKey("UsuarioId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Pedido"); + + b.Navigation("Usuario"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.ItemPedido", b => + { + b.HasOne("OpenAdm.Domain.Entities.Pedido", "Pedido") + .WithMany("ItensPedido") + .HasForeignKey("PedidoId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenAdm.Domain.Entities.Peso", "Peso") + .WithMany("ItensPedido") + .HasForeignKey("PesoId") + .OnDelete(DeleteBehavior.NoAction); + + b.HasOne("OpenAdm.Domain.Entities.Produto", "Produto") + .WithMany("ItensPedido") + .HasForeignKey("ProdutoId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("OpenAdm.Domain.Entities.Tamanho", "Tamanho") + .WithMany("ItensPedido") + .HasForeignKey("TamanhoId") + .OnDelete(DeleteBehavior.NoAction); + + b.Navigation("Pedido"); + + b.Navigation("Peso"); + + b.Navigation("Produto"); + + b.Navigation("Tamanho"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.ItemTabelaDePreco", b => + { + b.HasOne("OpenAdm.Domain.Entities.Produto", "Produto") + .WithMany("ItensTabelaDePreco") + .HasForeignKey("ProdutoId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenAdm.Domain.Entities.TabelaDePreco", "TabelaDePreco") + .WithMany("ItensTabelaDePreco") + .HasForeignKey("TabelaDePrecoId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.Navigation("Produto"); + + b.Navigation("TabelaDePreco"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.Parcela", b => + { + b.HasOne("OpenAdm.Domain.Entities.Fatura", "Fatura") + .WithMany("Parcelas") + .HasForeignKey("FaturaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Fatura"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.Pedido", b => + { + b.HasOne("OpenAdm.Domain.Entities.Usuario", "Usuario") + .WithMany() + .HasForeignKey("UsuarioId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Usuario"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.PesoProduto", b => + { + b.HasOne("OpenAdm.Domain.Entities.Peso", "Peso") + .WithMany() + .HasForeignKey("PesoId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenAdm.Domain.Entities.Produto", "Produto") + .WithMany() + .HasForeignKey("ProdutoId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Peso"); + + b.Navigation("Produto"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.Produto", b => + { + b.HasOne("OpenAdm.Domain.Entities.Categoria", "Categoria") + .WithMany("Produtos") + .HasForeignKey("CategoriaId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.Navigation("Categoria"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.TamanhoProduto", b => + { + b.HasOne("OpenAdm.Domain.Entities.Produto", "Produto") + .WithMany() + .HasForeignKey("ProdutoId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenAdm.Domain.Entities.Tamanho", "Tamanho") + .WithMany() + .HasForeignKey("TamanhoId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Produto"); + + b.Navigation("Tamanho"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.Categoria", b => + { + b.Navigation("Produtos"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.Fatura", b => + { + b.Navigation("Parcelas"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.Pedido", b => + { + b.Navigation("EnderecoEntrega"); + + b.Navigation("Fatura"); + + b.Navigation("ItensPedido"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.Peso", b => + { + b.Navigation("ItensPedido"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.Produto", b => + { + b.Navigation("ItensPedido"); + + b.Navigation("ItensTabelaDePreco"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.TabelaDePreco", b => + { + b.Navigation("ItensTabelaDePreco"); + }); + + modelBuilder.Entity("OpenAdm.Domain.Entities.Tamanho", b => + { + b.Navigation("ItensPedido"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/OpenAdm.Infra/Migrations/Parceiro/20241102042033_CpfCnpjUniqueMigraiton.cs b/OpenAdm.Infra/Migrations/Parceiro/20241102042033_CpfCnpjUniqueMigraiton.cs new file mode 100644 index 0000000..66df456 --- /dev/null +++ b/OpenAdm.Infra/Migrations/Parceiro/20241102042033_CpfCnpjUniqueMigraiton.cs @@ -0,0 +1,38 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace OpenAdm.Infra.Migrations.Parceiro +{ + /// + public partial class CpfCnpjUniqueMigraiton : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateIndex( + name: "IX_Usuarios_Cnpj", + table: "Usuarios", + column: "Cnpj", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_Usuarios_Cpf", + table: "Usuarios", + column: "Cpf", + unique: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropIndex( + name: "IX_Usuarios_Cnpj", + table: "Usuarios"); + + migrationBuilder.DropIndex( + name: "IX_Usuarios_Cpf", + table: "Usuarios"); + } + } +} diff --git a/OpenAdm.Infra/Migrations/Parceiro/ParceiroContextModelSnapshot.cs b/OpenAdm.Infra/Migrations/Parceiro/ParceiroContextModelSnapshot.cs index 911a397..f71fbd6 100644 --- a/OpenAdm.Infra/Migrations/Parceiro/ParceiroContextModelSnapshot.cs +++ b/OpenAdm.Infra/Migrations/Parceiro/ParceiroContextModelSnapshot.cs @@ -1139,6 +1139,12 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); + b.HasIndex("Cnpj") + .IsUnique(); + + b.HasIndex("Cpf") + .IsUnique(); + b.HasIndex("Email") .IsUnique(); diff --git a/OpenAdm.Infra/Repositories/GenericRepository.cs b/OpenAdm.Infra/Repositories/GenericRepository.cs index 265cde6..ed2aeb3 100644 --- a/OpenAdm.Infra/Repositories/GenericRepository.cs +++ b/OpenAdm.Infra/Repositories/GenericRepository.cs @@ -13,7 +13,7 @@ public class GenericRepository(ParceiroContext parceiroContext) { protected readonly ParceiroContext _parceiroContext = parceiroContext; - public async Task AddAsync(T entity) + public virtual async Task AddAsync(T entity) { await _parceiroContext.AddAsync(entity); await _parceiroContext.SaveChangesAsync(); diff --git a/OpenAdm.Infra/Repositories/UsuarioRepository.cs b/OpenAdm.Infra/Repositories/UsuarioRepository.cs index e29657d..c4c7e86 100644 --- a/OpenAdm.Infra/Repositories/UsuarioRepository.cs +++ b/OpenAdm.Infra/Repositories/UsuarioRepository.cs @@ -2,12 +2,26 @@ using OpenAdm.Domain.Interfaces; using OpenAdm.Infra.Context; using OpenAdm.Domain.Entities; +using Npgsql; +using OpenAdm.Domain.Exceptions; namespace OpenAdm.Infra.Repositories; public class UsuarioRepository(ParceiroContext parceiroContext) : GenericRepository(parceiroContext), IUsuarioRepository { + public override async Task AddAsync(Usuario entity) + { + try + { + return await base.AddAsync(entity); + } + catch (DbUpdateException e) + when (e.InnerException is NpgsqlException { SqlState: PostgresErrorCodes.UniqueViolation }) + { + throw new ExceptionApi("Este e-mail, ou cpf ou cnpj já se encontra cadastrado!"); + } + } public async Task> GetAllUsuariosAsync() { return await _parceiroContext