http-api/src/Identity/IdentitySeeder.cs
2025-04-29 23:51:19 +03:00

86 lines
2.4 KiB
C#

using Microsoft.AspNetCore.Identity;
using IdentityUser = cuqmbr.TravelGuide.Identity.Models.IdentityUser;
using IdentityRole = cuqmbr.TravelGuide.Identity.Models.IdentityRole;
using Microsoft.Extensions.DependencyInjection;
using IdentityRoleEnum = cuqmbr.TravelGuide.Application.Common.Models
.IdentityRole;
namespace cuqmbr.TravelGuide.Identity;
public static class IdentitySeeder
{
public static void Seed(IServiceProvider serviceProvider)
{
using var userManager = serviceProvider
.GetService<UserManager<IdentityUser>>();
userManager.UserValidators.Clear();
userManager.PasswordValidators.Clear();
using var roleManager = serviceProvider
.GetService<RoleManager<IdentityRole>>();
roleManager.RoleValidators.Clear();
// Seed Roles
foreach (var role in IdentityRoleEnum.Enumerations)
{
var roleString = role.Value.Name;
var roleExists = roleManager.RoleExistsAsync(roleString).Result;
if (roleExists)
{
continue;
}
roleManager.CreateAsync(new IdentityRole()
{
Name = roleString,
ConcurrencyStamp = Guid.NewGuid().ToString("D")
}).Wait();
}
// Seed Identity
var users = new (string Email, string Password, IdentityRoleEnum[] Roles)[]
{
("admin", "admin", new [] { IdentityRoleEnum.Administrator }),
};
foreach (var user in users)
{
var userExists = userManager
.FindByEmailAsync(user.Email).Result is not null;
if (userExists)
{
continue;
}
var newUser = new IdentityUser
{
Email = user.Email,
NormalizedEmail = user.Email.ToUpper(),
EmailConfirmed = true,
SecurityStamp = Guid.NewGuid().ToString("D"),
RefreshTokens = default!
};
var hashedPassword
= userManager.PasswordHasher.HashPassword(newUser, user.Password);
newUser.PasswordHash = hashedPassword;
userManager
.CreateAsync(newUser)
.Wait();
var userRoles = user.Roles.Select(x => x.Name);
userManager
.AddToRolesAsync(newUser, userRoles)
.Wait();
}
}
}