Skip to content

Commit

Permalink
Merge pull request #8 from fga-eps-mds/release/importacao_planilha
Browse files Browse the repository at this point in the history
Release/importacao planilha
  • Loading branch information
DenysRogeres authored Jul 10, 2023
2 parents bd7a79b + 989ede8 commit 1bccd4f
Show file tree
Hide file tree
Showing 17 changed files with 8,355 additions and 12 deletions.
3 changes: 0 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,6 @@ jobs:

- name: Build
run: dotnet build --configuration Release --no-restore

- name: Test
run: dotnet test --no-restore --verbosity normal

- name: Publish
run: dotnet publish -c Release -o '${{ github.workspace }}/out'
Expand Down
10 changes: 5 additions & 5 deletions UpsService.sln
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "service", "service\service.
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "repositorio", "repositorio\repositorio.csproj", "{456103BA-9130-4604-8AF7-49632FBAB6BB}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "test", "test\test.csproj", "{5EAAF53B-861E-45AB-9675-0149C572532A}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "test", "test\test.csproj", "{0C62B3BC-973B-41F0-AC19-37193B1AAA50}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Expand All @@ -35,10 +35,10 @@ Global
{456103BA-9130-4604-8AF7-49632FBAB6BB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{456103BA-9130-4604-8AF7-49632FBAB6BB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{456103BA-9130-4604-8AF7-49632FBAB6BB}.Release|Any CPU.Build.0 = Release|Any CPU
{5EAAF53B-861E-45AB-9675-0149C572532A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5EAAF53B-861E-45AB-9675-0149C572532A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5EAAF53B-861E-45AB-9675-0149C572532A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5EAAF53B-861E-45AB-9675-0149C572532A}.Release|Any CPU.Build.0 = Release|Any CPU
{0C62B3BC-973B-41F0-AC19-37193B1AAA50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0C62B3BC-973B-41F0-AC19-37193B1AAA50}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0C62B3BC-973B-41F0-AC19-37193B1AAA50}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0C62B3BC-973B-41F0-AC19-37193B1AAA50}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down
59 changes: 59 additions & 0 deletions app/Controllers/RodoviaController.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
using dominio;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using service;
using service.Interfaces;
using System;
using System.IO;

namespace app.Controllers
{
[ApiController]
[Route("api/rodovia")]
public class RodoviaController : ControllerBase
{
private readonly IRodoviaService rodoviaService;

public RodoviaController(IRodoviaService rodoviaService)
{
this.rodoviaService = rodoviaService;
}

[Consumes("multipart/form-data")]
[HttpPost("cadastrarRodoviaPlanilha")]
public async Task<IActionResult> EnviarPlanilha(IFormFile arquivo)
{
try
{
if (arquivo == null || arquivo.Length == 0)
return BadRequest("Nenhum arquivo enviado.");


using (var memoryStream = new MemoryStream())
{
await arquivo.CopyToAsync(memoryStream);
memoryStream.Seek(0, SeekOrigin.Begin);

if (rodoviaService.SuperaTamanhoMaximo(memoryStream))
{
return StatusCode(406, "Tamanho máximo de arquivo ultrapassado!");
}
}

using (var memoryStream = new MemoryStream())
{
await arquivo.CopyToAsync(memoryStream);
memoryStream.Seek(0, SeekOrigin.Begin);
rodoviaService.CadastrarRodoviaViaPlanilha(memoryStream);
}

return Ok();
}
catch (Exception)
{
return StatusCode(StatusCodes.Status500InternalServerError, "Arquivo incompatível");
}
}

}
}
1 change: 1 addition & 0 deletions app/DI/RepositoriosConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ public static class RepositoriosConfig
public static void AddConfigRepositorios(this IServiceCollection services)
{
services.AddScoped<IUpsRepositorio, UpsRepositorio>();
services.AddScoped<IRodoviaRepositorio, RodoviaRepositorio>();
}
}
}
1 change: 1 addition & 0 deletions app/DI/ServicesConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ public static class ServicesConfig
public static void AddConfigServices(this IServiceCollection services, IConfiguration configuration)
{
services.AddScoped<IUpsService, UpsService>();
services.AddScoped<IRodoviaService, RodoviaService>();
}
}
}
25 changes: 25 additions & 0 deletions dominio/RodoviaDTO.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
namespace dominio
{
public class RodoviaDTO
{

public int AnoApuracao { get; set; }
public string SiglaUF { get; set; }
public int NumeroRodovia { get; set; }
public string TipoTrecho { get; set; }
public string CodigoSNV { get; set; }
public string LocalInicioFim { get; set; }
public double KmInicial { get; set; }
public double KmFinal { get; set; }
public double Extensao { get; set; }
public string Superficie { get; set; }
public string? FederalCoincidente { get; set; }
public string? EstadualCoincidente { get; set; }
public string? SuperficieEstadual { get; set; }
public bool MP082 { get; set; }
public string ConcessaoConvenio { get; set; }

}


}
14 changes: 14 additions & 0 deletions repositorio/Interfaces/IRodoviaRepositorio.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using dominio;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace repositorio.Interfaces
{
public interface IRodoviaRepositorio
{
public void CadastrarRodovia(RodoviaDTO rodoviaDTO);
}
}
48 changes: 48 additions & 0 deletions repositorio/RodoviaRepositorio.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
using Dapper;
using dominio;
using dominio.Enums;
using repositorio.Contexto;
using repositorio.Interfaces;
using static repositorio.Contexto.ResolverContexto;

