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