DataInitializer.cs
Home
/
Src /
WebFileServ.Model.DAL /
DataInit /
DataInitializer.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Microsoft.AspNetCore.Identity;
using WebFileServ.Model.Entities.Identity;
using WebFileServ.Model.DAL.DataBase.EF;
namespace WebFileServ.Model.DAL.DataInit
{
/// <summary>
/// Класс для управления состоянием БД
/// </summary>
public class DataInitializer
: IDisposable
{
public DataInitializerConfig DataInitializerConfig { private set; get; }
private readonly ApplicationDbContext Context;
private readonly UserManager<ApplicationUser> UserManager;
private readonly RoleManager<ApplicationRole> RoleManager;
public DataInitializer
(
DataInitializerConfig dataInitializerConfig,
ApplicationDbContext context,
UserManager<ApplicationUser> userManager,
RoleManager<ApplicationRole> roleManager
)
{
DataInitializerConfig = dataInitializerConfig;
Context = context;
UserManager = userManager;
RoleManager = roleManager;
}
public async Task Init()
{
if (DataInitializerConfig.ReCreateDataBase)
{
await RemoveDbIfExsist();
}
if (DataInitializerConfig.AutoApplyMigration)
{
ApplyMigrations();
}
if (DataInitializerConfig.FillData)
{
await CreateAdminUserIfNotExsist();
}
}
/// <summary>
/// Удаление существующей базы. Для тестов.
/// </summary>
private async Task RemoveDbIfExsist()
{
await Context.Database.EnsureDeletedAsync();
}
/// <summary>
/// Создание БД если нет и автоматическое накатывание мигарций
/// </summary>
private void ApplyMigrations()
{
Context.Database.Migrate();
}
/// <summary>
/// Иницилизация пользователя администратора по-умолчанию.
/// Иницилизация роли администраторов
/// </summary>
/// <returns></returns>
private async Task CreateAdminUserIfNotExsist()
{
var email = "admin@admin";
var password = "demo";
var roleName = "AdminRole";
var adminRole = await RoleManager
.FindByNameAsync(roleName);
if (adminRole == null)
{
var createRoleResult = await RoleManager.CreateAsync(
new ApplicationRole(roleName)
);
if (!createRoleResult.Succeeded)
{
throw new Exception(
createRoleResult.Errors.FirstOrDefault()?.Description
);
}
}
var adminUser = await UserManager
.FindByNameAsync(email);
if (adminUser == null)
{
var createUserResult = await UserManager
.CreateAsync(
new ApplicationUser()
{
Email = email,
UserName = email
},
password
);
if (!createUserResult.Succeeded)
{
throw new Exception(
createUserResult.Errors.FirstOrDefault()?.Description
);
}
adminUser = await UserManager
.FindByNameAsync(email);
var addToRoleResult = await UserManager
.AddToRoleAsync(adminUser, roleName);
if (!addToRoleResult.Succeeded)
{
throw new Exception(
addToRoleResult.Errors.FirstOrDefault()?.Description
);
}
var adminRoles = adminUser
.RolesDict;
}
}
#region Dispose
private bool disposed = false;
// реализация интерфейса IDisposable.
public void Dispose()
{
Dispose(true);
// подавляем финализацию
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// Освобождаем управляемые ресурсы
Context.Dispose();
UserManager.Dispose();
RoleManager.Dispose();
}
// освобождаем неуправляемые объекты
disposed = true;
}
}
// Деструктор
~DataInitializer()
{
Dispose(false);
}
#endregion
}
}