using Microsoft.EntityFrameworkCore; using NLog; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MagMan.Data.Admin { /// /// Classe amministrazione Db principale: /// - creazione utenti sul Server MySql /// - gestione DB/Tabele x identity & gestione multi-tenant /// public class DbAdmin : IDisposable { #region Private Fields private static NLog.Logger Log = LogManager.GetCurrentClassLogger(); #endregion Private Fields #region Public Constructors public DbAdmin() { } #endregion Public Constructors #region Public Methods public static bool CheckCreateUser(string username, string pwd, string dbName) { bool answ = false; using (ServerAdminContext adbCtx = new ServerAdminContext()) { // ricerca utente... var numUser = adbCtx .UserList .Where(x => x.User == username) .ToList() .Count; if (numUser > 0) { answ = true; } if (!answ) { // creo utente string sqlCommand = "FLUSH PRIVILEGES;"; adbCtx.Database.ExecuteSqlRaw(sqlCommand); sqlCommand = $"CREATE USER '{username}'@'localhost' IDENTIFIED BY '{pwd}';"; adbCtx.Database.ExecuteSqlRaw(sqlCommand); sqlCommand = $"GRANT ALL ON *.* TO '{username}'@'localhost';"; adbCtx.Database.ExecuteSqlRaw(sqlCommand); sqlCommand = "FLUSH PRIVILEGES;"; adbCtx.Database.ExecuteSqlRaw(sqlCommand); } } return answ; } public static bool CheckCreateCustDb(int nKeyMain) { bool answ = false; string dbName = $"MagMan_{nKeyMain:000000}"; using (ServerAdminContext adbCtx = new ServerAdminContext()) { // ricerca DB... string sqlCommand = $"SHOW DATABASES;"; var searchDb = adbCtx .DbList .FromSqlRaw(sqlCommand) .ToList(); // se trovato qualcosa procedo if (searchDb != null) { var rigaDb = searchDb.Where(x => x.Database.Contains(dbName, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault(); answ = rigaDb != null; } // altrimenti crea if (!answ) { // creo DB sqlCommand = $"CREATE DATABASE IF NOT EXISTS {dbName};"; adbCtx.Database.ExecuteSqlRaw(sqlCommand); } } return answ; } public static async Task MigrateDbIdentity() { bool answ = false; using (IdentityContext dbCtx = new IdentityContext()) { await dbCtx.Database.MigrateAsync(); answ = true; } return answ; } public static async Task MigrateDbMultiTenant() { bool answ = false; using (MultiTenantContext dbCtx = new MultiTenantContext()) { await dbCtx.Database.MigrateAsync(); answ = true; } return answ; } public void Dispose() { } #endregion Public Methods } }