using Microsoft.AspNetCore.Identity; using Nuuru.Server.Auth; using Nuuru.Server.Models; using System.Security.Claims; namespace Nuuru.Server.Data { public class DbSeeder { private readonly UserManager _userManager; private readonly RoleManager _roleManager; private readonly ILogger _logger; public DbSeeder( UserManager userManager, RoleManager roleManager, ILogger logger) { _userManager = userManager; _roleManager = roleManager; _logger = logger; } public async Task SeedAsync() { await SeedRolesAsync(); await SeedTestUsersAsync(); } private async Task SeedRolesAsync() { // Define default roles with their permissions, colors, and priorities var defaultRoles = new[] { new { Name = "Admin", Color = "#ef4444", // Red Priority = 100, Permissions = new[] { // Admin permissions Permissions.Admin.ManageUsers, Permissions.Admin.ManagePermissions, Permissions.Admin.SystemSettings, Permissions.Admin.SendAnnouncements, Permissions.Admin.BulkOperations, Permissions.Admin.DeletePost, Permissions.Admin.ViewTrash, Permissions.Admin.NukeUser, Permissions.Admin.Panic, Permissions.Admin.ManageCategories, // Moderation permissions Permissions.Moderation.TrashPost, Permissions.Moderation.DeleteComment, Permissions.Moderation.EditTags, Permissions.Moderation.ApprovePost, Permissions.Moderation.BanUser, Permissions.Moderation.BanIp, Permissions.Moderation.ReviewBanAppeals, Permissions.Moderation.ViewReports, Permissions.Moderation.ViewAuditLog, Permissions.Moderation.ViewIps, Permissions.Moderation.LookupIps, Permissions.Moderation.SuppressHistory, Permissions.Moderation.LockComments, Permissions.Moderation.FeaturePost, Permissions.Moderation.SetRating, Permissions.Moderation.SetCategory, Permissions.Moderation.SetSource, Permissions.Moderation.EditDescription, Permissions.Moderation.SeeGuidelines, Permissions.Moderation.ViewIntegrityAssessments, Permissions.Moderation.ViewIntegrityBrowserHashes, // User permissions Permissions.User.UploadPost, Permissions.User.UploadAnonymously, Permissions.User.AutoApprove, Permissions.User.Comment, Permissions.User.CommentAnonymously, Permissions.User.EditBio, Permissions.User.EditOwnContent, Permissions.User.DeleteOwnContent, Permissions.User.EditTags, Permissions.User.SetRating, Permissions.User.SetCategory, Permissions.User.SetSource, Permissions.User.EditDescription, Permissions.User.Vote, Permissions.User.Favorite, Permissions.User.CreateReport, Permissions.User.React, Permissions.User.BypassIntegrity, Permissions.User.FeatureThread, // Forum permissions Permissions.Forum.CreateThread, Permissions.Forum.Reply, Permissions.Forum.PinThread, Permissions.Forum.LockThread, Permissions.Forum.DeletePost, Permissions.Forum.DeleteThread, Permissions.Forum.MoveThread, Permissions.Forum.UploadAttachment, // Messaging permissions Permissions.Messaging.SendMessage, Permissions.Messaging.CreateGroupConversation, Permissions.Messaging.LockConversation, Permissions.Messaging.DeleteConversation, Permissions.Messaging.AddParticipant, Permissions.Messaging.RemoveParticipant } }, new { Name = "Moderator", Color = "#3b82f6", // Blue Priority = 50, Permissions = new[] { // Moderation permissions Permissions.Moderation.TrashPost, Permissions.Moderation.DeleteComment, Permissions.Moderation.EditTags, Permissions.Moderation.ApprovePost, Permissions.Moderation.BanUser, Permissions.Moderation.ViewReports, Permissions.Moderation.ViewAuditLog, Permissions.Moderation.SetRating, Permissions.Moderation.SetSource, Permissions.Moderation.EditDescription, // User permissions Permissions.User.UploadPost, Permissions.User.AutoApprove, Permissions.User.Comment, Permissions.User.EditBio, Permissions.User.EditOwnContent, Permissions.User.EditDescription, Permissions.User.DeleteOwnContent, Permissions.User.EditTags, Permissions.User.SetRating, Permissions.User.SetSource, Permissions.User.Vote, Permissions.User.Favorite, Permissions.User.CreateReport, Permissions.User.React, // Forum permissions Permissions.Forum.CreateThread, Permissions.Forum.Reply, Permissions.Forum.UploadAttachment, // Messaging permissions Permissions.Messaging.SendMessage, Permissions.Messaging.CreateGroupConversation } }, new { Name = "Janitor", Color = "#6366f1", // Indigo Priority = 30, Permissions = new[] { // Moderation permissions Permissions.Moderation.ApprovePost, Permissions.Moderation.TrashPost, Permissions.Moderation.DeleteComment, // User permissions Permissions.User.UploadPost, Permissions.User.AutoApprove, Permissions.User.Comment, Permissions.User.EditBio, Permissions.User.EditOwnContent, Permissions.User.EditDescription, Permissions.User.DeleteOwnContent, Permissions.User.EditTags, Permissions.User.SetRating, Permissions.User.SetSource, Permissions.User.Vote, Permissions.User.Favorite, Permissions.User.CreateReport, Permissions.User.React, // Forum permissions Permissions.Forum.CreateThread, Permissions.Forum.Reply, Permissions.Forum.UploadAttachment, // Messaging permissions Permissions.Messaging.SendMessage, Permissions.Messaging.CreateGroupConversation } }, new { Name = "Approver", Color = "#8b5cf6", // Purple Priority = 20, Permissions = new[] { // Moderation permissions Permissions.Moderation.ApprovePost, // User permissions Permissions.User.UploadPost, Permissions.User.AutoApprove, Permissions.User.Comment, Permissions.User.EditBio, Permissions.User.EditOwnContent, Permissions.User.EditDescription, Permissions.User.DeleteOwnContent, Permissions.User.EditTags, Permissions.User.SetRating, Permissions.User.SetSource, Permissions.User.Vote, Permissions.User.Favorite, Permissions.User.CreateReport, Permissions.User.React, // Forum permissions Permissions.Forum.CreateThread, Permissions.Forum.Reply, Permissions.Forum.UploadAttachment, // Messaging permissions Permissions.Messaging.SendMessage, Permissions.Messaging.CreateGroupConversation } }, new { Name = "Trusted", Color = "#f59e0b", // Amber Priority = 10, Permissions = new[] { // User permissions Permissions.User.UploadPost, Permissions.User.AutoApprove, Permissions.User.Comment, Permissions.User.EditBio, Permissions.User.EditOwnContent, Permissions.User.EditDescription, Permissions.User.DeleteOwnContent, Permissions.User.EditTags, Permissions.User.SetRating, Permissions.User.SetSource, Permissions.User.Vote, Permissions.User.Favorite, Permissions.User.CreateReport, Permissions.User.React, // Forum permissions Permissions.Forum.CreateThread, Permissions.Forum.Reply, Permissions.Forum.UploadAttachment, // Messaging permissions Permissions.Messaging.SendMessage, Permissions.Messaging.CreateGroupConversation } }, new { Name = "User", Color = "#10b981", // Green Priority = 0, Permissions = new[] { // User permissions Permissions.User.UploadPost, Permissions.User.Comment, Permissions.User.EditBio, Permissions.User.EditOwnContent, Permissions.User.EditDescription, Permissions.User.DeleteOwnContent, Permissions.User.EditTags, Permissions.User.SetRating, Permissions.User.SetSource, Permissions.User.Vote, Permissions.User.Favorite, Permissions.User.CreateReport, Permissions.User.React, // Forum permissions Permissions.Forum.CreateThread, Permissions.Forum.Reply, Permissions.Forum.UploadAttachment, // Messaging permissions Permissions.Messaging.SendMessage, Permissions.Messaging.CreateGroupConversation } } }; foreach (var roleData in defaultRoles) { var existingRole = await _roleManager.FindByNameAsync(roleData.Name); if (existingRole == null) { var role = new ApplicationRole { Name = roleData.Name, Color = roleData.Color, Priority = roleData.Priority }; var result = await _roleManager.CreateAsync(role); if (result.Succeeded) { // Add permissions to role foreach (var permission in roleData.Permissions) { var claim = new Claim(Permissions.ClaimType, permission); await _roleManager.AddClaimAsync(role, claim); } _logger.LogInformation("Created default role: {RoleName} with {PermissionCount} permissions", roleData.Name, roleData.Permissions.Length); } else { _logger.LogError("Failed to create role {RoleName}: {Errors}", roleData.Name, string.Join(", ", result.Errors.Select(e => e.Description))); } } } } private async Task SeedTestUsersAsync() { var testUsers = new[] { new { UserName = "admin", Password = "Admin123!", Role = "Admin", Biography = "System Administrator" }, new { UserName = "moderator", Password = "Mod123!", Role = "Moderator", Biography = "Content Moderator" }, new { UserName = "user", Password = "User123!", Role = "User", Biography = "Regular User" }, }; foreach (var testUser in testUsers) { var existingUser = await _userManager.FindByNameAsync(testUser.UserName); if (existingUser == null) { var user = new ApplicationUser { UserName = testUser.UserName, Id = Guid.NewGuid(), Biography = testUser.Biography, Status = "Available" }; var result = await _userManager.CreateAsync(user, testUser.Password); if (result.Succeeded) { // Assign role to user var roleResult = await _userManager.AddToRoleAsync(user, testUser.Role); if (roleResult.Succeeded) { _logger.LogInformation("Created test user: {UserName} with role {Role}", testUser.UserName, testUser.Role); } else { _logger.LogError("Failed to assign role {Role} to user {UserName}: {Errors}", testUser.Role, testUser.UserName, string.Join(", ", roleResult.Errors.Select(e => e.Description))); } } else { _logger.LogError("Failed to create test user {UserName}: {Errors}", testUser.UserName, string.Join(", ", result.Errors.Select(e => e.Description))); } } } } } }