From 983586552bfd4a4e034fa0bdb539984611f30101 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 10 Jan 2024 17:55:06 +0100 Subject: [PATCH] Completo riorganizzazione progetti: - Core - Data.Admin --- MagMan.Core/DTO/DemoObj.cs | 12 +++ MagMan.Core/MagMan.Core.csproj | 6 ++ .../MailKitMailData.cs | 2 +- .../MailKitMailSettings.cs | 2 +- .../Services/IMailService.cs | 2 +- .../Services/MailService.cs | 7 +- .../AdminContext.cs | 6 +- {MagMan.User => MagMan.Data.Admin}/DbAdmin.cs | 27 +----- .../DbConfig.cs | 23 ++--- .../DbModels/TableCount.cs | 6 +- .../DbModels/UserPrivModel.cs | 2 +- .../MagMan.Data.Admin.csproj | 17 ++-- ...222165912_CreateIdentitySchema.Designer.cs | 6 +- .../20231222165912_CreateIdentitySchema.cs | 2 +- .../UserIdentityDbContextModelSnapshot.cs | 6 +- .../Services/BaseServ.cs | 2 +- .../UserAdminConfiguration.cs | 2 +- .../UserData.cs | 2 +- .../UserIdentityDbContext.cs | 13 +-- .../UserRoleConfiguration.cs | 2 +- .../DbAdmin.cs | 2 +- .../DbConfig.cs | 2 +- .../DbModels/ConfigModel.cs | 2 +- .../DbModels/ItemModel.cs | 2 +- .../DbModels/MaterialModel.cs | 2 +- .../DbModels/MovMagModel.cs | 2 +- .../DbModels/PrintJobQueueModel.cs | 2 +- .../DbModels/TableCount.cs | 2 +- .../DbModels/UserPrivModel.cs | 2 +- .../MagMan.Data.Tenant.csproj | 23 ++--- .../MagManContext.cs | 4 +- .../20231222163946_InitDb.Designer.cs | 2 +- .../Migrations/20231222163946_InitDb.cs | 2 +- .../20231222180319_AddMagBaseObj.Designer.cs | 2 +- .../20231222180319_AddMagBaseObj.cs | 2 +- ...20231222180523_AddMagBaseObj01.Designer.cs | 2 +- .../20231222180523_AddMagBaseObj01.cs | 2 +- .../Migrations/MagManContextModelSnapshot.cs | 2 +- ...222165912_CreateIdentitySchema.Designer.cs | 0 .../20231222165912_CreateIdentitySchema.cs | 0 .../UserIdentityDbContextModelSnapshot.cs | 0 .../ModelBuilderExtensions.cs | 2 +- MagMan.Data.Tenant/Services/BaseServ.cs | 70 ++++++++++++++++ .../Services/MessageService.cs | 2 +- .../Services/SelectData.cs | 2 +- .../Services/SelectOrderData.cs | 2 +- MagMan.Data/AdminContext.cs | 75 ----------------- MagMan.Data/MailKitEmailSender.cs | 69 --------------- MagMan.Data/MailKitEmailSenderOptions.cs | 36 -------- MagMan.Data/UserAdminConfiguration.cs | 26 ------ MagMan.Data/UserData.cs | 25 ------ MagMan.Data/UserIdentityDbContext.cs | 79 ------------------ MagMan.UI.sln | 20 ++--- MagMan.UI/Components/MigrationManager.razor | 6 +- MagMan.UI/Components/SearchMod.razor.cs | 5 +- MagMan.UI/Components/SetupDiagnostics.razor | 6 +- MagMan.UI/Health/Checks.cs | 11 +-- MagMan.UI/MagMan.UI.csproj | 5 +- MagMan.UI/Pages/Index.razor.cs | 2 +- MagMan.UI/Program.cs | 53 ++++++------ MagMan.UI/_Imports.razor | 11 ++- MagMan.User/UserRoleConfiguration.cs | 30 ------- README.md | 41 +++++++++ README.pdf | Bin 59814 -> 78642 bytes 64 files changed, 270 insertions(+), 514 deletions(-) create mode 100644 MagMan.Core/DTO/DemoObj.cs rename {MagMan.Data => MagMan.Core}/MailKitMailData.cs (97%) rename {MagMan.Data => MagMan.Core}/MailKitMailSettings.cs (95%) rename {MagMan.Data => MagMan.Core}/Services/IMailService.cs (88%) rename {MagMan.Data => MagMan.Core}/Services/MailService.cs (97%) rename {MagMan.User => MagMan.Data.Admin}/AdminContext.cs (93%) rename {MagMan.User => MagMan.Data.Admin}/DbAdmin.cs (75%) rename {MagMan.User => MagMan.Data.Admin}/DbConfig.cs (82%) rename {MagMan.Data => MagMan.Data.Admin}/DbModels/TableCount.cs (74%) rename {MagMan.Data => MagMan.Data.Admin}/DbModels/UserPrivModel.cs (93%) rename MagMan.User/MagMan.User.csproj => MagMan.Data.Admin/MagMan.Data.Admin.csproj (78%) rename {MagMan.User => MagMan.Data.Admin}/Migrations/UserIdentityDb/20231222165912_CreateIdentitySchema.Designer.cs (98%) rename {MagMan.User => MagMan.Data.Admin}/Migrations/UserIdentityDb/20231222165912_CreateIdentitySchema.cs (99%) rename {MagMan.User => MagMan.Data.Admin}/Migrations/UserIdentityDb/UserIdentityDbContextModelSnapshot.cs (98%) rename {MagMan.Data => MagMan.Data.Admin}/Services/BaseServ.cs (98%) rename {MagMan.User => MagMan.Data.Admin}/UserAdminConfiguration.cs (96%) rename {MagMan.User => MagMan.Data.Admin}/UserData.cs (95%) rename {MagMan.User => MagMan.Data.Admin}/UserIdentityDbContext.cs (87%) rename {MagMan.Data => MagMan.Data.Admin}/UserRoleConfiguration.cs (97%) rename {MagMan.Data => MagMan.Data.Tenant}/DbAdmin.cs (98%) rename {MagMan.Data => MagMan.Data.Tenant}/DbConfig.cs (98%) rename {MagMan.Data => MagMan.Data.Tenant}/DbModels/ConfigModel.cs (95%) rename {MagMan.Data => MagMan.Data.Tenant}/DbModels/ItemModel.cs (98%) rename {MagMan.Data => MagMan.Data.Tenant}/DbModels/MaterialModel.cs (96%) rename {MagMan.Data => MagMan.Data.Tenant}/DbModels/MovMagModel.cs (97%) rename {MagMan.Data => MagMan.Data.Tenant}/DbModels/PrintJobQueueModel.cs (95%) rename {MagMan.User => MagMan.Data.Tenant}/DbModels/TableCount.cs (92%) rename {MagMan.User => MagMan.Data.Tenant}/DbModels/UserPrivModel.cs (93%) rename MagMan.Data/MagMan.Data.csproj => MagMan.Data.Tenant/MagMan.Data.Tenant.csproj (75%) rename {MagMan.Data => MagMan.Data.Tenant}/MagManContext.cs (98%) rename {MagMan.Data => MagMan.Data.Tenant}/Migrations/20231222163946_InitDb.Designer.cs (97%) rename {MagMan.Data => MagMan.Data.Tenant}/Migrations/20231222163946_InitDb.cs (97%) rename {MagMan.Data => MagMan.Data.Tenant}/Migrations/20231222180319_AddMagBaseObj.Designer.cs (99%) rename {MagMan.Data => MagMan.Data.Tenant}/Migrations/20231222180319_AddMagBaseObj.cs (98%) rename {MagMan.Data => MagMan.Data.Tenant}/Migrations/20231222180523_AddMagBaseObj01.Designer.cs (99%) rename {MagMan.Data => MagMan.Data.Tenant}/Migrations/20231222180523_AddMagBaseObj01.cs (98%) rename {MagMan.Data => MagMan.Data.Tenant}/Migrations/MagManContextModelSnapshot.cs (99%) rename {MagMan.Data => MagMan.Data.Tenant}/Migrations/UserIdentityDb/20231222165912_CreateIdentitySchema.Designer.cs (100%) rename {MagMan.Data => MagMan.Data.Tenant}/Migrations/UserIdentityDb/20231222165912_CreateIdentitySchema.cs (100%) rename {MagMan.Data => MagMan.Data.Tenant}/Migrations/UserIdentityDb/UserIdentityDbContextModelSnapshot.cs (100%) rename {MagMan.Data => MagMan.Data.Tenant}/ModelBuilderExtensions.cs (99%) create mode 100644 MagMan.Data.Tenant/Services/BaseServ.cs rename {MagMan.Data => MagMan.Data.Tenant}/Services/MessageService.cs (98%) rename {MagMan.Data => MagMan.Data.Tenant}/Services/SelectData.cs (97%) rename {MagMan.Data => MagMan.Data.Tenant}/Services/SelectOrderData.cs (97%) delete mode 100644 MagMan.Data/AdminContext.cs delete mode 100644 MagMan.Data/MailKitEmailSender.cs delete mode 100644 MagMan.Data/MailKitEmailSenderOptions.cs delete mode 100644 MagMan.Data/UserAdminConfiguration.cs delete mode 100644 MagMan.Data/UserData.cs delete mode 100644 MagMan.Data/UserIdentityDbContext.cs delete mode 100644 MagMan.User/UserRoleConfiguration.cs diff --git a/MagMan.Core/DTO/DemoObj.cs b/MagMan.Core/DTO/DemoObj.cs new file mode 100644 index 0000000..fd82469 --- /dev/null +++ b/MagMan.Core/DTO/DemoObj.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MagMan.Core.DTO +{ + public class DemoObj + { + } +} diff --git a/MagMan.Core/MagMan.Core.csproj b/MagMan.Core/MagMan.Core.csproj index 27ac386..df2e60e 100644 --- a/MagMan.Core/MagMan.Core.csproj +++ b/MagMan.Core/MagMan.Core.csproj @@ -6,4 +6,10 @@ enable + + + + + + diff --git a/MagMan.Data/MailKitMailData.cs b/MagMan.Core/MailKitMailData.cs similarity index 97% rename from MagMan.Data/MailKitMailData.cs rename to MagMan.Core/MailKitMailData.cs index 34d4d0c..a1212b0 100644 --- a/MagMan.Data/MailKitMailData.cs +++ b/MagMan.Core/MailKitMailData.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace MagMan.Data +namespace MagMan.Core { public class MailKitMailData { diff --git a/MagMan.Data/MailKitMailSettings.cs b/MagMan.Core/MailKitMailSettings.cs similarity index 95% rename from MagMan.Data/MailKitMailSettings.cs rename to MagMan.Core/MailKitMailSettings.cs index 592a509..218ca13 100644 --- a/MagMan.Data/MailKitMailSettings.cs +++ b/MagMan.Core/MailKitMailSettings.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace MagMan.Data +namespace MagMan.Core { public class MailKitMailSettings { diff --git a/MagMan.Data/Services/IMailService.cs b/MagMan.Core/Services/IMailService.cs similarity index 88% rename from MagMan.Data/Services/IMailService.cs rename to MagMan.Core/Services/IMailService.cs index 42b5a88..0464f91 100644 --- a/MagMan.Data/Services/IMailService.cs +++ b/MagMan.Core/Services/IMailService.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace MagMan.Data.Services +namespace MagMan.Core.Services { public interface IMailService { diff --git a/MagMan.Data/Services/MailService.cs b/MagMan.Core/Services/MailService.cs similarity index 97% rename from MagMan.Data/Services/MailService.cs rename to MagMan.Core/Services/MailService.cs index acb28e1..f59d91a 100644 --- a/MagMan.Data/Services/MailService.cs +++ b/MagMan.Core/Services/MailService.cs @@ -3,8 +3,13 @@ using MailKit.Security; using Microsoft.Extensions.Options; using MimeKit; using NLog; +using MagMan.Core; +using System; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; -namespace MagMan.Data.Services +namespace MagMan.Core.Services { /// /// Implementazione MailKit come descritto qui https://blog.christian-schou.dk/send-emails-with-asp-net-core-with-mailkit/ diff --git a/MagMan.User/AdminContext.cs b/MagMan.Data.Admin/AdminContext.cs similarity index 93% rename from MagMan.User/AdminContext.cs rename to MagMan.Data.Admin/AdminContext.cs index b510ffe..ceee219 100644 --- a/MagMan.User/AdminContext.cs +++ b/MagMan.Data.Admin/AdminContext.cs @@ -1,8 +1,8 @@ -using MagMan.User.DbModels; +using MagMan.Data.Admin.DbModels; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; -namespace MagMan.User +namespace MagMan.Data.Admin { // // This is here so CodeMaid doesn't reorganize this document @@ -37,7 +37,7 @@ namespace MagMan.User /// /// User management /// - public DbSet UserList { get; set; } + public virtual DbSet UserList { get; set; } #endregion Public Properties diff --git a/MagMan.User/DbAdmin.cs b/MagMan.Data.Admin/DbAdmin.cs similarity index 75% rename from MagMan.User/DbAdmin.cs rename to MagMan.Data.Admin/DbAdmin.cs index b6790b1..a74a56a 100644 --- a/MagMan.User/DbAdmin.cs +++ b/MagMan.Data.Admin/DbAdmin.cs @@ -6,7 +6,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace MagMan.User +namespace MagMan.Data.Admin { public class DbAdmin : IDisposable { @@ -68,31 +68,6 @@ namespace MagMan.User return answ; } -#if false - public static async Task migrateDbMain() - { - bool answ = false; - using (MagManContext dbCtx = new MagManContext()) - { - await dbCtx.Database.MigrateAsync(); - answ = true; - } - return answ; - } - - public static bool resetPlantLogTable() - { - bool answ = false; - using (MagManContext dbCtx = new MagManContext()) - { - string sqlCommand = "TRUNCATE TABLE PlantLog;"; - dbCtx.Database.ExecuteSqlRaw(sqlCommand); - answ = true; - } - return answ; - } -#endif - public void Dispose() { } diff --git a/MagMan.User/DbConfig.cs b/MagMan.Data.Admin/DbConfig.cs similarity index 82% rename from MagMan.User/DbConfig.cs rename to MagMan.Data.Admin/DbConfig.cs index 21c958c..2dd32d3 100644 --- a/MagMan.User/DbConfig.cs +++ b/MagMan.Data.Admin/DbConfig.cs @@ -5,16 +5,16 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace MagMan.User +namespace MagMan.Data.Admin { public static class DbConfig { #region Public Fields - public static string DATABASE_NAME = "MagMan"; + public static string DATABASE_NAME = "MagMan_Ident"; public static int DATABASE_PROCESS_TIMEOUT = 5; - public static string DATABASE_PWD = "viadante16"; + public static string DATABASE_PWD = "viad@nte16!"; // Database config public static string DATABASE_SERV = "127.0.0.1"; @@ -53,22 +53,15 @@ namespace MagMan.User return migrateTask.Result; } -#if false - public static bool ExecMigrationMain() - { - // esecuzione migrazione - var migrateTask = Task.Run(async () => await DbAdmin.migrateDbMain()); - migrateTask.Wait(); - return migrateTask.Result; - } -#endif - public static void InitDb(string server, string nKey, string sKey) { DATABASE_SERV = server; - DATABASE_NAME = $"MagMan_{nKey}"; + // tutto fisso x gestione utenti +#if false + DATABASE_NAME = $"MagMan_Ident"; DATABASE_USER = $"user_{nKey}"; - DATABASE_PWD = $"pwd_{sKey}"; + DATABASE_PWD = $"pwd_{sKey}"; +#endif CONNECTION_STRING = $"server={DATABASE_SERV};port=3306;database={DATABASE_NAME};uid={DATABASE_USER};pwd={DATABASE_PWD};sslmode=None"; // stringa admin con utente root egalware... ADMIN_CONNECTION_STRING = $"server={DATABASE_SERV};port=3306;database=mysql;uid={DATABASE_USER};pwd={DATABASE_PWD};sslmode=None"; diff --git a/MagMan.Data/DbModels/TableCount.cs b/MagMan.Data.Admin/DbModels/TableCount.cs similarity index 74% rename from MagMan.Data/DbModels/TableCount.cs rename to MagMan.Data.Admin/DbModels/TableCount.cs index 59484d8..b41a852 100644 --- a/MagMan.Data/DbModels/TableCount.cs +++ b/MagMan.Data.Admin/DbModels/TableCount.cs @@ -5,7 +5,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace MagMan.Data.DbModels +namespace MagMan.Data.Admin.DbModels { /// /// Classe fake x il conteggio tabelle e check preliminari @@ -15,8 +15,8 @@ namespace MagMan.Data.DbModels { #region Public Properties - public int Count { get; set; } - public string TableName { get; set; } + public int Count { get; set; } = 0; + public string TableName { get; set; } = ""; #endregion Public Properties } diff --git a/MagMan.Data/DbModels/UserPrivModel.cs b/MagMan.Data.Admin/DbModels/UserPrivModel.cs similarity index 93% rename from MagMan.Data/DbModels/UserPrivModel.cs rename to MagMan.Data.Admin/DbModels/UserPrivModel.cs index 59a3c06..fdcf490 100644 --- a/MagMan.Data/DbModels/UserPrivModel.cs +++ b/MagMan.Data.Admin/DbModels/UserPrivModel.cs @@ -5,7 +5,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace MagMan.Data.DbModels +namespace MagMan.Data.Admin.DbModels { /// /// Tabella dei USER di MySql diff --git a/MagMan.User/MagMan.User.csproj b/MagMan.Data.Admin/MagMan.Data.Admin.csproj similarity index 78% rename from MagMan.User/MagMan.User.csproj rename to MagMan.Data.Admin/MagMan.Data.Admin.csproj index 75c337f..f9c5c8c 100644 --- a/MagMan.User/MagMan.User.csproj +++ b/MagMan.Data.Admin/MagMan.Data.Admin.csproj @@ -1,4 +1,4 @@ - + net6.0 @@ -7,12 +7,17 @@ - - + + + + + + + @@ -25,12 +30,10 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive + - - - - + diff --git a/MagMan.User/Migrations/UserIdentityDb/20231222165912_CreateIdentitySchema.Designer.cs b/MagMan.Data.Admin/Migrations/UserIdentityDb/20231222165912_CreateIdentitySchema.Designer.cs similarity index 98% rename from MagMan.User/Migrations/UserIdentityDb/20231222165912_CreateIdentitySchema.Designer.cs rename to MagMan.Data.Admin/Migrations/UserIdentityDb/20231222165912_CreateIdentitySchema.Designer.cs index 5680f40..a493e56 100644 --- a/MagMan.User/Migrations/UserIdentityDb/20231222165912_CreateIdentitySchema.Designer.cs +++ b/MagMan.Data.Admin/Migrations/UserIdentityDb/20231222165912_CreateIdentitySchema.Designer.cs @@ -1,6 +1,6 @@ // using System; -using MagMan.User; +using MagMan.Data.Admin; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Migrations; @@ -8,7 +8,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; #nullable disable -namespace MagMan.User.Migrations.UserIdentityDb +namespace MagMan.Data.Admin.Migrations.UserIdentityDb { [DbContext(typeof(UserIdentityDbContext))] [Migration("20231222165912_CreateIdentitySchema")] @@ -21,7 +21,7 @@ namespace MagMan.User.Migrations.UserIdentityDb .HasAnnotation("ProductVersion", "6.0.25") .HasAnnotation("Relational:MaxIdentifierLength", 64); - modelBuilder.Entity("MagMan.User.DbModels.TableCount", b => + modelBuilder.Entity("MagMan.Data.Admin.DbModels.TableCount", b => { b.Property("Count") .HasColumnType("int"); diff --git a/MagMan.User/Migrations/UserIdentityDb/20231222165912_CreateIdentitySchema.cs b/MagMan.Data.Admin/Migrations/UserIdentityDb/20231222165912_CreateIdentitySchema.cs similarity index 99% rename from MagMan.User/Migrations/UserIdentityDb/20231222165912_CreateIdentitySchema.cs rename to MagMan.Data.Admin/Migrations/UserIdentityDb/20231222165912_CreateIdentitySchema.cs index 22607f3..6855671 100644 --- a/MagMan.User/Migrations/UserIdentityDb/20231222165912_CreateIdentitySchema.cs +++ b/MagMan.Data.Admin/Migrations/UserIdentityDb/20231222165912_CreateIdentitySchema.cs @@ -4,7 +4,7 @@ using Microsoft.EntityFrameworkCore.Migrations; #nullable disable -namespace MagMan.User.Migrations.UserIdentityDb +namespace MagMan.Data.Admin.Migrations.UserIdentityDb { public partial class CreateIdentitySchema : Migration { diff --git a/MagMan.User/Migrations/UserIdentityDb/UserIdentityDbContextModelSnapshot.cs b/MagMan.Data.Admin/Migrations/UserIdentityDb/UserIdentityDbContextModelSnapshot.cs similarity index 98% rename from MagMan.User/Migrations/UserIdentityDb/UserIdentityDbContextModelSnapshot.cs rename to MagMan.Data.Admin/Migrations/UserIdentityDb/UserIdentityDbContextModelSnapshot.cs index f753adb..fd95ddc 100644 --- a/MagMan.User/Migrations/UserIdentityDb/UserIdentityDbContextModelSnapshot.cs +++ b/MagMan.Data.Admin/Migrations/UserIdentityDb/UserIdentityDbContextModelSnapshot.cs @@ -1,13 +1,13 @@ // using System; -using MagMan.User; +using MagMan.Data.Admin; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; #nullable disable -namespace MagMan.User.Migrations.UserIdentityDb +namespace MagMan.Data.Admin.Migrations.UserIdentityDb { [DbContext(typeof(UserIdentityDbContext))] partial class UserIdentityDbContextModelSnapshot : ModelSnapshot @@ -19,7 +19,7 @@ namespace MagMan.User.Migrations.UserIdentityDb .HasAnnotation("ProductVersion", "6.0.25") .HasAnnotation("Relational:MaxIdentifierLength", 64); - modelBuilder.Entity("MagMan.User.DbModels.TableCount", b => + modelBuilder.Entity("MagMan.Data.Admin.DbModels.TableCount", b => { b.Property("Count") .HasColumnType("int"); diff --git a/MagMan.Data/Services/BaseServ.cs b/MagMan.Data.Admin/Services/BaseServ.cs similarity index 98% rename from MagMan.Data/Services/BaseServ.cs rename to MagMan.Data.Admin/Services/BaseServ.cs index b69bcc0..c391d77 100644 --- a/MagMan.Data/Services/BaseServ.cs +++ b/MagMan.Data.Admin/Services/BaseServ.cs @@ -5,7 +5,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace MagMan.Data.Services +namespace MagMan.Data.Admin.Services { /// /// Classe di partenza x costruzione servizi di accesso dati + cache diff --git a/MagMan.User/UserAdminConfiguration.cs b/MagMan.Data.Admin/UserAdminConfiguration.cs similarity index 96% rename from MagMan.User/UserAdminConfiguration.cs rename to MagMan.Data.Admin/UserAdminConfiguration.cs index abcc9f0..521af69 100644 --- a/MagMan.User/UserAdminConfiguration.cs +++ b/MagMan.Data.Admin/UserAdminConfiguration.cs @@ -7,7 +7,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace MagMan.User +namespace MagMan.Data.Admin { public class UserAdminConfiguration : IEntityTypeConfiguration { diff --git a/MagMan.User/UserData.cs b/MagMan.Data.Admin/UserData.cs similarity index 95% rename from MagMan.User/UserData.cs rename to MagMan.Data.Admin/UserData.cs index 269f347..cfb8475 100644 --- a/MagMan.User/UserData.cs +++ b/MagMan.Data.Admin/UserData.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Identity; -namespace MagMan.User +namespace MagMan.Data.Admin { /// /// Classe generalizzaizone identity (user + roles + claims) x gestione semplificata in editing diff --git a/MagMan.User/UserIdentityDbContext.cs b/MagMan.Data.Admin/UserIdentityDbContext.cs similarity index 87% rename from MagMan.User/UserIdentityDbContext.cs rename to MagMan.Data.Admin/UserIdentityDbContext.cs index 60fa9f1..28fd977 100644 --- a/MagMan.User/UserIdentityDbContext.cs +++ b/MagMan.Data.Admin/UserIdentityDbContext.cs @@ -1,4 +1,4 @@ -using MagMan.User.DbModels; +using MagMan.Data.Admin.DbModels; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; using System; @@ -7,7 +7,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace MagMan.User +namespace MagMan.Data.Admin { public class UserIdentityDbContext : IdentityDbContext { @@ -24,13 +24,8 @@ namespace MagMan.User { } } - public UserIdentityDbContext(DbContextOptions options) - : base(options) + public UserIdentityDbContext(DbContextOptions options) : base(options) { -#if false - // se non ci fosse... crea! - Database.EnsureCreated(); -#endif try { // se non ci fosse... crea o migra! @@ -44,7 +39,7 @@ namespace MagMan.User #region Public Properties - public DbSet DbSetCounts { get; set; } + public virtual DbSet DbSetCounts { get; set; } #endregion Public Properties diff --git a/MagMan.Data/UserRoleConfiguration.cs b/MagMan.Data.Admin/UserRoleConfiguration.cs similarity index 97% rename from MagMan.Data/UserRoleConfiguration.cs rename to MagMan.Data.Admin/UserRoleConfiguration.cs index b3c237b..c3a9f75 100644 --- a/MagMan.Data/UserRoleConfiguration.cs +++ b/MagMan.Data.Admin/UserRoleConfiguration.cs @@ -7,7 +7,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace MagMan.Data +namespace MagMan.Data.Admin { public class UserRoleConfiguration : IEntityTypeConfiguration { diff --git a/MagMan.Data/DbAdmin.cs b/MagMan.Data.Tenant/DbAdmin.cs similarity index 98% rename from MagMan.Data/DbAdmin.cs rename to MagMan.Data.Tenant/DbAdmin.cs index b414725..d3bc0b0 100644 --- a/MagMan.Data/DbAdmin.cs +++ b/MagMan.Data.Tenant/DbAdmin.cs @@ -4,7 +4,7 @@ using System; using System.Linq; using System.Threading.Tasks; -namespace MagMan.Data +namespace MagMan.Data.Tenant { public class DbAdmin : IDisposable { diff --git a/MagMan.Data/DbConfig.cs b/MagMan.Data.Tenant/DbConfig.cs similarity index 98% rename from MagMan.Data/DbConfig.cs rename to MagMan.Data.Tenant/DbConfig.cs index 573f3ff..6b2ea66 100644 --- a/MagMan.Data/DbConfig.cs +++ b/MagMan.Data.Tenant/DbConfig.cs @@ -5,7 +5,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace MagMan.Data +namespace MagMan.Data.Tenant { public static class DbConfig { diff --git a/MagMan.Data/DbModels/ConfigModel.cs b/MagMan.Data.Tenant/DbModels/ConfigModel.cs similarity index 95% rename from MagMan.Data/DbModels/ConfigModel.cs rename to MagMan.Data.Tenant/DbModels/ConfigModel.cs index ffc27f9..4e20fca 100644 --- a/MagMan.Data/DbModels/ConfigModel.cs +++ b/MagMan.Data.Tenant/DbModels/ConfigModel.cs @@ -4,7 +4,7 @@ using System.ComponentModel.DataAnnotations; // // This is here so CodeMaid doesn't reorganize this document // -namespace MagMan.Data.DbModels +namespace MagMan.Data.Tenant.DbModels { /// /// Tabella Config diff --git a/MagMan.Data/DbModels/ItemModel.cs b/MagMan.Data.Tenant/DbModels/ItemModel.cs similarity index 98% rename from MagMan.Data/DbModels/ItemModel.cs rename to MagMan.Data.Tenant/DbModels/ItemModel.cs index 6c309c9..e4a8eac 100644 --- a/MagMan.Data/DbModels/ItemModel.cs +++ b/MagMan.Data.Tenant/DbModels/ItemModel.cs @@ -6,7 +6,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace MagMan.Data.DbModels +namespace MagMan.Data.Tenant.DbModels { // // This is here so CodeMaid doesn't reorganize this document diff --git a/MagMan.Data/DbModels/MaterialModel.cs b/MagMan.Data.Tenant/DbModels/MaterialModel.cs similarity index 96% rename from MagMan.Data/DbModels/MaterialModel.cs rename to MagMan.Data.Tenant/DbModels/MaterialModel.cs index 5a4196d..906da7b 100644 --- a/MagMan.Data/DbModels/MaterialModel.cs +++ b/MagMan.Data.Tenant/DbModels/MaterialModel.cs @@ -6,7 +6,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace MagMan.Data.DbModels +namespace MagMan.Data.Tenant.DbModels { // // This is here so CodeMaid doesn't reorganize this document diff --git a/MagMan.Data/DbModels/MovMagModel.cs b/MagMan.Data.Tenant/DbModels/MovMagModel.cs similarity index 97% rename from MagMan.Data/DbModels/MovMagModel.cs rename to MagMan.Data.Tenant/DbModels/MovMagModel.cs index 432f8bf..32aac01 100644 --- a/MagMan.Data/DbModels/MovMagModel.cs +++ b/MagMan.Data.Tenant/DbModels/MovMagModel.cs @@ -6,7 +6,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace MagMan.Data.DbModels +namespace MagMan.Data.Tenant.DbModels { // // This is here so CodeMaid doesn't reorganize this document diff --git a/MagMan.Data/DbModels/PrintJobQueueModel.cs b/MagMan.Data.Tenant/DbModels/PrintJobQueueModel.cs similarity index 95% rename from MagMan.Data/DbModels/PrintJobQueueModel.cs rename to MagMan.Data.Tenant/DbModels/PrintJobQueueModel.cs index 0a9fa0a..bb902da 100644 --- a/MagMan.Data/DbModels/PrintJobQueueModel.cs +++ b/MagMan.Data.Tenant/DbModels/PrintJobQueueModel.cs @@ -6,7 +6,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace MagMan.Data.DbModels +namespace MagMan.Data.Tenant.DbModels { // // This is here so CodeMaid doesn't reorganize this document diff --git a/MagMan.User/DbModels/TableCount.cs b/MagMan.Data.Tenant/DbModels/TableCount.cs similarity index 92% rename from MagMan.User/DbModels/TableCount.cs rename to MagMan.Data.Tenant/DbModels/TableCount.cs index b1c30f5..de964b6 100644 --- a/MagMan.User/DbModels/TableCount.cs +++ b/MagMan.Data.Tenant/DbModels/TableCount.cs @@ -5,7 +5,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace MagMan.User.DbModels +namespace MagMan.Data.Tenant.DbModels { /// /// Classe fake x il conteggio tabelle e check preliminari diff --git a/MagMan.User/DbModels/UserPrivModel.cs b/MagMan.Data.Tenant/DbModels/UserPrivModel.cs similarity index 93% rename from MagMan.User/DbModels/UserPrivModel.cs rename to MagMan.Data.Tenant/DbModels/UserPrivModel.cs index e0ad310..a2d6db8 100644 --- a/MagMan.User/DbModels/UserPrivModel.cs +++ b/MagMan.Data.Tenant/DbModels/UserPrivModel.cs @@ -5,7 +5,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace MagMan.User.DbModels +namespace MagMan.Data.Tenant.DbModels { /// /// Tabella dei USER di MySql diff --git a/MagMan.Data/MagMan.Data.csproj b/MagMan.Data.Tenant/MagMan.Data.Tenant.csproj similarity index 75% rename from MagMan.Data/MagMan.Data.csproj rename to MagMan.Data.Tenant/MagMan.Data.Tenant.csproj index 01e5b7e..178602d 100644 --- a/MagMan.Data/MagMan.Data.csproj +++ b/MagMan.Data.Tenant/MagMan.Data.Tenant.csproj @@ -12,28 +12,10 @@ - - - - - - - - - - - - - - - - - - all @@ -54,4 +36,9 @@ + + + + + diff --git a/MagMan.Data/MagManContext.cs b/MagMan.Data.Tenant/MagManContext.cs similarity index 98% rename from MagMan.Data/MagManContext.cs rename to MagMan.Data.Tenant/MagManContext.cs index 8d76caf..ce5d95d 100644 --- a/MagMan.Data/MagManContext.cs +++ b/MagMan.Data.Tenant/MagManContext.cs @@ -1,4 +1,4 @@ -using MagMan.Data.DbModels; +using MagMan.Data.Tenant.DbModels; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using NLog; @@ -9,7 +9,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace MagMan.Data +namespace MagMan.Data.Tenant { public partial class MagManContext : DbContext { diff --git a/MagMan.Data/Migrations/20231222163946_InitDb.Designer.cs b/MagMan.Data.Tenant/Migrations/20231222163946_InitDb.Designer.cs similarity index 97% rename from MagMan.Data/Migrations/20231222163946_InitDb.Designer.cs rename to MagMan.Data.Tenant/Migrations/20231222163946_InitDb.Designer.cs index fdfcda4..9171131 100644 --- a/MagMan.Data/Migrations/20231222163946_InitDb.Designer.cs +++ b/MagMan.Data.Tenant/Migrations/20231222163946_InitDb.Designer.cs @@ -7,7 +7,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; #nullable disable -namespace MagMan.Data.Migrations +namespace MagMan.Data.Tenant.Migrations { [DbContext(typeof(MagManContext))] [Migration("20231222163946_InitDb")] diff --git a/MagMan.Data/Migrations/20231222163946_InitDb.cs b/MagMan.Data.Tenant/Migrations/20231222163946_InitDb.cs similarity index 97% rename from MagMan.Data/Migrations/20231222163946_InitDb.cs rename to MagMan.Data.Tenant/Migrations/20231222163946_InitDb.cs index a67ee8b..0a7e484 100644 --- a/MagMan.Data/Migrations/20231222163946_InitDb.cs +++ b/MagMan.Data.Tenant/Migrations/20231222163946_InitDb.cs @@ -2,7 +2,7 @@ #nullable disable -namespace MagMan.Data.Migrations +namespace MagMan.Data.Tenant.Migrations { public partial class InitDb : Migration { diff --git a/MagMan.Data/Migrations/20231222180319_AddMagBaseObj.Designer.cs b/MagMan.Data.Tenant/Migrations/20231222180319_AddMagBaseObj.Designer.cs similarity index 99% rename from MagMan.Data/Migrations/20231222180319_AddMagBaseObj.Designer.cs rename to MagMan.Data.Tenant/Migrations/20231222180319_AddMagBaseObj.Designer.cs index 9c79e5b..f1aa296 100644 --- a/MagMan.Data/Migrations/20231222180319_AddMagBaseObj.Designer.cs +++ b/MagMan.Data.Tenant/Migrations/20231222180319_AddMagBaseObj.Designer.cs @@ -8,7 +8,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; #nullable disable -namespace MagMan.Data.Migrations +namespace MagMan.Data.Tenant.Migrations { [DbContext(typeof(MagManContext))] [Migration("20231222180319_AddMagBaseObj")] diff --git a/MagMan.Data/Migrations/20231222180319_AddMagBaseObj.cs b/MagMan.Data.Tenant/Migrations/20231222180319_AddMagBaseObj.cs similarity index 98% rename from MagMan.Data/Migrations/20231222180319_AddMagBaseObj.cs rename to MagMan.Data.Tenant/Migrations/20231222180319_AddMagBaseObj.cs index 18a7385..b141d32 100644 --- a/MagMan.Data/Migrations/20231222180319_AddMagBaseObj.cs +++ b/MagMan.Data.Tenant/Migrations/20231222180319_AddMagBaseObj.cs @@ -4,7 +4,7 @@ using Microsoft.EntityFrameworkCore.Migrations; #nullable disable -namespace MagMan.Data.Migrations +namespace MagMan.Data.Tenant.Migrations { public partial class AddMagBaseObj : Migration { diff --git a/MagMan.Data/Migrations/20231222180523_AddMagBaseObj01.Designer.cs b/MagMan.Data.Tenant/Migrations/20231222180523_AddMagBaseObj01.Designer.cs similarity index 99% rename from MagMan.Data/Migrations/20231222180523_AddMagBaseObj01.Designer.cs rename to MagMan.Data.Tenant/Migrations/20231222180523_AddMagBaseObj01.Designer.cs index 3f644e4..bc5a906 100644 --- a/MagMan.Data/Migrations/20231222180523_AddMagBaseObj01.Designer.cs +++ b/MagMan.Data.Tenant/Migrations/20231222180523_AddMagBaseObj01.Designer.cs @@ -8,7 +8,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; #nullable disable -namespace MagMan.Data.Migrations +namespace MagMan.Data.Tenant.Migrations { [DbContext(typeof(MagManContext))] [Migration("20231222180523_AddMagBaseObj01")] diff --git a/MagMan.Data/Migrations/20231222180523_AddMagBaseObj01.cs b/MagMan.Data.Tenant/Migrations/20231222180523_AddMagBaseObj01.cs similarity index 98% rename from MagMan.Data/Migrations/20231222180523_AddMagBaseObj01.cs rename to MagMan.Data.Tenant/Migrations/20231222180523_AddMagBaseObj01.cs index b12d2ff..2ce7017 100644 --- a/MagMan.Data/Migrations/20231222180523_AddMagBaseObj01.cs +++ b/MagMan.Data.Tenant/Migrations/20231222180523_AddMagBaseObj01.cs @@ -4,7 +4,7 @@ using Microsoft.EntityFrameworkCore.Migrations; #nullable disable -namespace MagMan.Data.Migrations +namespace MagMan.Data.Tenant.Migrations { public partial class AddMagBaseObj01 : Migration { diff --git a/MagMan.Data/Migrations/MagManContextModelSnapshot.cs b/MagMan.Data.Tenant/Migrations/MagManContextModelSnapshot.cs similarity index 99% rename from MagMan.Data/Migrations/MagManContextModelSnapshot.cs rename to MagMan.Data.Tenant/Migrations/MagManContextModelSnapshot.cs index 6f1c17b..9092b6a 100644 --- a/MagMan.Data/Migrations/MagManContextModelSnapshot.cs +++ b/MagMan.Data.Tenant/Migrations/MagManContextModelSnapshot.cs @@ -7,7 +7,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; #nullable disable -namespace MagMan.Data.Migrations +namespace MagMan.Data.Tenant.Migrations { [DbContext(typeof(MagManContext))] partial class MagManContextModelSnapshot : ModelSnapshot diff --git a/MagMan.Data/Migrations/UserIdentityDb/20231222165912_CreateIdentitySchema.Designer.cs b/MagMan.Data.Tenant/Migrations/UserIdentityDb/20231222165912_CreateIdentitySchema.Designer.cs similarity index 100% rename from MagMan.Data/Migrations/UserIdentityDb/20231222165912_CreateIdentitySchema.Designer.cs rename to MagMan.Data.Tenant/Migrations/UserIdentityDb/20231222165912_CreateIdentitySchema.Designer.cs diff --git a/MagMan.Data/Migrations/UserIdentityDb/20231222165912_CreateIdentitySchema.cs b/MagMan.Data.Tenant/Migrations/UserIdentityDb/20231222165912_CreateIdentitySchema.cs similarity index 100% rename from MagMan.Data/Migrations/UserIdentityDb/20231222165912_CreateIdentitySchema.cs rename to MagMan.Data.Tenant/Migrations/UserIdentityDb/20231222165912_CreateIdentitySchema.cs diff --git a/MagMan.Data/Migrations/UserIdentityDb/UserIdentityDbContextModelSnapshot.cs b/MagMan.Data.Tenant/Migrations/UserIdentityDb/UserIdentityDbContextModelSnapshot.cs similarity index 100% rename from MagMan.Data/Migrations/UserIdentityDb/UserIdentityDbContextModelSnapshot.cs rename to MagMan.Data.Tenant/Migrations/UserIdentityDb/UserIdentityDbContextModelSnapshot.cs diff --git a/MagMan.Data/ModelBuilderExtensions.cs b/MagMan.Data.Tenant/ModelBuilderExtensions.cs similarity index 99% rename from MagMan.Data/ModelBuilderExtensions.cs rename to MagMan.Data.Tenant/ModelBuilderExtensions.cs index 5c8470e..fd001d9 100644 --- a/MagMan.Data/ModelBuilderExtensions.cs +++ b/MagMan.Data.Tenant/ModelBuilderExtensions.cs @@ -5,7 +5,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace MagMan.Data +namespace MagMan.Data.Tenant { public static class ModelBuilderExtensions { diff --git a/MagMan.Data.Tenant/Services/BaseServ.cs b/MagMan.Data.Tenant/Services/BaseServ.cs new file mode 100644 index 0000000..828283d --- /dev/null +++ b/MagMan.Data.Tenant/Services/BaseServ.cs @@ -0,0 +1,70 @@ +using Microsoft.Extensions.Configuration; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MagMan.Data.Tenant.Services +{ + /// + /// Classe di partenza x costruzione servizi di accesso dati + cache + /// + public class BaseServ + { + #region Protected Properties + + /// + /// Durata cache breve (1 min circa + perturbazione percentuale +/-10%) + /// + protected TimeSpan FastCache + { + get => TimeSpan.FromSeconds(cacheTtlShort * rnd.Next(900, 1100) / 1000); + } + + /// + /// Durata cache lunga (+ perturbazione percentuale +/-10%) + /// + protected TimeSpan LongCache + { + get => TimeSpan.FromSeconds(cacheTtlLong * rnd.Next(900, 1100) / 1000); + } + + /// + /// Durata cache MOLTO breve (10 sec circa + perturbazione percentuale +/-10%) + /// + protected TimeSpan UltraFastCache + { + get => TimeSpan.FromSeconds(cacheTtlShort / 6 * rnd.Next(900, 1100) / 1000); + } + + /// + /// Durata cache MOLTO lunga (+ perturbazione percentuale +/-10%) + /// + protected TimeSpan UltraLongCache + { + get => TimeSpan.FromSeconds(cacheTtlLong * 10 * rnd.Next(900, 1100) / 1000); + } + + #endregion Protected Properties + + + protected static IConfiguration _configuration = null!; + + #region Private Fields + + /// + /// Durata cache lunga IN SECONDI + /// + private int cacheTtlLong = 60 * 5; + + /// + /// Durata cache breve IN SECONDI + /// + private int cacheTtlShort = 60 * 1; + + private Random rnd = new Random(); + + #endregion Private Fields + } +} diff --git a/MagMan.Data/Services/MessageService.cs b/MagMan.Data.Tenant/Services/MessageService.cs similarity index 98% rename from MagMan.Data/Services/MessageService.cs rename to MagMan.Data.Tenant/Services/MessageService.cs index d9907f3..65c9a4c 100644 --- a/MagMan.Data/Services/MessageService.cs +++ b/MagMan.Data.Tenant/Services/MessageService.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace MagMan.Data.Services +namespace MagMan.Data.Tenant.Services { public class MessageService { diff --git a/MagMan.Data/Services/SelectData.cs b/MagMan.Data.Tenant/Services/SelectData.cs similarity index 97% rename from MagMan.Data/Services/SelectData.cs rename to MagMan.Data.Tenant/Services/SelectData.cs index 2cd4ae5..7e073ca 100644 --- a/MagMan.Data/Services/SelectData.cs +++ b/MagMan.Data.Tenant/Services/SelectData.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace MagMan.Data.Services +namespace MagMan.Data.Tenant.Services { public class SelectData { diff --git a/MagMan.Data/Services/SelectOrderData.cs b/MagMan.Data.Tenant/Services/SelectOrderData.cs similarity index 97% rename from MagMan.Data/Services/SelectOrderData.cs rename to MagMan.Data.Tenant/Services/SelectOrderData.cs index 1395eb3..bb95de3 100644 --- a/MagMan.Data/Services/SelectOrderData.cs +++ b/MagMan.Data.Tenant/Services/SelectOrderData.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace MagMan.Data.Services +namespace MagMan.Data.Tenant.Services { public class SelectOrderData : SelectData { diff --git a/MagMan.Data/AdminContext.cs b/MagMan.Data/AdminContext.cs deleted file mode 100644 index 459ae66..0000000 --- a/MagMan.Data/AdminContext.cs +++ /dev/null @@ -1,75 +0,0 @@ -using MagMan.Data.DbModels; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Configuration; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MagMan.Data -{ - // - // This is here so CodeMaid doesn't reorganize this document - // - public partial class AdminContext : DbContext - { - #region Private Fields - - private IConfiguration _configuration; - - #endregion Private Fields - - #region Public Constructors - - public AdminContext() - { - } - - public AdminContext(IConfiguration configuration) - { - _configuration = configuration; - } - - public AdminContext(DbContextOptions options) : base(options) - { - } - - #endregion Public Constructors - - #region Public Properties - - /// - /// User management - /// - public DbSet UserList { get; set; } - - #endregion Public Properties - - #region Protected Methods - - protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) - { - string connString = DbConfig.ADMIN_CONNECTION_STRING; - if (!optionsBuilder.IsConfigured) - { - //connString = _configuration.GetConnectionString("MagMan.Data"); - connString = "Server=localhost;port=3306;database=mysql;user=root;pwd=Egalware_24068!;sslmode=None;"; - var serverVersion = ServerVersion.AutoDetect(connString); - optionsBuilder.UseMySql(connString, serverVersion); - } - } - - protected override void OnModelCreating(ModelBuilder modelBuilder) - { - modelBuilder.Entity().HasKey(c => new { c.Host, c.User }); - - OnModelCreatingPartial(modelBuilder); - } - - #endregion Protected Methods - - - partial void OnModelCreatingPartial(ModelBuilder modelBuilder); - } -} \ No newline at end of file diff --git a/MagMan.Data/MailKitEmailSender.cs b/MagMan.Data/MailKitEmailSender.cs deleted file mode 100644 index eff7ed5..0000000 --- a/MagMan.Data/MailKitEmailSender.cs +++ /dev/null @@ -1,69 +0,0 @@ -using Microsoft.Extensions.Options; -using MimeKit.Text; -using MimeKit; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using MailKit.Net.Smtp; -using Microsoft.AspNetCore.Identity.UI.Services; - -namespace MagMan.Data -{ - /// - /// Implementazione interfaccia email con pacchetto MailKIT - /// - /// https://www.ryadel.com/en/asp-net-core-send-email-messages-smtp-mailkit/ - /// - public class MailKitEmailSender : IEmailSender - { - #region Public Constructors - - public MailKitEmailSender(IOptions options) - { - this.Options = options.Value; - } - - #endregion Public Constructors - - #region Public Properties - - public MailKitEmailSenderOptions Options { get; set; } - - #endregion Public Properties - - #region Public Methods - - public Task Execute(string to, string subject, string message) - { - // create message - var email = new MimeMessage(); - email.Sender = MailboxAddress.Parse(Options.Sender_EMail); - if (!string.IsNullOrEmpty(Options.Sender_Name)) - email.Sender.Name = Options.Sender_Name; - email.From.Add(email.Sender); - email.To.Add(MailboxAddress.Parse(to)); - email.Subject = subject; - email.Body = new TextPart(TextFormat.Html) { Text = message }; - - // send email - using (var smtp = new SmtpClient()) - { - smtp.Connect(Options.Host_Address, Options.Host_Port, Options.Host_SecureSocketOptions); - smtp.Authenticate(Options.Host_Username, Options.Host_Password); - smtp.Send(email); - smtp.Disconnect(true); - } - - return Task.FromResult(true); - } - - public Task SendEmailAsync(string email, string subject, string message) - { - return Execute(email, subject, message); - } - - #endregion Public Methods - } -} \ No newline at end of file diff --git a/MagMan.Data/MailKitEmailSenderOptions.cs b/MagMan.Data/MailKitEmailSenderOptions.cs deleted file mode 100644 index 36eaadd..0000000 --- a/MagMan.Data/MailKitEmailSenderOptions.cs +++ /dev/null @@ -1,36 +0,0 @@ -using MailKit.Security; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MagMan.Data -{ - public class MailKitEmailSenderOptions - { - #region Public Constructors - - public MailKitEmailSenderOptions() - { - Host_SecureSocketOptions = SecureSocketOptions.Auto; - } - - #endregion Public Constructors - - #region Public Properties - - public string Host_Address { get; set; } = ""; - - public string Host_Password { get; set; } = ""; - public int Host_Port { get; set; } = 0; - - public SecureSocketOptions Host_SecureSocketOptions { get; set; } = SecureSocketOptions.None; - public string Host_Username { get; set; } = ""; - public string Sender_EMail { get; set; } = ""; - - public string Sender_Name { get; set; } = ""; - - #endregion Public Properties - } -} \ No newline at end of file diff --git a/MagMan.Data/UserAdminConfiguration.cs b/MagMan.Data/UserAdminConfiguration.cs deleted file mode 100644 index c2cbde7..0000000 --- a/MagMan.Data/UserAdminConfiguration.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Microsoft.AspNetCore.Identity; -using Microsoft.EntityFrameworkCore.Metadata.Builders; -using Microsoft.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MagMan.Data -{ - public class UserAdminConfiguration : IEntityTypeConfiguration - { - #region Public Methods - - public void Configure(EntityTypeBuilder builder) - { - builder.HasData( - new IdentityUser { UserName = "samuele@steamware.net", Email = "samuele@steamware.net", EmailConfirmed = true }, - new IdentityUser { UserName = "samuele.locatelli@egalware.com", Email = "samuele.locatelli@egalware.com", EmailConfirmed = true } - ); - } - - #endregion Public Methods - } -} diff --git a/MagMan.Data/UserData.cs b/MagMan.Data/UserData.cs deleted file mode 100644 index 5c15c58..0000000 --- a/MagMan.Data/UserData.cs +++ /dev/null @@ -1,25 +0,0 @@ -using Microsoft.AspNetCore.Identity; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MagMan.Data -{ - /// - /// Classe generalizzaizone identity (user + roles + claims) x gestione semplificata in editing - /// - public class UserData - { - #region Public Properties - - public List Claims { get; set; } = new List(); - - public IdentityUser Identity { get; set; } = new IdentityUser(); - - public List Roles { get; set; } = new List(); - - #endregion Public Properties - } -} diff --git a/MagMan.Data/UserIdentityDbContext.cs b/MagMan.Data/UserIdentityDbContext.cs deleted file mode 100644 index 3d415a1..0000000 --- a/MagMan.Data/UserIdentityDbContext.cs +++ /dev/null @@ -1,79 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection.Emit; -using System.Text; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Identity.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore; -using MagMan.Data.DbModels; - -namespace MagMan.Data -{ - public class UserIdentityDbContext : IdentityDbContext - { - #region Public Constructors - - public UserIdentityDbContext() - { - try - { - // se non ci fosse... crea o migra! - Database.Migrate(); - } - catch (Exception exc) - { } - } - - public UserIdentityDbContext(DbContextOptions options) - : base(options) - { -#if false - // se non ci fosse... crea! - Database.EnsureCreated(); -#endif - try - { - // se non ci fosse... crea o migra! - Database.Migrate(); - } - catch (Exception exc) - { } - } - - #endregion Public Constructors - - #region Public Properties - - public DbSet DbSetCounts { get; set; } - - #endregion Public Properties - - #region Protected Methods - - protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) - { - string connString = DbConfig.CONNECTION_STRING; - if (!optionsBuilder.IsConfigured) - { - var serverVersion = ServerVersion.AutoDetect(connString); - optionsBuilder.UseMySql(connString, serverVersion); - } - } - - protected override void OnModelCreating(ModelBuilder builder) - { - base.OnModelCreating(builder); - - // aggiunta ruoli - builder.ApplyConfiguration(new UserRoleConfiguration()); - // aggiunta user admin base - builder.ApplyConfiguration(new UserAdminConfiguration()); - - // Todo: aggiungere configurazione claims oltre ai roles... - - } - - #endregion Protected Methods - } -} diff --git a/MagMan.UI.sln b/MagMan.UI.sln index 5c96199..60bf249 100644 --- a/MagMan.UI.sln +++ b/MagMan.UI.sln @@ -7,9 +7,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MagMan.UI", "MagMan.UI\MagM EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MagMan.Core", "MagMan.Core\MagMan.Core.csproj", "{328950E0-CCFB-40EF-AC68-A26912135588}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MagMan.Data", "MagMan.Data\MagMan.Data.csproj", "{4F26EF07-74E7-4A8F-B24B-19AACDD718B3}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MagMan.Data.Tenant", "MagMan.Data.Tenant\MagMan.Data.Tenant.csproj", "{69E22B67-FFA7-4E21-81A7-B8F025A420C5}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MagMan.User", "MagMan.User\MagMan.User.csproj", "{E63054F2-C7EE-4996-B764-B9DA6033F754}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MagMan.Data.Admin", "MagMan.Data.Admin\MagMan.Data.Admin.csproj", "{324914D5-2616-42D8-82EF-5420148DC9E1}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -25,14 +25,14 @@ Global {328950E0-CCFB-40EF-AC68-A26912135588}.Debug|Any CPU.Build.0 = Debug|Any CPU {328950E0-CCFB-40EF-AC68-A26912135588}.Release|Any CPU.ActiveCfg = Release|Any CPU {328950E0-CCFB-40EF-AC68-A26912135588}.Release|Any CPU.Build.0 = Release|Any CPU - {4F26EF07-74E7-4A8F-B24B-19AACDD718B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4F26EF07-74E7-4A8F-B24B-19AACDD718B3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4F26EF07-74E7-4A8F-B24B-19AACDD718B3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4F26EF07-74E7-4A8F-B24B-19AACDD718B3}.Release|Any CPU.Build.0 = Release|Any CPU - {E63054F2-C7EE-4996-B764-B9DA6033F754}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E63054F2-C7EE-4996-B764-B9DA6033F754}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E63054F2-C7EE-4996-B764-B9DA6033F754}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E63054F2-C7EE-4996-B764-B9DA6033F754}.Release|Any CPU.Build.0 = Release|Any CPU + {69E22B67-FFA7-4E21-81A7-B8F025A420C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {69E22B67-FFA7-4E21-81A7-B8F025A420C5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {69E22B67-FFA7-4E21-81A7-B8F025A420C5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {69E22B67-FFA7-4E21-81A7-B8F025A420C5}.Release|Any CPU.Build.0 = Release|Any CPU + {324914D5-2616-42D8-82EF-5420148DC9E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {324914D5-2616-42D8-82EF-5420148DC9E1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {324914D5-2616-42D8-82EF-5420148DC9E1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {324914D5-2616-42D8-82EF-5420148DC9E1}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/MagMan.UI/Components/MigrationManager.razor b/MagMan.UI/Components/MigrationManager.razor index 512650a..cf922c0 100644 --- a/MagMan.UI/Components/MigrationManager.razor +++ b/MagMan.UI/Components/MigrationManager.razor @@ -44,7 +44,7 @@ return; reportProcess(); - await MagMan.Data.DbAdmin.migrateDbMain(); + await MagMan.Data.Tenant.DbAdmin.migrateDbMain(); await ReloadData(); reportChange(); } @@ -55,7 +55,7 @@ return; reportProcess(); - await MagMan.User.DbAdmin.migrateDbIdentity(); + await MagMan.Data.Admin.DbAdmin.migrateDbIdentity(); await ReloadData(); reportChange(); } @@ -71,7 +71,7 @@ protected async Task ReloadData() { - var resultIden = await Health.Checks.DbIdentity(DbConfig.DATABASE_NAME); + var resultIden = await Health.Checks.DbIdentity(MagMan.Data.Admin.DbConfig.DATABASE_NAME); DbIdentity = (resultIden.Status == Microsoft.Extensions.Diagnostics.HealthChecks.HealthStatus.Healthy); DbAllOk = (DbIdentity); } diff --git a/MagMan.UI/Components/SearchMod.razor.cs b/MagMan.UI/Components/SearchMod.razor.cs index 8f49591..c16384a 100644 --- a/MagMan.UI/Components/SearchMod.razor.cs +++ b/MagMan.UI/Components/SearchMod.razor.cs @@ -1,6 +1,5 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -using MagMan.Data.Services; + +using MagMan.Data.Tenant.Services; using Microsoft.AspNetCore.Components; namespace MagMan.UI.Components diff --git a/MagMan.UI/Components/SetupDiagnostics.razor b/MagMan.UI/Components/SetupDiagnostics.razor index 28f9b47..e0b04ba 100644 --- a/MagMan.UI/Components/SetupDiagnostics.razor +++ b/MagMan.UI/Components/SetupDiagnostics.razor @@ -87,10 +87,10 @@ } protected async Task ReloadData() { - var resultLog = await Health.Checks.DbPlantTable(DbConfig.DATABASE_NAME); - var resultIden = await Health.Checks.DbIdentity(DbConfig.DATABASE_NAME); - DbLogOk = (resultLog.Status == HealthStatus.Healthy); + var resultIden = await Health.Checks.DbIdentity(MagMan.Data.Admin.DbConfig.DATABASE_NAME); + var resultLog = await Health.Checks.DbPlantTable(MagMan.Data.Tenant.DbConfig.DATABASE_NAME); DbIdentity = (resultIden.Status == HealthStatus.Healthy); + DbLogOk = (resultLog.Status == HealthStatus.Healthy); DbAllOk = (DbLogOk && DbIdentity); } diff --git a/MagMan.UI/Health/Checks.cs b/MagMan.UI/Health/Checks.cs index 4dfe5a1..8c112a9 100644 --- a/MagMan.UI/Health/Checks.cs +++ b/MagMan.UI/Health/Checks.cs @@ -1,12 +1,13 @@ -using MagMan.Data.DbModels; +using MagMan.Data.Tenant.DbModels; using MagMan.Data; using Microsoft.Extensions.Diagnostics.HealthChecks; using NLog; using Org.BouncyCastle.Pqc.Crypto.Lms; using System.Net.NetworkInformation; -using MagMan.User; -using MagMan.User.DbModels; +using MagMan.Data.Admin; +using MagMan.Data.Admin.DbModels; using Microsoft.EntityFrameworkCore; +using MagMan.Data.Tenant; namespace MagMan.UI.Health { @@ -25,7 +26,7 @@ namespace MagMan.UI.Health using (var appDb = new UserIdentityDbContext()) { string description = "Try check Table IdentityUsers"; - List recordList = new List(); + List recordList = new List(); var healthCheckData = new Dictionary(); try { @@ -85,7 +86,7 @@ namespace MagMan.UI.Health using (var adminDb = new AdminContext()) { string description = "Try check MySql User table"; - List userList = new List(); + List userList = new List(); var healthCheckData = new Dictionary(); try { diff --git a/MagMan.UI/MagMan.UI.csproj b/MagMan.UI/MagMan.UI.csproj index 7ce14f2..a9e7c1a 100644 --- a/MagMan.UI/MagMan.UI.csproj +++ b/MagMan.UI/MagMan.UI.csproj @@ -44,14 +44,15 @@ runtime; build; native; contentfiles; analyzers; buildtransitive + - - + + diff --git a/MagMan.UI/Pages/Index.razor.cs b/MagMan.UI/Pages/Index.razor.cs index 60125d1..090aa2a 100644 --- a/MagMan.UI/Pages/Index.razor.cs +++ b/MagMan.UI/Pages/Index.razor.cs @@ -1,4 +1,4 @@ -using MagMan.Data.Services; +using MagMan.Data.Tenant.Services; using Microsoft.AspNetCore.Components; using System; diff --git a/MagMan.UI/Program.cs b/MagMan.UI/Program.cs index c6f9588..3b6fdb2 100644 --- a/MagMan.UI/Program.cs +++ b/MagMan.UI/Program.cs @@ -1,22 +1,23 @@ -using MagMan.UI.Data; -using Microsoft.AspNetCore.Components; -using Microsoft.AspNetCore.Components.Web; -using Microsoft.AspNetCore.Identity; -using Microsoft.EntityFrameworkCore; -using MagMan.Data; -using Microsoft.AspNetCore.Localization; -using System.Globalization; -using Microsoft.AspNetCore.HttpOverrides; -using StackExchange.Redis; -using MagMan.Data.Services; -using HealthChecks.UI.Client; -using Microsoft.AspNetCore.Diagnostics.HealthChecks; using Blazored.LocalStorage; using Blazored.SessionStorage; -using Microsoft.Extensions.Diagnostics.HealthChecks; -using System.Configuration; -using Microsoft.AspNetCore.Components.Authorization; +using HealthChecks.UI.Client; +using MagMan.Core; +using MagMan.Core.Services; +using MagMan.Data; +using MagMan.Data.Admin; +using MagMan.Data.Tenant; +using MagMan.Data.Tenant.Services; using MagMan.UI.Areas.Identity; +using MagMan.UI.Data; +using Microsoft.AspNetCore.Components.Authorization; +using Microsoft.AspNetCore.Diagnostics.HealthChecks; +using Microsoft.AspNetCore.HttpOverrides; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Localization; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Diagnostics.HealthChecks; +using StackExchange.Redis; +using System.Globalization; var builder = WebApplication.CreateBuilder(args); @@ -37,14 +38,18 @@ builder.Services.AddSingleton(redisMultiplexer); string dbServerAddr = builder.Configuration["DbConfig:Server"]; string nKey = builder.Configuration["DbConfig:nKey"]; string sKey = builder.Configuration["DbConfig:sKey"]; -MagMan.Data.DbConfig.InitDb(dbServerAddr, nKey, sKey); -MagMan.User.DbConfig.InitDb(dbServerAddr, nKey, sKey); +MagMan.Data.Admin.DbConfig.InitDb(dbServerAddr, nKey, sKey); +MagMan.Data.Tenant.DbConfig.InitDb(dbServerAddr, nKey, sKey); // inizializzo il DB e creo (se necessario) l'utente -MagMan.User.DbConfig.CheckUser(nKey, sKey); +MagMan.Data.Admin.DbConfig.CheckUser(nKey, sKey); + +// spostare e fare in caso nelle chiamate custom +#if true // verifico se serve applicazione migrazioni -MagMan.Data.DbConfig.ExecMigrationMain(); +MagMan.Data.Tenant.DbConfig.ExecMigrationMain(); +#endif //DbConfig.ExecMigrationIdentity(); -string connStringDB = DbConfig.CONNECTION_STRING; +string connStringDB = MagMan.Data.Admin.DbConfig.CONNECTION_STRING; // healthchecks builder.Services.AddHealthChecks() @@ -85,11 +90,11 @@ builder.Services.Configure(o => -builder.Services.AddDbContext(options => +builder.Services.AddDbContext(options => options.UseSqlServer(connectionString)); builder.Services.AddDefaultIdentity(options => options.SignIn.RequireConfirmedAccount = true) - .AddEntityFrameworkStores(); + .AddEntityFrameworkStores(); #if false @@ -123,7 +128,7 @@ builder.Services.AddBlazoredLocalStorage(); builder.Services.AddBlazoredSessionStorage(); // gestione email -builder.Services.Configure(builder.Configuration.GetSection(nameof(MailKitMailSettings))); +builder.Services.Configure(builder.Configuration.GetSection(nameof(MailKitMailSettings))); builder.Services.AddScoped(); builder.Services.AddHttpContextAccessor(); diff --git a/MagMan.UI/_Imports.razor b/MagMan.UI/_Imports.razor index 698ee8b..105b4e4 100644 --- a/MagMan.UI/_Imports.razor +++ b/MagMan.UI/_Imports.razor @@ -7,11 +7,14 @@ @using Microsoft.AspNetCore.Components.Web.Virtualization @using Microsoft.JSInterop @using MagMan.Core +@using MagMan.Core.DTO @using MagMan.Data -@using MagMan.Data.DbModels -@using MagMan.Data.Services -@* @using MagMan.Data.DTO *@ -@using MagMan.Data.Services +@using MagMan.Data.Admin +@using MagMan.Data.Admin.DbModels +@using MagMan.Data.Admin.Services +@using MagMan.Data.Tenant +@using MagMan.Data.Tenant.DbModels +@using MagMan.Data.Tenant.Services @using MagMan.UI @using MagMan.UI.Shared @using MagMan.UI.Components diff --git a/MagMan.User/UserRoleConfiguration.cs b/MagMan.User/UserRoleConfiguration.cs deleted file mode 100644 index ab563c7..0000000 --- a/MagMan.User/UserRoleConfiguration.cs +++ /dev/null @@ -1,30 +0,0 @@ -using Microsoft.AspNetCore.Identity; -using Microsoft.EntityFrameworkCore.Metadata.Builders; -using Microsoft.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MagMan.User -{ - public class UserRoleConfiguration : IEntityTypeConfiguration - { - #region Public Methods - - public void Configure(EntityTypeBuilder builder) - { - builder.HasData( - new IdentityRole { Name = "Undef", NormalizedName = "UNDEF" }, - //new IdentityRole { Name = "ExtUser", NormalizedName = "EXTUSER" }, - //new IdentityRole { Name = "ExtTransp", NormalizedName = "EXTTRANSP" }, - new IdentityRole { Name = "User", NormalizedName = "USER" }, - new IdentityRole { Name = "Admin", NormalizedName = "ADMIN" }, - new IdentityRole { Name = "SuperAdmin", NormalizedName = "SUPERADMIN" } - ); - } - - #endregion Public Methods - } -} diff --git a/README.md b/README.md index 66b7181..889c395 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,45 @@ Il sofware è previsto in modalità **multi-tenant**, dove verrà generato un DB Di base il sistema deve prevedere il riconoscimento degli utenti e/o dei software EgalWare licenziati e reindirizzare l'impiego delle funzionalità avanzate verso il DB dedicato al cliente. +## Architettura + +Il progetto è pensato in architettura **multi-tenant** per la versione **online**, ovvero un unico indirizzo web (tramite load balancers x reverse proxy) che fornisce l'applicazione a tutti i clienti. + +Ogni cliente, facendo login, verrà riconosciuto e gli verrà fornita la partizione dati/DB di competenza del tenant secondo lo schema seguente: + +### Workflow + +Di seguito lo schema di funzionamento +```mermaid +flowchart TB + user(User Login\n web browser) --> ServerApp + egtbw(EgtB&W sw\n REST call) --> ServerApp + + ServerApp{{magman.egalware.com}} --> multiTenant(Admin DB) + ServerApp --> clientData(Tenant DB Data) + + multiTenant--> tenantMgmt(Clienti) + multiTenant--> MachMgmt(Macchine) + multiTenant--> KeyMgmt(Chiavi) + multiTenant--> UserMgmt(Utenti) + + clientData --> MagData(Dati Magazzino) + clientData --> MachineData(Stato Impianto) + clientData --> LogData(Log Impianto) + clientData --> CommData(Stato Commesse) + + +style ServerApp fill:#223999 +style multiTenant fill:#921111 +style clientData fill:#226919 + + +``` + +In pratica le chiamate vengono inviate tutte al servizio web e da qui smistate per competenza e funzionalità verso i vari DB. + +A livello architetturale il progetto è separato tra la parte **Data.Admin** e **Data.Tenant**. + ## Oggetti di base Gli oggetti di abse sono i seguenti: @@ -88,4 +127,6 @@ Ogni nuovo user dovrà poi essere associato al bucket del cliente tramite un cod Version | Date | Editor | Note :--: |----------|----- | ----: + 0.3 | 2024.01.10 | S.E. Locatelli | Revisione modalità multi-tenant + 0.2 | 2024.01.05 | S.E. Locatelli | update ruoli e workflow 0.1 | 2023.12.28 | S.E. Locatelli | Prima revisione documento diff --git a/README.pdf b/README.pdf index e21a5040e4900a162110b7042deca3d711683d3e..a432f2209efc78dc5e7fb7d8e38a2ea7a301f430 100644 GIT binary patch delta 48034 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 delta 29663 zcmZ^}18`5I2$;P&A+uCGf+cxjmzN3w8+s4MWlZ|aB|31(Ay;Wb;SAW%+>7G74 zXU=tMPS@1c-Eag^vH+f-N5{<0!p_RZ&PK<~O!e=gfn!o|Fcmj)H6x}L=VfJPWoKsj zUzfxPE>Nz-J~>cspfEcnfSrw-Sx}JJ#nsu&$PUgkt6Fz0jzS96@4B{aMmpKWfE>Pj z>)@7+8I8!Wj)9yE=gWZ9IWh(~p*OOdztmbt%Vxsk#L8O1m{#BZ<)Qj;9gp?#JFBN* znrF-ZI3PlPdiy&*)7Z@b!5ZuJe9#ox9WX z+Q04prIgKJ?z6C-&bp?gRxnS9HFV@-(iE4|7T@olH(K@bXD+4uuHYL)>y_@dlgoh;Kbxrg z;a4PHw>>pL3ATPH-0YPF=nL3CoH^OCg-^OyqkS+|7Tb%Q^cJ?6g^*6PIqf*^E!1Hp zxKkvhU-yavNZgGU_nk+t;vIX>>&-RTkOYUC8D-j_!U{qzFmO}kq=#tCrWBC%RUh3z zXJF!;uXzB}1-TG|)6Yb+1o?k^fUnB&8LHPamk~4fY8Hx~qn=0NqQ{|_O`#}*yhf}V z;}y!8lYIEUFeVeY@XJ!6=kz(zwh#UUpKUqcKW8TbOg8i$e7-MpHA^qmp6Tbz5|F@# zf`QS&zhe>%!62+C(joZkp{l`y8Y{=Q-#wqetC;-lLCv?F1TZDkulgs=z^a~-n|pLv z@z53JSOucZm{0FqsKas1dWnqu_!ZWEv$G}dL0IRrL10x2sDT8(cg*uXV{eSIP~H{Y z6$>hJuJvBrS3H60tRr)h({7pV2@#Q%!}uz1a&GwZf8d0P!;k$wXK(H}K5^dx(4 z8+BnTw$pj^TW8POd9`;bDE%}A zaOBoqEyE!^cR`0QctXTSi&JA81T?sL?ZwlqPZ09YLPy{|JAIV^xvu{9qJsos=Wz>!+KoH3wDSSFRJBf)G|{K2_FbGeA~6hdD&F*j%xJ z9Sv`z(ozP)$NB2wUg%#PLxMaM#suC12o5XR1jTt);0boXS@3VH6zQ-?>Q0OAlj&MG ziku%u_*dqh`J59#CV>7q-OQ-eAy)JyOVmQ$+0{HEpPD^_jRORDG#yj*+2B_YrzBGTlX;b0{CED#s5XTfVDAGXyK358VZ?F!tYFc-PI+3& zo@rHSs_)b;>1oS`TXgnwb04oZT**t3`1pVPpTq?0@?&Rd(x(S8ZF5n&>R^e)jl@28 zEld~wnFZxamP9gBpmKGQ_`P-qlyjV%U?ZJ+_>UhCZb{hONJLo|L(zY z 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