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 _moveFileService; private readonly IActionService _writeFileService; private readonly IActionService _createDirectoryRequestService; private readonly IActionService _unzipFileRequestService; private readonly IActionService _zipDirectoryRequestService; private readonly IActionService _deleteDirectoryRequestService; private readonly IActionService _deleteFileRequestService; private readonly IActionService _appendFileService; public DirectFileOperationsController(IDirectFileOperationsService directFileOperationsService, IActionService moveFileService, IActionService writeFileRequest, IActionService createDirectoryRequestService, IActionService unzipFileRequestService, IActionService zipDirectoryRequestService, IActionService deleteDirectoryRequestService, IActionService deleteFileRequestService, IActionService 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 MoveFile([FromBody] MoveFileRequest request) { return await HandleRequestResponse(request, FileOperationType.Move, _moveFileService); } [HttpPost("WriteFile")] [ProducesResponseType(200)] [ProducesResponseType(typeof(ReturnResponse), 400)] [ProducesResponseType(500)] public async Task WriteFile([FromBody] WriteFileRequest request) { return await HandleRequestResponse(request, FileOperationType.WriteFile, _writeFileService); } [HttpPost("CreateDirectory")] [ProducesResponseType(200)] [ProducesResponseType(typeof(ReturnResponse), 400)] [ProducesResponseType(500)] public async Task CreateDirectory([FromBody] CreateDirectoryRequest request) { return await HandleRequestResponse(request, FileOperationType.CreateDirectory, _createDirectoryRequestService); } [HttpPost("UnzipFile")] [ProducesResponseType(200)] [ProducesResponseType(typeof(ReturnResponse), 400)] [ProducesResponseType(500)] public async Task UnzipFile([FromBody] UnzipFileRequest request) { return await HandleRequestResponse(request, FileOperationType.UnzipFile, _unzipFileRequestService); } [HttpPost("ZipDirectory")] [ProducesResponseType(200)] [ProducesResponseType(typeof(ReturnResponse), 400)] [ProducesResponseType(500)] public async Task ZipDirectory([FromBody] ZipDirectoryRequest request) { return await HandleRequestResponse(request, FileOperationType.ZipDirectory, _zipDirectoryRequestService); } [HttpPost("DeleteDirectory")] [ProducesResponseType(200)] [ProducesResponseType(typeof(ReturnResponse), 400)] [ProducesResponseType(500)] public async Task DeleteDirectory([FromBody] DeleteDirectoryRequest request) { return await HandleRequestResponse(request, FileOperationType.DeleteDirectory, _deleteDirectoryRequestService); } [HttpPost("DeleteFile")] [ProducesResponseType(200)] [ProducesResponseType(typeof(ReturnResponse), 400)] [ProducesResponseType(500)] public async Task DeleteFile([FromBody] DeleteFileRequest request) { return await HandleRequestResponse(request, FileOperationType.Delete, _deleteFileRequestService); } [HttpPost("AppendFile")] [ProducesResponseType(200)] [ProducesResponseType(typeof(ReturnResponse), 400)] [ProducesResponseType(500)] public async Task AppendFile([FromBody] AppendFileRequest request) { return await HandleRequestResponse(request, FileOperationType.AppendFile, _appendFileService); } public async Task HandleRequestResponse(TRequest originalRequest, FileOperationType operationType, IActionService 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); } } }