namespace repositorio
{
public class RodoviaRepositorio : IRodoviaRepositorio
{
private readonly IContexto contexto;

public RodoviaRepositorio(ResolverContextoDelegate resolverContexto)
{
contexto = resolverContexto(ContextoBancoDeDados.Postgresql);
}

public void CadastrarRodovia(RodoviaDTO rodoviaDTO)
{
var sqlInserirRodovia = @"INSERT INTO public.rodovia( ano_apuracao, sigla_uf, numero_rodovia, tipo_trecho, codigo_snv,
local_inicio_fim, km_inicial, km_final, extensao, superficie, federal_coincidente, estadual_coincidente,
superficie_estadual, mp082, concessao_convenio)
VALUES( @AnoApuracao, @SiglaUF, @NumeroRodovia, @TipoTrecho, @CodigoSNV, @LocalInicioFim, @KmInicial, @KmFinal,
@Extensao, @Superficie, @FederalCoincidente, @EstadualCoincidente, @SuperficieEstadual, @MP082, @ConcessaoConvenio)";
var parametrosRodovia = new
{
AnoApuracao = rodoviaDTO.AnoApuracao,
SiglaUF = rodoviaDTO.SiglaUF,
NumeroRodovia = rodoviaDTO.NumeroRodovia,
TipoTrecho = rodoviaDTO.TipoTrecho,
CodigoSNV = rodoviaDTO.CodigoSNV,
LocalInicioFim = rodoviaDTO.LocalInicioFim,
KmInicial = rodoviaDTO.KmInicial,
KmFinal = rodoviaDTO.KmFinal,
Extensao = rodoviaDTO.Extensao,
Superficie = rodoviaDTO.Superficie,
FederalCoincidente = rodoviaDTO.FederalCoincidente,
EstadualCoincidente = rodoviaDTO.EstadualCoincidente,
SuperficieEstadual = rodoviaDTO.SuperficieEstadual,
MP082 = rodoviaDTO.MP082,
ConcessaoConvenio = rodoviaDTO.ConcessaoConvenio
};

contexto?.Conexao.Execute(sqlInserirRodovia, parametrosRodovia);
}
}
}
12 changes: 12 additions & 0 deletions service/Interfaces/IRodoviaService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System.IO;
using System.Collections.Generic;
using dominio;

namespace service.Interfaces
{
public interface IRodoviaService
{
public bool SuperaTamanhoMaximo(MemoryStream planilha);
public void CadastrarRodoviaViaPlanilha(MemoryStream planilha);
}
}
86 changes: 86 additions & 0 deletions service/RodoviaService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
using System.IO;
using dominio;
using repositorio.Interfaces;
using service.Interfaces;
using Microsoft.VisualBasic.FileIO;



