using System; using System.Threading.Tasks; using FrameworkBLL.GOP; using GB5Shared.DTO.Framework.Login; using GB5Shared.DTO.Framework.ResponseStandard; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using static GB5Shared.GB5Constant.Constant; namespace FrameworkSL.Controllers.GOP { /// /// GOP File Upload Controller /// /// POST UploadFile — accepts any file (JSON / TXT / CSV / Excel) + SourceType, /// parses each record and submits it as a GOP execution. /// Returns a per-row result summary immediately; /// actual execution runs asynchronously via the worker engine. /// [ApiController] [Route("[controller]")] public class GopFileUploadService : ControllerBase { private readonly IGopFileUploadBLL _IGopFileUploadBLL; public GopFileUploadService(IGopFileUploadBLL IGopFileUploadBLL) { _IGopFileUploadBLL = IGopFileUploadBLL; } /// /// Upload a file and submit each record as a GOP execution. /// /// Supported formats: .json .txt .csv .xlsx .xls /// /// - JSON / TXT : single object → 1 execution; array / NDJSON → N executions /// - CSV : header row + data rows → one execution per row /// - Excel : first sheet, header row + data rows → one execution per row /// /// Returns 202 Accepted with QueueId + ExecutionId per row. /// [HttpPost("UploadFile")] public async Task> UploadFile( [FromForm] GopFileUploadRequestDTO request, [FromHeader(Name = "Login")] string LoginDTOJson) { var LoginDTO = JsonConvert.DeserializeObject(LoginDTOJson); try { string env = string.IsNullOrWhiteSpace(request.Environment) ? "PROD" : request.Environment; var result = await _IGopFileUploadBLL.UploadAndSubmit(request.File!, request.SourceType!, env, LoginDTO!); return await GB5Shared.ResponseStandard.Response.CreateSuccessResponse( result, CacheKeyLevel.NOT_REQUIRED, LoginDTO!); } catch (Exception ex) { return await GB5Shared.ResponseStandard.Response.CreateExceptionError( ex, CacheKeyLevel.NOT_REQUIRED, LoginDTO!, ex.Message, 500); } } } public class GopFileUploadRequestDTO { public IFormFile? File { get; set; } public string? SourceType { get; set; } public string? Environment { get; set; } = "PROD"; } }