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";
}
}