You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
iot/projects/IoT.Shared/IoTSharedDbConfig.cs

162 lines
11 KiB

using Infrastructure.Application.Entites.Settings;
using Infrastructure.Domain;
using Infrastructure.Extensions;
using IoT.Shared.Application.Domain.Entities;
using Microsoft.EntityFrameworkCore;
using System.Linq;
using System.Reflection;
namespace IoT.Shared
{
public class IoTSharedDbConfig
{
public static void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Setting>();
//
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<User>().HasIndex(o => o.PhoneNumber).IsUnique();
modelBuilder.Entity<OrganRole>().Property(o => o.Name).IsRequired();
modelBuilder.Entity<OrganRole>().HasIndex(o => new { o.OrganId, o.Name }).IsUnique();
modelBuilder.Entity<OrganRole>().HasOne(o => o.Organ).WithMany(o => o.Roles).HasForeignKey(o => o.OrganId).OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<PermissionCategory>().HasOne(o => o.Organ).WithMany(o => o.Categories).HasForeignKey(o => o.OrganId).OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<PermissionCategory>().HasIndex(o => new { o.OrganId, o.Name }).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<OrganUserRole>().HasOne(o => o.OrganUser).WithMany(o => o.UserRoles).HasForeignKey(o => o.OrganUserId);
modelBuilder.Entity<OrganUserRole>().HasOne(o => o.OrganRole).WithMany(o => o.UserRoles).HasForeignKey(o => o.OrganRoleId);
modelBuilder.Entity<OrganUserRole>().HasIndex(o => new { o.OrganUserId, o.OrganRoleId }).IsUnique();
modelBuilder.Entity<OrganRolePermission>().HasOne(o => o.Role).WithMany(o => o.RolePermissions).HasForeignKey(o => o.RoleId);
modelBuilder.Entity<OrganRolePermission>().HasOne(o => o.Permission).WithMany(o => o.RolePermissions).HasForeignKey(o => o.PermissionId);
modelBuilder.Entity<OrganRolePermission>().HasIndex(o => new { o.RoleId, o.PermissionId }).IsUnique();
//
modelBuilder.Entity<IoTGateway>().HasIndex(o => o.Number).IsUnique();
//
modelBuilder.Entity<IoTProductCategory>().HasIndex(o => o.Number).IsUnique();
modelBuilder.Entity<IoTProduct>().HasOne(o => o.Category).WithMany(o => o.Products).HasForeignKey(o => o.CategoryId);
modelBuilder.Entity<IoTProduct>().HasIndex(o => o.Number).IsUnique();
modelBuilder.Entity<IoTApi>().HasOne(o => o.Product).WithMany(o => o.Apis).HasForeignKey(o => o.ProductId);
modelBuilder.Entity<IoTApi>().HasIndex(o => new { o.ProductId, o.Name }).IsUnique();
modelBuilder.Entity<IoTParameter>().HasOne(o => o.Api).WithMany(o => o.Parameters).HasForeignKey(o => o.ApiId);
//
modelBuilder.Entity<IoTDevice>().HasOne(o => o.Product).WithMany(o => o.Devices).HasForeignKey(o => o.ProductId);
modelBuilder.Entity<IoTDevice>().HasOne(o => o.Node).WithMany(o => o.Devices).HasForeignKey(o => o.NodeId);
modelBuilder.Entity<IoTDevice>().HasIndex(o => o.Number).IsUnique();
modelBuilder.Entity<IoTData>().HasOne(o => o.Device).WithMany(o => o.Data).HasForeignKey(o => o.DeviceId);
//
modelBuilder.Entity<IoTCommand>().HasOne(o => o.Api).WithMany(o => o.Commands).HasForeignKey(o => o.ApiId);
modelBuilder.Entity<IoTScene>().HasOne(o => o.Node).WithMany(o => o.Scenes).HasForeignKey(o => o.NodeId).OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<IoTSceneIoTCommand>().HasOne(o => o.Scene).WithMany(o => o.SceneCommands).HasForeignKey(o => o.SceneId);
modelBuilder.Entity<IoTSceneIoTCommand>().HasOne(o => o.Command).WithMany(o => o.SceneCommands).HasForeignKey(o => o.CommandId);
modelBuilder.Entity<IoTSceneTimer>().HasOne(o => o.Scene).WithMany(o => o.SceneTimers).HasForeignKey(o => o.SceneId);
modelBuilder.Entity<IoTSceneTigger>().HasOne(o => o.Scene).WithMany(o => o.SceneTiggers).HasForeignKey(o => o.SceneId);
modelBuilder.Entity<IoTSceneTigger>().HasOne(o => o.Data).WithMany(o => o.Tiggers).HasForeignKey(o => o.DataId);
}
public static void Seed(DbContext db)
{
var permissionCategoryRoot = new PermissionCategory
{
Name = "权限分类",
Number = "root"
};
db.Set<PermissionCategory>().Add(permissionCategoryRoot);
db.SaveChanges();
foreach (var item in db.Model.GetEntityTypes())
{
var group = item.ClrType.GetCustomAttribute<GroupAttribute>();
var categoryGroup = db.Set<PermissionCategory>().FirstOrDefault(o => o.Number == group.Number);
if (categoryGroup == null)
{
categoryGroup = db.Set<PermissionCategory>().Add(new PermissionCategory
{
Parent = permissionCategoryRoot,
Name = group.Name,
Number = group.Number
}).Entity;
db.Set<PermissionCategory>().Add(categoryGroup);
}
var type = item.ClrType;
var name = type.GetDisplayName();
var number = type.Name;
var category = new PermissionCategory
{
Parent = categoryGroup,
Name = name,
Number = number
};
var scopeAttribute = type.GetCustomAttribute<ScopeAttribute>();
if (scopeAttribute != null)
{
var scope = scopeAttribute.Scope;
//平台权限
if (scope.HasFlag(ScopeType.PlatformRead))
{
category.Permissions.Add(new Permission { IsReadOnly = true, Type = PermissionType.Platform, Name = $"查看平台{name}", Number = $"Read-Platform-{number}" });
}
if (scope.HasFlag(ScopeType.PlatformAdd))
{
category.Permissions.Add(new Permission { IsReadOnly = true, Type = PermissionType.Platform, Name = $"添加平台{name}", Number = $"Add-Platform-{number}" });
}
if (scope.HasFlag(ScopeType.PlatformEdit))
{
category.Permissions.Add(new Permission { IsReadOnly = true, Type = PermissionType.Platform, Name = $"修改平台{name}", Number = $"Edit-Platform-{number}" });
}
if (scope.HasFlag(ScopeType.PlatformDelete))
{
category.Permissions.Add(new Permission { IsReadOnly = true, Type = PermissionType.Platform, Name = $"删除平台{name}", Number = $"Delete-Platform-{number}" });
}
//机构权限
if (scope.HasFlag(ScopeType.OrganRead))
{
category.Permissions.Add(new Permission { IsReadOnly = true, Type = PermissionType.Organ, Name = $"查看机构{name}", Number = $"Read-Organ-{number}" });
}
if (scope.HasFlag(ScopeType.OrganAdd))
{
category.Permissions.Add(new Permission { IsReadOnly = true, Type = PermissionType.Organ, Name = $"添加机构{name}", Number = $"Add-Organ-{number}" });
}
if (scope.HasFlag(ScopeType.OrganEdit))
{
category.Permissions.Add(new Permission { IsReadOnly = true, Type = PermissionType.Organ, Name = $"修改机构{name}", Number = $"Edit-Organ-{number}" });
}
if (scope.HasFlag(ScopeType.OrganDelete))
{
category.Permissions.Add(new Permission { IsReadOnly = true, Type = PermissionType.Organ, Name = $"删除机构{name}", Number = $"Delete-Organ-{number}" });
}
//个人权限
if (scope.HasFlag(ScopeType.UserRead))
{
category.Permissions.Add(new Permission { IsReadOnly = true, Type = PermissionType.User, Name = $"查看个人{name}", Number = $"Read-User-{number}" });
}
if (scope.HasFlag(ScopeType.UserAdd))
{
category.Permissions.Add(new Permission { IsReadOnly = true, Type = PermissionType.User, Name = $"添加个人{name}", Number = $"Add-User-{number}" });
}
if (scope.HasFlag(ScopeType.UserEdit))
{
category.Permissions.Add(new Permission { IsReadOnly = true, Type = PermissionType.User, Name = $"修改个人{name}", Number = $"Edit-User-{number}" });
}
if (scope.HasFlag(ScopeType.UserDelete))
{
category.Permissions.Add(new Permission { IsReadOnly = true, Type = PermissionType.User, Name = $"删除个人{name}", Number = $"Delete-User-{number}" });
}
}
db.Set<PermissionCategory>().Add(category);
db.SaveChanges();
db.Set<PermissionCategory>().FirstOrDefault(o => o.Number == "root").Update();
db.SaveChanges();
}
db.Set<IoTProductCategory>().Add(new IoTProductCategory { Id = "productcatgoryid-00".ToGuid(), Number = "00", Name = "网关", Image = "/images/gateway.svg" });
db.Set<IoTProductCategory>().Add(new IoTProductCategory { Id = "productcatgoryid-10".ToGuid(), Number = "10", Name = "安防", Image = "/images/safe.svg" });
db.Set<IoTProductCategory>().Add(new IoTProductCategory { Id = "productcatgoryid-20".ToGuid(), Number = "20", Name = "电器", Image = "/images/socket.svg" });
db.Set<IoTProductCategory>().Add(new IoTProductCategory { Id = "productcatgoryid-30".ToGuid(), Number = "30", Name = "照明", Image = "/images/light.svg" });
db.Set<IoTProductCategory>().Add(new IoTProductCategory { Id = "productcatgoryid-40".ToGuid(), Number = "40", Name = "监测", Image = "/images/monitor.svg" });
db.SaveChanges();
}
}
}