This commit is contained in:
Zeeshaun
2026-04-27 10:50:07 -05:00
parent 8b528fa00b
commit b5edd55420
141 changed files with 9602 additions and 0 deletions
@@ -0,0 +1,60 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using LCU.Api.Internal.FileOperations.Extensions;
using LCU.Api.Internal.FileOperations.Services.FileActionServices;
using LCU.Library.Internal.ApiResponse.Models;
using LCU.Library.Internal.Exceptions;
using LCU.Library.Internal.FileOperationsModels.Models;
using LCU.Library.Internal.FileOperationsModels.Models.Requests;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Serilog;
namespace LCU.Api.Internal.FileOperations.Controllers;
[ApiController]
[Route("api/[controller]")]
public class DirectFileInformationController : ControllerBase
{
private readonly IFileSizeService _fileSizeService;
public DirectFileInformationController(IFileSizeService fileSizeService)
{
_fileSizeService = fileSizeService;
}
[HttpPost("GetFileSize")]
[ProducesResponseType(200)]
[ProducesResponseType(typeof(List<string>), 400)]
[ProducesResponseType(500)]
public IActionResult GetFileSize([FromBody] FileSizeRequest request)
{
try
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState.GetErrorMessages());
}
var validateResponse = _fileSizeService.PreQueueValidation(request);
if (!validateResponse.IsSuccessful)
{
return BadRequest($"Request is invalid. Response: {string.Join("\n ", validateResponse.MessageStack.ToArray())}");
}
var response = _fileSizeService.GetFileSize(request);
return Ok(response);
}
catch (ServiceException exception)
{
return StatusCode(StatusCodes.Status500InternalServerError, exception.Message);
}
catch (Exception exception)
{
Log.Error(exception, "Unexpected Exception");
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
}
@@ -0,0 +1,146 @@
using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Serilog;
using LCU.Api.Internal.FileOperations.Services;
using LCU.Api.Internal.FileOperations.Services.FileActionServices;
using LCU.Library.Internal.FileOperationsModels.Models;
using LCU.Library.Internal.Exceptions;
using LCU.Library.Internal.ApiResponse.Models;
namespace LCU.Api.Internal.FileOperations.Controllers;
[ApiController]
[Route("api/[controller]")]
public class DirectFileOperationsController : ControllerBase
{
private readonly IDirectFileOperationsService _directFileOperationsService;
private readonly IActionService<MoveFileRequest> _moveFileService;
private readonly IActionService<WriteFileRequest> _writeFileService;
private readonly IActionService<CreateDirectoryRequest> _createDirectoryRequestService;
private readonly IActionService<UnzipFileRequest> _unzipFileRequestService;
private readonly IActionService<ZipDirectoryRequest> _zipDirectoryRequestService;
private readonly IActionService<DeleteDirectoryRequest> _deleteDirectoryRequestService;
private readonly IActionService<DeleteFileRequest> _deleteFileRequestService;
private readonly IActionService<AppendFileRequest> _appendFileService;
public DirectFileOperationsController(IDirectFileOperationsService directFileOperationsService,
IActionService<MoveFileRequest> moveFileService,
IActionService<WriteFileRequest> writeFileRequest,
IActionService<CreateDirectoryRequest> createDirectoryRequestService,
IActionService<UnzipFileRequest> unzipFileRequestService,
IActionService<ZipDirectoryRequest> zipDirectoryRequestService,
IActionService<DeleteDirectoryRequest> deleteDirectoryRequestService,
IActionService<DeleteFileRequest> deleteFileRequestService,
IActionService<AppendFileRequest> appendFileService)
{
_directFileOperationsService = directFileOperationsService;
_moveFileService = moveFileService;
_writeFileService = writeFileRequest;
_createDirectoryRequestService = createDirectoryRequestService;
_unzipFileRequestService = unzipFileRequestService;
_zipDirectoryRequestService = zipDirectoryRequestService;
_deleteDirectoryRequestService = deleteDirectoryRequestService;
_deleteFileRequestService = deleteFileRequestService;
_appendFileService = appendFileService;
}
[HttpPost("MoveFile")]
[ProducesResponseType(200)]
[ProducesResponseType(typeof(ReturnResponse), 400)]
[ProducesResponseType(500)]
public async Task<IActionResult> MoveFile([FromBody] MoveFileRequest request)
{
return await HandleRequestResponse(request, FileOperationType.Move, _moveFileService);
}
[HttpPost("WriteFile")]
[ProducesResponseType(200)]
[ProducesResponseType(typeof(ReturnResponse), 400)]
[ProducesResponseType(500)]
public async Task<IActionResult> WriteFile([FromBody] WriteFileRequest request)
{
return await HandleRequestResponse(request, FileOperationType.WriteFile, _writeFileService);
}
[HttpPost("CreateDirectory")]
[ProducesResponseType(200)]
[ProducesResponseType(typeof(ReturnResponse), 400)]
[ProducesResponseType(500)]
public async Task<IActionResult> CreateDirectory([FromBody] CreateDirectoryRequest request)
{
return await HandleRequestResponse(request, FileOperationType.CreateDirectory, _createDirectoryRequestService);
}
[HttpPost("UnzipFile")]
[ProducesResponseType(200)]
[ProducesResponseType(typeof(ReturnResponse), 400)]
[ProducesResponseType(500)]
public async Task<IActionResult> UnzipFile([FromBody] UnzipFileRequest request)
{
return await HandleRequestResponse(request, FileOperationType.UnzipFile, _unzipFileRequestService);
}
[HttpPost("ZipDirectory")]
[ProducesResponseType(200)]
[ProducesResponseType(typeof(ReturnResponse), 400)]
[ProducesResponseType(500)]
public async Task<IActionResult> ZipDirectory([FromBody] ZipDirectoryRequest request)
{
return await HandleRequestResponse(request, FileOperationType.ZipDirectory, _zipDirectoryRequestService);
}
[HttpPost("DeleteDirectory")]
[ProducesResponseType(200)]
[ProducesResponseType(typeof(ReturnResponse), 400)]
[ProducesResponseType(500)]
public async Task<IActionResult> DeleteDirectory([FromBody] DeleteDirectoryRequest request)
{
return await HandleRequestResponse(request, FileOperationType.DeleteDirectory, _deleteDirectoryRequestService);
}
[HttpPost("DeleteFile")]
[ProducesResponseType(200)]
[ProducesResponseType(typeof(ReturnResponse), 400)]
[ProducesResponseType(500)]
public async Task<IActionResult> DeleteFile([FromBody] DeleteFileRequest request)
{
return await HandleRequestResponse(request, FileOperationType.Delete, _deleteFileRequestService);
}
[HttpPost("AppendFile")]
[ProducesResponseType(200)]
[ProducesResponseType(typeof(ReturnResponse), 400)]
[ProducesResponseType(500)]
public async Task<IActionResult> AppendFile([FromBody] AppendFileRequest request)
{
return await HandleRequestResponse(request, FileOperationType.AppendFile, _appendFileService);
}
public async Task<IActionResult> HandleRequestResponse<TRequest>(TRequest originalRequest,
FileOperationType operationType,
IActionService<TRequest> service) where TRequest : ReturnResponse
{
try
{
var validateResponse = service.PreQueueValidation(originalRequest);
if (!validateResponse.IsSuccessful)
{
return BadRequest($"Request is invalid. Response: {String.Join("\n ", validateResponse.MessageStack.ToArray())}");
}
var result = await _directFileOperationsService.HandleDirectFileOperationsRequest(originalRequest, operationType);
return Ok(result);
}
catch (ServiceException serviceException)
{
return StatusCode(StatusCodes.Status500InternalServerError, serviceException.Message);
}
catch (Exception exception)
{
Log.Error(exception, "Unexpected Exception");
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
}
@@ -0,0 +1,45 @@
using System;
using System.Linq;
using System.Collections.Generic;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Serilog;
using LCU.Library.Internal.FileOperationsModels.Models;
using LCU.Api.Internal.FileOperations.Services;
namespace LCU.Api.Internal.FileOperations.Controllers;
[ApiController]
[Route("[controller]")]
public class DynamicDirectoryController : ControllerBase
{
private readonly IDynamicDirectoryService _dynamicDirectoryService;
public DynamicDirectoryController(IDynamicDirectoryService dynamicDirectoryService)
{
_dynamicDirectoryService = dynamicDirectoryService;
}
[HttpPost("BuildDirectoryList")]
[ProducesResponseType(201)]
[ProducesResponseType(404)]
[ProducesResponseType(typeof(List<string>), 400)]
[ProducesResponseType(500)]
public IActionResult BuildDirectoryList([FromBody] DynamicDirectoryListRequest request)
{
try
{
var result = _dynamicDirectoryService.BuildDirectoryList(request);
if (result == null || !result.Any())
{
return NotFound();
}
return Ok(result);
}
catch (Exception ex)
{
Log.Error(ex, "Failure Build Dynamic Directory List");
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
}
@@ -0,0 +1,59 @@
using System;
using System.Collections.Generic;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Serilog;
using LCU.Library.Internal.FileOperationsModels.Models;
using LCU.Library.Internal.FileOperationsModels.Shared;
namespace LCU.Api.Internal.FileOperations.Controllers
{
[ApiController]
[Route("[controller]")]
public class DynamicFileController : ControllerBase
{
/// <summary>Gets a list of files based on regex substitution.</summary>
/// <remarks>
/// Example:
/// POST /api/BuildDynamicFileList
/// {
/// "path": "\\\\172.16.13.17\\Reports\\",
/// "filename": "Action_IndirectVehicleLoanSales_date_time.csv",
/// "dynamicFileSettings": {
/// "regexSettings": [
/// {
/// "tag": "date",
/// "regex": "\\d+_\\d+_\\d+"
/// },
/// {
/// "tag": "time",
/// "regex": "\\d+"
/// }],
/// "daysFromToday": 0
/// }
/// }
/// </remarks>
/// <param name="dynamicFileListRequest"></param>
/// <returns></returns>
// POST api/BuildDynamicFileList
[HttpPost("BuildDynamicFileList")]
[ProducesResponseType(201)]
[ProducesResponseType(typeof(List<string>), 400)]
[ProducesResponseType(500)]
public IActionResult BuildDynamicFileList([FromBody] DynamicFileListRequest dynamicFileListRequest)
{
try
{
var fileNames = RegexNameHandler.BuildFileList(dynamicFileListRequest.Path,
dynamicFileListRequest.Filename,
dynamicFileListRequest.DynamicFileSettings);
return Ok(fileNames);
}
catch (Exception ex)
{
Log.Error(ex, "Failure Build Dynamic File List");
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
}
}
@@ -0,0 +1,62 @@
using System;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Serilog;
using LCU.Library.Internal.Exceptions;
using LCU.Api.Internal.FileOperations.Services.ExcelServices;
using LCU.Library.Internal.FileOperationsModels.Models.ExcelModels.Requests;
using LCU.Library.Internal.FileOperationsModels.Models.ExcelModels.Responses;
using LCU.Api.Internal.FileOperations.Extensions;
namespace LCU.Api.Internal.FileOperations.Controllers;
[ApiController]
[Route("api/[controller]")]
public class ExcelController : ControllerBase
{
private readonly IExcelService _excelService;
public ExcelController(IExcelService excelService)
{
_excelService = excelService;
}
/// <remarks>
/// This endpoint is a direct file operations call to extract excel workbook data. The ExcelDataRequest contains
/// the file content in a base64 encoded string for an excel sheet and it will extract all data into a json object.
/// The request also has optional SheetRequests in which a SheetName and specific Rows and Columns can be selected.
///
/// Notes:
/// - FileContent is required.
/// - SheetRequests are optional.
/// - If SheetRequests are added the SheetName is required.
/// - The SheetRequest's Rows and Columns are optional.
/// </remarks>
/// <param name="request"></param>
/// <returns>ExcelDataResponse</returns>
[HttpPost("ExtractExcelWorkBookData")]
[ProducesResponseType(200)]
[ProducesResponseType(typeof(ExcelDataResponse), 400)]
[ProducesResponseType(500)]
public IActionResult ExtractExcelWorkBookData([FromBody] ExcelDataRequest request)
{
try
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState.GetErrorMessages());
}
var requestResponse = _excelService.ExtractExcelWorkBookData(request);
return Ok(requestResponse);
}
catch (ServiceException exception)
{
return StatusCode(StatusCodes.Status500InternalServerError, exception.Message);
}
catch (Exception exception)
{
Log.Error(exception, "Unexpected Exception");
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
}
@@ -0,0 +1,292 @@
using System;
using System.Threading.Tasks;
using System.Collections.Generic;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Serilog;
using LCU.Library.Internal.FileOperationsModels.Models;
using LCU.Library.Internal.Exceptions;
using LCU.Library.Internal.ApiResponse.Models;
using LCU.Api.Internal.FileOperations.Services.QueueServices;
using LCU.Api.Internal.FileOperations.Extensions;
using LCU.Api.Internal.FileOperations.Services;
using LCU.Api.Internal.FileOperations.Services.FileActionServices;
namespace LCU.Api.Internal.FileOperations.Controllers;
[Route("api/[controller]")]
[ApiController]
public class FileOperationsController : ControllerBase
{
private readonly IQueueFileOperationsService _queueFileOperationsService;
private readonly IActionService<MoveFileRequest> _moveFileService;
private readonly IActionService<CopyFileRequest> _copyFileService;
private readonly IActionService<DeleteFileRequest> _deleteFileService;
private readonly IActionService<ModifyFileRequest> _modifyFileService;
private readonly IActionService<RenameFileRequest> _renameFileService;
private readonly IActionService<ZipDirectoryRequest> _zipDirectoryService;
private readonly IActionService<UnzipFileRequest> _unzipFileService;
private readonly IActionService<UnzipPasswordProtectedFileRequest> _unzipPasswordProtectedFileService;
private readonly IActionService<CreateDirectoryRequest> _createDirectoryService;
private readonly IActionService<RenameDirectoryRequest> _renameDirectoryService;
private readonly IActionService<BulkOperationRequest<MoveFileRequest>> _bulkMoveFileService;
private readonly IActionService<EncryptFileDataRequest> _encryptFileDataService;
private readonly IActionService<DecryptFileDataRequest> _decryptFileDataService;
private readonly IActionService<WriteFileRequest> _writeFileDataService;
private readonly IActionService<DeleteDirectoryRequest> _deleteDirectoryService;
private readonly IActionService<DeleteEmptyDirectoryRequest> _deleteEmptyDirectoryService;
private readonly IDirectFileService _directFileService;
public FileOperationsController(IQueueFileOperationsService fileOperationsService,
IActionService<MoveFileRequest> moveFileService,
IActionService<CopyFileRequest> copyFileService,
IActionService<ModifyFileRequest> modifyFileService,
IActionService<DeleteFileRequest> deleteFileService,
IActionService<RenameFileRequest> renameFileService,
IActionService<ZipDirectoryRequest> zipDirectoryService,
IActionService<UnzipFileRequest> unzipFileService,
IActionService<UnzipPasswordProtectedFileRequest> unzipPasswordProtectedFileService,
IActionService<CreateDirectoryRequest> createDirectoryService,
IActionService<RenameDirectoryRequest> renameDirectoryService,
IActionService<BulkOperationRequest<MoveFileRequest>> bulkMoveFileService,
IActionService<EncryptFileDataRequest> encryptFileDataService,
IActionService<DecryptFileDataRequest> decryptFileDataService,
IActionService<WriteFileRequest> writeFileDataService,
IActionService<DeleteDirectoryRequest> deleteDirectoryService,
IActionService<DeleteEmptyDirectoryRequest> deleteEmptyDirectoryService,
IDirectFileService directFileService)
{
_queueFileOperationsService = fileOperationsService;
_moveFileService = moveFileService;
_copyFileService = copyFileService;
_modifyFileService = modifyFileService;
_deleteFileService = deleteFileService;
_renameFileService = renameFileService;
_zipDirectoryService = zipDirectoryService;
_unzipFileService = unzipFileService;
_unzipPasswordProtectedFileService = unzipPasswordProtectedFileService;
_createDirectoryService = createDirectoryService;
_renameDirectoryService = renameDirectoryService;
_bulkMoveFileService = bulkMoveFileService;
_encryptFileDataService = encryptFileDataService;
_decryptFileDataService = decryptFileDataService;
_directFileService = directFileService;
_writeFileDataService = writeFileDataService;
_deleteDirectoryService = deleteDirectoryService;
_deleteEmptyDirectoryService = deleteEmptyDirectoryService;
}
// Get api/{file}
[HttpGet("{filename}")]
[ProducesResponseType(200)]
[ProducesResponseType(400)]
public IActionResult GetFile([FromRoute] string filename)
{
if (string.IsNullOrWhiteSpace(filename))
{
return BadRequest("filename is required");
}
try
{
var result = _directFileService.GetFileBytes(filename);
return new FileContentResult(result, "application/octet-stream");
}
catch (ArgumentException ae)
{
Log.Error(ae, $"Request for bad file path {filename}");
return BadRequest("File path not found");
}
catch (Exception ex)
{
Log.Error(ex, $"Unexpected error retrieving file path {filename}");
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
// POST api/MoveFile
[HttpPost("MoveFile")]
[ProducesResponseType(201)]
[ProducesResponseType(typeof(List<string>), 400)]
[ProducesResponseType(500)]
public async Task<IActionResult> MoveFile([FromBody] MoveFileRequest request)
{
return await HandleRequestResponse(request, FileOperationType.Move, _moveFileService);
}
// POST api/CopyFile
[HttpPost("CopyFile")]
[ProducesResponseType(201)]
[ProducesResponseType(typeof(List<string>), 400)]
[ProducesResponseType(500)]
public async Task<IActionResult> CopyFile([FromBody] CopyFileRequest request)
{
return await HandleRequestResponse(request, FileOperationType.Copy, _copyFileService);
}
// POST api/ModifyFile
[HttpPost("ModifyFile")]
[ProducesResponseType(201)]
[ProducesResponseType(typeof(List<string>), 400)]
[ProducesResponseType(500)]
public async Task<IActionResult> ModifyFile([FromBody] ModifyFileRequest request)
{
return await HandleRequestResponse(request, FileOperationType.Modify, _modifyFileService);
}
// POST api/DeleteFile
[HttpPost("DeleteFile")]
[ProducesResponseType(201)]
[ProducesResponseType(typeof(List<string>), 400)]
[ProducesResponseType(500)]
public async Task<IActionResult> DeleteFile([FromBody] DeleteFileRequest request)
{
return await HandleRequestResponse(request, FileOperationType.Delete, _deleteFileService);
}
// POST api/RenameFile
[HttpPost("RenameFile")]
[ProducesResponseType(201)]
[ProducesResponseType(typeof(List<string>), 400)]
[ProducesResponseType(500)]
public async Task<IActionResult> RenameFile([FromBody] RenameFileRequest request)
{
return await HandleRequestResponse(request, FileOperationType.Rename, _renameFileService);
}
// POST api/ZipDirectory
[HttpPost("ZipDirectory")]
[ProducesResponseType(201)]
[ProducesResponseType(typeof(List<string>), 400)]
[ProducesResponseType(500)]
public async Task<IActionResult> ZipDirectory([FromBody] ZipDirectoryRequest request)
{
return await HandleRequestResponse(request, FileOperationType.ZipDirectory, _zipDirectoryService);
}
// POST api/UnzipFile
[HttpPost("UnzipFile")]
[ProducesResponseType(201)]
[ProducesResponseType(typeof(List<string>), 400)]
[ProducesResponseType(500)]
public async Task<IActionResult> UnzipFile([FromBody] UnzipFileRequest request)
{
return await HandleRequestResponse(request, FileOperationType.UnzipFile, _unzipFileService);
}
// POST api/UnzipPasswordProtectedFile
[HttpPost("UnzipPasswordProtectedFile")]
[ProducesResponseType(201)]
[ProducesResponseType(typeof(List<string>), 400)]
[ProducesResponseType(500)]
public async Task<IActionResult> UnzipPasswordProtectedFile([FromBody] UnzipPasswordProtectedFileRequest request)
{
return await HandleRequestResponse(request, FileOperationType.UnzipPasswordProtectedFile, _unzipPasswordProtectedFileService);
}
// POST api/CreateDirectory
[HttpPost("CreateDirectory")]
[ProducesResponseType(201)]
[ProducesResponseType(typeof(List<string>), 400)]
[ProducesResponseType(500)]
public async Task<IActionResult> CreateDirectory([FromBody] CreateDirectoryRequest request)
{
return await HandleRequestResponse(request, FileOperationType.CreateDirectory, _createDirectoryService);
}
// POST api/RenameDirectory
[HttpPost("RenameDirectory")]
[ProducesResponseType(201)]
[ProducesResponseType(typeof(List<string>), 400)]
[ProducesResponseType(500)]
public async Task<IActionResult> RenameDirectory([FromBody] RenameDirectoryRequest request)
{
return await HandleRequestResponse(request, FileOperationType.RenameDirectory, _renameDirectoryService);
}
// POST api/BulkMoveFile
[HttpPost("BulkMoveFile")]
[ProducesResponseType(201)]
[ProducesResponseType(typeof(List<string>), 400)]
[ProducesResponseType(500)]
public async Task<IActionResult> BulkMoveFile([FromBody] BulkOperationRequest<MoveFileRequest> request)
{
return await HandleRequestResponse(request, FileOperationType.BulkMoveFile, _bulkMoveFileService);
}
// POST api/EncryptFileData
[HttpPost("EncryptFileData")]
[ProducesResponseType(201)]
[ProducesResponseType(typeof(List<string>), 400)]
[ProducesResponseType(500)]
public async Task<IActionResult> EncryptFileData([FromBody] EncryptFileDataRequest request)
{
return await HandleRequestResponse(request, FileOperationType.EncryptFileData, _encryptFileDataService);
}
// POST api/DecryptFileData
[HttpPost("DecryptFileData")]
[ProducesResponseType(201)]
[ProducesResponseType(typeof(List<string>), 400)]
[ProducesResponseType(500)]
public async Task<IActionResult> DecryptFileData([FromBody] DecryptFileDataRequest request)
{
return await HandleRequestResponse(request, FileOperationType.DecryptFileData, _decryptFileDataService);
}
// POST api/WriteFileData
[HttpPost("WriteFileData")]
[ProducesResponseType(201)]
[ProducesResponseType(typeof(List<string>), 400)]
[ProducesResponseType(500)]
public async Task<IActionResult> WriteFileData([FromBody] WriteFileRequest request)
{
return await HandleRequestResponse(request, FileOperationType.WriteFile, _writeFileDataService);
}
[HttpPost("DeleteDirectory")]
[ProducesResponseType(201)]
[ProducesResponseType(typeof(List<string>), 400)]
[ProducesResponseType(500)]
public async Task<IActionResult> DeleteDirectory([FromBody] DeleteDirectoryRequest request)
{
return await HandleRequestResponse(request, FileOperationType.DeleteDirectory, _deleteDirectoryService);
}
[HttpPost("DeleteEmptyDirectory")]
[ProducesResponseType(201)]
[ProducesResponseType(typeof(List<string>), 400)]
[ProducesResponseType(500)]
public async Task<IActionResult> DeleteEmptyDirectory([FromBody] DeleteEmptyDirectoryRequest request)
{
return await HandleRequestResponse(request, FileOperationType.DeleteEmptyDirectory, _deleteEmptyDirectoryService);
}
public async Task<IActionResult> HandleRequestResponse<TRequest>(TRequest originalRequest, FileOperationType operationType, IActionService<TRequest> service) where TRequest : ReturnResponse
{
try
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState.GetErrorMessages());
}
var validateResponse = service.PreQueueValidation(originalRequest);
if (!validateResponse.IsSuccessful)
{
return BadRequest($"Request is invalid. Response: {String.Join("\n ", validateResponse.MessageStack.ToArray())}");
}
await _queueFileOperationsService.QueueFileOperations(originalRequest, operationType);
return Ok();
}
catch (ServiceException)
{
return StatusCode(StatusCodes.Status500InternalServerError);
}
catch (Exception exception)
{
Log.Error(exception, "Unexpected Exception");
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
}
@@ -0,0 +1,141 @@
using System;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Serilog;
using LCU.Library.Internal.FileOperationsModels.Models;
using LCU.Api.Internal.FileOperations.Validations;
using LCU.Api.Internal.FileOperations.Services.FileActionServices;
using System.Collections.Generic;
using System.Threading.Tasks;
using LCU.Api.Internal.FileOperations.Extensions;
using LCU.Library.Internal.Exceptions;
using LCU.Api.Internal.FileOperations.Services.QueueServices;
using LCU.Library.Internal.FileOperationsModels.Models.Requests;
namespace LCU.Api.Internal.FileOperations.Controllers;
[ApiController]
[Route("[controller]")]
public class FileValidationController : ControllerBase
{
private readonly IQueueFileOperationsService _queueFileOperationsService;
private readonly IActionService<ValidateFileRequest> _validateFileService;
private readonly IActionService<ValidateFileSizeInRangeRequest> _validateFileSizeInRangeService;
public FileValidationController(IQueueFileOperationsService fileOperationsService,
IActionService<ValidateFileRequest> validateFileService,
IActionService<ValidateFileSizeInRangeRequest> validateFileSizeInRangeService
)
{
_queueFileOperationsService = fileOperationsService;
_validateFileService = validateFileService;
_validateFileSizeInRangeService = validateFileSizeInRangeService;
}
// POST ValidateFileExists
[HttpPost("ValidateFileExists")]
[ProducesResponseType(200)]
[ProducesResponseType(typeof(bool), 400)]
[ProducesResponseType(500)]
public IActionResult ValidateFileExists([FromBody] string sourceFilePath)
{
try
{
var requestResponse = new RequestResponse();
requestResponse = FileValidation.ValidateFileExists(sourceFilePath, requestResponse);
return Ok(requestResponse.IsSuccessful);
}
catch (Exception exception)
{
Log.Error(exception, "Unexpected Exception");
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
// POST api/QueueValidateFile
[HttpPost("QueueValidateFile")]
[ProducesResponseType(201)]
[ProducesResponseType(typeof(List<string>), 400)]
[ProducesResponseType(500)]
public async Task<IActionResult> ValidateFile([FromBody] ValidateFileRequest request)
{
try
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState.GetErrorMessages());
}
var validateResponse = _validateFileService.PreQueueValidation(request);
if (!validateResponse.IsSuccessful)
{
return BadRequest($"Request is invalid. Response: {String.Join("\n ", validateResponse.MessageStack.ToArray())}");
}
await _queueFileOperationsService.QueueFileOperations(request, FileOperationType.Validate);
return Accepted();
}
catch (ServiceException)
{
return StatusCode(StatusCodes.Status500InternalServerError);
}
catch (Exception exception)
{
Log.Error(exception, "Unexpected Exception");
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
[HttpPost("ValidatePdfPageExists/{path}/{pageNumber:int}")]
[ProducesResponseType(200)]
[ProducesResponseType(typeof(bool), 400)]
[ProducesResponseType(500)]
public IActionResult ValidatePdfPageExists(string path, int pageNumber)
{
try
{
var requestResponse = new RequestResponse();
requestResponse = PdfValidations.ValidatePdfPageExists(requestResponse, path, pageNumber);
return Ok(requestResponse);
}
catch (Exception exception)
{
Log.Error(exception, "Unexpected Exception");
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
// POST api/QueueValidateFileSizeInRange
[HttpPost("QueueValidateFileSizeInRange")]
[ProducesResponseType(201)]
[ProducesResponseType(typeof(List<string>), 400)]
[ProducesResponseType(500)]
public async Task<IActionResult> ValidateFileSizeInRange([FromBody] ValidateFileSizeInRangeRequest request)
{
try
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState.GetErrorMessages());
}
var validateResponse = _validateFileSizeInRangeService.PreQueueValidation(request);
if (!validateResponse.IsSuccessful)
{
return BadRequest($"Request is invalid. Response: {string.Join("\n ", validateResponse.MessageStack.ToArray())}");
}
await _queueFileOperationsService.QueueFileOperations(request, FileOperationType.ValidateFileSizeInRange);
return Accepted();
}
catch (ServiceException)
{
return StatusCode(StatusCodes.Status500InternalServerError);
}
catch (Exception exception)
{
Log.Error(exception, "Unexpected Exception");
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
}
@@ -0,0 +1,51 @@
using System;
using System.Threading.Tasks;
using LCU.Api.Internal.FileOperations.Extensions;
using LCU.Api.Internal.FileOperations.Services.QueueServices;
using LCU.Library.Internal.FileOperationsModels.Models;
using LCU.Library.Internal.ApiResponse.Models;
using LCU.Library.Internal.Exceptions;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Serilog;
namespace LCU.Api.Internal.FileOperations.Controllers;
[ApiController]
[Route("api/[controller]")]
public class IndexFileController : ControllerBase
{
private readonly IQueueFileOperationsService _queueFileOperationsService;
public IndexFileController(IQueueFileOperationsService queueFileOperationsService)
{
_queueFileOperationsService = queueFileOperationsService;
}
[HttpPost("QueueExtractIndexFileData")]
[ProducesResponseType(200)]
[ProducesResponseType(typeof(ReturnResponse), 400)]
[ProducesResponseType(500)]
public async Task<IActionResult> QueueExtractIndexFileData([FromBody] ExtractIndexFileDataRequest request)
{
try
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState.GetErrorMessages());
}
await _queueFileOperationsService.QueueFileOperations(request, FileOperationType.ExtractIndexFileData);
return Accepted();
}
catch (ServiceException exception)
{
return StatusCode(StatusCodes.Status500InternalServerError, exception.Message);
}
catch (Exception exception)
{
Log.Error(exception, "Unexpected Exception");
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
}
@@ -0,0 +1,185 @@
using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Serilog;
using LCU.Api.Internal.FileOperations.Services;
using LCU.Library.Internal.FileOperationsModels.Models;
using LCU.Library.Internal.Exceptions;
using LCU.Library.Internal.FileOperationsModels.Models.HtmlToPdfModels;
using LCU.Api.Internal.FileOperations.Extensions;
using LCU.Api.Internal.FileOperations.Services.QueueServices;
using LCU.Api.Internal.FileOperations.Services.PdfServices;
namespace LCU.Api.Internal.FileOperations.Controllers;
[ApiController]
[Route("api/[controller]")]
public class PdfController : ControllerBase
{
private readonly IQueueFileOperationsService _queueFileOperationsService;
private readonly IPdfParserService _pdfParserService;
private readonly IBatchPdfParserService _batchPdfParserService;
private readonly IDirectFileService _directFileService;
private readonly IHtmlToPdfService _htmlToPdfService;
public PdfController(IQueueFileOperationsService queueFileOperationsService,
IPdfParserService pdfParserService,
IBatchPdfParserService batchPdfParserService,
IDirectFileService directFileService,
IHtmlToPdfService htmlToPdfService)
{
_queueFileOperationsService = queueFileOperationsService;
_batchPdfParserService = batchPdfParserService;
_pdfParserService = pdfParserService;
_directFileService = directFileService;
_htmlToPdfService = htmlToPdfService;
}
[HttpPost("QueueBatchPdfParser")]
[ProducesResponseType(202)]
[ProducesResponseType(400)]
[ProducesResponseType(500)]
public async Task<IActionResult> QueueBatchPdfParser([FromBody] BatchParsePdfRequest request)
{
try
{
var requestResponse = _batchPdfParserService.IsRequestValid(request, new RequestResponse());
if (!requestResponse.IsSuccessful)
{
return BadRequest($"Request is invalid. Response: {String.Join("\n ", requestResponse.MessageStack.ToArray())}");
}
await _queueFileOperationsService.QueueFileOperations(request, FileOperationType.BatchPdfParser);
return Accepted();
}
catch (ServiceException exception)
{
return StatusCode(StatusCodes.Status500InternalServerError, exception.Message);
}
catch (Exception exception)
{
Log.Error(exception, "Unexpected Exception");
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
/// <remarks>
/// This will parse a PDF from a starting page to and a stopping page, save new pdf to RootPath,
/// and returns the PDF name. The PDF name will be set to ParsedPdfname or the default "{pdfParserRequest.PdfName}.{pdfParserRequest.StartingPage}.pdf".
///
/// Notes:
/// - Page numbers range from 1-x.
/// - If PDF exists it will automatically overwrite.
/// - Original PDF can be open at the time of parsing.
/// </remarks>
/// <param name="pdfParserRequest"></param>
/// <returns></returns>
[HttpPost("ParsePdf")]
[ProducesResponseType(200)]
[ProducesResponseType(typeof(ParsePdfRequest), 400)]
[ProducesResponseType(500)]
public IActionResult ParsePdf([FromBody] ParsePdfRequest pdfParserRequest)
{
try
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState.GetErrorMessages());
}
var result = _pdfParserService.ParsePdf(pdfParserRequest);
return Ok(result);
}
catch (ServiceException exception)
{
return StatusCode(StatusCodes.Status500InternalServerError, exception.Message);
}
catch (Exception exception)
{
Log.Error(exception, "Unexpected Exception");
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
[HttpGet("GetPdfContent/{pdfPath}")]
[ProducesResponseType(200)]
[ProducesResponseType(400)]
[ProducesResponseType(500)]
public IActionResult GetPdfContent([FromRoute] string pdfPath)
{
if (string.IsNullOrWhiteSpace(pdfPath))
{
return BadRequest("PDF Path is required");
}
try
{
var result = _directFileService.GetFileBytes(pdfPath);
return new FileContentResult(result, "application/pdf");
}
catch (ArgumentException ae)
{
Log.Error(ae, $"Request for bad PDF path {pdfPath}");
return BadRequest("PDF path not found");
}
catch (Exception ex)
{
Log.Error(ex, $"Unexpected error retrieving PDF path {pdfPath}");
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
/// <remarks>
/// ConvertHmtlToPdf will take the HtmlToPdfRequest and generate a HTML file filling in the tags with the supplied data.
/// It will then utilize Chrome functionality to print a pdf and save it to a location. Finally converting to byte array and returning.
///
/// HtmlToPdfRequest:
/// - HtmlTemplateFilePath: (REQUIRED) File Path of the main html template that the HTML file will start to build.
/// - PdfName: (REQUIRED) What the PDF and HTML files will be called.
/// - KeepHtmlFile: (Defaults = False) Mostly for testing purposes. If set to true it will keep the generated HTML file.
/// - KeepPdfFile: (Defaults = False) Mostly for testing purposes. If set to true it will keep the generated PDF file
/// - HtmlSaveFilePath: (REQUIRED) Location that the generated HTML file will be temporarily (KeepHtmlFile = false) stored.
/// - PdfSaveFilePath: (REQUIRED) Location that the generated PDF file will be temporarily (KeepHtmlFile = false) stored.
/// - BodyTagValues: Tags that will be filled in with supplied values.
/// - TagValues:
/// - Tag: (REQUIRED) Name of the tag in the HTML. In HTML should be surrounded by {}. This tag does not need {}.
/// - Value: (REQUIRED) Value in which will replace the {TagName}.
/// - BodyValueCollections: List of ValueCollections that give us the ability to replace a tag that is associated with a HTML Template. The ValucollectionItems is
/// looped through to generate what will replace the tag. Common use case would be a list of items or a table of items.
/// - CollectionTag: (REQUIRED) Name of the tag in the HTML. In HTML should be surrounded by {}. This tag does not need {}.
/// - CollectionHtmlTemplateFilePath: (REQUIRED) File Path of the collections html template that the HTML file will start to build.
/// - ValueCollectionItems: List of ValueCollectionItems that can be looped through to help build out what the CollectionTag will be replaced with.
/// ValueCollection has a nested ValueCollectionItems, giving the ability to create infinite amount of nested collections within collections.
/// - TagValues: List of TagValues
/// - ValueCollections: List of ValueCollections
///
/// Notes:
/// - In HTML templates tags should be surrounded by braces {TagName}. The request does not need the braces {}.
/// - Any unused tags surrounded by braces will be removed at the end of the process.
/// - Can use \\\\zeus\DataIntegrationsQA\\PDFCreation\\ folder to store templates, generated HTML files, and generated PDF
/// - \\\\zeus\DataIntegrationsQA\\PDFCreation\\Html_Templates
/// - \\\\zeus\DataIntegrationsQA\\PDFCreation\\Html_Drop
/// - \\\\zeus\DataIntegrationsQA\\PDFCreation\\PDF_Drop
/// </remarks>
[HttpPost("ConvertHtmlToPdf")]
[ProducesResponseType(200)]
[ProducesResponseType(400)]
[ProducesResponseType(500)]
public IActionResult ConvertHtmlToPdf([FromBody] HtmlToPdfRequest htmlToPdfRequest)
{
try
{
var result = _htmlToPdfService.ConvertHtmlToPdf(htmlToPdfRequest);
return new FileContentResult(result, "application/pdf");
}
catch (ServiceException exception)
{
return StatusCode(StatusCodes.Status500InternalServerError, exception.Message);
}
catch (Exception exception)
{
Log.Error(exception, "Unexpected Exception");
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
}
@@ -0,0 +1,39 @@
using System;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Http;
using Serilog;
using LCU.Library.Internal.Exceptions;
using LCU.Library.Internal.Status.Services;
namespace LCU.Api.Internal.FileOperations.Controllers;
[ApiController]
[Route("api/[controller]")]
public class StatusController : ControllerBase
{
private readonly IApiHealthCheckService _apiHealthCheckService;
public StatusController(IApiHealthCheckService apiHealthCheckService)
{
_apiHealthCheckService = apiHealthCheckService;
}
[HttpGet]
[ProducesResponseType(200)]
[ProducesResponseType(500)]
public IActionResult Get()
{
try
{
return Ok(_apiHealthCheckService.CheckApiHealthAndBuildEnvironmentView());
}
catch (ServiceException exception)
{
return StatusCode(StatusCodes.Status500InternalServerError, exception.Message);
}
catch (Exception exception)
{
Log.Error(exception, "Unexpected Exception");
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
}