using MySql.Data.MySqlClient; using Support.Crypto; using Support.Models; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Support.Controllers { public class DashboardController { private readonly Database _dbContext; public DashboardController(Database database) { _dbContext = database; } public DashboardViewModel GetModel(Appsettings appsettings) { DashboardViewModel result = null; try { if (_dbContext != null) { result = new DashboardViewModel(); if (appsettings != null) { if (!string.IsNullOrEmpty(appsettings.PrivateDirectory) && Directory.Exists(appsettings.PrivateDirectory)) { result.ResultsFiles = Directory.GetFiles(appsettings.PrivateDirectory, "*.hl7", SearchOption.TopDirectoryOnly).Length; string ack = Path.Combine(appsettings.PrivateDirectory, "ack"); string ack_done = Path.Combine(ack, "done"); if (!string.IsNullOrEmpty(ack) && Directory.Exists(ack)) { result.PendingAcks = Directory.GetFiles(ack, "*.log", SearchOption.TopDirectoryOnly).Length; } if (!string.IsNullOrEmpty(ack_done) && Directory.Exists(ack_done)) { result.DoneAcks = Directory.GetFiles(ack_done, "*", SearchOption.TopDirectoryOnly).Length; } } if (!string.IsNullOrEmpty(appsettings.PublicDirectory) && Directory.Exists(appsettings.PublicDirectory)) { result.EncryptedResultsFiles = Directory.GetFiles(appsettings.PublicDirectory, "*", SearchOption.TopDirectoryOnly).Length; } } using (MySqlConnection client = _dbContext.CreateConnection()) { client.Open(); MySqlCommand cmd = client.CreateCommand(); cmd.CommandText = "select * from config c limit 1"; MySqlDataReader reader = cmd.ExecuteReader(); if (reader != null && reader.HasRows && reader.Read() && reader["maintenance"] != null) { string c = reader["maintenance"].ToString(); int c_out = 0; if (!string.IsNullOrEmpty(c) && Int32.TryParse(c, out c_out)) { result.Maintenance = c_out; } } if (!reader.IsClosed) { reader.Close(); } cmd.CommandText = "select count(d.udid) c from device d"; reader = cmd.ExecuteReader(); if (reader != null && reader.HasRows && reader.Read() && reader["c"] != null) { string c = reader["c"].ToString(); int c_out = 0; if (!string.IsNullOrEmpty(c) && Int32.TryParse(c, out c_out)) { result.Devices = c_out; } } if (!reader.IsClosed) { reader.Close(); } cmd.CommandText = "select count(d.udid) c from device d where d.created >= curdate()"; reader = cmd.ExecuteReader(); if (reader != null && reader.HasRows && reader.Read() && reader["c"] != null) { string c = reader["c"].ToString(); int c_out = 0; if (!string.IsNullOrEmpty(c) && Int32.TryParse(c, out c_out)) { result.DevicesToday = c_out; } } if (!reader.IsClosed) { reader.Close(); } cmd.CommandText = "select count(r.pgs) c, sum(if(r.available = 1, 1, 0)) a, sum(if(r.picked_up, 1, 0)) p, sum(if(r.notified, 1, 0)) n from results r"; reader = cmd.ExecuteReader(); if (reader != null && reader.HasRows && reader.Read() && reader["c"] != null) { string c = reader["c"].ToString(); string a = reader["a"].ToString(); string p = reader["p"].ToString(); string n = reader["n"].ToString(); int c_out = 0; int a_out = 0; int p_out = 0; int n_out = 0; if (!string.IsNullOrEmpty(c) && Int32.TryParse(c, out c_out)) { result.Results = c_out; } if (!string.IsNullOrEmpty(a) && Int32.TryParse(a, out a_out)) { result.ResultsAvailable = a_out; } if (!string.IsNullOrEmpty(p) && Int32.TryParse(p, out p_out)) { result.ResultsPickedUp = p_out; } if (!string.IsNullOrEmpty(n) && Int32.TryParse(n, out n_out)) { result.ResultsNotified = n_out; } } if (!reader.IsClosed) { reader.Close(); } cmd.CommandText = @"select r.pgs, r.pgs_hash, r.udid, r.notified, date_format(r.notified_ts, '%d.%m.%Y %H:%i:%s') notified_on, r.picked_up, date_format(r.picked_up_ts, '%d.%m.%Y %H:%i:%s') picked_up_on, r.available, date_format(r.available_ts, '%d.%m.%Y %H:%i:%s') available_on, date_format(r.created, '%d.%m.%Y %H:%i:%s') created_on, r.status from results r order by r.created desc limit 50"; reader = cmd.ExecuteReader(); if (reader != null && reader.HasRows) { result.LastResults = new List(); while (reader.Read()) { if (reader["pgs"] != null && reader["udid"] != null && reader["created_on"] != null) { Models.Results results = new Models.Results(); results.PGS = reader["pgs"].ToString(); results.UDID = reader["udid"].ToString(); results.Notified = (reader["notified"] != null && reader["notified"] != DBNull.Value && Convert.ToInt32(reader["notified"].ToString()) == 1); results.NotifiedOn = (reader["notified_on"] != null && reader["notified_on"] != DBNull.Value ? reader["notified_on"].ToString() : null); results.PickedUp = (reader["picked_up"] != null && reader["picked_up"] != DBNull.Value && Convert.ToInt32(reader["picked_up"].ToString()) == 1); results.PickedUpOn = (reader["picked_up_on"] != null && reader["picked_up_on"] != DBNull.Value ? reader["picked_up_on"].ToString() : null); results.Available = (reader["available"] != null && reader["available"] != DBNull.Value && Convert.ToInt32(reader["available"].ToString()) == 1); results.AvailableOn = (reader["available_on"] != null && reader["available_on"] != DBNull.Value ? reader["available_on"].ToString() : null); results.Created = reader["created_on"].ToString(); results.Status = (reader["status"] != null && reader["status"] != DBNull.Value ? reader["status"].ToString() : null); if (reader["pgs_hash"] != null && reader["pgs_hash"] != DBNull.Value) { string pgs_hash = reader["pgs_hash"].ToString(); string decrypted_values = AES.Decrypt(pgs_hash, AES.GetKey(results.UDID + AES.PGS_ENCRYPT_PARTIAL_KEY)); if (!string.IsNullOrEmpty(decrypted_values)) { string[] values = decrypted_values.Split('|'); if (values.Length == 3) { results.ZIP = values[0]; results.Birthday = values[1]; results.OrderId = values[2]; } } } result.LastResults.Add(results); } } } if (!reader.IsClosed) { reader.Close(); } client.Close(); } } } catch (Exception ex) { Console.WriteLine(ex); } return result; } } }