From c84187270b3159bacac06fd3db20d08831c4e321 Mon Sep 17 00:00:00 2001 From: Felix Morales Date: Fri, 22 Sep 2023 17:56:04 -0500 Subject: [PATCH] feature, creacion de endpoint para consultar archivos de facturacion pendientes de procesar --- Contracts/Utils/IFileManagerRepository.cs | 3 +- Controllers/AuthController.cs | 2 +- Controllers/FileManagerController.cs | 48 +++++++++++++++++++++++ Repository/Utils/FileManagerRepository.cs | 25 ++++++++++++ 4 files changed, 76 insertions(+), 2 deletions(-) diff --git a/Contracts/Utils/IFileManagerRepository.cs b/Contracts/Utils/IFileManagerRepository.cs index 5bc1a8c..236cd1c 100644 --- a/Contracts/Utils/IFileManagerRepository.cs +++ b/Contracts/Utils/IFileManagerRepository.cs @@ -10,6 +10,7 @@ namespace CORRESPONSALBackend.Contracts.Utils public Task getFileById(long id); public Task deleteFileByProcess(long id, int Proceso); public Task UpdateFileNameById(long id, string newFileName); - + public Task> GetFilesByProcessId(int process); + public Task UpdateFileProcessById(long fileId, int process); } } \ No newline at end of file diff --git a/Controllers/AuthController.cs b/Controllers/AuthController.cs index d9cab4b..08a7f22 100644 --- a/Controllers/AuthController.cs +++ b/Controllers/AuthController.cs @@ -61,7 +61,7 @@ namespace CORRESPONSALBackend.Controllers _config["Jwt:Issuer"], _config["Jwt:Audience"], claims, - expires: DateTime.UtcNow.AddHours(Int32.Parse(_config["Jwt:ExpirationHours"])), + expires: _userData.Usuario.Contains("Agente") ? DateTime.UtcNow.AddHours(168) : DateTime.UtcNow.AddHours(Int32.Parse(_config["Jwt:ExpirationHours"])), //expires: DateTime.UtcNow.AddMinutes(5), signingCredentials: signIn); diff --git a/Controllers/FileManagerController.cs b/Controllers/FileManagerController.cs index 6286903..fdd2358 100644 --- a/Controllers/FileManagerController.cs +++ b/Controllers/FileManagerController.cs @@ -236,5 +236,53 @@ namespace CORRESPONSALBackend.Controllers } return new OkObjectResult(new { respuesta = "Se elimino el registro" }); } + + [HttpGet("UnprocessedTextFiles")] + public async Task GetUnprocessedTextFilesZip(){ + try{ + var unprocessedFiles = await _Repo.GetFilesByProcessId(31);//Se obtiene el listado de archivos que no se han procesado + if(unprocessedFiles.Count() > 0){ + FilePaths4Process unprocessedFilesRelativePath = await _RepoRelativePath.getPaths4ProcessById(31);//Se obtiene la ruta relativa de los archivos sin procesar + FilePaths4Process processedFilesRelativePath = await _RepoRelativePath.getPaths4ProcessById(35);//Se obtiene la ruta relativa de los archivos procesados + var unprocessedFilesPath = RootPathCorresponsales + unprocessedFilesRelativePath.Path;//Se genera la ruta completa de los archivos sin procesar + var processedFilesPath = RootPathCorresponsales + processedFilesRelativePath.Path;//Se genera la ruta completa de los archivos procesados + string zipName = $"ZippedFilesToProcess_{DateTime.Now:yyyyMMddHHmmss}.zip"; //Se crea el nombre del zip + System.IO.Compression.ZipFile.CreateFromDirectory(unprocessedFilesPath, processedFilesPath+zipName);//Se comprime el folder de los archivos sin procesar. + if(System.IO.File.Exists(processedFilesPath + zipName))//Se valida que se haya creado el archivo zip + { + byte[] zipBytes = System.IO.File.ReadAllBytes(processedFilesPath + zipName); + MemoryStream zipStream = new MemoryStream(zipBytes);//Se obtiene el contenido del zip + if(zipStream.Length > 0)//Se valida que el zip pese mas de 0 bytes + { + foreach(var unprocessedFile in unprocessedFiles)//se recorren los archivos que no han sido procesados + { + if(System.IO.File.Exists(unprocessedFilesPath+unprocessedFile.NombreArchivo))//Se valida si el archivo actual existe + { + byte[] txtBytes = System.IO.File.ReadAllBytes(unprocessedFilesPath + unprocessedFile.NombreArchivo); + MemoryStream txtStream = new MemoryStream(txtBytes);//Se obtiene el contenido del archivo actual que no ha sido procesado + using(var processedFileStream = System.IO.File.Create(processedFilesPath + unprocessedFile.NombreArchivo))//Se crea un nuevo archivo en la ruta de los procesados con el nombre del archivo sin procesar + { + await txtStream.CopyToAsync(processedFileStream);//Se copia el contenido del archivo sin procesar al nuevo archivo en la ruta de los procesados. + System.IO.File.Delete(unprocessedFilesPath + unprocessedFile.NombreArchivo);//Se borra el archivo en la ruta de los no procesados. + await _Repo.UpdateFileProcessById(unprocessedFile.id, 32);//Se actualiza el proceso en el log al archivo actual. + } + }//Deberia borrar el registro de la BD del archivo que no existe? + } + System.IO.File.Delete(processedFilesPath + zipName);//Se borra el archivo zip. + return File(zipStream, "application/zip", zipName);//Se envia como respuesta el contenido del archivo zip. + }else{ + System.IO.File.Delete(processedFilesPath + zipName);//Se borra el archivo zip. + throw new Exception("Ocurrio un error al comprimir los archivos de texto. Intentelo de nuevo."); + } + }else{ + throw new Exception("Ocurrio un error al comprimir los archivos de texto. Intentelo de nuevo."); + } + }else{ + return new OkObjectResult( new {respuesta = "Sin archivos por procesar pro el momento"}); + } + }catch(Exception ex){ + return new BadRequestObjectResult(new {respuesta = ex.Message}); + } + } } } \ No newline at end of file diff --git a/Repository/Utils/FileManagerRepository.cs b/Repository/Utils/FileManagerRepository.cs index bdbb2cd..4248a94 100644 --- a/Repository/Utils/FileManagerRepository.cs +++ b/Repository/Utils/FileManagerRepository.cs @@ -97,5 +97,30 @@ namespace CORRESPONSALBackend.Repository.Utils commandType: CommandType.StoredProcedure); return entrada.FirstOrDefault(); } + + public async Task> GetFilesByProcessId(int process) + { + string query = "[Utils.FileManager.GetFilesByProcessId]"; + using var connection = _context.CreateConnection(); + var entrada = await connection.QueryAsync(query, new + { + @process = process + }, + commandType: CommandType.StoredProcedure); + return entrada.ToList(); + } + + public async Task UpdateFileProcessById(long fileId, int process) + { + string query = "[Utils.FileManager.UpdateProcessById]"; + using var connection = _context.CreateConnection(); + var entrada = await connection.QueryAsync(query, new + { + @id = fileId, + @process = process + }, + commandType: CommandType.StoredProcedure); + return entrada.FirstOrDefault(); + } } } \ No newline at end of file