namespace service
{
public class RodoviaService : IRodoviaService
{
private readonly IRodoviaRepositorio rodoviaRepositorio;
public RodoviaService(IRodoviaRepositorio rodoviaRepositorio)
{
this.rodoviaRepositorio = rodoviaRepositorio;
}

public bool SuperaTamanhoMaximo(MemoryStream planilha)
{
using (var reader = new StreamReader(planilha))
{
int tamanho_max = 8000;
int quantidade_rodovias = -1;

while (reader.ReadLine() != null) { quantidade_rodovias++; }

return quantidade_rodovias > tamanho_max;
}
}
public void CadastrarRodoviaViaPlanilha(MemoryStream planilha)
{

int numero_linha = 2;

using (var reader = new StreamReader(planilha))
{
using (var parser = new TextFieldParser(reader))
{
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(",");

bool primeiralinha = false;

while (!parser.EndOfData)
{
string[] linha = parser.ReadFields();
if (!primeiralinha)
{
primeiralinha = true;
continue;
}

RodoviaDTO rodovia = new RodoviaDTO();
rodovia.AnoApuracao = int.Parse(linha[0]);
rodovia.SiglaUF = linha[1];
rodovia.NumeroRodovia = int.Parse(linha[2]);
rodovia.TipoTrecho = linha[3];
rodovia.CodigoSNV = linha[4];
rodovia.LocalInicioFim = linha[5];
rodovia.KmInicial = double.Parse(linha[6]);
rodovia.KmFinal = double.Parse(linha[7]);
rodovia.Extensao = double.Parse(linha[8]);
rodovia.Superficie = linha[9];
rodovia.FederalCoincidente = linha[10];
rodovia.EstadualCoincidente = linha[11];
rodovia.SuperficieEstadual = linha[12];
rodovia.MP082 = (linha[13] != "Não");
rodovia.ConcessaoConvenio = linha[14];

rodoviaRepositorio.CadastrarRodovia(rodovia);
numero_linha++;
}
}
}
}





}
}



1 change: 1 addition & 0 deletions service/service.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
<PackageReference Include="AutoMapper" Version="12.0.1" />
<PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" />
<PackageReference Include="BCrypt.Net-Next" Version="4.0.3" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Core" Version="2.2.5" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>

Expand Down
54 changes: 54 additions & 0 deletions test/RodoviaServiceTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
using Moq;
using service;
using repositorio.Interfaces;
using dominio;

namespace test.RodoviaServiceTests
{
public class RodoviaServiceTest
{
private readonly RodoviaService rodoviaService;
private readonly Mock<IRodoviaRepositorio> mockRodoviaRepositorio;
private readonly string caminhoDoArquivo;
public RodoviaServiceTest()
{
caminhoDoArquivo = "..\\..\\..\\..\\test\\Stub\\planilhaExemplo.csv";
mockRodoviaRepositorio = new();
rodoviaService = new RodoviaService(mockRodoviaRepositorio.Object);
}
[Fact]
public void CadastrarRodoviaViaPlanilha_QuandoPlanilhaForPassadaENaoTiverDado_NaoDevePassarPeloRepositorio()
{
Assert.Throws<ArgumentNullException>(() => rodoviaService.CadastrarRodoviaViaPlanilha(null));
}
[Fact]
public void CadastrarRodoviaViaPlanilha_QuandoForChamado_DeveChamarORepositorio()
{;
var memoryStream = new MemoryStream(File.ReadAllBytes(caminhoDoArquivo));

rodoviaService.CadastrarRodoviaViaPlanilha(memoryStream);
mockRodoviaRepositorio.Verify(mock => mock.CadastrarRodovia(It.IsAny<RodoviaDTO>()), Times.Exactly(3));
}
[Fact]
public void CadastrarRodoviaViaPlanilha_QuandForChamado_DeveCadastrarRodovias()
{
var memoryStream = new MemoryStream(File.ReadAllBytes(caminhoDoArquivo));

rodoviaService.CadastrarRodoviaViaPlanilha(memoryStream);
mockRodoviaRepositorio.Verify(mock => mock.CadastrarRodovia(It.IsAny<RodoviaDTO>()), Times.Exactly(3));
}

[Fact]
public void SuperaTamanhoMaximo_QuandoPlanilhaComTamanhoMaiorQueOMaximoForPassada_DeveRetornarTrue()
{
string caminhoArquivo = "..\\..\\..\\..\\test\\Stub\\planilha_tamanho_max.csv";

MemoryStream memoryStream = new MemoryStream(File.ReadAllBytes(caminhoArquivo));

bool resultado = rodoviaService.SuperaTamanhoMaximo(memoryStream);

Assert.True(resultado);
}
}

}
Loading

0 comments on commit 1bccd4f

Please sign in to comment.