using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; using gehGassi.Domain.Common; using gehGassi.Domain.Roles; using gehGassi.Domain.Shop; using gehGassi.Domain.Users; using gehGassi.Permissions; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Options; using Newtonsoft.Json; namespace gehGassi.Persistence { /// /// Hilfsklasse für das Initialisieren der DB. /// Befüllen mit Standard-Werten /// public class DbInitializer { private readonly UserManager _userManager; private readonly RoleManager _roleManager; private readonly IOptions _options; private readonly IWebHostEnvironment _hostingEnvironment; private readonly SqlDbContext _context; private const string RoleToPermissionsFilename = "rolepermissions.json"; /// /// Erstellt eine Isntanz /// /// Instanz eines DbContext /// Instanz eines UserManager /// Instanz eines RoleManager /// Instanz eines IOptions DbInitializerOptions /// Instanz eines IHostingEnvironment public DbInitializer(DbContext context, UserManager userManager, RoleManager roleManager, IOptions options, IWebHostEnvironment hostingEnvironment) { _userManager = userManager; _roleManager = roleManager; _options = options; _hostingEnvironment = hostingEnvironment; _context = (SqlDbContext)context; } /// /// Befüllen der DB mit Standard-Werten /// /// true wenn erfolgreich, false sonst public async Task SeedAsync() { //Sicherstellen, dass DB existiert //await _context.Database.EnsureCreatedAsync(); try { await _context.Database.MigrateAsync(); } catch (Exception ex) { var err = ex.Message; } //Anlegen der Rollen //Laden der Vordefinierten Rollen-Rechte var path = Path.Combine(_hostingEnvironment.WebRootPath, _options.Value.Directory); var rolesToPermissions = JsonConvert.DeserializeObject>(File.ReadAllText(Path.Combine(path, RoleToPermissionsFilename))); foreach (var role in rolesToPermissions) { if (!await _roleManager.RoleExistsAsync(role.RoleName)) { await _roleManager.CreateAsync(new ApplicationRole(role.RoleName, role.Permissions.PackPermissionsIntoString())); } else { var roleItem = await _roleManager.FindByNameAsync(role.RoleName); if (roleItem != null) { roleItem.Permissions = role.Permissions.PackPermissionsIntoString(); await _roleManager.UpdateAsync(roleItem); } } } var adminRole = await _roleManager.FindByNameAsync("Administrator"); var adminUser = new ApplicationUser { FirstName = "Florian", LastName = "Mihalits", FullName = "Florian Mihalits", Email = "office@creativebits.com", NormalizedEmail = "OFFICE@CREATIVEBITS.COM", UserName = "office@creativebits.com", NormalizedUserName = "OFFICE@CREATIVEBITS.COM", PhoneNumber = "+43 676 846024 200", EmailConfirmed = true, PhoneNumberConfirmed = true, SecurityStamp = Guid.NewGuid().ToString("D"), TimeZoneId = TimeZoneInfo.Local.Id, PreferredLanguage = "de", Photo = string.Empty, RegistrationDate = DateTimeOffset.UtcNow, LastLoginDate = DateTimeOffset.UtcNow, Permissions = adminRole.Permissions }; if (!_context.Users.Any(u => u.UserName == adminUser.UserName)) { await _userManager.CreateAsync(adminUser, "!gehGassi#321"); await _userManager.AddToRoleAsync(adminUser, "Administrator"); } //Anderes initialisieren.... var shopSettings = await _context.ShopSettings.FirstOrDefaultAsync(); if (shopSettings == null) { shopSettings = new ShopSettings() { PaymentOnInvoice = false, PayPalEnabled = false, PayPalClientId = string.Empty, PayPalSecret = string.Empty, KlarnaEnabled = false, KlarnaClientId = string.Empty, KlarnaSecret = string.Empty, OrderEmail = "office@gehgassi.com", ShipmentCalculationType = ShipmentCalculationType.Weight }; _context.ShopSettings.Add(shopSettings); } await _context.SaveChangesAsync(); return true; } } /// /// Einstellungen für den DbInitionalizer /// public class DbInitializerOptions { /// /// Basis-Directory in welchem die Rollen-Rechte Datei liegt /// public string Directory { get; set; } } }