using line_gestao_api.Models; using line_gestao_api.Services; using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Options; namespace line_gestao_api.Data; public class SeedOptions { public string DefaultTenantName { get; set; } = "Default"; public string AdminName { get; set; } = "Administrador"; public string AdminEmail { get; set; } = "admin@linegestao.local"; public string AdminPassword { get; set; } = "Admin123!"; } public static class SeedData { public static readonly Guid DefaultTenantId = Guid.Parse("11111111-1111-1111-1111-111111111111"); public static async Task EnsureSeedDataAsync(IServiceProvider services) { using var scope = services.CreateScope(); var db = scope.ServiceProvider.GetRequiredService(); var userManager = scope.ServiceProvider.GetRequiredService>(); var roleManager = scope.ServiceProvider.GetRequiredService>>(); var tenantProvider = scope.ServiceProvider.GetRequiredService(); var options = scope.ServiceProvider.GetRequiredService>().Value; await db.Database.MigrateAsync(); var roles = new[] { "admin", "gestor", "operador", "leitura" }; foreach (var role in roles) { if (!await roleManager.RoleExistsAsync(role)) { await roleManager.CreateAsync(new IdentityRole(role)); } } var tenant = await db.Tenants.FirstOrDefaultAsync(t => t.Id == DefaultTenantId); if (tenant == null) { tenant = new Tenant { Id = DefaultTenantId, Name = options.DefaultTenantName, CreatedAt = DateTime.UtcNow }; db.Tenants.Add(tenant); await db.SaveChangesAsync(); } tenantProvider.SetTenantId(tenant.Id); var normalizedEmail = userManager.NormalizeEmail(options.AdminEmail); var existingAdmin = await userManager.Users .FirstOrDefaultAsync(u => u.NormalizedEmail == normalizedEmail && u.TenantId == tenant.Id); if (existingAdmin == null) { var adminUser = new ApplicationUser { UserName = options.AdminEmail, Email = options.AdminEmail, Name = options.AdminName, TenantId = tenant.Id, EmailConfirmed = true, IsActive = true }; var createResult = await userManager.CreateAsync(adminUser, options.AdminPassword); if (createResult.Succeeded) { await userManager.AddToRoleAsync(adminUser, "admin"); } } tenantProvider.SetTenantId(null); } }