using Microsoft.Extensions.Configuration; using MP.AppAuth.DTO; using MP.AppAuth.Models; using Newtonsoft.Json; using NLog; using RestSharp; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web; using static System.Net.Mime.MediaTypeNames; namespace MP.AppAuth.Services { public class SyncService { #region Public Constructors /// /// Init classe /// /// public SyncService(IConfiguration configuration) { _configuration = configuration; // sistemo conf secondo Target compilazione #if DEBUG_LIMANDEBUG apiUrl = "https://localhost:5003/"; #else apiUrl = "https://liman.egalware.com/ELM.API/"; #endif // fix opzioni base del RestClient restOptStd = new RestClientOptions { Timeout = TimeSpan.FromSeconds(60), BaseUrl = new Uri(apiUrl) }; } #endregion Public Constructors #region Public Properties public List AKVList { get; set; } = new List(); public string Applicazione { get; set; } = ""; /// /// Codice cliente/installazione /// public string Installazione { get; set; } = ""; /// /// Master key licenza principale /// public string MasterKey { get; set; } = ""; #endregion Public Properties #region Public Methods /// /// Stato server gestione licenze /// public async Task checkLimanServer() { string answ = "ND"; // cerco online RestClient client = new RestClient(apiUrl); var request = new RestRequest($"api/health", Method.Get); var response = await client.GetAsync(request); // controllo risposta if (response.StatusCode == System.Net.HttpStatusCode.OK) { // verifico risposta if (response.Content != null) { answ = response.Content.Replace("\"", ""); } } return answ; } /// /// Init della classe con variabili di base da Redis/DB /// public bool InitAkv() { bool fatto = false; Applicazione = "MAPO"; Installazione = getAVKStr("Installazione"); MasterKey = getAVKStr(Applicazione); fatto = !string.IsNullOrEmpty($"{Installazione}{MasterKey}"); return fatto; } /// /// Lista record AnagKeyVal /// public async Task?> OnlineListAnagKeyVal() { List? answ = new List(); // cerco online RestClient client = new RestClient(apiUrl); string MKeyEnc = HttpUtility.UrlEncode(MasterKey); var request = new RestRequest($"api/dbsync/anagkeyval/{Installazione}?CodApp={Applicazione}", Method.Get); var response = await client.GetAsync(request); // controllo risposta if (response.StatusCode == System.Net.HttpStatusCode.OK) { // salvo in redis contenuto serializzato string rawData = $"{response.Content}"; answ = JsonConvert.DeserializeObject?>(rawData); } return await Task.FromResult(answ); } /// /// Lista record Config /// public async Task?> OnlineListConfig() { List? answ = new List(); // cerco online RestClient client = new RestClient(apiUrl); string MKeyEnc = HttpUtility.UrlEncode(MasterKey); var request = new RestRequest($"api/dbsync/conf/{Installazione}?CodApp={Applicazione}", Method.Get); var response = await client.GetAsync(request); // controllo risposta if (response.StatusCode == System.Net.HttpStatusCode.OK) { // salvo in redis contenuto serializzato string rawData = $"{response.Content}"; answ = JsonConvert.DeserializeObject?>(rawData); } return await Task.FromResult(answ); } /// /// Lista record Vocabolario /// public async Task?> OnlineListVocabolario() { List? answ = new List(); // cerco online RestClient client = new RestClient(apiUrl); string MKeyEnc = HttpUtility.UrlEncode(MasterKey); var request = new RestRequest($"api/dbsync/vocabolario/{Installazione}?CodApp={Applicazione}", Method.Get); var response = await client.GetAsync(request); // controllo risposta if (response.StatusCode == System.Net.HttpStatusCode.OK) { // salvo in redis contenuto serializzato string rawData = $"{response.Content}"; answ = JsonConvert.DeserializeObject?>(rawData); } return await Task.FromResult(answ); } /// /// Invio file zip di backup al server centrale /// /// Cod Applicazione /// CLiente / Installazione /// Invia richiesta UnZip /// Invia richiesta Approvazione /// ZipFile da inviare /// public async Task SendZipFile(string CodApp, string CodInst, bool DoUnzip, bool ForceApprov, FileInfo ZipFile) { bool answ = false; try { string apiUrl = "/api/filesave/zipbackup"; Log.Info($"Inizio chiamata REST | URL: {restOptStd.BaseUrl} | api: {apiUrl}"); // client chiamate rest var client = new RestClient(restOptStd); // Chiamo il metodo! var actReq = new RestRequest(apiUrl, Method.Post); actReq.AddParameter("CodApp", $"{CodApp}"); actReq.AddParameter("CodInst", $"{CodInst}"); actReq.AddParameter("DoUnzip", $"{DoUnzip}"); actReq.AddParameter("ForceApprov", $"{ForceApprov}"); actReq.AddFile("ZipFile", ZipFile.FullName); actReq.AddHeader("Content-Type", "multipart/form-data"); // effettuo vera chiamata var currResp = await client.ExecuteAsync(actReq); if ((currResp.StatusCode == System.Net.HttpStatusCode.OK || currResp.StatusCode == System.Net.HttpStatusCode.Created) && currResp.Content != null) { // mi restituisce esito upload var currList = JsonConvert.DeserializeObject(currResp.Content); if (currList != null) { answ = currList.Uploaded; Log.Info($"Invio file | ZipName: {ZipFile.Name} | uploaded: {answ}"); } } else { Log.Error($"Errore in invio | StatusCode: {currResp.StatusCode}{Environment.NewLine}{currResp.Content}"); } } catch (Exception exc) { Log.Error($"Eccezione in fase gestione REST services SendZipFile{Environment.NewLine}{exc}"); } return answ; } #endregion Public Methods #region Protected Methods /// /// Cerca di recuperare valore string da elenco AKV /// /// Chiave AKV richiesta /// protected string getAVKStr(string varReq) { string answ = ""; if (AKVList != null && AKVList.Count > 0) { var currRec = AKVList.Where(x => x.NomeVar == varReq).FirstOrDefault(); if (currRec != null) { answ = $"{currRec.ValString}"; } } return answ; } #endregion Protected Methods #region Private Fields private static IConfiguration? _configuration; /// /// Classe logger /// private static Logger Log = LogManager.GetCurrentClassLogger(); #endregion Private Fields #region Private Properties /// /// URL dell'API x chiamate gestione licenze /// private string apiUrl { get; set; } = "https://localhost:5003/"; /// /// Conf client RestSharp standard: /// - base URI al sito /// - timeout 1 min /// private RestClientOptions restOptStd { get; set; } = new RestClientOptions(); #endregion Private Properties } }