Skip to content

Commit

Permalink
feature loja parceira
Browse files Browse the repository at this point in the history
  • Loading branch information
Brunobento1990 committed Mar 8, 2024
1 parent 0f12569 commit 72e37ea
Show file tree
Hide file tree
Showing 14 changed files with 418 additions and 1 deletion.
87 changes: 87 additions & 0 deletions OpenAdm.Api/Controllers/LojasParceirasController.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
using Microsoft.AspNetCore.Mvc;
using OpenAdm.Application.Dtos.LojaParceira;
using OpenAdm.Application.Interfaces;
using OpenAdm.Infra.Paginacao;

namespace OpenAdm.Api.Controllers;

[ApiController]
[Route("lojas-parceiras")]
public class LojasParceirasController : ControllerBaseApi
{
private readonly ILojasParceirasService _lojasParceirasService;

public LojasParceirasController(ILojasParceirasService lojasParceirasService)
{
_lojasParceirasService = lojasParceirasService;
}

[HttpGet("paginacao")]
public async Task<IActionResult> Paginacao([FromQuery] PaginacaoLojasParceirasDto paginacaoLojasParceirasDto)
{
try
{
var paginacao = await _lojasParceirasService.GetPaginacaoAsync(paginacaoLojasParceirasDto);
return Ok(paginacao);
}
catch (Exception ex)
{
return await HandleErrorAsync(ex);
}
}

[HttpPost("create")]
public async Task<IActionResult> Create(CreateLojaParceiraDto createLojaParceiraDto)
{
try
{
var lojaParceiraViewModel = await _lojasParceirasService.CreateLojaParceiraAsync(createLojaParceiraDto);
return Ok(lojaParceiraViewModel);
}
catch (Exception ex)
{
return await HandleErrorAsync(ex);
}
}

[HttpPut("update")]
public async Task<IActionResult> Update(UpdateLojaParceiraDto updateLojaParceiraDto)
{
try
{
var lojaParceiraViewModel = await _lojasParceirasService.UpdateLojaParceiraAsync(updateLojaParceiraDto);
return Ok(lojaParceiraViewModel);
}
catch (Exception ex)
{
return await HandleErrorAsync(ex);
}
}

[HttpGet("get-loja")]
public async Task<IActionResult> GetLoja([FromQuery] Guid id)
{
try
{
var lojaParceiraViewModel = await _lojasParceirasService.GetLojasParceirasViewModelAsync(id);
return Ok(lojaParceiraViewModel);
}
catch (Exception ex)
{
return await HandleErrorAsync(ex);
}
}
[HttpDelete("delete")]
public async Task<IActionResult> DeleteLoja([FromQuery] Guid id)
{
try
{
await _lojasParceirasService.DeleteLojaParceiraAsync(id);
return Ok();
}
catch (Exception ex)
{
return await HandleErrorAsync(ex);
}
}
}
39 changes: 39 additions & 0 deletions OpenAdm.Application/Dtos/LojaParceira/CreateLojaParceiraDto.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
using Domain.Pkg.Entities;
using System.ComponentModel.DataAnnotations;

namespace OpenAdm.Application.Dtos.LojaParceira;

public class CreateLojaParceiraDto
{
[Required]
[MaxLength(255)]
public string Nome { get; set; } = string.Empty;

[MaxLength(500)]
public string? Instagram { get; set; }
[MaxLength(500)]
public string? Facebook { get; set; }
[MaxLength(500)]
public string? Endereco { get; set; }
[MaxLength(20)]
public string? Contato { get; set; }
public string? Foto { get; set; }

public LojasParceiras ToEntity(string? nomeFoto)
{
var date = DateTime.Now;

return new LojasParceiras(
Guid.NewGuid(),
date,
date,
0,
Nome,
nomeFoto,
Foto,
Instagram,
Facebook,
Endereco,
Contato);
}
}
21 changes: 21 additions & 0 deletions OpenAdm.Application/Dtos/LojaParceira/UpdateLojaParceiraDto.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
using System.ComponentModel.DataAnnotations;

namespace OpenAdm.Application.Dtos.LojaParceira;

public class UpdateLojaParceiraDto
{
public Guid Id { get; set; }
[Required]
[MaxLength(255)]
public string Nome { get; set; } = string.Empty;

[MaxLength(500)]
public string? Instagram { get; set; }
[MaxLength(500)]
public string? Facebook { get; set; }
[MaxLength(500)]
public string? Endereco { get; set; }
[MaxLength(20)]
public string? Contato { get; set; }
public string? Foto { get; set; }
}
15 changes: 15 additions & 0 deletions OpenAdm.Application/Interfaces/ILojasParceirasService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using OpenAdm.Application.Dtos.LojaParceira;
using OpenAdm.Application.Models.LojasParceira;
using OpenAdm.Domain.Model;
using OpenAdm.Infra.Paginacao;

