diff --git a/MainProject.Tests/Services/RoleService_Tests.cs b/MainProject.Tests/Services/RoleService_Tests.cs index 027012e..188cf34 100644 --- a/MainProject.Tests/Services/RoleService_Tests.cs +++ b/MainProject.Tests/Services/RoleService_Tests.cs @@ -2,6 +2,8 @@ using BasicDotnetTemplate.MainProject.Services; using BasicDotnetTemplate.MainProject.Models.Api.Data.Role; using BasicDotnetTemplate.MainProject.Models.Database.SqlServer; +using Newtonsoft.Json; +using BasicDotnetTemplate.MainProject.Models.Api.Common.Exceptions; diff --git a/MainProject/Core/Database/SqlServerContext.cs b/MainProject/Core/Database/SqlServerContext.cs index 68ccab1..f36d364 100644 --- a/MainProject/Core/Database/SqlServerContext.cs +++ b/MainProject/Core/Database/SqlServerContext.cs @@ -6,29 +6,75 @@ namespace BasicDotnetTemplate.MainProject.Core.Database { public class SqlServerContext : DbContext { + private const string _isDeletedFalse = "[IsDeleted] = 0"; + private const string _isEnabled = "[Enabled] = 1"; public SqlServerContext(DbContextOptions options) : base(options) { } - public DbSet Users { get; set; } + public DbSet PermissionModules { get; set; } + public DbSet PermissionOperations { get; set; } + public DbSet PermissionSystems { get; set; } + public DbSet PermissionSystemModules { get; set; } + public DbSet PermissionSystemModuleOperations { get; set; } + public DbSet RolePermissionSystemModuleOperations { get; set; } public DbSet Roles { get; set; } + public DbSet Users { get; set; } + protected override void OnModelCreating(ModelBuilder modelBuilder) { + #region "INDEXES" + // Indexes + modelBuilder.Entity() .HasIndex(x => x.Email, "IX_Email"); modelBuilder.Entity() .HasIndex(x => new { x.IsDeleted, x.Guid }, "IX_IsDeleted_Guid") - .HasFilter("[IsDeleted] = 0"); - + .HasFilter(_isDeletedFalse); modelBuilder.Entity() .HasIndex(x => new { x.IsDeleted, x.Guid }, "IX_IsDeleted_Guid") - .HasFilter("[IsDeleted] = 0"); + .HasFilter(_isDeletedFalse); + + modelBuilder.Entity() + .HasIndex(x => new { x.IsDeleted }, "IX_IsDeleted") + .HasFilter(_isDeletedFalse); + + modelBuilder.Entity() + .HasIndex(x => new { x.Enabled }, "IX_Enabled") + .HasFilter(_isEnabled); + + modelBuilder.Entity() + .HasIndex(x => new { x.IsDeleted, x.Name, x.Enabled }, "IX_IsDeleted_Name_Enabled") + .HasFilter(_isEnabled) + .HasFilter(_isDeletedFalse); + + modelBuilder.Entity() + .HasIndex(x => new { x.IsDeleted }, "IX_IsDeleted") + .HasFilter(_isDeletedFalse); + + modelBuilder.Entity() + .HasIndex(x => new { x.Enabled }, "IX_Enabled") + .HasFilter(_isEnabled); + + modelBuilder.Entity() + .HasIndex(x => new { x.IsDeleted, x.Name, x.Enabled }, "IX_IsDeleted_Name_Enabled") + .HasFilter(_isEnabled) + .HasFilter(_isDeletedFalse); + + modelBuilder.Entity() + .HasIndex(x => new { x.IsDeleted, x.Name }, "IX_IsDeleted_Name"); + + modelBuilder.Entity() + .HasIndex(x => new { x.IsDeleted, x.Enabled, x.Guid }, "IX_IsDeleted_Enabled_Guid"); + + #endregion + } } } diff --git a/MainProject/Migrations/20250426183010_AddingPermissionsTables.Designer.cs b/MainProject/Migrations/20250426183010_AddingPermissionsTables.Designer.cs new file mode 100644 index 0000000..6ee1838 --- /dev/null +++ b/MainProject/Migrations/20250426183010_AddingPermissionsTables.Designer.cs @@ -0,0 +1,543 @@ +// +using System; +using BasicDotnetTemplate.MainProject.Core.Database; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace MainProject.Migrations +{ + [DbContext(typeof(SqlServerContext))] + [Migration("20250426183010_AddingPermissionsTables")] + partial class AddingPermissionsTables + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "9.0.2") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.PermissionModule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("CreationUserId") + .HasColumnType("int"); + + b.Property("DeletionTime") + .HasColumnType("datetime2"); + + b.Property("DeletionUserId") + .HasColumnType("int"); + + b.Property("Enabled") + .HasColumnType("bit"); + + b.Property("Guid") + .IsRequired() + .HasMaxLength(45) + .HasColumnType("nvarchar(45)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("UpdateTime") + .HasColumnType("datetime2"); + + b.Property("UpdateUserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex(new[] { "Enabled" }, "IX_Enabled") + .HasFilter("[Enabled] = 1"); + + b.HasIndex(new[] { "IsDeleted" }, "IX_IsDeleted") + .HasFilter("[IsDeleted] = 0"); + + b.HasIndex(new[] { "IsDeleted", "Name", "Enabled" }, "IX_IsDeleted_Name_Enabled") + .HasFilter("[IsDeleted] = 0"); + + b.ToTable("PermissionModules"); + }); + + modelBuilder.Entity("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.PermissionOperation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("CreationUserId") + .HasColumnType("int"); + + b.Property("DeletionTime") + .HasColumnType("datetime2"); + + b.Property("DeletionUserId") + .HasColumnType("int"); + + b.Property("Guid") + .IsRequired() + .HasMaxLength(45) + .HasColumnType("nvarchar(45)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("UpdateTime") + .HasColumnType("datetime2"); + + b.Property("UpdateUserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex(new[] { "IsDeleted", "Name" }, "IX_IsDeleted_Name"); + + b.ToTable("PermissionOperations"); + }); + + modelBuilder.Entity("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.PermissionSystem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("CreationUserId") + .HasColumnType("int"); + + b.Property("DeletionTime") + .HasColumnType("datetime2"); + + b.Property("DeletionUserId") + .HasColumnType("int"); + + b.Property("Enabled") + .HasColumnType("bit"); + + b.Property("Guid") + .IsRequired() + .HasMaxLength(45) + .HasColumnType("nvarchar(45)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("UpdateTime") + .HasColumnType("datetime2"); + + b.Property("UpdateUserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex(new[] { "Enabled" }, "IX_Enabled") + .HasFilter("[Enabled] = 1"); + + b.HasIndex(new[] { "IsDeleted" }, "IX_IsDeleted") + .HasFilter("[IsDeleted] = 0"); + + b.HasIndex(new[] { "IsDeleted", "Name", "Enabled" }, "IX_IsDeleted_Name_Enabled") + .HasFilter("[IsDeleted] = 0"); + + b.ToTable("PermissionSystems"); + }); + + modelBuilder.Entity("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.PermissionSystemModule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("CreationUserId") + .HasColumnType("int"); + + b.Property("DeletionTime") + .HasColumnType("datetime2"); + + b.Property("DeletionUserId") + .HasColumnType("int"); + + b.Property("Enabled") + .HasColumnType("bit"); + + b.Property("Guid") + .IsRequired() + .HasMaxLength(45) + .HasColumnType("nvarchar(45)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("PermissionModuleId") + .HasColumnType("int"); + + b.Property("PermissionSystemId") + .HasColumnType("int"); + + b.Property("UpdateTime") + .HasColumnType("datetime2"); + + b.Property("UpdateUserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("PermissionModuleId"); + + b.HasIndex("PermissionSystemId"); + + b.ToTable("PermissionSystemModules"); + }); + + modelBuilder.Entity("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.PermissionSystemModuleOperation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("CreationUserId") + .HasColumnType("int"); + + b.Property("DeletionTime") + .HasColumnType("datetime2"); + + b.Property("DeletionUserId") + .HasColumnType("int"); + + b.Property("Enabled") + .HasColumnType("bit"); + + b.Property("Guid") + .IsRequired() + .HasMaxLength(45) + .HasColumnType("nvarchar(45)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("PermissionOperationId") + .HasColumnType("int"); + + b.Property("PermissionSystemModuleId") + .HasColumnType("int"); + + b.Property("UpdateTime") + .HasColumnType("datetime2"); + + b.Property("UpdateUserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("PermissionOperationId"); + + b.HasIndex("PermissionSystemModuleId"); + + b.HasIndex(new[] { "IsDeleted", "Enabled", "Guid" }, "IX_IsDeleted_Enabled_Guid"); + + b.ToTable("PermissionSystemModuleOperations"); + }); + + modelBuilder.Entity("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("CreationUserId") + .HasColumnType("int"); + + b.Property("DeletionTime") + .HasColumnType("datetime2"); + + b.Property("DeletionUserId") + .HasColumnType("int"); + + b.Property("Guid") + .IsRequired() + .HasMaxLength(45) + .HasColumnType("nvarchar(45)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("IsNotEditable") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("UpdateTime") + .HasColumnType("datetime2"); + + b.Property("UpdateUserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex(new[] { "IsDeleted", "Guid" }, "IX_IsDeleted_Guid") + .HasFilter("[IsDeleted] = 0"); + + b.ToTable("Roles"); + }); + + modelBuilder.Entity("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.RolePermissionSystemModuleOperation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Active") + .HasColumnType("bit"); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("CreationUserId") + .HasColumnType("int"); + + b.Property("DeletionTime") + .HasColumnType("datetime2"); + + b.Property("DeletionUserId") + .HasColumnType("int"); + + b.Property("Guid") + .IsRequired() + .HasMaxLength(45) + .HasColumnType("nvarchar(45)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("PermissionSystemModuleOperationId") + .HasColumnType("int"); + + b.Property("RoleId") + .HasColumnType("int"); + + b.Property("UpdateTime") + .HasColumnType("datetime2"); + + b.Property("UpdateUserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("PermissionSystemModuleOperationId"); + + b.HasIndex("RoleId"); + + b.ToTable("RolePermissionSystemModuleOperations"); + }); + + modelBuilder.Entity("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("CreationUserId") + .HasColumnType("int"); + + b.Property("DeletionTime") + .HasColumnType("datetime2"); + + b.Property("DeletionUserId") + .HasColumnType("int"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("FirstName") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("Guid") + .IsRequired() + .HasMaxLength(45) + .HasColumnType("nvarchar(45)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("IsTestUser") + .HasColumnType("bit"); + + b.Property("LastName") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("Password") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("PasswordHash") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("PasswordSalt") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("RoleId") + .HasColumnType("int"); + + b.Property("UpdateTime") + .HasColumnType("datetime2"); + + b.Property("UpdateUserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.HasIndex(new[] { "Email" }, "IX_Email"); + + b.HasIndex(new[] { "IsDeleted", "Guid" }, "IX_IsDeleted_Guid") + .HasFilter("[IsDeleted] = 0"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.PermissionSystemModule", b => + { + b.HasOne("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.PermissionModule", "PermissionModule") + .WithMany() + .HasForeignKey("PermissionModuleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.PermissionSystem", "PermissionSystem") + .WithMany() + .HasForeignKey("PermissionSystemId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("PermissionModule"); + + b.Navigation("PermissionSystem"); + }); + + modelBuilder.Entity("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.PermissionSystemModuleOperation", b => + { + b.HasOne("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.PermissionOperation", "PermissionOperation") + .WithMany() + .HasForeignKey("PermissionOperationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.PermissionSystemModule", "PermissionSystemModule") + .WithMany() + .HasForeignKey("PermissionSystemModuleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("PermissionOperation"); + + b.Navigation("PermissionSystemModule"); + }); + + modelBuilder.Entity("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.RolePermissionSystemModuleOperation", b => + { + b.HasOne("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.PermissionSystemModuleOperation", "PermissionSystemModuleOperation") + .WithMany() + .HasForeignKey("PermissionSystemModuleOperationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.Role", "Role") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("PermissionSystemModuleOperation"); + + b.Navigation("Role"); + }); + + modelBuilder.Entity("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.User", b => + { + b.HasOne("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.Role", "Role") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/MainProject/Migrations/20250426183010_AddingPermissionsTables.cs b/MainProject/Migrations/20250426183010_AddingPermissionsTables.cs new file mode 100644 index 0000000..3390e0d --- /dev/null +++ b/MainProject/Migrations/20250426183010_AddingPermissionsTables.cs @@ -0,0 +1,283 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace MainProject.Migrations +{ + /// + public partial class AddingPermissionsTables : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "PermissionModules", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + Name = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: false), + Enabled = table.Column(type: "bit", nullable: false), + Guid = table.Column(type: "nvarchar(45)", maxLength: 45, nullable: false), + IsDeleted = table.Column(type: "bit", nullable: false), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreationUserId = table.Column(type: "int", nullable: true), + UpdateTime = table.Column(type: "datetime2", nullable: true), + UpdateUserId = table.Column(type: "int", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true), + DeletionUserId = table.Column(type: "int", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_PermissionModules", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "PermissionOperations", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + Name = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: false), + Guid = table.Column(type: "nvarchar(45)", maxLength: 45, nullable: false), + IsDeleted = table.Column(type: "bit", nullable: false), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreationUserId = table.Column(type: "int", nullable: true), + UpdateTime = table.Column(type: "datetime2", nullable: true), + UpdateUserId = table.Column(type: "int", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true), + DeletionUserId = table.Column(type: "int", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_PermissionOperations", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "PermissionSystems", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + Name = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: false), + Enabled = table.Column(type: "bit", nullable: false), + Guid = table.Column(type: "nvarchar(45)", maxLength: 45, nullable: false), + IsDeleted = table.Column(type: "bit", nullable: false), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreationUserId = table.Column(type: "int", nullable: true), + UpdateTime = table.Column(type: "datetime2", nullable: true), + UpdateUserId = table.Column(type: "int", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true), + DeletionUserId = table.Column(type: "int", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_PermissionSystems", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "PermissionSystemModules", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + PermissionSystemId = table.Column(type: "int", nullable: false), + PermissionModuleId = table.Column(type: "int", nullable: false), + Enabled = table.Column(type: "bit", nullable: false), + Guid = table.Column(type: "nvarchar(45)", maxLength: 45, nullable: false), + IsDeleted = table.Column(type: "bit", nullable: false), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreationUserId = table.Column(type: "int", nullable: true), + UpdateTime = table.Column(type: "datetime2", nullable: true), + UpdateUserId = table.Column(type: "int", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true), + DeletionUserId = table.Column(type: "int", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_PermissionSystemModules", x => x.Id); + table.ForeignKey( + name: "FK_PermissionSystemModules_PermissionModules_PermissionModuleId", + column: x => x.PermissionModuleId, + principalTable: "PermissionModules", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_PermissionSystemModules_PermissionSystems_PermissionSystemId", + column: x => x.PermissionSystemId, + principalTable: "PermissionSystems", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "PermissionSystemModuleOperations", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + PermissionSystemModuleId = table.Column(type: "int", nullable: false), + PermissionOperationId = table.Column(type: "int", nullable: false), + Enabled = table.Column(type: "bit", nullable: false), + Guid = table.Column(type: "nvarchar(45)", maxLength: 45, nullable: false), + IsDeleted = table.Column(type: "bit", nullable: false), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreationUserId = table.Column(type: "int", nullable: true), + UpdateTime = table.Column(type: "datetime2", nullable: true), + UpdateUserId = table.Column(type: "int", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true), + DeletionUserId = table.Column(type: "int", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_PermissionSystemModuleOperations", x => x.Id); + table.ForeignKey( + name: "FK_PermissionSystemModuleOperations_PermissionOperations_PermissionOperationId", + column: x => x.PermissionOperationId, + principalTable: "PermissionOperations", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_PermissionSystemModuleOperations_PermissionSystemModules_PermissionSystemModuleId", + column: x => x.PermissionSystemModuleId, + principalTable: "PermissionSystemModules", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "RolePermissionSystemModuleOperations", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + RoleId = table.Column(type: "int", nullable: false), + PermissionSystemModuleOperationId = table.Column(type: "int", nullable: false), + Active = table.Column(type: "bit", nullable: false), + Guid = table.Column(type: "nvarchar(45)", maxLength: 45, nullable: false), + IsDeleted = table.Column(type: "bit", nullable: false), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreationUserId = table.Column(type: "int", nullable: true), + UpdateTime = table.Column(type: "datetime2", nullable: true), + UpdateUserId = table.Column(type: "int", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true), + DeletionUserId = table.Column(type: "int", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_RolePermissionSystemModuleOperations", x => x.Id); + table.ForeignKey( + name: "FK_RolePermissionSystemModuleOperations_PermissionSystemModuleOperations_PermissionSystemModuleOperationId", + column: x => x.PermissionSystemModuleOperationId, + principalTable: "PermissionSystemModuleOperations", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_RolePermissionSystemModuleOperations_Roles_RoleId", + column: x => x.RoleId, + principalTable: "Roles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_Enabled", + table: "PermissionModules", + column: "Enabled", + filter: "[Enabled] = 1"); + + migrationBuilder.CreateIndex( + name: "IX_IsDeleted", + table: "PermissionModules", + column: "IsDeleted", + filter: "[IsDeleted] = 0"); + + migrationBuilder.CreateIndex( + name: "IX_IsDeleted_Name_Enabled", + table: "PermissionModules", + columns: new[] { "IsDeleted", "Name", "Enabled" }, + filter: "[IsDeleted] = 0"); + + migrationBuilder.CreateIndex( + name: "IX_IsDeleted_Name", + table: "PermissionOperations", + columns: new[] { "IsDeleted", "Name" }); + + migrationBuilder.CreateIndex( + name: "IX_IsDeleted_Enabled_Guid", + table: "PermissionSystemModuleOperations", + columns: new[] { "IsDeleted", "Enabled", "Guid" }); + + migrationBuilder.CreateIndex( + name: "IX_PermissionSystemModuleOperations_PermissionOperationId", + table: "PermissionSystemModuleOperations", + column: "PermissionOperationId"); + + migrationBuilder.CreateIndex( + name: "IX_PermissionSystemModuleOperations_PermissionSystemModuleId", + table: "PermissionSystemModuleOperations", + column: "PermissionSystemModuleId"); + + migrationBuilder.CreateIndex( + name: "IX_PermissionSystemModules_PermissionModuleId", + table: "PermissionSystemModules", + column: "PermissionModuleId"); + + migrationBuilder.CreateIndex( + name: "IX_PermissionSystemModules_PermissionSystemId", + table: "PermissionSystemModules", + column: "PermissionSystemId"); + + migrationBuilder.CreateIndex( + name: "IX_Enabled", + table: "PermissionSystems", + column: "Enabled", + filter: "[Enabled] = 1"); + + migrationBuilder.CreateIndex( + name: "IX_IsDeleted", + table: "PermissionSystems", + column: "IsDeleted", + filter: "[IsDeleted] = 0"); + + migrationBuilder.CreateIndex( + name: "IX_IsDeleted_Name_Enabled", + table: "PermissionSystems", + columns: new[] { "IsDeleted", "Name", "Enabled" }, + filter: "[IsDeleted] = 0"); + + migrationBuilder.CreateIndex( + name: "IX_RolePermissionSystemModuleOperations_PermissionSystemModuleOperationId", + table: "RolePermissionSystemModuleOperations", + column: "PermissionSystemModuleOperationId"); + + migrationBuilder.CreateIndex( + name: "IX_RolePermissionSystemModuleOperations_RoleId", + table: "RolePermissionSystemModuleOperations", + column: "RoleId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "RolePermissionSystemModuleOperations"); + + migrationBuilder.DropTable( + name: "PermissionSystemModuleOperations"); + + migrationBuilder.DropTable( + name: "PermissionOperations"); + + migrationBuilder.DropTable( + name: "PermissionSystemModules"); + + migrationBuilder.DropTable( + name: "PermissionModules"); + + migrationBuilder.DropTable( + name: "PermissionSystems"); + } + } +} diff --git a/MainProject/Migrations/SqlServerContextModelSnapshot.cs b/MainProject/Migrations/SqlServerContextModelSnapshot.cs index 293a846..d32f3cb 100644 --- a/MainProject/Migrations/SqlServerContextModelSnapshot.cs +++ b/MainProject/Migrations/SqlServerContextModelSnapshot.cs @@ -22,6 +22,270 @@ namespace MainProject.Migrations SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + modelBuilder.Entity("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.PermissionModule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("CreationUserId") + .HasColumnType("int"); + + b.Property("DeletionTime") + .HasColumnType("datetime2"); + + b.Property("DeletionUserId") + .HasColumnType("int"); + + b.Property("Enabled") + .HasColumnType("bit"); + + b.Property("Guid") + .IsRequired() + .HasMaxLength(45) + .HasColumnType("nvarchar(45)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("UpdateTime") + .HasColumnType("datetime2"); + + b.Property("UpdateUserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex(new[] { "Enabled" }, "IX_Enabled") + .HasFilter("[Enabled] = 1"); + + b.HasIndex(new[] { "IsDeleted" }, "IX_IsDeleted") + .HasFilter("[IsDeleted] = 0"); + + b.HasIndex(new[] { "IsDeleted", "Name", "Enabled" }, "IX_IsDeleted_Name_Enabled") + .HasFilter("[IsDeleted] = 0"); + + b.ToTable("PermissionModules"); + }); + + modelBuilder.Entity("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.PermissionOperation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("CreationUserId") + .HasColumnType("int"); + + b.Property("DeletionTime") + .HasColumnType("datetime2"); + + b.Property("DeletionUserId") + .HasColumnType("int"); + + b.Property("Guid") + .IsRequired() + .HasMaxLength(45) + .HasColumnType("nvarchar(45)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("UpdateTime") + .HasColumnType("datetime2"); + + b.Property("UpdateUserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex(new[] { "IsDeleted", "Name" }, "IX_IsDeleted_Name"); + + b.ToTable("PermissionOperations"); + }); + + modelBuilder.Entity("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.PermissionSystem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("CreationUserId") + .HasColumnType("int"); + + b.Property("DeletionTime") + .HasColumnType("datetime2"); + + b.Property("DeletionUserId") + .HasColumnType("int"); + + b.Property("Enabled") + .HasColumnType("bit"); + + b.Property("Guid") + .IsRequired() + .HasMaxLength(45) + .HasColumnType("nvarchar(45)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("UpdateTime") + .HasColumnType("datetime2"); + + b.Property("UpdateUserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex(new[] { "Enabled" }, "IX_Enabled") + .HasFilter("[Enabled] = 1"); + + b.HasIndex(new[] { "IsDeleted" }, "IX_IsDeleted") + .HasFilter("[IsDeleted] = 0"); + + b.HasIndex(new[] { "IsDeleted", "Name", "Enabled" }, "IX_IsDeleted_Name_Enabled") + .HasFilter("[IsDeleted] = 0"); + + b.ToTable("PermissionSystems"); + }); + + modelBuilder.Entity("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.PermissionSystemModule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("CreationUserId") + .HasColumnType("int"); + + b.Property("DeletionTime") + .HasColumnType("datetime2"); + + b.Property("DeletionUserId") + .HasColumnType("int"); + + b.Property("Enabled") + .HasColumnType("bit"); + + b.Property("Guid") + .IsRequired() + .HasMaxLength(45) + .HasColumnType("nvarchar(45)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("PermissionModuleId") + .HasColumnType("int"); + + b.Property("PermissionSystemId") + .HasColumnType("int"); + + b.Property("UpdateTime") + .HasColumnType("datetime2"); + + b.Property("UpdateUserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("PermissionModuleId"); + + b.HasIndex("PermissionSystemId"); + + b.ToTable("PermissionSystemModules"); + }); + + modelBuilder.Entity("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.PermissionSystemModuleOperation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("CreationUserId") + .HasColumnType("int"); + + b.Property("DeletionTime") + .HasColumnType("datetime2"); + + b.Property("DeletionUserId") + .HasColumnType("int"); + + b.Property("Enabled") + .HasColumnType("bit"); + + b.Property("Guid") + .IsRequired() + .HasMaxLength(45) + .HasColumnType("nvarchar(45)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("PermissionOperationId") + .HasColumnType("int"); + + b.Property("PermissionSystemModuleId") + .HasColumnType("int"); + + b.Property("UpdateTime") + .HasColumnType("datetime2"); + + b.Property("UpdateUserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("PermissionOperationId"); + + b.HasIndex("PermissionSystemModuleId"); + + b.HasIndex(new[] { "IsDeleted", "Enabled", "Guid" }, "IX_IsDeleted_Enabled_Guid"); + + b.ToTable("PermissionSystemModuleOperations"); + }); + modelBuilder.Entity("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.Role", b => { b.Property("Id") @@ -72,6 +336,58 @@ namespace MainProject.Migrations b.ToTable("Roles"); }); + modelBuilder.Entity("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.RolePermissionSystemModuleOperation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Active") + .HasColumnType("bit"); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("CreationUserId") + .HasColumnType("int"); + + b.Property("DeletionTime") + .HasColumnType("datetime2"); + + b.Property("DeletionUserId") + .HasColumnType("int"); + + b.Property("Guid") + .IsRequired() + .HasMaxLength(45) + .HasColumnType("nvarchar(45)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("PermissionSystemModuleOperationId") + .HasColumnType("int"); + + b.Property("RoleId") + .HasColumnType("int"); + + b.Property("UpdateTime") + .HasColumnType("datetime2"); + + b.Property("UpdateUserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("PermissionSystemModuleOperationId"); + + b.HasIndex("RoleId"); + + b.ToTable("RolePermissionSystemModuleOperations"); + }); + modelBuilder.Entity("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.User", b => { b.Property("Id") @@ -151,6 +467,63 @@ namespace MainProject.Migrations b.ToTable("Users"); }); + modelBuilder.Entity("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.PermissionSystemModule", b => + { + b.HasOne("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.PermissionModule", "PermissionModule") + .WithMany() + .HasForeignKey("PermissionModuleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.PermissionSystem", "PermissionSystem") + .WithMany() + .HasForeignKey("PermissionSystemId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("PermissionModule"); + + b.Navigation("PermissionSystem"); + }); + + modelBuilder.Entity("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.PermissionSystemModuleOperation", b => + { + b.HasOne("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.PermissionOperation", "PermissionOperation") + .WithMany() + .HasForeignKey("PermissionOperationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.PermissionSystemModule", "PermissionSystemModule") + .WithMany() + .HasForeignKey("PermissionSystemModuleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("PermissionOperation"); + + b.Navigation("PermissionSystemModule"); + }); + + modelBuilder.Entity("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.RolePermissionSystemModuleOperation", b => + { + b.HasOne("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.PermissionSystemModuleOperation", "PermissionSystemModuleOperation") + .WithMany() + .HasForeignKey("PermissionSystemModuleOperationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.Role", "Role") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("PermissionSystemModuleOperation"); + + b.Navigation("Role"); + }); + modelBuilder.Entity("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.User", b => { b.HasOne("BasicDotnetTemplate.MainProject.Models.Database.SqlServer.Role", "Role") diff --git a/MainProject/Models/Database/SqlServer/PermissionModule.cs b/MainProject/Models/Database/SqlServer/PermissionModule.cs new file mode 100644 index 0000000..dba3a92 --- /dev/null +++ b/MainProject/Models/Database/SqlServer/PermissionModule.cs @@ -0,0 +1,11 @@ +using System.ComponentModel.DataAnnotations; + +namespace BasicDotnetTemplate.MainProject.Models.Database.SqlServer +{ + public class PermissionModule : Base + { + [MaxLength(100)] + public required string Name { get; set; } + public required bool Enabled { get; set; } + } +} \ No newline at end of file diff --git a/MainProject/Models/Database/SqlServer/PermissionOperation.cs b/MainProject/Models/Database/SqlServer/PermissionOperation.cs new file mode 100644 index 0000000..4080277 --- /dev/null +++ b/MainProject/Models/Database/SqlServer/PermissionOperation.cs @@ -0,0 +1,10 @@ +using System.ComponentModel.DataAnnotations; + +namespace BasicDotnetTemplate.MainProject.Models.Database.SqlServer +{ + public class PermissionOperation : Base + { + [MaxLength(100)] + public required string Name { get; set; } + } +} \ No newline at end of file diff --git a/MainProject/Models/Database/SqlServer/PermissionSystem.cs b/MainProject/Models/Database/SqlServer/PermissionSystem.cs new file mode 100644 index 0000000..7b28d33 --- /dev/null +++ b/MainProject/Models/Database/SqlServer/PermissionSystem.cs @@ -0,0 +1,11 @@ +using System.ComponentModel.DataAnnotations; + +namespace BasicDotnetTemplate.MainProject.Models.Database.SqlServer +{ + public class PermissionSystem : Base + { + [MaxLength(100)] + public required string Name { get; set; } + public required bool Enabled { get; set; } + } +} \ No newline at end of file diff --git a/MainProject/Models/Database/SqlServer/PermissionSystemModule.cs b/MainProject/Models/Database/SqlServer/PermissionSystemModule.cs new file mode 100644 index 0000000..84eef1f --- /dev/null +++ b/MainProject/Models/Database/SqlServer/PermissionSystemModule.cs @@ -0,0 +1,13 @@ +using System.ComponentModel.DataAnnotations; + +namespace BasicDotnetTemplate.MainProject.Models.Database.SqlServer +{ + public class PermissionSystemModule : Base + { + public required int PermissionSystemId { get; set; } + public required int PermissionModuleId { get; set; } + public required PermissionSystem PermissionSystem { get; set; } + public required PermissionModule PermissionModule { get; set; } + public required bool Enabled { get; set; } + } +} \ No newline at end of file diff --git a/MainProject/Models/Database/SqlServer/PermissionSystemModuleOperation.cs b/MainProject/Models/Database/SqlServer/PermissionSystemModuleOperation.cs new file mode 100644 index 0000000..deb5d8b --- /dev/null +++ b/MainProject/Models/Database/SqlServer/PermissionSystemModuleOperation.cs @@ -0,0 +1,13 @@ +using System.ComponentModel.DataAnnotations; + +namespace BasicDotnetTemplate.MainProject.Models.Database.SqlServer +{ + public class PermissionSystemModuleOperation : Base + { + public required int PermissionSystemModuleId { get; set; } + public required int PermissionOperationId { get; set; } + public required bool Enabled { get; set; } + public required PermissionSystemModule PermissionSystemModule { get; set; } + public required PermissionOperation PermissionOperation { get; set; } + } +} \ No newline at end of file diff --git a/MainProject/Models/Database/SqlServer/RolePermissionSystemModuleOperation.cs b/MainProject/Models/Database/SqlServer/RolePermissionSystemModuleOperation.cs new file mode 100644 index 0000000..d42be00 --- /dev/null +++ b/MainProject/Models/Database/SqlServer/RolePermissionSystemModuleOperation.cs @@ -0,0 +1,13 @@ +using System.ComponentModel.DataAnnotations; + +namespace BasicDotnetTemplate.MainProject.Models.Database.SqlServer +{ + public class RolePermissionSystemModuleOperation : Base + { + public required int RoleId { get; set; } + public required int PermissionSystemModuleOperationId { get; set; } + public required bool Active { get; set; } + public required Role Role { get; set; } + public required PermissionSystemModuleOperation PermissionSystemModuleOperation { get; set; } + } +} \ No newline at end of file diff --git a/MainProject/Services/PermissionService.cs b/MainProject/Services/PermissionService.cs new file mode 100644 index 0000000..ee7449a --- /dev/null +++ b/MainProject/Services/PermissionService.cs @@ -0,0 +1,637 @@ + +using System.Collections; +using BasicDotnetTemplate.MainProject.Core.Database; +using BasicDotnetTemplate.MainProject.Models.Api.Common.Exceptions; +using BasicDotnetTemplate.MainProject.Models.Database.SqlServer; +using Microsoft.EntityFrameworkCore; + +namespace BasicDotnetTemplate.MainProject.Services; + +public interface IPermissionService +{ + Task GetPermissionSystemByGuidAsync(string guid); + Task GetPermissionSystemByNameAsync(string name); + Task HandleEnabledPermissionSystem(PermissionSystem permission, bool enabled); + Task CreatePermissionSystemAsync(string name, bool enabled); + Task DeletePermissionSystemAsync(PermissionSystem permission); + + + Task GetPermissionModuleByGuidAsync(string guid); + Task GetPermissionModuleByNameAsync(string name); + Task HandleEnabledPermissionModuleAsync(PermissionModule permission, bool enabled); + Task CreatePermissionModuleAsync(string name, bool enabled); + Task DeletePermissionModuleAsync(PermissionModule permission); + + + Task GetPermissionOperationByGuidAsync(string guid); + Task GetPermissionOperationByNameAsync(string name); + Task CreatePermissionOperationAsync(string name); + Task DeletePermissionOperationAsync(PermissionOperation permission); + + + Task GetPermissionSystemModuleByGuidAsync(string guid); + Task HandleEnabledPermissionSystemModuleAsync(PermissionSystemModule permission, bool enabled); + Task CreatePermissionSystemModuleAsync( + PermissionSystem permissionSystem, + PermissionModule permissionModule, + bool enabled + ); + Task DeletePermissionSystemModuleAsync(PermissionSystemModule permission); + + + Task GetPermissionSystemModuleOperationByGuidAsync(string guid); + Task HandleEnabledPermissionSystemModuleOperationAsync(PermissionSystemModuleOperation permission, bool enabled); + Task CreatePermissionSystemModuleOperationAsync( + PermissionSystemModule permissionSystemModule, + PermissionOperation permissionOperation, + bool enabled + ); + Task DeletePermissionSystemModuleOperationAsync(PermissionSystemModuleOperation permission); + + + Task GetRolePermissionSystemModuleOperationByGuidAsync(string guid); + Task HandleEnabledRolePermissionSystemModuleOperationAsync(RolePermissionSystemModuleOperation permission, bool active); + Task CreateRolePermissionSystemModuleOperationAsync( + Role role, + PermissionSystemModuleOperation permissionSystemModuleOperation, + bool enabled + ); + Task DeleteRolePermissionSystemModuleOperationAsync(RolePermissionSystemModuleOperation permission); +} + +public class PermissionService : BaseService, IPermissionService +{ + private readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger(); + public PermissionService( + IHttpContextAccessor httpContextAccessor, + IConfiguration configuration, + SqlServerContext sqlServerContext + ) : base(httpContextAccessor, configuration, sqlServerContext) + { } + + private IQueryable GetPermissionSystemsQueryable() + { + return this._sqlServerContext.PermissionSystems + .Where(x => !x.IsDeleted); + } + + private IQueryable GetPermissionModulesQueryable() + { + return this._sqlServerContext.PermissionModules + .Where(x => !x.IsDeleted); + } + + private IQueryable GetPermissionOperationsQueryable() + { + return this._sqlServerContext.PermissionOperations + .Where(x => !x.IsDeleted); + } + + private IQueryable GetPermissionSystemModulesQueryable() + { + return this._sqlServerContext.PermissionSystemModules + .Where(x => !x.IsDeleted); + } + + private IQueryable GetPermissionSystemModuleOperationsQueryable() + { + return this._sqlServerContext.PermissionSystemModuleOperations + .Include(x => x.PermissionOperation) + .Include(x => x.PermissionSystemModule) + .ThenInclude(x => x.PermissionSystem) + .Where(x => !x.IsDeleted); + } + + private IQueryable GetRolePermissionSystemModuleOperationsQueryable() + { + return this._sqlServerContext.RolePermissionSystemModuleOperations + .Include(x => x.Role) + .Include(x => x.PermissionSystemModuleOperation) + .ThenInclude(x => x.PermissionSystemModule) + .ThenInclude(x => x.PermissionSystem) + .Include(x => x.PermissionSystemModuleOperation) + .ThenInclude(x => x.PermissionSystemModule) + .ThenInclude(x => x.PermissionModule) + .Include(x => x.PermissionSystemModuleOperation) + .ThenInclude(x => x.PermissionOperation) + .Where(x => !x.IsDeleted); + } + + private PermissionOperation CreatePermissionOperationData(string name) + { + PermissionOperation permission = new() + { + CreationTime = DateTime.UtcNow, + Name = name, + IsDeleted = false, + Guid = Guid.NewGuid().ToString() + }; + + return permission; + } + + private PermissionSystem CreatePermissionSystemData(string name, bool enabled) + { + PermissionSystem permission = new() + { + CreationTime = DateTime.UtcNow, + Name = name, + Enabled = enabled, + IsDeleted = false, + Guid = Guid.NewGuid().ToString() + }; + + return permission; + } + + private PermissionModule CreatePermissionModuleData(string name, bool enabled) + { + PermissionModule permission = new() + { + CreationTime = DateTime.UtcNow, + Name = name, + Enabled = enabled, + IsDeleted = false, + Guid = Guid.NewGuid().ToString() + }; + + return permission; + } + + private PermissionSystemModule CreatePermissionSystemModuleData( + PermissionSystem permissionSystem, + PermissionModule permissionModule, + bool enabled + ) + { + PermissionSystemModule permission = new() + { + CreationTime = DateTime.UtcNow, + PermissionSystemId = permissionSystem.Id, + PermissionSystem = permissionSystem, + PermissionModuleId = permissionModule.Id, + PermissionModule = permissionModule, + Enabled = enabled, + IsDeleted = false, + Guid = Guid.NewGuid().ToString() + }; + + return permission; + } + + private PermissionSystemModuleOperation CreatePermissionSystemModuleOperationData( + PermissionSystemModule permissionSystemModule, + PermissionOperation permissionOperation, + bool enabled + ) + { + PermissionSystemModuleOperation permission = new() + { + CreationTime = DateTime.UtcNow, + PermissionOperationId = permissionOperation.Id, + PermissionOperation = permissionOperation, + PermissionSystemModuleId = permissionSystemModule.Id, + PermissionSystemModule = permissionSystemModule, + Enabled = enabled, + IsDeleted = false, + Guid = Guid.NewGuid().ToString() + }; + + return permission; + } + + private RolePermissionSystemModuleOperation CreateRolePermissionSystemModuleOperationData( + Role role, + PermissionSystemModuleOperation permissionModuleOperation, + bool active + ) + { + RolePermissionSystemModuleOperation permission = new() + { + CreationTime = DateTime.UtcNow, + PermissionSystemModuleOperationId = permissionModuleOperation.Id, + PermissionSystemModuleOperation = permissionModuleOperation, + RoleId = role.Id, + Role = role, + Active = active, + IsDeleted = false, + Guid = Guid.NewGuid().ToString() + }; + + return permission; + } + +#region "PermissionSystem" + + public async Task GetPermissionSystemByGuidAsync(string guid) + { + return await this.GetPermissionSystemsQueryable().Where(x => x.Guid == guid).FirstOrDefaultAsync(); + } + + public async Task GetPermissionSystemByNameAsync(string name) + { + return await this.GetPermissionSystemsQueryable().Where(x => x.Name == name).FirstOrDefaultAsync(); + } + + public async Task CreatePermissionSystemAsync(string name, bool enabled) + { + PermissionSystem? permission; + + using var transaction = await _sqlServerContext.Database.BeginTransactionAsync(); + + try + { + var tempPermission = CreatePermissionSystemData(name, enabled); + await _sqlServerContext.PermissionSystems.AddAsync(tempPermission); + await _sqlServerContext.SaveChangesAsync(); + await transaction.CommitAsync(); + permission = tempPermission; + } + catch (Exception exception) + { + await transaction.RollbackAsync(); + Logger.Error(exception, $"[PermissionService][CreatePermissionSystemAsync]"); + throw new CreateException($"An error occurred while creating the permission for transaction ID {transaction.TransactionId}.", exception); + } + return permission; + } + + public async Task HandleEnabledPermissionSystem(PermissionSystem permission, bool enabled) + { + bool? updated = false; + + using (var transaction = _sqlServerContext.Database.BeginTransactionAsync()) + { + permission.Enabled = enabled; + permission.UpdateTime = DateTime.UtcNow; + _sqlServerContext.Update(permission); + await _sqlServerContext.SaveChangesAsync(); + await (await transaction).CommitAsync(); + updated = true; + } + + return updated; + } + + public async Task DeletePermissionSystemAsync(PermissionSystem permission) + { + bool? deleted = false; + + using (var transaction = _sqlServerContext.Database.BeginTransactionAsync()) + { + permission.IsDeleted = true; + permission.DeletionTime = DateTime.UtcNow; + _sqlServerContext.Update(permission); + await _sqlServerContext.SaveChangesAsync(); + await (await transaction).CommitAsync(); + deleted = true; + } + + return deleted; + } + +#endregion + + +#region "PermissionModule" + + + public async Task GetPermissionModuleByGuidAsync(string guid) + { + return await this.GetPermissionModulesQueryable().Where(x => x.Guid == guid).FirstOrDefaultAsync(); + } + + public async Task GetPermissionModuleByNameAsync(string name) + { + return await this.GetPermissionModulesQueryable().Where(x => x.Name == name).FirstOrDefaultAsync(); + } + + public async Task CreatePermissionModuleAsync(string name, bool enabled) + { + PermissionModule? permission; + + using var transaction = await _sqlServerContext.Database.BeginTransactionAsync(); + + try + { + var tempPermission = CreatePermissionModuleData(name, enabled); + await _sqlServerContext.PermissionModules.AddAsync(tempPermission); + await _sqlServerContext.SaveChangesAsync(); + await transaction.CommitAsync(); + permission = tempPermission; + } + catch (Exception exception) + { + await transaction.RollbackAsync(); + Logger.Error(exception, $"[PermissionService][CreatePermissionModuleAsync]"); + throw new CreateException($"An error occurred while creating the permission for transaction ID {transaction.TransactionId}.", exception); + } + return permission; + } + + public async Task HandleEnabledPermissionModuleAsync(PermissionModule permission, bool enabled) + { + bool? updated = false; + + using (var transaction = _sqlServerContext.Database.BeginTransactionAsync()) + { + permission.Enabled = enabled; + permission.UpdateTime = DateTime.UtcNow; + _sqlServerContext.Update(permission); + await _sqlServerContext.SaveChangesAsync(); + await (await transaction).CommitAsync(); + updated = true; + } + + return updated; + } + + public async Task DeletePermissionModuleAsync(PermissionModule permission) + { + bool? deleted = false; + + using (var transaction = _sqlServerContext.Database.BeginTransactionAsync()) + { + permission.IsDeleted = true; + permission.DeletionTime = DateTime.UtcNow; + _sqlServerContext.Update(permission); + await _sqlServerContext.SaveChangesAsync(); + await (await transaction).CommitAsync(); + deleted = true; + } + + return deleted; + } + +#endregion + + +#region "PermissionOperation" + + public async Task GetPermissionOperationByGuidAsync(string guid) + { + return await this.GetPermissionOperationsQueryable().Where(x => x.Guid == guid).FirstOrDefaultAsync(); + } + + public async Task GetPermissionOperationByNameAsync(string name) + { + return await this.GetPermissionOperationsQueryable().Where(x => x.Name == name).FirstOrDefaultAsync(); + } + + public async Task CreatePermissionOperationAsync(string name) + { + PermissionOperation? permission; + + using var transaction = await _sqlServerContext.Database.BeginTransactionAsync(); + + try + { + var tempPermission = CreatePermissionOperationData(name); + await _sqlServerContext.PermissionOperations.AddAsync(tempPermission); + await _sqlServerContext.SaveChangesAsync(); + await transaction.CommitAsync(); + permission = tempPermission; + } + catch (Exception exception) + { + await transaction.RollbackAsync(); + Logger.Error(exception, $"[PermissionService][CreatePermissionOperationAsync]"); + throw new CreateException($"An error occurred while creating the permission for transaction ID {transaction.TransactionId}.", exception); + } + return permission; + } + + public async Task DeletePermissionOperationAsync(PermissionOperation permission) + { + bool? deleted = false; + + using (var transaction = _sqlServerContext.Database.BeginTransactionAsync()) + { + permission.IsDeleted = true; + permission.DeletionTime = DateTime.UtcNow; + _sqlServerContext.Update(permission); + await _sqlServerContext.SaveChangesAsync(); + await (await transaction).CommitAsync(); + deleted = true; + } + + return deleted; + } + +#endregion + + +#region "PermissionSystemModule" + + public async Task GetPermissionSystemModuleByGuidAsync(string guid) + { + return await this.GetPermissionSystemModulesQueryable().Where(x => x.Guid == guid).FirstOrDefaultAsync(); + } + + public async Task CreatePermissionSystemModuleAsync( + PermissionSystem permissionSystem, + PermissionModule permissionModule, + bool enabled + ) + { + PermissionSystemModule? permission; + + using var transaction = await _sqlServerContext.Database.BeginTransactionAsync(); + + try + { + var tempPermission = CreatePermissionSystemModuleData(permissionSystem, permissionModule, enabled); + await _sqlServerContext.PermissionSystemModules.AddAsync(tempPermission); + await _sqlServerContext.SaveChangesAsync(); + await transaction.CommitAsync(); + permission = tempPermission; + } + catch (Exception exception) + { + await transaction.RollbackAsync(); + Logger.Error(exception, $"[PermissionService][CreatePermissionSystemModuleAsync]"); + throw new CreateException($"An error occurred while creating the permission for transaction ID {transaction.TransactionId}.", exception); + } + return permission; + } + + public async Task HandleEnabledPermissionSystemModuleAsync(PermissionSystemModule permission, bool enabled) + { + bool? updated = false; + + using (var transaction = _sqlServerContext.Database.BeginTransactionAsync()) + { + permission.Enabled = enabled; + permission.UpdateTime = DateTime.UtcNow; + _sqlServerContext.Update(permission); + await _sqlServerContext.SaveChangesAsync(); + await (await transaction).CommitAsync(); + updated = true; + } + + return updated; + } + + public async Task DeletePermissionSystemModuleAsync(PermissionSystemModule permission) + { + bool? deleted = false; + + using (var transaction = _sqlServerContext.Database.BeginTransactionAsync()) + { + permission.IsDeleted = true; + permission.DeletionTime = DateTime.UtcNow; + _sqlServerContext.Update(permission); + await _sqlServerContext.SaveChangesAsync(); + await (await transaction).CommitAsync(); + deleted = true; + } + + return deleted; + } + +#endregion + + +#region "PermissionSystemModuleOperation" + + public async Task GetPermissionSystemModuleOperationByGuidAsync(string guid) + { + return await this.GetPermissionSystemModuleOperationsQueryable().Where(x => x.Guid == guid).FirstOrDefaultAsync(); + } + + public async Task CreatePermissionSystemModuleOperationAsync( + PermissionSystemModule permissionSystemModule, + PermissionOperation permissionOperation, + bool enabled + ) + { + PermissionSystemModuleOperation? permission; + + using var transaction = await _sqlServerContext.Database.BeginTransactionAsync(); + + try + { + var tempPermission = CreatePermissionSystemModuleOperationData(permissionSystemModule, permissionOperation, enabled); + await _sqlServerContext.PermissionSystemModuleOperations.AddAsync(tempPermission); + await _sqlServerContext.SaveChangesAsync(); + await transaction.CommitAsync(); + permission = tempPermission; + } + catch (Exception exception) + { + await transaction.RollbackAsync(); + Logger.Error(exception, $"[PermissionService][CreatePermissionSystemModuleOperationAsync]"); + throw new CreateException($"An error occurred while creating the permission for transaction ID {transaction.TransactionId}.", exception); + } + return permission; + } + + public async Task HandleEnabledPermissionSystemModuleOperationAsync(PermissionSystemModuleOperation permission, bool enabled) + { + bool? updated = false; + + using (var transaction = _sqlServerContext.Database.BeginTransactionAsync()) + { + permission.Enabled = enabled; + permission.UpdateTime = DateTime.UtcNow; + _sqlServerContext.Update(permission); + await _sqlServerContext.SaveChangesAsync(); + await (await transaction).CommitAsync(); + updated = true; + } + + return updated; + } + + public async Task DeletePermissionSystemModuleOperationAsync(PermissionSystemModuleOperation permission) + { + bool? deleted = false; + + using (var transaction = _sqlServerContext.Database.BeginTransactionAsync()) + { + permission.IsDeleted = true; + permission.DeletionTime = DateTime.UtcNow; + _sqlServerContext.Update(permission); + await _sqlServerContext.SaveChangesAsync(); + await (await transaction).CommitAsync(); + deleted = true; + } + + return deleted; + } + +#endregion + + +#region "RolePermissionSystemModuleOperation" + + public async Task GetRolePermissionSystemModuleOperationByGuidAsync(string guid) + { + return await this.GetRolePermissionSystemModuleOperationsQueryable().Where(x => x.Guid == guid).FirstOrDefaultAsync(); + } + + public async Task CreateRolePermissionSystemModuleOperationAsync( + Role role, + PermissionSystemModuleOperation permissionSystemModuleOperation, + bool enabled + ) + { + RolePermissionSystemModuleOperation? permission; + + using var transaction = await _sqlServerContext.Database.BeginTransactionAsync(); + + try + { + var tempPermission = CreateRolePermissionSystemModuleOperationData(role, permissionSystemModuleOperation, enabled); + await _sqlServerContext.RolePermissionSystemModuleOperations.AddAsync(tempPermission); + await _sqlServerContext.SaveChangesAsync(); + await transaction.CommitAsync(); + permission = tempPermission; + } + catch (Exception exception) + { + await transaction.RollbackAsync(); + Logger.Error(exception, $"[PermissionService][RolePermissionSystemModuleOperation]"); + throw new CreateException($"An error occurred while creating the permission for transaction ID {transaction.TransactionId}.", exception); + } + return permission; + } + + public async Task HandleEnabledRolePermissionSystemModuleOperationAsync(RolePermissionSystemModuleOperation permission, bool active) + { + bool? updated = false; + + using (var transaction = _sqlServerContext.Database.BeginTransactionAsync()) + { + permission.Active = active; + permission.UpdateTime = DateTime.UtcNow; + _sqlServerContext.Update(permission); + await _sqlServerContext.SaveChangesAsync(); + await (await transaction).CommitAsync(); + updated = true; + } + + return updated; + } + + public async Task DeleteRolePermissionSystemModuleOperationAsync(RolePermissionSystemModuleOperation permission) + { + bool? deleted = false; + + using (var transaction = _sqlServerContext.Database.BeginTransactionAsync()) + { + permission.IsDeleted = true; + permission.DeletionTime = DateTime.UtcNow; + _sqlServerContext.Update(permission); + await _sqlServerContext.SaveChangesAsync(); + await (await transaction).CommitAsync(); + deleted = true; + } + + return deleted; + } + +#endregion + +} +