using Core.DTO;
using Core;
using LiMan.APi.Data;
using LiMan.DB.DTO;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using NLog;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Linq;
using LiMan.DB.DBModels;
using Microsoft.Extensions.Configuration;
using Org.BouncyCastle.Asn1.Crmf;
using System;
namespace LiMan.APi.Controllers
{
///
/// Controller gestione RELEASE applicativi
///
[Route("api/release")]
[ApiController]
public class ReleaseController : ControllerBase
{
#region Public Constructors
///
/// Init generico
///
///
public ReleaseController(ApiDataService DataService)
{
dataService = DataService;
Log.Info("Avviata classe ReleaseController");
}
#endregion Public Constructors
#region Public Methods
///
/// Recupera elenco dati Release (rilasciate) GET api/release/EgtBW
///
/// Codice Applicazione
///
[HttpGet("{id}")]
[Obsolete("Please use POST with api/release/getall instead.", false)]
public async Task> Get(string id)
{
var result = await dataService.ReleaseGetByApp(id);
await dataService.recordCall(id, id, $"GET:api/release/{id}");
return result;
}
///
/// Recupera elenco dati Release (rilasciate) data versione minima GET api/release/filt/EgtBW
///
/// Codice Applicazione
/// Versione minima richiesta (attuale)
///
[HttpGet("filt/{id}")]
[Obsolete("Please use POST with api/release/getfilt instead.", false)]
public async Task> GetFilt(string id, string VersMin)
{
var result = await dataService.ReleaseGetByAppVers(id, VersMin);
await dataService.recordCall(id, id, $"GET:api/release/filt/{id}");
return result;
}
///
/// Recupera elenco dati Release (rilasciate) data versione minima e massima GET api/release/filtLimit/EgtBW
///
/// Codice Applicazione
/// Versione minima richiesta (attuale)
/// Versione massima consentita
///
[HttpGet("filtLimit/{id}")]
[Obsolete("Please use POST with api/release/getlimit instead.", false)]
public async Task> GetFiltLimit(string id, string VersMin, string VersMax)
{
var result = await dataService.ReleaseGetByAppVersLimit(id, VersMin, VersMax);
await dataService.recordCall(id, id, $"GET:api/release/filtLimit/{id}");
return result;
}
///
/// Recupera elenco dati Release (rilasciate) POST api/release/getall
///
/// Obj ReleaseReqDTO con chiavi (master o app)
[HttpPost("getall")]
public async Task> GetReleases([FromBody] ReleaseReqDTO CurrRequest)
{
List result = new List();
// verifica validità richiesta...
if (CheckReqKeys(CurrRequest))
{
result = await dataService.ReleaseGetByApp(CurrRequest.CodApp);
await dataService.recordCall(CurrRequest.CodApp, CurrRequest.CodApp, $"POST:api/release/getall/ | {CurrRequest.MastKey} | {CurrRequest.CodImp} | {CurrRequest.CodApp}");
}
return result;
}
///
/// Recupera elenco dati Release CRITICHE rilasciate (se sono ultima per singola CodApp)
/// POST api/release/get-critical
///
/// Obj ReleaseReqDTO con chiavi (master o app)
[HttpPost("getcritical")]
public async Task> GetReleasesCritical([FromBody] ReleaseReqDTO CurrRequest)
{
Dictionary result = new Dictionary();
// verifica validità richiesta...
if (CheckReqKeys(CurrRequest))
{
result = await dataService.ReleaseGetCritical();
await dataService.recordCall(CurrRequest.CodApp, CurrRequest.CodApp, $"POST:api/release/getcritical/ | {CurrRequest.MastKey} | {CurrRequest.CodImp} | {CurrRequest.CodApp}");
}
return result;
}
///
/// Recupera elenco dati Release (rilasciate) data versione minima POST api/release/getfilt
///
/// Obj ReleaseReqDTO con chiavi (master o app)
[HttpPost("getfilt")]
public async Task> GetReleasesFilt([FromBody] ReleaseReqDTO CurrRequest)
{
List result = new List();
// verifica validità richiesta...
if (CheckReqKeys(CurrRequest))
{
result = await dataService.ReleaseGetByAppVers(CurrRequest.CodApp, CurrRequest.VersMin);
await dataService.recordCall(CurrRequest.CodApp, CurrRequest.CodApp, $"POST:api/release/getfilt/ | {CurrRequest.MastKey} | {CurrRequest.CodImp} | {CurrRequest.CodApp}");
}
return result;
}
///
/// Recupera elenco dati Release (rilasciate) data versione minima e massima POST api/release/getlimit
///
/// Obj ReleaseReqDTO con chiavi (master o app)
[HttpPost("getlimit")]
public async Task> GetReleasesLimit([FromBody] ReleaseReqDTO CurrRequest)
{
List result = new List();
// verifica validità richiesta...
if (CheckReqKeys(CurrRequest))
{
result = await dataService.ReleaseGetByAppVersLimit(CurrRequest.CodApp, CurrRequest.VersMin, CurrRequest.VersMax);
await dataService.recordCall(CurrRequest.CodApp, CurrRequest.CodApp, $"POST:api/release/getlimit/ | {CurrRequest.MastKey} | {CurrRequest.CodImp} | {CurrRequest.CodApp}");
}
return result;
}
///
/// Salva una nuova release dell'applicativo (eventualmente sovrascrivendo) POST api/release/save
///
/// Obj Richiesta
[HttpPost("save")]
public async Task save([FromBody] AppRelVersion CurrRequest)
{
ReleaseDTO result = new ReleaseDTO()
{
CodApp = CurrRequest.CodApp,
ReleaseDate = CurrRequest.ReleaseDate,
VersNum = CurrRequest.VersNum,
VersText = CurrRequest.VersText,
RelTags = CurrRequest.RelTags.ToUpper()
};
// controllo valori
if (CurrRequest.IsValid)
{
// verifica preliminare licenza x upload
var licUploader = await dataService.LicenzeSearch(CurrRequest.CodInst, CurrRequest.UplAppID, CurrRequest.MasterKey, false);
if (licUploader != null && licUploader.Count > 0)
{
// in primis cerco app...
var appList = await dataService.ApplicativiGetAll();
ApplicativoModel recApp = new ApplicativoModel();
if (appList != null)
{
recApp = appList.FirstOrDefault(x => x.CodApp == CurrRequest.CodApp);
}
// nel caso mancasse la aggiungo
if (recApp == null || string.IsNullOrEmpty(recApp.CodApp) || recApp.CodApp != CurrRequest.CodApp)
{
recApp = new ApplicativoModel()
{
CodApp = CurrRequest.CodApp,
Descrizione = "Nuova APP da POST api/release/save",
TplConnString = "",
Tipo = CurrRequest.Tipo
};
await dataService.ApplicativoUpsert(recApp);
}
//converto in una release...
ReleaseModel newRec = new ReleaseModel()
{
CodApp = CurrRequest.CodApp,
ReleaseDate = CurrRequest.ReleaseDate,
RelTags = CurrRequest.RelTags.ToUpper(),
VersNum = CurrRequest.VersNum,
VersText = CurrRequest.VersText
};
// registro versione eventualmente gestendo nuovo applicativo
var insRes = await dataService.ReleaseUpsert(newRec);
if (insRes)
{
Log.Info($"Release recorded | {CurrRequest.CodApp} | {CurrRequest.VersNum} | {CurrRequest.VersText} | {CurrRequest.ReleaseDate} | {CurrRequest.RelTags}");
}
}
// recupero vers applicativo...
var rawResult = await dataService.ReleaseGetByApp(CurrRequest.CodApp);
if (rawResult != null && rawResult.Count > 0)
{
result = rawResult.Where(x => x.VersText == CurrRequest.VersText).FirstOrDefault();
}
// fisso nostra install
await dataService.recordCall(CurrRequest.CodInst, CurrRequest.CodApp, $"POST:api/release/save:{CurrRequest.CodApp}");
}
else
{
Log.Error($"Errore: licenza UpdateManager non trovata | {CurrRequest.MasterKey}");
await dataService.recordCall(CurrRequest.CodInst, CurrRequest.CodApp, $"ERROR POST:api/release/save:{CurrRequest.CodApp} | {CurrRequest.MasterKey}");
}
return result;
}
#endregion Public Methods
#region Protected Properties
///
/// Dataservice x accesso DB
///
protected ApiDataService dataService { get; set; }
#endregion Protected Properties
#region Private Fields
///
/// Classe per logging
///
private static Logger Log = LogManager.GetCurrentClassLogger();
#endregion Private Fields
#region Private Methods
///
/// Verifica validità richiesta
/// - dati presenti in chiamata
/// - combinazioni CodApp + chiavi valide/attive
///
///
///
private bool CheckReqKeys(ReleaseReqDTO currReq)
{
bool answ = currReq.IsValid;
if (answ)
{
// verifica validità chiavi... TBD!!!
}
return answ;
}
#endregion Private Methods
}
}