namespace OpenAdm.Application.Interfaces;

public interface ILojasParceirasService
{
Task<PaginacaoViewModel<LojasParceirasViewModel>> GetPaginacaoAsync(PaginacaoLojasParceirasDto paginacaoLojasParceirasDto);
Task<LojasParceirasViewModel> GetLojasParceirasViewModelAsync(Guid id);
Task<LojasParceirasViewModel> CreateLojaParceiraAsync(CreateLojaParceiraDto createLojaParceiraDto);
Task<LojasParceirasViewModel> UpdateLojaParceiraAsync(UpdateLojaParceiraDto updateLojaParceiraDto);
Task DeleteLojaParceiraAsync(Guid id);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using Domain.Pkg.Entities;

namespace OpenAdm.Application.Models.LojasParceira;

public class LojasParceirasViewModel : BaseModel
{
public string Nome { get; set; } = string.Empty;
public string? Foto { get; set; }
public string? Instagram { get; set; }
public string? Facebook { get; set; }
public string? Endereco { get; set; }
public string? Contato { get; set; }

public LojasParceirasViewModel ToModel(LojasParceiras lojasParceiras)
{
Id = lojasParceiras.Id;
DataDeAtualizacao = lojasParceiras.DataDeAtualizacao;
Numero = lojasParceiras.Numero;
DataDeCriacao = lojasParceiras.DataDeCriacao;
Foto = lojasParceiras.Foto;
Instagram = lojasParceiras.Instagram;
Facebook = lojasParceiras.Facebook;
Endereco = lojasParceiras.Endereco;
Contato = lojasParceiras.Contato;
Nome = lojasParceiras.Nome;

return this;
}
}
115 changes: 115 additions & 0 deletions OpenAdm.Application/Services/LojasParceirasService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
using Domain.Pkg.Entities;
using Domain.Pkg.Errors;
using Domain.Pkg.Exceptions;
using OpenAdm.Application.Dtos.LojaParceira;
using OpenAdm.Application.Interfaces;
using OpenAdm.Application.Models.LojasParceira;
using OpenAdm.Domain.Interfaces;
using OpenAdm.Domain.Model;
using OpenAdm.Infra.Azure.Interfaces;
using OpenAdm.Infra.Paginacao;

namespace OpenAdm.Application.Services;

public class LojasParceirasService : ILojasParceirasService
{
private readonly ILojasParceirasRepository _lojasParceirasRepository;
private readonly IUploadImageBlobClient _uploadImageBlobClient;

public LojasParceirasService(ILojasParceirasRepository lojasParceirasRepository, IUploadImageBlobClient uploadImageBlobClient)
{
_lojasParceirasRepository = lojasParceirasRepository;
_uploadImageBlobClient = uploadImageBlobClient;
}

public async Task<LojasParceirasViewModel> CreateLojaParceiraAsync(CreateLojaParceiraDto createLojaParceiraDto)
{
var nomeFoto = string.Empty;
if (!string.IsNullOrWhiteSpace(createLojaParceiraDto.Foto))
{
nomeFoto = $"{Guid.NewGuid()}.jpg";
createLojaParceiraDto.Foto = await _uploadImageBlobClient.UploadImageAsync(createLojaParceiraDto.Foto, nomeFoto);
}

var lojaParceira = createLojaParceiraDto.ToEntity(nomeFoto);

await _lojasParceirasRepository.AddAsync(lojaParceira);

return new LojasParceirasViewModel().ToModel(lojaParceira);
}

public async Task DeleteLojaParceiraAsync(Guid id)
{
var lojaParceira = await GetLojaAsync(id);

if (!string.IsNullOrWhiteSpace(lojaParceira.NomeFoto))
{
await _uploadImageBlobClient.DeleteImageAsync(lojaParceira.NomeFoto);
}

await _lojasParceirasRepository.DeleteAsync(lojaParceira);
}

public async Task<LojasParceirasViewModel> GetLojasParceirasViewModelAsync(Guid id)
{
var lojaParceira = await GetLojaAsync(id);

return new LojasParceirasViewModel().ToModel(lojaParceira);
}

public async Task<PaginacaoViewModel<LojasParceirasViewModel>> GetPaginacaoAsync(PaginacaoLojasParceirasDto paginacaoLojasParceirasDto)
{
var paginacao = await _lojasParceirasRepository.GetPaginacaoLojasParceirasAsync(paginacaoLojasParceirasDto);

return new PaginacaoViewModel<LojasParceirasViewModel>()
{
TotalPage = paginacao.TotalPage,
Values = paginacao
.Values
.Select(x =>
new LojasParceirasViewModel().ToModel(x))
.ToList()
};
}

public async Task<LojasParceirasViewModel> UpdateLojaParceiraAsync(UpdateLojaParceiraDto updateLojaParceiraDto)
{
var lojaParceira = await GetLojaAsync(updateLojaParceiraDto.Id);

var foto = lojaParceira.Foto;
var nomeFoto = lojaParceira.NomeFoto;

if(!string.IsNullOrWhiteSpace(updateLojaParceiraDto.Foto) && !updateLojaParceiraDto.Foto.StartsWith("https://"))
{
if (!string.IsNullOrWhiteSpace(nomeFoto))
{
var resultDeleteFoto = await _uploadImageBlobClient.DeleteImageAsync(nomeFoto);
if (!resultDeleteFoto)
throw new ExceptionApi("Não foi possível excluir a foto da loja, tente novamente mais tarde, ou entre em contato com o suporte!");

nomeFoto = $"{Guid.NewGuid()}.jpg";

foto = await _uploadImageBlobClient.UploadImageAsync(updateLojaParceiraDto.Foto, nomeFoto);
}
}

lojaParceira.Update(
updateLojaParceiraDto.Nome,
nomeFoto,
foto,
updateLojaParceiraDto.Instagram,
updateLojaParceiraDto.Facebook,
updateLojaParceiraDto.Endereco,
updateLojaParceiraDto.Contato);

await _lojasParceirasRepository.UpdateAsync(lojaParceira);

return new LojasParceirasViewModel().ToModel(lojaParceira);
}

private async Task<LojasParceiras> GetLojaAsync(Guid id)
{
return await _lojasParceirasRepository.GetLojaParceiraByIdAsync(id)
?? throw new ExceptionApi(CodigoErrors.RegistroNotFound);
}
}
10 changes: 10 additions & 0 deletions OpenAdm.Domain/Interfaces/ILojasParceirasRepository.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using Domain.Pkg.Entities;
using OpenAdm.Domain.Model;

namespace OpenAdm.Domain.Interfaces;

public interface ILojasParceirasRepository : IGenericRepository<LojasParceiras>
{
Task<PaginacaoViewModel<LojasParceiras>> GetPaginacaoLojasParceirasAsync(FilterModel<LojasParceiras> filterModel);
Task<LojasParceiras?> GetLojaParceiraByIdAsync(Guid id);
}
2 changes: 1 addition & 1 deletion OpenAdm.Domain/OpenAdm.Domain.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Domain.Pkg" Version="1.0.31" />
<PackageReference Include="Domain.Pkg" Version="1.0.34" />
</ItemGroup>

</Project>
2 changes: 2 additions & 0 deletions OpenAdm.Infra/Context/ParceiroContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ public class ParceiroContext(DbContextOptions options, IDomainFactory domainFact
public DbSet<ConfiguracoesDePedido> ConfiguracoesDePedidos { get; set; }
public DbSet<Estoque> Estoques { get; set; }
public DbSet<MovimentacaoDeProduto> MovimentacoesDeProdutos { get; set; }
public DbSet<LojasParceiras> LojasParceiras { get; set; }

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
Expand Down Expand Up @@ -61,5 +62,6 @@ protected override void OnModelCreating(ModelBuilder modelBuilder)
modelBuilder.ApplyConfiguration(new ConfiguracoesDePedidoConfiguration());
modelBuilder.ApplyConfiguration(new EstoqueConfiguration());
modelBuilder.ApplyConfiguration(new MovimentacaoDeProdutoConfiguration());
modelBuilder.ApplyConfiguration(new LojasParceirasConfiguration());
}
}
38 changes: 38 additions & 0 deletions OpenAdm.Infra/EntityConfiguration/LojasParceirasConfiguration.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
using Domain.Pkg.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;

namespace OpenAdm.Infra.EntityConfiguration;

public class LojasParceirasConfiguration : IEntityTypeConfiguration<LojasParceiras>
{
public void Configure(EntityTypeBuilder<LojasParceiras> builder)
{
builder.HasKey(x => x.Id);
builder.Property(x => x.DataDeCriacao)
.IsRequired()
.ValueGeneratedOnAdd()
.HasDefaultValueSql("now()");
builder.Property(x => x.DataDeAtualizacao)
.IsRequired()
.ValueGeneratedOnAddOrUpdate()
.HasDefaultValueSql("now()");
builder.Property(x => x.Numero)
.ValueGeneratedOnAdd();
builder.Property(x => x.NomeFoto)
.HasMaxLength(500);
builder.Property(x => x.Foto)
.HasMaxLength(500);
builder.Property(x => x.Instagram)
.HasMaxLength(500);
builder.Property(x => x.Facebook)
.HasMaxLength(500);
builder.Property(x => x.Endereco)
.HasMaxLength(500);
builder.Property(x => x.Contato)
.HasMaxLength(20);
builder.Property(x => x.Nome)
.IsRequired()
.HasMaxLength(255);
}
}
Loading

0 comments on commit 72e37ea

Please sign in to comment.