using Application.Domain.Entities; using Infrastructure.Application.Entites.Settings; using Infrastructure.Data; using Infrastructure.Events; using Infrastructure.Extensions; using Infrastructure.Security; using IoT.Shared; using IoT.Shared.Application.Domain.Entities; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using System; using System.Linq; using Permission = Application.Domain.Entities.Permission; using PermissionCategory = Application.Domain.Entities.PermissionCategory; using User = Application.Domain.Entities.User; namespace IoTNode.Data { public class IoTNodeDbContext : EfDbContext, IDbConfig { private readonly IEncryptionService _encryptionService; public IoTNodeDbContext(DbContextOptions options, ILogger logger, IHostEnvironment env, IConfiguration cfg, IEventPublisher publisher, IEncryptionService encryptionService) : base(options, logger, env, cfg, publisher) { this._encryptionService = encryptionService; } protected override void OnModelCreating(ModelBuilder modelBuilder) { IoTSharedDbConfig.OnModelCreating(modelBuilder); //Setting modelBuilder.Entity().HasIndex(o => o.Name).IsUnique(); //ignore modelBuilder.Ignore(); modelBuilder.Ignore(); modelBuilder.Ignore(); modelBuilder.Ignore(); modelBuilder.Ignore(); modelBuilder.Ignore(); modelBuilder.Ignore(); modelBuilder.Ignore<OrganUser>(); modelBuilder.Ignore<OrganRole>(); modelBuilder.Ignore<OrganRolePermission>(); modelBuilder.Ignore<OrganUserRole>(); modelBuilder.Ignore<PermissionCategory>(); modelBuilder.Ignore<IoTProductCategory>(); modelBuilder.Ignore<IoTCommand>(); modelBuilder.Ignore<IoTSceneIoTCommand>(); modelBuilder.Ignore<IoTScene>(); modelBuilder.Ignore<IoTTimer>(); modelBuilder.Ignore<IoTTigger>(); modelBuilder.Entity<IoTProduct>().Ignore(o => o.DisplayOrder); modelBuilder.Entity<IoTApi>().Ignore(o => o.IoTCommands); modelBuilder.Entity<IoTGateway>().Ignore(o => o.Building); modelBuilder.Entity<IoTDevice>().Ignore(o => o.IoTCommands); modelBuilder.Ignore<IoT.Shared.Application.Domain.Entities.User>(); modelBuilder.Ignore<IoT.Shared.Application.Domain.Entities.PermissionCategory>(); modelBuilder.Ignore<IoT.Shared.Application.Domain.Entities.Permission>(); // modelBuilder.Ignore<PermissionCategory>(); modelBuilder.Ignore<Permission>(); modelBuilder.Ignore<User>(); modelBuilder.Entity<User>().Property(o => o.UserName).IsRequired(); modelBuilder.Entity<User>().HasIndex(o => o.UserName).IsUnique(); modelBuilder.Entity<User>().HasIndex(o => o.Email).IsUnique(); modelBuilder.Entity<Role>().Property(o => o.Name).IsRequired(); modelBuilder.Entity<Role>().HasIndex(o => o.Name).IsUnique(); modelBuilder.Entity<PermissionCategory>().HasOne(o => o.Parent).WithMany(o => o.Children).HasForeignKey(o => o.ParentId).OnDelete(DeleteBehavior.SetNull); modelBuilder.Entity<PermissionCategory>().HasIndex(o => o.Number).IsUnique(); modelBuilder.Entity<Permission>().HasIndex(o => o.Number).IsUnique(); modelBuilder.Entity<Permission>().HasOne(o => o.Category).WithMany(o => o.Permissions).HasForeignKey(o => o.CategoryId).OnDelete(DeleteBehavior.SetNull); modelBuilder.Entity<UserRole>().HasOne(o => o.User).WithMany(o => o.UserRoles).HasForeignKey(o => o.UserId); modelBuilder.Entity<UserRole>().HasOne(o => o.Role).WithMany(o => o.UserRoles).HasForeignKey(o => o.RoleId); modelBuilder.Entity<UserRole>().HasIndex(o => new { o.UserId, o.RoleId }).IsUnique(); modelBuilder.Entity<RolePermission>().HasOne(o => o.Role).WithMany(o => o.RolePermissions).HasForeignKey(o => o.RoleId); modelBuilder.Entity<RolePermission>().HasOne(o => o.Permission).WithMany(o => o.RolePermissions).HasForeignKey(o => o.PermissionId); modelBuilder.Entity<RolePermission>().HasIndex(o => new { o.RoleId, o.PermissionId }).IsUnique(); base.OnModelCreating(modelBuilder); } public void Seed(DbContext db) { foreach (var item in db.Model.GetEntityTypes()) { var type = item.ClrType; var name = type.GetDisplayName(); var number = type.Name; var category = new PermissionCategory { Name = name, Number = type.Name }; category.Permissions.Add(new Permission { Name = $"查看{name}", Number = $"Read-{number}" }); category.Permissions.Add(new Permission { Name = $"添加{name}", Number = $"Add-{number}" }); category.Permissions.Add(new Permission { Name = $"修改{name}", Number = $"Edit-{number}" }); category.Permissions.Add(new Permission { Name = $"删除{name}", Number = $"Delete-{number}" }); db.Set<PermissionCategory>().Add(category); } db.SaveChanges(); var saRole = new Role { Name = "超级管理员", IsReadOnly = true }; var adminRole = new Role { Name = "管理员", IsReadOnly = true }; var skips = new string[] { "添加Api", "修改Api", "添加分类", "修改分类", "添加参数", "修改参数", "添加产品", "修改产品", "添加节点", "添加权限", "修改权限", "添加权限分类", "修改权限分类", "添加设备" }; foreach (var item in db.Set<Permission>()) { saRole.RolePermissions.Add(new RolePermission { Permission = item, IsReadOnly = true }); if (!item.Name.Contains("删除") && !skips.Contains(item.Name)) { adminRole.RolePermissions.Add(new RolePermission { Permission = item, IsReadOnly = true }); } } var securityStam = "123456"; db.Set<User>().Add(new User { UserName = "super", SecurityStamp = securityStam, PasswordHash = _encryptionService.CreatePasswordHash("123456", securityStam), Email = "super@test.com" }); db.Set<User>().Add(new User { UserName = "admin", SecurityStamp = securityStam, PasswordHash = _encryptionService.CreatePasswordHash("123456", securityStam), Email = "admin@test.com" }); db.SaveChanges(); // var set = db.Set<Setting>(); set.Add(new Setting { Name = "name", Value = this._cfg.GetValue("seed:NodeName", "网关"), Type = SettingType.String }); set.Add(new Setting { Name = "logo", Value = "/images/logo.png", Type = SettingType.ImageUrl }); set.Add(new Setting { Name = "copyright", Value = "Copyright © {0} Company. All rights reserved", Type = SettingType.Html }); // var macAddress = Helper.Instance.GetMacAddress(); set.Add(new Setting { Name = "sn", Value = macAddress, Type = SettingType.String }); set.Add(new Setting { Name = "code", Value = this._env.IsDevelopment() ? Helper.Instance.MacEncrypt(Helper.Instance.GetMacAddress()) : "根据mac生成的授权码", Type = SettingType.String }); // var host = this._cfg.GetValue("seed:host", "localhost"); var stream = this._cfg.GetValue("seed:stream", "localhost"); var delay = this._cfg.GetValue("seed:delay", "100"); set.Add(new Setting { Name = "debug", Value = "false", Type = SettingType.String }); set.Add(new Setting { Name = "notify:enabled", Value = "true", Type = SettingType.String }); set.Add(new Setting { Name = "notify:host", Value = $"http://{host}/platform", Type = SettingType.String }); set.Add(new Setting { Name = "timer.seconds", Value = "180", Type = SettingType.String }); set.Add(new Setting { Name = "onvif.timer", Value = "1", Type = SettingType.String }); set.Add(new Setting { Name = "onvif.speed", Value = "0.2", Type = SettingType.String }); set.Add(new Setting { Name = "camera.usr", Value = "admin", Type = SettingType.String }); set.Add(new Setting { Name = "camera.pwd", Value = "dsideal123", Type = SettingType.String }); set.Add(new Setting { Name = "stream.rtmp", Value = stream, Type = SettingType.String }); set.Add(new Setting { Name = "ffmpeg.args", Value = " -y -threads {0} -rtsp_transport tcp -use_wallclock_as_timestamps 1 -stimeout 3000000 -i \"{1}\" -fflags +genpts -c copy -f flv \"{2}\"", Type = SettingType.String }); set.Add(new Setting { Name = "fbee.writelist", Value = "", Type = SettingType.String }); set.Add(new Setting { Name = "camera.writelist", Value = "", Type = SettingType.String }); set.Add(new Setting { Name = "delay", Value = delay, Type = SettingType.String }); db.SaveChanges(); db.Set<IoTGateway>().Add(new IoTGateway { Id = $"nodeid-{macAddress}".ToGuid(), Name = $"节点({macAddress})", Number = macAddress, IsOnline = true, Version = Helper.Instance.GetVersion(), Image = "/images/classroom.svg" }); db.SaveChanges(); } } }