using System;
using System.Threading.Tasks;
using FrameworkBLL.GOP;
using GB5Shared.DTO.Framework.Login;
using GB5Shared.DTO.Framework.ResponseStandard;
using GB5Shared.DTO.GOP;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using static GB5Shared.GB5Constant.Constant;
namespace FrameworkSL.Controllers.GOP
{
///
/// GOP Queue & Execution Controller
///
/// POST SubmitExecution — resolve binding → enqueue → fire worker (returns immediately)
/// GET GetExecutionStatus — header + state-log for a given executionId
/// GET GetExecutionNodeLogs — per-node attempt detail
/// GET GetQueueDashboard — status counts across all queues
/// GET GetDeadLetters — unresolved DLQ entries
/// POST ResolveDeadLetter — mark a DLQ entry resolved
/// POST OpenRemediation — open a manual remediation case
/// POST ResolveRemediation — close a remediation case
/// GET GetOpenRemediations — all Open/InProgress cases
///
[ApiController]
[Route("[controller]")]
public class GopQueueService : ControllerBase
{
private readonly IGopQueueBLL _IGopQueueBLL;
public GopQueueService(IGopQueueBLL IGopQueueBLL)
{
_IGopQueueBLL = IGopQueueBLL;
}
// ── Submit ────────────────────────────────────────────────
///
/// Resolves the source binding, enqueues the execution, and fires the worker.
/// Returns QueueId + ExecutionId immediately (202 Accepted pattern).
///
[HttpPost("SubmitExecution")]
public async Task> SubmitExecution(
[FromBody] GopSubmitRequestDTO Request,
[FromHeader(Name = "Login")] string LoginDTOJson)
{
var LoginDTO = JsonConvert.DeserializeObject(LoginDTOJson);
try
{
var result = await _IGopQueueBLL.SubmitExecution(Request, 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);
}
}
// ── Query ─────────────────────────────────────────────────
/// Returns execution header + state-log for a given ExecutionId.
[HttpGet("GetExecutionStatus")]
public async Task> GetExecutionStatus(
int ExecutionId,
[FromHeader(Name = "Login")] string LoginDTOJson)
{
var LoginDTO = JsonConvert.DeserializeObject(LoginDTOJson);
try
{
var result = await _IGopQueueBLL.GetExecutionStatus(ExecutionId, 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);
}
}
/// Returns all node-log attempts for a given ExecutionId.
[HttpGet("GetExecutionNodeLogs")]
public async Task> GetExecutionNodeLogs(
int ExecutionId,
[FromHeader(Name = "Login")] string LoginDTOJson)
{
var LoginDTO = JsonConvert.DeserializeObject(LoginDTOJson);
try
{
var result = await _IGopQueueBLL.GetExecutionNodeLogs(ExecutionId, 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);
}
}
/// Returns queue status counts (dashboard summary).
[HttpGet("GetQueueDashboard")]
public async Task> GetQueueDashboard(
[FromHeader(Name = "Login")] string LoginDTOJson)
{
var LoginDTO = JsonConvert.DeserializeObject(LoginDTOJson);
try
{
var result = await _IGopQueueBLL.GetQueueDashboard(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);
}
}
// ── Dead Letter ───────────────────────────────────────────
/// Returns all unresolved dead-letter entries for the client.
[HttpGet("GetDeadLetters")]
public async Task> GetDeadLetters(
[FromHeader(Name = "Login")] string LoginDTOJson)
{
var LoginDTO = JsonConvert.DeserializeObject(LoginDTOJson);
try
{
var result = await _IGopQueueBLL.GetDeadLetters(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);
}
}
/// Marks a dead-letter entry as resolved.
[HttpPost("ResolveDeadLetter")]
public async Task> ResolveDeadLetter(
int DlqId,
string ResolvedBy,
[FromHeader(Name = "Login")] string LoginDTOJson)
{
var LoginDTO = JsonConvert.DeserializeObject(LoginDTOJson);
try
{
await _IGopQueueBLL.ResolveDeadLetter(DlqId, ResolvedBy, LoginDTO!);
return await GB5Shared.ResponseStandard.Response.CreateSuccessResponse(
$"DLQ entry {DlqId} resolved.", CacheKeyLevel.NOT_REQUIRED, LoginDTO!);
}
catch (Exception ex)
{
return await GB5Shared.ResponseStandard.Response.CreateExceptionError(
ex, CacheKeyLevel.NOT_REQUIRED, LoginDTO!, ex.Message, 500);
}
}
// ── Remediation ───────────────────────────────────────────
/// Opens a manual remediation case for a failed execution node.
[HttpPost("OpenRemediation")]
public async Task> OpenRemediation(
[FromBody] GopOpenRemediationRequestDTO Request,
[FromHeader(Name = "Login")] string LoginDTOJson)
{
var LoginDTO = JsonConvert.DeserializeObject(LoginDTOJson);
try
{
int remId = await _IGopQueueBLL.OpenRemediation(Request, LoginDTO!);
return await GB5Shared.ResponseStandard.Response.CreateSuccessResponse(
new { RemediationId = remId, Message = "Remediation case opened." },
CacheKeyLevel.NOT_REQUIRED, LoginDTO!);
}
catch (Exception ex)
{
return await GB5Shared.ResponseStandard.Response.CreateExceptionError(
ex, CacheKeyLevel.NOT_REQUIRED, LoginDTO!, ex.Message, 500);
}
}
/// Resolves (closes) an open remediation case.
[HttpPost("ResolveRemediation")]
public async Task> ResolveRemediation(
[FromBody] GopResolveRemediationRequestDTO Request,
[FromHeader(Name = "Login")] string LoginDTOJson)
{
var LoginDTO = JsonConvert.DeserializeObject(LoginDTOJson);
try
{
await _IGopQueueBLL.ResolveRemediation(Request, LoginDTO!);
return await GB5Shared.ResponseStandard.Response.CreateSuccessResponse(
$"Remediation {Request.RemediationId} resolved.",
CacheKeyLevel.NOT_REQUIRED, LoginDTO!);
}
catch (Exception ex)
{
return await GB5Shared.ResponseStandard.Response.CreateExceptionError(
ex, CacheKeyLevel.NOT_REQUIRED, LoginDTO!, ex.Message, 500);
}
}
/// Returns all Open/InProgress remediation cases for the client.
[HttpGet("GetOpenRemediations")]
public async Task> GetOpenRemediations(
[FromHeader(Name = "Login")] string LoginDTOJson)
{
var LoginDTO = JsonConvert.DeserializeObject(LoginDTOJson);
try
{
var result = await _IGopQueueBLL.GetOpenRemediations(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);
}
}
}
}