using Microsoft.Extensions.Configuration; using MongoDB.Driver; using MP.Core.Conf; using MP.Core.DTO; using MP.Core.Objects; using MP.Data.MgModels; using Newtonsoft.Json; using NLog; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; namespace MP.Data.Controllers { public class MpMongoController : IDisposable { public MpMongoController(IConfiguration configuration) { _configuration = configuration; string mongoConf = _configuration.GetConnectionString("mdbConnString"); client = new MongoClient(mongoConf); mongoDb = client.GetDatabase("MAPO"); Log.Info("Avviata classe MpMongoController"); } /// /// Database corrente MongoDB /// private IMongoDatabase mongoDb; public void Dispose() { client = null; _configuration = null; } /// /// Ricerca ricetta su MongoDB dato PODL /// /// /// public async Task RecipeGetByPODL(int idxPODL) { await Task.Delay(1); RecipeModel answ = new RecipeModel(); try { // definisco filtro var filtBuilder = Builders.Filter; var filter = filtBuilder.Eq("IdxPODL", idxPODL); var collectionData = mongoDb.GetCollection("RecipeArchive"); // recupero answ = collectionData.Find(filter).Project("{_id: 0}").FirstOrDefault(); } catch { } return answ; } /// /// Ricerca ricetta su MongoDB dato ID MongoDB /// /// /// public async Task RecipeGetByID(string mID) { await Task.Delay(1); RecipeModel answ = new RecipeModel(); try { // definisco filtro var filtBuilder = Builders.Filter; var filter = filtBuilder.Eq("_id", mID); var collectionData = mongoDb.GetCollection("RecipeArchive"); // recupero answ = collectionData.Find(filter).Project("{_id: 0}").FirstOrDefault(); } catch { } return answ; } /// /// Salva ricetta su MongoDB /// /// /// public async Task RecipeSetByPODL(RecipeModel currRecord) { await Task.Delay(1); bool answ = false; try { // definisco filtro var filtBuilder = Builders.Filter; var filter = filtBuilder.Eq("IdxPODL", currRecord.IdxPODL); var collectionData = mongoDb.GetCollection("RecipeArchive"); // elimino old collectionData.DeleteMany(filter); // aggiungo collectionData.InsertOne(currRecord); answ = true; } catch (Exception exc) { Log.Error($"Eccezione in RecipeSetByPODL{Environment.NewLine}{exc}"); } return answ; } /// /// Salva i dataItems della macchina indicata in MongoDB /// /// /// /// public bool SaveMachineDataItems(string idxMacchina, List dataItems) { bool answ = false; var collMtcSetup = mongoDb.GetCollection("MtcSetup"); // compongo filtro ricerca e metodo update var filter = Builders.Filter.Eq(u => u.IdxMacchina, idxMacchina); // chiamo update: cerco riga, se c'è aggiorno sennò creo MtcSetupDto newDoc = new MtcSetupDto() { IdxMacchina = idxMacchina, DataItems = dataItems }; // elimino se ci fosse già... collMtcSetup.DeleteMany(filter); // inserisco ex novo! collMtcSetup.InsertOne(newDoc); answ = true; return answ; } /// /// Init ricetta dato PODL + conf /// /// /// /// /// public RecipeModel InitRecipe(string confPath, int idxPODL, Dictionary CalcArgs) { RecipeModel answ = new RecipeModel(); // per prima cosa leggo file di conf x inizializzare ricetta... string fullPath = RecipePath(confPath); bool fileOk = File.Exists(fullPath); if (fileOk) { string rawData = File.ReadAllText(fullPath); var currRecipe = JsonConvert.DeserializeObject(rawData); // inizializzo dalla conf... answ = new RecipeModel(idxPODL, currRecipe, CalcArgs); } return answ; } /// /// Ricetta in formato calcolato (string) /// public string CalcRecipe(RecipeModel currRecipe) { string answ = ""; // per prima cosa leggo file di conf x inizializzare ricetta... string fullPath = RecipePath(currRecipe.TemplateFile); bool fileOk = File.Exists(fullPath); if (fileOk) { // preparo dati header var headStrings = currRecipe.HeadVal.Select(x => $"\"{x.Key}\": \"{x.Value}\"").ToList(); string headVals = string.Join(",", headStrings); // leggo template string rawData = File.ReadAllText(fullPath); // recupero configurazione x inizio/fine righe string[] righe = rawData.Split(Environment.NewLine); List righeRed = new List(); string sRow = ""; string eRow = ""; foreach (var riga in righe) { if (riga.Trim().StartsWith("||SROW:")) { sRow = riga.Trim().Replace("||SROW:", "").Replace("||", ""); } else if (riga.Trim().StartsWith("||EROW:")) { eRow = riga.Trim().Replace("||EROW:", "").Replace("||", ""); } else { righeRed.Add(riga); } } // rigenero righe senza le parti da ripetere... rawData = string.Join(Environment.NewLine, righeRed); // effettuo sostituzione... answ = rawData.Replace("||PlaceholderHeader||", headVals); // per le righe prima calcolo blocchi ripetuti List rowComp = new List(); foreach (var item in currRecipe.RowsVal) { var rowsStrings = item.Value.Select(x => $"\"{x.Key}\": \"{x.Value}\"").ToList(); rowComp.Add($"{sRow}{string.Join(",", rowsStrings)}{eRow}"); } string rowsVals = string.Join($",{Environment.NewLine}", rowComp); //...poi sostituisco answ = answ.Replace("||PlaceholderRows||", rowsVals); } return answ; } private MongoClient client = new MongoClient("mongodb://localhost:27017"); private static IConfiguration _configuration; private static Logger Log = LogManager.GetCurrentClassLogger(); public static string RecipePath(string ruleName) { return string.Format($"Recipe/{ruleName}"); } } }