191 lines
6.4 KiB
C#
191 lines
6.4 KiB
C#
using Microsoft.AspNetCore.Mvc;
|
|
using NLog;
|
|
using WebDoorCreator.Data.DTO;
|
|
using WebDoorCreator.Data.Services;
|
|
|
|
namespace WebDoorCreator.API.Controllers
|
|
{
|
|
[Route("api/[controller]")]
|
|
[ApiController]
|
|
public class QueueController : ControllerBase
|
|
{
|
|
#region Public Constructors
|
|
|
|
public QueueController(IConfiguration configuration, QueueDataService DataService, WebDoorCreatorService _WDService)
|
|
{
|
|
Log.Info("Starting QueueController");
|
|
_configuration = configuration;
|
|
QDataServ = DataService;
|
|
WDService = _WDService;
|
|
Log.Info("Avviato QueueController");
|
|
}
|
|
|
|
#endregion Public Constructors
|
|
|
|
#region Public Methods
|
|
|
|
/// <summary>
|
|
/// Lunghezza coda in fase di processing
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
[HttpGet("ActLenght")]
|
|
public async Task<Dictionary<string, long>> ActLenght()
|
|
{
|
|
Dictionary<string, long> answ = new Dictionary<string, long>();
|
|
var actPend = await QDataServ.NumRequestPending();
|
|
answ.Add("pending", actPend);
|
|
|
|
var actProc = await QDataServ.NumRequestProcessing();
|
|
answ.Add("processing", actProc);
|
|
|
|
var actErr = await QDataServ.NumRequestErrors();
|
|
answ.Add("errors", actErr);
|
|
|
|
var actDone = await QDataServ.NumRequestDone();
|
|
answ.Add("done", actDone);
|
|
return answ;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Cleanup dati delle code di calcolo
|
|
/// </summary>
|
|
/// <param name="passPhrase">Chiave x auth di reset</param>
|
|
/// <returns></returns>
|
|
[HttpPost("DCCacheCleanup")]
|
|
public async Task<string> DCCacheCleanup(string passPhrase)
|
|
{
|
|
string answ = "NA";
|
|
bool fatto = false;
|
|
if (passPhrase == "bbbBirdIsTheWord")
|
|
{
|
|
fatto = await QDataServ.DoorCalcCacheCleanup();
|
|
}
|
|
answ = fatto ? "OK" : "NO";
|
|
return answ;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Reset delle code di chiamata x ripetere simulazione
|
|
/// </summary>
|
|
/// <param name="passPhrase">Chiave x auth di reset</param>
|
|
/// <returns></returns>
|
|
[HttpPost("ResetQueue")]
|
|
public async Task<string> ResetQueue(string passPhrase)
|
|
{
|
|
string answ = "NA";
|
|
bool fatto = false;
|
|
if (passPhrase == "bbbBirdIsTheWord")
|
|
{
|
|
fatto = await QDataServ.ResetQueue();
|
|
}
|
|
answ = fatto ? "OK" : "NO";
|
|
return answ;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Reset della coda di processing x evitare condizioni di "stuck in calc"
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
[HttpPost("ResetQueueProcessing")]
|
|
public async Task<string> ResetQueueProcessing()
|
|
{
|
|
string answ = "NA";
|
|
// fixme todo
|
|
|
|
/* --------------
|
|
* da riscrivere
|
|
* - server record x cancellazione logica delle porte OK
|
|
* - il record (boolean, toDelete...) indica azione richiesta OK
|
|
* - si prendono TUTTE le porte da DB con toDelete == true OK
|
|
* - si eliminano su REDIS dalle 4 code (req, processing, error, done) OK
|
|
* - check delle code processing, SE ci sono record rimasti li cerco sul DB
|
|
* - se NON ci sono sul db --> li elimino da processing
|
|
* - effettivo delete sul db di toDelete
|
|
*
|
|
* - proseguo come ora (sposto tra code processing --> request)
|
|
*/
|
|
|
|
var doors2Del = await WDService.DoorGet2Del();
|
|
|
|
if (doors2Del != null)
|
|
{
|
|
foreach (var item in doors2Del)
|
|
{
|
|
await WDService.RedisBulkDelByDoorId(item.DoorId);
|
|
await QDataServ.RedisBulkDelHashByKey(item.DoorId);
|
|
await WDService.DoorDelete(item);
|
|
}
|
|
}
|
|
|
|
bool fatto = await QDataServ.ResetQueueProcessing();
|
|
answ = fatto ? "OK" : "NO";
|
|
return answ;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Invio elenco risultati elaborazioni (modalità boolean di esecuzione corretta)
|
|
/// </summary>
|
|
/// <param name="calcResults">Risultati elaborazioni in formato CalcResultDTO</param>
|
|
/// <returns></returns>
|
|
[HttpPost("SaveProcResult")]
|
|
public async Task<string> SaveProcResult(List<CalcResultDTO> calcResults)
|
|
{
|
|
string answ = "NA";
|
|
bool fatto = await QDataServ.SaveProcessingResult(calcResults);
|
|
answ = fatto ? "OK" : "NO";
|
|
return answ;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Elenco richieste raggruppate x stato
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
[HttpGet("StatusList")]
|
|
public async Task<Dictionary<string, Dictionary<string, string>>> StatusList()
|
|
{
|
|
Dictionary<string, Dictionary<string, string>> answ = new Dictionary<string, Dictionary<string, string>>();
|
|
var actPend = await QDataServ.RequestPending();
|
|
answ.Add("pending", actPend);
|
|
|
|
var actProc = await QDataServ.RequestProcessing();
|
|
answ.Add("processing", actProc);
|
|
|
|
var actErr = await QDataServ.RequestErr();
|
|
answ.Add("errors", actErr);
|
|
|
|
var actDone = await QDataServ.RequestDone();
|
|
answ.Add("done", actDone);
|
|
return answ;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Chiede un numero massimo di items dalla coda NB:
|
|
/// - verranno tolti dalla coda FIFO richieste
|
|
/// - verranno messi nella coda FIFO processing
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
[HttpGet("TakeNextItems")]
|
|
public async Task<Dictionary<string, string>> TakeProcessingItems(int numItems = 10)
|
|
{
|
|
var actQueue = await QDataServ.TakeProcessingItems(numItems);
|
|
return actQueue;
|
|
}
|
|
|
|
#endregion Public Methods
|
|
|
|
#region Private Fields
|
|
|
|
private static IConfiguration _configuration = null!;
|
|
|
|
private static Logger Log = LogManager.GetCurrentClassLogger();
|
|
|
|
#endregion Private Fields
|
|
|
|
#region Private Properties
|
|
|
|
private QueueDataService QDataServ { get; set; } = null!;
|
|
private WebDoorCreatorService WDService { get; set; } = null!;
|
|
|
|
#endregion Private Properties
|
|
}
|
|
} |