From 2d9388cb2a4963a3633fe6a524199f54fb0ad75b Mon Sep 17 00:00:00 2001 From: KharchenkoVladimir Date: Mon, 29 Nov 2021 12:39:28 +0500 Subject: [PATCH] Revert "CS2-123: Changed role permissions to bit collection" This reverts commit ad34e6445c1e96ca88a647169f8b4e8f8bc50260. --- AsbCloudApp/Data/PermissionDto.cs | 9 + AsbCloudApp/Data/UserRoleDto.cs | 6 +- AsbCloudApp/Data/UserTokenDto.cs | 3 +- ..._Permissions_To_Bit_Collection.Designer.cs | 2855 ----------------- ...2_Changed_Permissions_To_Bit_Collection.cs | 133 - .../AsbCloudDbContextModelSnapshot.cs | 85 +- AsbCloudDb/Model/AsbCloudDbContext.cs | 8 +- AsbCloudDb/Model/IAsbCloudDbContext.cs | 1 + AsbCloudDb/Model/Permission.cs | 19 +- .../Model/RelationUserRolePermission.cs | 28 + AsbCloudDb/Model/UserRole.cs | 12 +- .../Services/AuthService.cs | 35 +- .../Services/UserRoleService.cs | 107 +- 13 files changed, 226 insertions(+), 3075 deletions(-) create mode 100644 AsbCloudApp/Data/PermissionDto.cs delete mode 100644 AsbCloudDb/Migrations/20211126101932_Changed_Permissions_To_Bit_Collection.Designer.cs delete mode 100644 AsbCloudDb/Migrations/20211126101932_Changed_Permissions_To_Bit_Collection.cs create mode 100644 AsbCloudDb/Model/RelationUserRolePermission.cs diff --git a/AsbCloudApp/Data/PermissionDto.cs b/AsbCloudApp/Data/PermissionDto.cs new file mode 100644 index 00000000..84bd59f9 --- /dev/null +++ b/AsbCloudApp/Data/PermissionDto.cs @@ -0,0 +1,9 @@ +namespace AsbCloudApp.Data +{ + public class PermissionDto + { + public int Id { get; set; } + public string Caption { get; set; } + public int Type { get; set; } + } +} \ No newline at end of file diff --git a/AsbCloudApp/Data/UserRoleDto.cs b/AsbCloudApp/Data/UserRoleDto.cs index 64b28ee0..4e428aac 100644 --- a/AsbCloudApp/Data/UserRoleDto.cs +++ b/AsbCloudApp/Data/UserRoleDto.cs @@ -6,8 +6,10 @@ namespace AsbCloudApp.Data { public int Id { get; set; } public string Caption { get; set; } - public int RoleType { get; set; } public int IdParent { get; set; } - public long Permissions { get; set; } + public int RoleType { get; set; } + public virtual ICollection Users { get; set; } + public IEnumerable PermissionIds { get; set; } + public IEnumerable Permissions { get; set; } } } diff --git a/AsbCloudApp/Data/UserTokenDto.cs b/AsbCloudApp/Data/UserTokenDto.cs index 5dab69ab..36a90374 100644 --- a/AsbCloudApp/Data/UserTokenDto.cs +++ b/AsbCloudApp/Data/UserTokenDto.cs @@ -6,7 +6,8 @@ namespace AsbCloudApp.Data { public int Id { get; set; } public string CompanyName { get; set; } - public IDictionary Roles { get; set; } + public IDictionary Permissions { get; set; } + public IEnumerable RoleNames { get; set; } public string Token { get; set; } } } diff --git a/AsbCloudDb/Migrations/20211126101932_Changed_Permissions_To_Bit_Collection.Designer.cs b/AsbCloudDb/Migrations/20211126101932_Changed_Permissions_To_Bit_Collection.Designer.cs deleted file mode 100644 index cf29d38b..00000000 --- a/AsbCloudDb/Migrations/20211126101932_Changed_Permissions_To_Bit_Collection.Designer.cs +++ /dev/null @@ -1,2855 +0,0 @@ -// -using System; -using System.Collections.Generic; -using AsbCloudDb.Model; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -namespace AsbCloudDb.Migrations -{ - [DbContext(typeof(AsbCloudDbContext))] - [Migration("20211126101932_Changed_Permissions_To_Bit_Collection")] - partial class Changed_Permissions_To_Bit_Collection - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasPostgresExtension("adminpack") - .HasAnnotation("Relational:Collation", "Russian_Russia.1251") - .HasAnnotation("Relational:MaxIdentifierLength", 63) - .HasAnnotation("ProductVersion", "5.0.10") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("Caption") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("caption") - .HasComment("Название"); - - b.Property("IdDeposit") - .HasColumnType("integer") - .HasColumnName("id_deposit"); - - b.Property("Latitude") - .HasColumnType("double precision") - .HasColumnName("latitude"); - - b.Property("Longitude") - .HasColumnType("double precision") - .HasColumnName("longitude"); - - b.HasKey("Id"); - - b.HasIndex("IdDeposit"); - - b.ToTable("t_cluster"); - - b - .HasComment("Кусты"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Company", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("Caption") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("caption"); - - b.Property("IdCompanyType") - .HasMaxLength(255) - .HasColumnType("integer") - .HasColumnName("id_company_type") - .HasComment("вид деятельности"); - - b.HasKey("Id"); - - b.HasIndex("IdCompanyType"); - - b.ToTable("t_company"); - - b.HasData( - new - { - Id = 1, - Caption = "ООО \"АСБ\"", - IdCompanyType = 3 - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.CompanyType", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("Caption") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("caption"); - - b.HasKey("Id"); - - b.ToTable("t_company_type"); - - b.HasData( - new - { - Id = 1, - Caption = "Недрапользователь" - }, - new - { - Id = 2, - Caption = "Буровой подрядчик" - }, - new - { - Id = 3, - Caption = "Сервис автоматизации бурения" - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Deposit", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("Caption") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("caption"); - - b.Property("Latitude") - .HasColumnType("double precision") - .HasColumnName("latitude"); - - b.Property("Longitude") - .HasColumnType("double precision") - .HasColumnName("longitude"); - - b.HasKey("Id"); - - b.ToTable("t_deposit"); - - b - .HasComment("Месторождение"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.DrillFlowChart", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("AxialLoadMax") - .HasColumnType("double precision") - .HasColumnName("axial_load_max") - .HasComment("Максимальная нагрузка"); - - b.Property("AxialLoadMin") - .HasColumnType("double precision") - .HasColumnName("axial_load_min") - .HasComment("Минимальная нагрузка"); - - b.Property("DepthEnd") - .HasColumnType("double precision") - .HasColumnName("depth_end") - .HasComment("Глубина окончания интервала"); - - b.Property("DepthStart") - .HasColumnType("double precision") - .HasColumnName("depth_start") - .HasComment("Стартовая глубина"); - - b.Property("FlowMax") - .HasColumnType("double precision") - .HasColumnName("flow_max") - .HasComment("Максимальный расход"); - - b.Property("FlowMin") - .HasColumnType("double precision") - .HasColumnName("flow_min") - .HasComment("Минимальный расход"); - - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("well_id") - .HasComment("Id скважины"); - - b.Property("IdWellOperationCategory") - .HasColumnType("integer") - .HasColumnName("id_operation_category") - .HasComment("Id типа операции"); - - b.Property("LastUpdate") - .HasColumnType("timestamp without time zone") - .HasColumnName("last_update") - .HasComment("Дата последнего изменения"); - - b.Property("PressureMax") - .HasColumnType("double precision") - .HasColumnName("pressure_max") - .HasComment("Максимальное давление"); - - b.Property("PressureMin") - .HasColumnType("double precision") - .HasColumnName("pressure_min") - .HasComment("Минимальное давление"); - - b.Property("RotorSpeedMax") - .HasColumnType("double precision") - .HasColumnName("rotor_speed_max") - .HasComment("Максимальные обороты на ВСП"); - - b.Property("RotorSpeedMin") - .HasColumnType("double precision") - .HasColumnName("rotor_speed_min") - .HasComment("Минимальные обороты на ВСП"); - - b.Property("RotorTorqueMax") - .HasColumnType("double precision") - .HasColumnName("rotor_torque_max") - .HasComment("Максимальный момент на ВСП"); - - b.Property("RotorTorqueMin") - .HasColumnType("double precision") - .HasColumnName("rotor_torque_min") - .HasComment("Минимальный момент на ВСП"); - - b.HasKey("Id"); - - b.HasIndex("IdWell"); - - b.HasIndex("IdWellOperationCategory"); - - b.ToTable("t_drill_flow_chart"); - - b - .HasComment("Параметры корридоров бурения (диапазоны параметров бурения)"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.DrillParams", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("AxialLoadAvg") - .HasColumnType("double precision") - .HasColumnName("axial_load_avg") - .HasComment("Средняя нагрузка"); - - b.Property("AxialLoadMax") - .HasColumnType("double precision") - .HasColumnName("axial_load_max") - .HasComment("Максимальная нагрузка"); - - b.Property("AxialLoadMin") - .HasColumnType("double precision") - .HasColumnName("axial_load_min") - .HasComment("Минимальная нагрузка"); - - b.Property("DepthEnd") - .HasColumnType("double precision") - .HasColumnName("depth_end") - .HasComment("Глубина окончания интервала"); - - b.Property("DepthStart") - .HasColumnType("double precision") - .HasColumnName("depth_start") - .HasComment("Стартовая глубина"); - - b.Property("FlowAvg") - .HasColumnType("double precision") - .HasColumnName("flow_avg") - .HasComment("Средний расход"); - - b.Property("FlowMax") - .HasColumnType("double precision") - .HasColumnName("flow_max") - .HasComment("Максимальный расход"); - - b.Property("FlowMin") - .HasColumnType("double precision") - .HasColumnName("flow_min") - .HasComment("Минимальный расход"); - - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("well_id") - .HasComment("Id скважины"); - - b.Property("IdWellSectionType") - .HasColumnType("integer") - .HasColumnName("id_wellsection_type") - .HasComment("Id с типом секции скважины"); - - b.Property("PressureAvg") - .HasColumnType("double precision") - .HasColumnName("pressure_avg") - .HasComment("Среднее давление"); - - b.Property("PressureMax") - .HasColumnType("double precision") - .HasColumnName("pressure_max") - .HasComment("Максимальное давление"); - - b.Property("PressureMin") - .HasColumnType("double precision") - .HasColumnName("pressure_min") - .HasComment("Минимальное давление"); - - b.Property("RotorSpeedAvg") - .HasColumnType("double precision") - .HasColumnName("rotor_speed_avg") - .HasComment("Средние обороты на ВСП"); - - b.Property("RotorSpeedMax") - .HasColumnType("double precision") - .HasColumnName("rotor_speed_max") - .HasComment("Максимальные обороты на ВСП"); - - b.Property("RotorSpeedMin") - .HasColumnType("double precision") - .HasColumnName("rotor_speed_min") - .HasComment("Минимальные обороты на ВСП"); - - b.Property("RotorTorqueAvg") - .HasColumnType("double precision") - .HasColumnName("rotor_torque_avg") - .HasComment("Средний момент на ВСП"); - - b.Property("RotorTorqueMax") - .HasColumnType("double precision") - .HasColumnName("rotor_torque_max") - .HasComment("Максимальный момент на ВСП"); - - b.Property("RotorTorqueMin") - .HasColumnType("double precision") - .HasColumnName("rotor_torque_min") - .HasComment("Минимальный момент на ВСП"); - - b.HasKey("Id"); - - b.HasIndex("IdWell"); - - b.HasIndex("IdWellSectionType"); - - b.ToTable("t_drill_params"); - - b - .HasComment("Режим бурения в секции (диапазоны параметров бурения)"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.FileCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("Name") - .HasColumnType("text") - .HasColumnName("name") - .HasComment("Название категории"); - - b.Property("ShortName") - .HasColumnType("text") - .HasColumnName("short_name") - .HasComment("Короткое название категории"); - - b.HasKey("Id"); - - b.ToTable("t_file_category"); - - b - .HasComment("Категории файлов"); - - b.HasData( - new - { - Id = 1, - Name = "Растворный сервис", - ShortName = "fluidService" - }, - new - { - Id = 2, - Name = "Цементирование", - ShortName = "cement" - }, - new - { - Id = 3, - Name = "ННБ", - ShortName = "nnb" - }, - new - { - Id = 4, - Name = "ГТИ", - ShortName = "gti" - }, - new - { - Id = 5, - Name = "Документы по скважине", - ShortName = "wellDocuments" - }, - new - { - Id = 6, - Name = "Супервайзер", - ShortName = "supervisor" - }, - new - { - Id = 7, - Name = "Мастер", - ShortName = "master" - }, - new - { - Id = 8, - Name = "Последний замер бурового раствора ПЛАН", - ShortName = "fluidPlanLastData" - }, - new - { - Id = 9, - Name = "Последний замер бурового раствора ФАКТ", - ShortName = "fluidFactLastData" - }, - new - { - Id = 10, - Name = "Последние данные Шламограммы", - ShortName = "mudLastData" - }, - new - { - Id = 11, - Name = "Последние данные ННБ", - ShortName = "nnbLastData" - }, - new - { - Id = 12, - Name = "Рапорт", - ShortName = "report" - }, - new - { - Id = 13, - Name = "Программа бурения, части", - ShortName = "ПБч" - }, - new - { - Id = 14, - Name = "Программа бурения", - ShortName = "ПБ" - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.FileInfo", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("IdAuthor") - .HasColumnType("integer") - .HasColumnName("id_author") - .HasComment("Id пользователя, загрузившего файл"); - - b.Property("IdCategory") - .HasColumnType("integer") - .HasColumnName("id_category") - .HasComment("id категории файла"); - - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("id скважины"); - - b.Property("IsDeleted") - .HasColumnType("boolean") - .HasColumnName("is_deleted") - .HasComment("Удален ли файл"); - - b.Property("Name") - .HasColumnType("text") - .HasColumnName("name") - .HasComment("Название файла"); - - b.Property("PublishInfo") - .HasColumnType("jsonb") - .HasColumnName("publish_info") - .HasComment("Информация о файле в облаке"); - - b.Property("Size") - .HasColumnType("bigint") - .HasColumnName("file_size") - .HasComment("Размер файла"); - - b.Property("UploadDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("date"); - - b.HasKey("Id"); - - b.HasIndex("IdAuthor"); - - b.HasIndex("IdCategory"); - - b.HasIndex("IdWell"); - - b.ToTable("t_file_info"); - - b - .HasComment("Файлы всех категорий"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.FileMark", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("Comment") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("comment") - .HasComment("Комментарий"); - - b.Property("DateCreated") - .HasColumnType("timestamp without time zone") - .HasColumnName("date_created") - .HasComment("Дата совершенного действия"); - - b.Property("IdFile") - .HasColumnType("integer") - .HasColumnName("id_file") - .HasComment("id файла"); - - b.Property("IdMarkType") - .HasColumnType("integer") - .HasColumnName("id_mark_type") - .HasComment("0 - Согласован"); - - b.Property("IdUser") - .HasColumnType("integer") - .HasColumnName("id_user") - .HasComment("id пользователя"); - - b.Property("IsDeleted") - .HasColumnType("boolean") - .HasColumnName("is_deleted") - .HasComment("Помечен ли файл как удаленный"); - - b.HasKey("Id"); - - b.HasIndex("IdFile"); - - b.HasIndex("IdUser"); - - b.ToTable("t_file_mark"); - - b - .HasComment("Действия с файлами."); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Measure", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property>("Data") - .HasColumnType("jsonb") - .HasColumnName("data") - .HasComment("Данные таблицы последних данных"); - - b.Property("IdCategory") - .HasColumnType("integer") - .HasColumnName("id_category") - .HasComment("id категории"); - - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("id скважины"); - - b.Property("IsDeleted") - .HasColumnType("boolean") - .HasColumnName("is_deleted") - .HasComment("Пометка удаленным"); - - b.Property("Timestamp") - .HasColumnType("timestamp without time zone") - .HasColumnName("timestamp") - .HasComment("время добавления"); - - b.HasKey("Id"); - - b.HasIndex("IdCategory"); - - b.HasIndex("IdWell"); - - b.ToTable("t_measure"); - - b - .HasComment("Таблица c данными для вкладки 'Последние данные'"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.MeasureCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("Name") - .HasColumnType("text") - .HasColumnName("name") - .HasComment("Название категории"); - - b.Property("ShortName") - .HasColumnType("text") - .HasColumnName("short_name") - .HasComment("Короткое название категории"); - - b.HasKey("Id"); - - b.ToTable("t_measure_category"); - - b - .HasComment("Категория последних данных"); - - b.HasData( - new - { - Id = 1, - Name = "Показатели бурового раствора", - ShortName = "Раствор" - }, - new - { - Id = 2, - Name = "Шламограмма", - ShortName = "Шламограмма" - }, - new - { - Id = 3, - Name = "ННБ", - ShortName = "ННБ" - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Permission", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("Description") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("description") - .HasComment("Описание разрешений"); - - b.Property("Index") - .HasColumnType("text") - .HasColumnName("index") - .HasComment("Порядковый номер бита. \n В нем 0-запрещено, 1-разрешено."); - - b.HasKey("Id"); - - b.ToTable("t_permission"); - - b - .HasComment("Описание битов разрешений для ролей пользователей"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.RelationCompanyWell", b => - { - b.Property("IdCompany") - .HasColumnType("integer") - .HasColumnName("id_company"); - - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well"); - - b.HasKey("IdCompany", "IdWell"); - - b.HasIndex("IdWell"); - - b.ToTable("t_relation_company_well"); - - b - .HasComment("отношение скважин и компаний"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.RelationUserUserRole", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("IdUser") - .HasColumnType("integer") - .HasColumnName("id_user"); - - b.Property("IdUserRole") - .HasColumnType("integer") - .HasColumnName("id_user_role"); - - b.HasKey("Id"); - - b.HasIndex("IdUser"); - - b.HasIndex("IdUserRole"); - - b.ToTable("t_relation_user_user_role"); - - b - .HasComment("Отношение пользователей и ролей"); - - b.HasData( - new - { - Id = 1, - IdUser = 1, - IdUserRole = 2 - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.ReportProperty", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("Begin") - .HasColumnType("timestamp with time zone") - .HasColumnName("begin"); - - b.Property("End") - .HasColumnType("timestamp with time zone") - .HasColumnName("end") - .HasComment("timestamp with time zone"); - - b.Property("Format") - .HasColumnType("integer") - .HasColumnName("format") - .HasComment("Формат отчета"); - - b.Property("IdFile") - .HasColumnType("integer") - .HasColumnName("id_file") - .HasComment("id файла-родителя"); - - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("id скважины"); - - b.Property("Step") - .HasColumnType("integer") - .HasColumnName("step") - .HasComment("размер шага в секундах"); - - b.HasKey("Id"); - - b.HasIndex("IdFile"); - - b.HasIndex("IdWell"); - - b.ToTable("t_report_property"); - - b - .HasComment("Отчеты с данными по буровым"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("Info") - .HasColumnType("jsonb") - .HasColumnName("info") - .HasComment("Информация с панели о скважине"); - - b.Property("RemoteUid") - .HasColumnType("text") - .HasColumnName("remote_uid") - .HasComment("Идентификатор передающего устройства. Может повторяться в списке, так как комплекты оборудования переезжают от скв. к скв."); - - b.Property("TelemetryTimeZone") - .HasColumnType("jsonb") - .HasColumnName("timezone") - .HasComment("Смещение часового пояса от UTC"); - - b.HasKey("Id"); - - b.HasIndex(new[] { "RemoteUid" }, "t_telemetry_remote_uid_index"); - - b.ToTable("t_telemetry"); - - b - .HasComment("таблица привязки телеметрии от комплектов к конкретной скважине."); - }); - - modelBuilder.Entity("AsbCloudDb.Model.TelemetryAnalysis", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("DurationSec") - .HasColumnType("integer") - .HasColumnName("duration_sec") - .HasComment("Кол-во секунд после предыдущей операции"); - - b.Property("IdOperation") - .HasColumnType("integer") - .HasColumnName("id_operation"); - - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry"); - - b.Property("IsBitPositionDecreasing") - .HasColumnType("boolean") - .HasColumnName("is_bit_position_decreasing") - .HasComment("Долото поднимается"); - - b.Property("IsBitPositionIncreasing") - .HasColumnType("boolean") - .HasColumnName("is_bit_position_increasing") - .HasComment("Долото спускается"); - - b.Property("IsBitPositionLt20") - .HasColumnType("boolean") - .HasColumnName("is_bit_posision_lt_20") - .HasComment("Положение долота меньше 20м"); - - b.Property("IsBlockPositionDecreasing") - .HasColumnType("boolean") - .HasColumnName("is_block_posision_decresing") - .HasComment("Талевый блок поднимается"); - - b.Property("IsBlockPositionIncreasing") - .HasColumnType("boolean") - .HasColumnName("is_block_posision_incresing") - .HasComment("Талевый блок спускается"); - - b.Property("IsHookWeightLt3") - .HasColumnType("boolean") - .HasColumnName("is_hook_weight_lt_3") - .HasComment("Вес на крюке менее 3т"); - - b.Property("IsHookWeightNotChanges") - .HasColumnType("boolean") - .HasColumnName("is_hook_weight_not_changes") - .HasComment("Вес на крюке не меняется"); - - b.Property("IsPressureGt20") - .HasColumnType("boolean") - .HasColumnName("is_pressure_gt_20") - .HasComment("Давоение более 20"); - - b.Property("IsPressureLt20") - .HasColumnType("boolean") - .HasColumnName("is_pressure_lt_20") - .HasComment("Давление менее 20"); - - b.Property("IsRotorSpeedGt5") - .HasColumnType("boolean") - .HasColumnName("is_rotor_speed_gt_3") - .HasComment("Обороты ротора выше 3"); - - b.Property("IsRotorSpeedLt5") - .HasColumnType("boolean") - .HasColumnName("is_rotor_speed_lt_3") - .HasComment("Обороты ротора ниже 3"); - - b.Property("IsWellDepthDecreasing") - .HasColumnType("boolean") - .HasColumnName("is_well_depth_decreasing") - .HasComment("Глубина забоя не увеличивается"); - - b.Property("IsWellDepthIncreasing") - .HasColumnType("boolean") - .HasColumnName("is_well_depth_increasing") - .HasComment("Глубина забоя увеличивается"); - - b.Property("OperationEndDepth") - .HasColumnType("double precision") - .HasColumnName("operation_end_depth") - .HasComment("Глубина, на которой закончилась операция"); - - b.Property("OperationStartDepth") - .HasColumnType("double precision") - .HasColumnName("operation_start_depth") - .HasComment("Глубина, на которой началась операция"); - - b.Property("UnixDate") - .HasColumnType("bigint") - .HasColumnName("unix_date") - .HasComment("Unix timestamp для Linq запросов с вычислением дат"); - - b.HasKey("Id"); - - b.HasIndex("IdOperation"); - - b.HasIndex("IdTelemetry"); - - b.ToTable("t_telemetry_analysis"); - - b - .HasComment("События на скважине"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaub", b => - { - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry"); - - b.Property("Date") - .HasColumnType("timestamp with time zone") - .HasColumnName("date") - .HasComment("'2021-10-19 18:23:54+05'"); - - b.Property("AxialLoad") - .HasColumnType("real") - .HasColumnName("axial_load") - .HasComment("Осевая нагрузка"); - - b.Property("AxialLoadLimitMax") - .HasColumnType("real") - .HasColumnName("axial_load_limit_max") - .HasComment("Осевая нагрузка. Аварийная макс."); - - b.Property("AxialLoadSp") - .HasColumnType("real") - .HasColumnName("axial_load_sp") - .HasComment("Осевая нагрузка. Задание"); - - b.Property("BitDepth") - .HasColumnType("real") - .HasColumnName("bit_depth") - .HasComment("Положение инструмента"); - - b.Property("BlockPosition") - .HasColumnType("real") - .HasColumnName("block_position") - .HasComment("Высота талевого блока"); - - b.Property("BlockPositionMax") - .HasColumnType("real") - .HasColumnName("block_position_max") - .HasComment("Талевый блок. Макс положение"); - - b.Property("BlockPositionMin") - .HasColumnType("real") - .HasColumnName("block_position_min") - .HasComment("Талевый блок. Мин положение"); - - b.Property("BlockSpeed") - .HasColumnType("real") - .HasColumnName("block_speed") - .HasComment("Скорость талевого блока"); - - b.Property("BlockSpeedSp") - .HasColumnType("real") - .HasColumnName("block_speed_sp") - .HasComment("Скорости талевого блока. Задание"); - - b.Property("BlockSpeedSpDevelop") - .HasColumnType("real") - .HasColumnName("block_speed_sp_develop") - .HasComment("Талевый блок. Задание скорости для проработки"); - - b.Property("BlockSpeedSpRotor") - .HasColumnType("real") - .HasColumnName("block_speed_sp_rotor") - .HasComment("Талевый блок. Задание скорости для роторного бурения"); - - b.Property("BlockSpeedSpSlide") - .HasColumnType("real") - .HasColumnName("block_speed_sp_slide") - .HasComment("Талевый блок. Задание скорости для режима слайда"); - - b.Property("Flow") - .HasColumnType("real") - .HasColumnName("flow") - .HasComment("Расход"); - - b.Property("FlowDeltaLimitMax") - .HasColumnType("real") - .HasColumnName("flow_delta_limit_max") - .HasComment("Расход. Аварийный макс."); - - b.Property("FlowIdle") - .HasColumnType("real") - .HasColumnName("flow_idle") - .HasComment("Расход. Холостой ход"); - - b.Property("HookWeight") - .HasColumnType("real") - .HasColumnName("hook_weight") - .HasComment("Вес на крюке"); - - b.Property("HookWeightIdle") - .HasColumnType("real") - .HasColumnName("hook_weight_idle") - .HasComment("Вес на крюке. Холостой ход"); - - b.Property("HookWeightLimitMax") - .HasColumnType("real") - .HasColumnName("hook_weight_limit_max") - .HasComment("Вес на крюке. Затяжка"); - - b.Property("HookWeightLimitMin") - .HasColumnType("real") - .HasColumnName("hook_weight_limit_min") - .HasComment("Вес на крюке. Посадка"); - - b.Property("IdFeedRegulator") - .HasColumnType("smallint") - .HasColumnName("id_feed_regulator") - .HasComment("Текущий критерий бурения"); - - b.Property("IdUser") - .HasColumnType("integer") - .HasColumnName("id_user") - .HasComment("Пользователь САУБ"); - - b.Property("Mode") - .HasColumnType("smallint") - .HasColumnName("mode") - .HasComment("Режим САУБ"); - - b.Property("MseState") - .HasColumnType("smallint") - .HasColumnName("mse_state") - .HasComment("Текущее состояние работы MSE"); - - b.Property("Pressure") - .HasColumnType("real") - .HasColumnName("pressure") - .HasComment("Давление"); - - b.Property("PressureDeltaLimitMax") - .HasColumnType("real") - .HasColumnName("pressure_delta_limit_max") - .HasComment("Давление дифф. Аварийное макс."); - - b.Property("PressureIdle") - .HasColumnType("real") - .HasColumnName("pressure_idle") - .HasComment("Давление. Холостой ход"); - - b.Property("PressureSp") - .HasColumnType("real") - .HasColumnName("pressure_sp") - .HasComment("Давление. Задание"); - - b.Property("PressureSpDevelop") - .HasColumnType("real") - .HasColumnName("pressure_sp_develop") - .HasComment("Давление. Задание для проработки"); - - b.Property("PressureSpRotor") - .HasColumnType("real") - .HasColumnName("pressure_sp_rotor") - .HasComment("Давление. Задание для роторного бурения"); - - b.Property("PressureSpSlide") - .HasColumnType("real") - .HasColumnName("pressure_sp_slide") - .HasComment("Давление. Задание для режима слайда"); - - b.Property("RotorSpeed") - .HasColumnType("real") - .HasColumnName("rotor_speed") - .HasComment("Обороты ротора"); - - b.Property("RotorTorque") - .HasColumnType("real") - .HasColumnName("rotor_torque") - .HasComment("Момент на роторе"); - - b.Property("RotorTorqueIdle") - .HasColumnType("real") - .HasColumnName("rotor_torque_idle") - .HasComment("Момент на роторе. Холостой ход"); - - b.Property("RotorTorqueLimitMax") - .HasColumnType("real") - .HasColumnName("rotor_torque_limit_max") - .HasComment("Момент на роторе. Аварийный макс."); - - b.Property("RotorTorqueSp") - .HasColumnType("real") - .HasColumnName("rotor_torque_sp") - .HasComment("Момент на роторе. Задание"); - - b.Property("WellDepth") - .HasColumnType("real") - .HasColumnName("well_depth") - .HasComment("Глубина забоя"); - - b.HasKey("IdTelemetry", "Date"); - - b.ToTable("t_telemetry_data_saub"); - - b - .HasComment("набор основных данных по SAUB"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSpin", b => - { - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry"); - - b.Property("Date") - .HasColumnType("timestamp with time zone") - .HasColumnName("date") - .HasComment("'2021-10-19 18:23:54+05'"); - - b.Property("BreakAngleK") - .HasColumnType("real") - .HasColumnName("break_angle_k") - .HasComment("Коэффициент для расчёта за какой угол нужно тормозить"); - - b.Property("BreakAngleLeft") - .HasColumnType("real") - .HasColumnName("break_angle_left") - .HasComment("Угол торможения влево при работе по моменту"); - - b.Property("EncoderResolution") - .HasColumnType("real") - .HasColumnName("encoder_resolution") - .HasComment(" Разрешение энкодера"); - - b.Property("Mode") - .HasColumnType("smallint") - .HasColumnName("mode") - .HasComment("Выбранный режим управления"); - - b.Property("PidMuxTorqueLeftLimit") - .HasColumnType("real") - .HasColumnName("pid_mux_torque_left_limit") - .HasComment(" Момент при котором определяется ехать назад по моменту или по скорости"); - - b.Property("PositionRight") - .HasColumnType("real") - .HasColumnName("position_right") - .HasComment("Крайний правый угол осциляции"); - - b.Property("PositionZero") - .HasColumnType("real") - .HasColumnName("position_zero") - .HasComment("Нулевая позиция осциляции"); - - b.Property("Ratio") - .HasColumnType("real") - .HasColumnName("ratio") - .HasComment(" Коэффициент редукции редектора"); - - b.Property("ReverseKTorque") - .HasColumnType("real") - .HasColumnName("reverse_k_torque") - .HasComment("Коэффициент на который умножается момент, для того чтобы система поняла что мы движемся в обратную сторону"); - - b.Property("ReverseSpeedSpZeroTime") - .HasColumnType("smallint") - .HasColumnName("reverse_speed_sp_zero_time") - .HasComment("Время выдачи сигнала нулевой скорости на при смене направления"); - - b.Property("RevolsLeftLimit") - .HasColumnType("real") - .HasColumnName("revols_left_limit") - .HasComment("Ограничение числа оборотов влево"); - - b.Property("RevolsLeftTotal") - .HasColumnType("real") - .HasColumnName("revols_left_total") - .HasComment("Суммарное количество оборотов влево"); - - b.Property("RevolsRightLimit") - .HasColumnType("real") - .HasColumnName("revols_right_limit") - .HasComment("Ограничение числа оборотов вправо"); - - b.Property("RevolsRightTotal") - .HasColumnType("real") - .HasColumnName("revols_right_total") - .HasComment("Суммарное количество оборотов вправо"); - - b.Property("RotorTorqueAvg") - .HasColumnType("real") - .HasColumnName("rotor_torque_avg") - .HasComment(" Момент в роторе средний"); - - b.Property("SpeedLeftSp") - .HasColumnType("real") - .HasColumnName("speed_left_sp") - .HasComment("Заданная скорость вращения влево"); - - b.Property("SpeedRightSp") - .HasColumnType("real") - .HasColumnName("speed_right_sp") - .HasComment("Заданная скорость вращения вправо"); - - b.Property("State") - .HasColumnType("smallint") - .HasColumnName("state") - .HasComment("Переменная этапа"); - - b.Property("TopDriveSpeed") - .HasColumnType("real") - .HasColumnName("top_drive_speed") - .HasComment("Скорость СВП"); - - b.Property("TopDriveSpeedErr") - .HasColumnType("smallint") - .HasColumnName("top_drive_speed_err"); - - b.Property("TopDriveSpeedMax") - .HasColumnType("real") - .HasColumnName("top_drive_speed_max") - .HasComment("верхний предел"); - - b.Property("TopDriveSpeedMin") - .HasColumnType("real") - .HasColumnName("top_drive_speed_min") - .HasComment("нижний предел"); - - b.Property("TopDriveSpeedOffset") - .HasColumnType("real") - .HasColumnName("top_drive_speed_offset") - .HasComment("смещение"); - - b.Property("TopDriveSpeedSpFrom") - .HasColumnType("real") - .HasColumnName("top_drive_speed_sp_from") - .HasComment("Заданная скорость c СВП"); - - b.Property("TopDriveSpeedSpFromErr") - .HasColumnType("smallint") - .HasColumnName("top_drive_speed_sp_from_err"); - - b.Property("TopDriveSpeedSpFromMax") - .HasColumnType("real") - .HasColumnName("top_drive_speed_sp_from_max"); - - b.Property("TopDriveSpeedSpFromMin") - .HasColumnType("real") - .HasColumnName("top_drive_speed_sp_from_min"); - - b.Property("TopDriveSpeedSpFromOffset") - .HasColumnType("real") - .HasColumnName("top_drive_speed_sp_from_offset"); - - b.Property("TopDriveSpeedSpTo") - .HasColumnType("real") - .HasColumnName("top_drive_speed_sp_to") - .HasComment("Задание скорости на СВП"); - - b.Property("TopDriveSpeedSpToErr") - .HasColumnType("smallint") - .HasColumnName("top_drive_speed_sp_to_err"); - - b.Property("TopDriveSpeedSpToMax") - .HasColumnType("real") - .HasColumnName("top_drive_speed_sp_to_max"); - - b.Property("TopDriveSpeedSpToMin") - .HasColumnType("real") - .HasColumnName("top_drive_speed_sp_to_min"); - - b.Property("TopDriveSpeedSpToOffset") - .HasColumnType("real") - .HasColumnName("top_drive_speed_sp_to_offset"); - - b.Property("TopDriveTorque") - .HasColumnType("real") - .HasColumnName("top_drive_torque") - .HasComment("Момент СВП"); - - b.Property("TopDriveTorqueErr") - .HasColumnType("smallint") - .HasColumnName("top_drive_torque_err"); - - b.Property("TopDriveTorqueMax") - .HasColumnType("real") - .HasColumnName("top_drive_torque_max"); - - b.Property("TopDriveTorqueMin") - .HasColumnType("real") - .HasColumnName("top_drive_torque_min"); - - b.Property("TopDriveTorqueOffset") - .HasColumnType("real") - .HasColumnName("top_drive_torque_offset"); - - b.Property("TopDriveTorqueSpFrom") - .HasColumnType("real") - .HasColumnName("top_drive_torque_sp_from") - .HasComment("Заданный момент c СВП"); - - b.Property("TopDriveTorqueSpFromErr") - .HasColumnType("smallint") - .HasColumnName("top_drive_torque_sp_from_err"); - - b.Property("TopDriveTorqueSpFromMax") - .HasColumnType("real") - .HasColumnName("top_drive_torque_sp_from_max"); - - b.Property("TopDriveTorqueSpFromMin") - .HasColumnType("real") - .HasColumnName("top_drive_torque_sp_from_min"); - - b.Property("TopDriveTorqueSpFromOffset") - .HasColumnType("real") - .HasColumnName("top_drive_torque_sp_from_offset"); - - b.Property("TopDriveTorqueSpTo") - .HasColumnType("real") - .HasColumnName("top_drive_torque_sp_to") - .HasComment("Задание момента на СВП"); - - b.Property("TopDriveTorqueSpToErr") - .HasColumnType("smallint") - .HasColumnName("top_drive_torque_sp_to_err"); - - b.Property("TopDriveTorqueSpToMax") - .HasColumnType("real") - .HasColumnName("top_drive_torque_sp_to_max"); - - b.Property("TopDriveTorqueSpToMin") - .HasColumnType("real") - .HasColumnName("top_drive_torque_sp_to_min"); - - b.Property("TopDriveTorqueSpToOffset") - .HasColumnType("real") - .HasColumnName("top_drive_torque_sp_to_offset"); - - b.Property("TorqueLeftLimit") - .HasColumnType("real") - .HasColumnName("torque_left_limit") - .HasComment("Ограничение крутящего момента влево"); - - b.Property("TorqueRampTime") - .HasColumnType("real") - .HasColumnName("torque_ramp_time") - .HasComment("Время нарастания момента"); - - b.Property("TorqueRightLimit") - .HasColumnType("real") - .HasColumnName("torque_right_limit") - .HasComment("Ограничение крутящего момента вправо"); - - b.Property("TorqueStarting") - .HasColumnType("real") - .HasColumnName("torque_starting") - .HasComment(" Страгивающий момент"); - - b.Property("TurnLeftOnceByAngle") - .HasColumnType("real") - .HasColumnName("turn_left_once_by_angle") - .HasComment("Доворот по градусам единожды влево"); - - b.Property("TurnLeftOnceByRevols") - .HasColumnType("real") - .HasColumnName("turn_left_once_by_revols") - .HasComment("Доворот по оборотам единожды влево"); - - b.Property("TurnLeftOnceByTorque") - .HasColumnType("real") - .HasColumnName("turn_left_once_by_torque") - .HasComment("Доворот по моменту единожды влево"); - - b.Property("TurnRightOnceByAngle") - .HasColumnType("real") - .HasColumnName("turn_right_once_by_angle") - .HasComment("Доворот по градусам единожды вправо"); - - b.Property("TurnRightOnceByRevols") - .HasColumnType("real") - .HasColumnName("turn_right_once_by_revols") - .HasComment("Доворот по оборотам единожды вправо"); - - b.Property("TurnRightOnceByTorque") - .HasColumnType("real") - .HasColumnName("turn_right_once_by_torque") - .HasComment("Доворот по моменту единожды вправо"); - - b.Property("UnlockBySectorOut") - .HasColumnType("real") - .HasColumnName("unlock_by_sector_out") - .HasComment(" Градус отклонения от сектора для автоматического сброса блокировки"); - - b.Property("Ver") - .HasColumnType("real") - .HasColumnName("ver") - .HasComment("Версия ПО ПЛК"); - - b.Property("W2800") - .HasColumnType("smallint") - .HasColumnName("w2800") - .HasComment("Установка нуля энкодера"); - - b.Property("W2808") - .HasColumnType("smallint") - .HasColumnName("w2808") - .HasComment("Неисправность энкодера"); - - b.Property("W2810") - .HasColumnType("smallint") - .HasColumnName("w2810") - .HasComment(" автоматический сброс блокировки"); - - b.HasKey("IdTelemetry", "Date"); - - b.ToTable("t_telemetry_data_spin"); - - b - .HasComment("набор основных данных по SpinMaster"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.TelemetryEvent", b => - { - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry"); - - b.Property("IdEvent") - .HasColumnType("integer") - .HasColumnName("id_event"); - - b.Property("IdCategory") - .HasColumnType("integer") - .HasColumnName("id_category"); - - b.Property("MessageTemplate") - .HasColumnType("text") - .HasColumnName("message_template"); - - b.HasKey("IdTelemetry", "IdEvent"); - - b.ToTable("t_telemetry_event"); - - b - .HasComment("Справочник событий. События формируют сообщения. Разделено по версиям посылок от телеметрии."); - }); - - modelBuilder.Entity("AsbCloudDb.Model.TelemetryMessage", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("Arg0") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("arg0") - .HasComment("Аргумент №0 для вставки в шаблон сообщения"); - - b.Property("Arg1") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("arg1"); - - b.Property("Arg2") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("arg2"); - - b.Property("Arg3") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("arg3"); - - b.Property("Date") - .HasColumnType("timestamp with time zone") - .HasColumnName("date"); - - b.Property("IdEvent") - .HasColumnType("integer") - .HasColumnName("id_event"); - - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry"); - - b.Property("IdTelemetryUser") - .HasColumnType("integer") - .HasColumnName("id_telemetry_user") - .HasComment("Пользователь панели отправляющей телеметрию. не пользователь облака."); - - b.Property("WellDepth") - .HasColumnType("double precision") - .HasColumnName("well_depth"); - - b.HasKey("Id"); - - b.HasIndex("IdTelemetry"); - - b.ToTable("t_telemetry_message"); - - b - .HasComment("Сообщения на буровых"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.TelemetryUser", b => - { - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry"); - - b.Property("IdUser") - .HasColumnType("integer") - .HasColumnName("id_user"); - - b.Property("Level") - .HasColumnType("integer") - .HasColumnName("level"); - - b.Property("Name") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("name"); - - b.Property("Patronymic") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("patronymic"); - - b.Property("Surname") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("surname"); - - b.HasKey("IdTelemetry", "IdUser"); - - b.ToTable("t_telemetry_user"); - - b - .HasComment("Пользователи панели САУБ. Для сообщений."); - }); - - modelBuilder.Entity("AsbCloudDb.Model.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("Email") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("email") - .HasComment("должность"); - - b.Property("IdCompany") - .HasColumnType("integer") - .HasColumnName("id_company"); - - b.Property("Login") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("login"); - - b.Property("Name") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("name") - .HasComment("имя"); - - b.Property("PasswordHash") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("password_hash") - .HasComment("соленый хэш пароля.\nпервые 5 символов - соль"); - - b.Property("Patronymic") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("patronymic") - .HasComment("отчество"); - - b.Property("Phone") - .HasMaxLength(50) - .HasColumnType("character varying(50)") - .HasColumnName("phone") - .HasComment("номер телефона"); - - b.Property("Position") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("position") - .HasComment("email"); - - b.Property("State") - .HasColumnType("smallint") - .HasColumnName("state") - .HasComment("состояние:\n100 - удален"); - - b.Property("Surname") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("surname") - .HasComment("фамилия"); - - b.HasKey("Id"); - - b.HasIndex("IdCompany"); - - b.HasIndex("Login") - .IsUnique(); - - b.ToTable("t_user"); - - b - .HasComment("Пользователи облака"); - - b.HasData( - new - { - Id = 1, - IdCompany = 1, - Login = "dev", - Name = "Разработчик", - PasswordHash = "Vlcj|4fa529103dde7ff72cfe76185f344d4aa87931f8e1b2044e8a7739947c3d18923464eaad93843e4f809c5e126d013072" - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.UserRole", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("Caption") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("caption") - .HasComment("Название"); - - b.Property("IdParent") - .HasColumnType("integer") - .HasColumnName("id_parent") - .HasComment("От какой роли унаследована данная роль"); - - b.Property("Permissions") - .HasColumnType("bigint") - .HasColumnName("permissions") - .HasComment("Десятичное число, хранящее список разрешений для роли (в двоичном виде)"); - - b.Property("RoleType") - .HasColumnType("integer") - .HasColumnName("role_type") - .HasComment("0-роль из стандартной матрицы, \n1-специальная роль для какого-либо пользователя"); - - b.HasKey("Id"); - - b.ToTable("t_user_role"); - - b - .HasComment("Роли пользователей в системе"); - - b.HasData( - new - { - Id = 1, - Caption = "Администратор", - IdParent = 0, - Permissions = 0L, - RoleType = 0 - }, - new - { - Id = 2, - Caption = "Пользователь", - IdParent = 0, - Permissions = 0L, - RoleType = 0 - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Well", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("Caption") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("caption"); - - b.Property("IdCluster") - .HasColumnType("integer") - .HasColumnName("id_cluster"); - - b.Property("IdState") - .HasColumnType("integer") - .HasColumnName("state") - .HasComment("0 - неизвестно, 1 - в работе, 2 - завершена"); - - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry"); - - b.Property("IdWellType") - .HasColumnType("integer") - .HasColumnName("id_well_type"); - - b.Property("Latitude") - .HasColumnType("double precision") - .HasColumnName("latitude"); - - b.Property("Longitude") - .HasColumnType("double precision") - .HasColumnName("longitude"); - - b.HasKey("Id"); - - b.HasIndex("IdCluster"); - - b.HasIndex("IdTelemetry") - .IsUnique(); - - b.HasIndex("IdWellType"); - - b.ToTable("t_well"); - - b - .HasComment("скважины"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WellComposite", b => - { - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("Id скважины получателя"); - - b.Property("IdWellSrc") - .HasColumnType("integer") - .HasColumnName("id_well_src") - .HasComment("Id скважины композита"); - - b.Property("IdWellSectionType") - .HasColumnType("integer") - .HasColumnName("id_well_section_type") - .HasComment("Id тип секции композита"); - - b.HasKey("IdWell", "IdWellSrc", "IdWellSectionType"); - - b.HasIndex("IdWellSectionType"); - - b.HasIndex("IdWellSrc"); - - b.ToTable("t_well_сomposite"); - - b - .HasComment("Композитная скважина"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WellOperation", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("CategoryInfo") - .HasColumnType("text") - .HasColumnName("category_info") - .HasComment("Доп. информация к выбраной категории"); - - b.Property("Comment") - .HasColumnType("text") - .HasColumnName("comment") - .HasComment("Комментарий"); - - b.Property("DateStart") - .HasColumnType("timestamp without time zone") - .HasColumnName("date_start") - .HasComment("Дата начала операции"); - - b.Property("DepthEnd") - .HasColumnType("double precision") - .HasColumnName("depth_end") - .HasComment("Глубина после завершения операции, м"); - - b.Property("DepthStart") - .HasColumnType("double precision") - .HasColumnName("depth_start") - .HasComment("Глубина на начало операции, м"); - - b.Property("DurationHours") - .HasColumnType("double precision") - .HasColumnName("duration_hours") - .HasComment("Продолжительность, часы"); - - b.Property("IdCategory") - .HasColumnType("integer") - .HasColumnName("id_category") - .HasComment("Id категории операции"); - - b.Property("IdType") - .HasColumnType("integer") - .HasColumnName("id_type") - .HasComment("0 = План или 1 = Факт"); - - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("Id скважины"); - - b.Property("IdWellSectionType") - .HasColumnType("integer") - .HasColumnName("id_well_section_type") - .HasComment("Id тип секции скважины"); - - b.HasKey("Id"); - - b.HasIndex("DateStart"); - - b.HasIndex("DepthEnd"); - - b.HasIndex("IdCategory"); - - b.HasIndex("IdWell"); - - b.HasIndex("IdWellSectionType"); - - b.ToTable("t_well_operation"); - - b - .HasComment("Данные по операциям на скважине"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WellOperationCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("Code") - .HasColumnType("integer") - .HasColumnName("code") - .HasComment("Код операции"); - - b.Property("Name") - .HasColumnType("text") - .HasColumnName("name") - .HasComment("Название категории операции"); - - b.HasKey("Id"); - - b.ToTable("t_well_operation_category"); - - b - .HasComment("Справочник операций на скважине"); - - b.HasData( - new - { - Id = 1, - Code = 0, - Name = "Невозможно определить операцию" - }, - new - { - Id = 2, - Code = 0, - Name = "Роторное бурение" - }, - new - { - Id = 3, - Code = 0, - Name = "Слайдирование" - }, - new - { - Id = 4, - Code = 0, - Name = "Подъем с проработкой" - }, - new - { - Id = 5, - Code = 0, - Name = "Спуск с проработкой" - }, - new - { - Id = 6, - Code = 0, - Name = "Подъем с промывкой" - }, - new - { - Id = 7, - Code = 0, - Name = "Спуск с промывкой" - }, - new - { - Id = 8, - Code = 0, - Name = "Спуск в скважину" - }, - new - { - Id = 9, - Code = 0, - Name = "Спуск с вращением" - }, - new - { - Id = 10, - Code = 0, - Name = "Подъем из скважины" - }, - new - { - Id = 11, - Code = 0, - Name = "Подъем с вращением" - }, - new - { - Id = 12, - Code = 0, - Name = "Промывка в покое" - }, - new - { - Id = 13, - Code = 0, - Name = "Промывка с вращением" - }, - new - { - Id = 14, - Code = 0, - Name = "Удержание в клиньях" - }, - new - { - Id = 15, - Code = 0, - Name = "Неподвижное состояние" - }, - new - { - Id = 16, - Code = 0, - Name = "Вращение без циркуляции" - }, - new - { - Id = 17, - Code = 0, - Name = "На поверхности" - }, - new - { - Id = 1001, - Code = 0, - Name = "Бурение" - }, - new - { - Id = 1002, - Code = 0, - Name = "ГИС" - }, - new - { - Id = 1003, - Code = 0, - Name = "ГФР" - }, - new - { - Id = 1004, - Code = 0, - Name = "Монтаж ПВО" - }, - new - { - Id = 1005, - Code = 0, - Name = "Демонтаж ПВО" - }, - new - { - Id = 1006, - Code = 0, - Name = "Установка ФА" - }, - new - { - Id = 1007, - Code = 0, - Name = "Оборудование устья" - }, - new - { - Id = 1008, - Code = 0, - Name = "ОЗЦ" - }, - new - { - Id = 1009, - Code = 0, - Name = "Оборудование устья" - }, - new - { - Id = 1010, - Code = 0, - Name = "ОЗЦ" - }, - new - { - Id = 1011, - Code = 0, - Name = "Начало цикла строительства скважины" - }, - new - { - Id = 1012, - Code = 0, - Name = "Окончание цикла строительства скважины" - }, - new - { - Id = 1013, - Code = 0, - Name = "Опрессовка ПВО" - }, - new - { - Id = 1014, - Code = 0, - Name = "Опресовка Ц.К." - }, - new - { - Id = 1015, - Code = 0, - Name = "Опрессовка ВЗД" - }, - new - { - Id = 1016, - Code = 0, - Name = "Перевод скв на другой тип промывочной жидкости" - }, - new - { - Id = 1017, - Code = 0, - Name = "Перезапись каротажа" - }, - new - { - Id = 1018, - Code = 0, - Name = "Перетяжка талевого каната" - }, - new - { - Id = 1019, - Code = 0, - Name = "Наращивание, промывка" - }, - new - { - Id = 1020, - Code = 0, - Name = "Подъем инструмента" - }, - new - { - Id = 1021, - Code = 0, - Name = "Подъем инструмента с промывкой" - }, - new - { - Id = 1022, - Code = 0, - Name = "Обратная проработка" - }, - new - { - Id = 1023, - Code = 0, - Name = "Сборка инструмента" - }, - new - { - Id = 1024, - Code = 0, - Name = "Подготовительные работы" - }, - new - { - Id = 1025, - Code = 0, - Name = "Сборка КНБК" - }, - new - { - Id = 1026, - Code = 0, - Name = "Разборка КНБК" - }, - new - { - Id = 1027, - Code = 0, - Name = "Промывка" - }, - new - { - Id = 1028, - Code = 0, - Name = "Промежуточная промывка" - }, - new - { - Id = 1029, - Code = 0, - Name = "Прокачка пачек" - }, - new - { - Id = 1030, - Code = 0, - Name = "Разбуривание тех.оснастки" - }, - new - { - Id = 1031, - Code = 0, - Name = "Ремонт" - }, - new - { - Id = 1032, - Code = 0, - Name = "Спуск инструмента" - }, - new - { - Id = 1033, - Code = 0, - Name = "Спуск инструмента с промывкой" - }, - new - { - Id = 1034, - Code = 0, - Name = "Прямая проработка" - }, - new - { - Id = 1035, - Code = 0, - Name = "Принудительная проработка" - }, - new - { - Id = 1036, - Code = 0, - Name = "Спуск обсадной колонны" - }, - new - { - Id = 1037, - Code = 0, - Name = "Тех СПО-подъем" - }, - new - { - Id = 1038, - Code = 0, - Name = "Тех СПО-спуск" - }, - new - { - Id = 1039, - Code = 0, - Name = "Техническое обслуживание" - }, - new - { - Id = 1040, - Code = 0, - Name = "Цементаж" - }, - new - { - Id = 1041, - Code = 0, - Name = "Шаблонировка ствола" - }, - new - { - Id = 1042, - Code = 0, - Name = "Геологическое осложнение" - }, - new - { - Id = 1043, - Code = 0, - Name = "НПВ" - }, - new - { - Id = 1044, - Code = 0, - Name = "ВМР" - }, - new - { - Id = 1045, - Code = 0, - Name = "Прочее" - }, - new - { - Id = 1046, - Code = 0, - Name = "Спуск КНБК" - }, - new - { - Id = 1047, - Code = 0, - Name = "Подъем КНБК" - }, - new - { - Id = 1048, - Code = 0, - Name = "Спуск ОК" - }, - new - { - Id = 1050, - Code = 0, - Name = "Промывка при спуске ОК" - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("Caption") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("caption") - .HasComment("Название"); - - b.HasKey("Id"); - - b.ToTable("t_well_section_type"); - - b - .HasComment("конструкция секции скважины"); - - b.HasData( - new - { - Id = 1, - Caption = "Пилотный ствол" - }, - new - { - Id = 2, - Caption = "Направление" - }, - new - { - Id = 3, - Caption = "Кондуктор" - }, - new - { - Id = 4, - Caption = "Эксплуатационная колонна" - }, - new - { - Id = 5, - Caption = "Транспортный ствол" - }, - new - { - Id = 6, - Caption = "Хвостовик" - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WellType", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("Caption") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("caption") - .HasComment("Название"); - - b.HasKey("Id"); - - b.ToTable("t_well_type"); - - b - .HasComment("конструкция скважины"); - - b.HasData( - new - { - Id = 1, - Caption = "Наклонно-направленная" - }, - new - { - Id = 2, - Caption = "Горизонтальная" - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => - { - b.HasOne("AsbCloudDb.Model.Deposit", "Deposit") - .WithMany("Clusters") - .HasForeignKey("IdDeposit") - .HasConstraintName("t_cluster_t_deposit_id_fk"); - - b.Navigation("Deposit"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Company", b => - { - b.HasOne("AsbCloudDb.Model.CompanyType", "CompanyType") - .WithMany("Companies") - .HasForeignKey("IdCompanyType") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CompanyType"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.DrillFlowChart", b => - { - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany() - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Well"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.DrillParams", b => - { - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany() - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") - .WithMany("DrillParamsCollection") - .HasForeignKey("IdWellSectionType") - .HasConstraintName("t_drill_params_t_well_section_type_id_fk") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Well"); - - b.Navigation("WellSectionType"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.FileInfo", b => - { - b.HasOne("AsbCloudDb.Model.User", "Author") - .WithMany("Files") - .HasForeignKey("IdAuthor"); - - b.HasOne("AsbCloudDb.Model.FileCategory", "FileCategory") - .WithMany() - .HasForeignKey("IdCategory") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany() - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Author"); - - b.Navigation("FileCategory"); - - b.Navigation("Well"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.FileMark", b => - { - b.HasOne("AsbCloudDb.Model.FileInfo", "FileInfo") - .WithMany("FileMarks") - .HasForeignKey("IdFile") - .HasConstraintName("t_file_mark_t_file_info_fk") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.User", "User") - .WithMany("FileMarks") - .HasForeignKey("IdUser") - .HasConstraintName("t_user_t_file_mark_fk") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("FileInfo"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Measure", b => - { - b.HasOne("AsbCloudDb.Model.MeasureCategory", "Category") - .WithMany("Measures") - .HasForeignKey("IdCategory") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany() - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Category"); - - b.Navigation("Well"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.RelationCompanyWell", b => - { - b.HasOne("AsbCloudDb.Model.Company", "Company") - .WithMany("RelationCompaniesWells") - .HasForeignKey("IdCompany") - .HasConstraintName("t_relation_company_well_t_company_id_fk") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany("RelationCompaniesWells") - .HasForeignKey("IdWell") - .HasConstraintName("t_relation_company_well_t_well_id_fk") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Company"); - - b.Navigation("Well"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.RelationUserUserRole", b => - { - b.HasOne("AsbCloudDb.Model.User", "User") - .WithMany("RelationUsersUserRoles") - .HasForeignKey("IdUser") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.UserRole", "UserRole") - .WithMany("RelationUsersUserRoles") - .HasForeignKey("IdUserRole") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - - b.Navigation("UserRole"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.ReportProperty", b => - { - b.HasOne("AsbCloudDb.Model.FileInfo", "File") - .WithMany() - .HasForeignKey("IdFile") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany() - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("File"); - - b.Navigation("Well"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.TelemetryAnalysis", b => - { - b.HasOne("AsbCloudDb.Model.WellOperationCategory", "Operation") - .WithMany("Analysis") - .HasForeignKey("IdOperation") - .HasConstraintName("t_analysis_t_operation_id_fk") - .OnDelete(DeleteBehavior.SetNull) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany("Analysis") - .HasForeignKey("IdTelemetry") - .HasConstraintName("t_analysis_t_telemetry_id_fk") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Operation"); - - b.Navigation("Telemetry"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaub", b => - { - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany("DataSaub") - .HasForeignKey("IdTelemetry") - .HasConstraintName("t_telemetry_data_saub_t_telemetry_id_fk") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Telemetry"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSpin", b => - { - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany("DataSpin") - .HasForeignKey("IdTelemetry") - .HasConstraintName("t_telemetry_data_spin_t_telemetry_id_fk") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Telemetry"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.TelemetryEvent", b => - { - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany("Events") - .HasForeignKey("IdTelemetry") - .HasConstraintName("t_event_t_telemetry_id_fk") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Telemetry"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.TelemetryMessage", b => - { - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany("Messages") - .HasForeignKey("IdTelemetry") - .HasConstraintName("t_messages_t_telemetry_id_fk") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Telemetry"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.TelemetryUser", b => - { - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany("Users") - .HasForeignKey("IdTelemetry") - .HasConstraintName("t_telemetry_user_t_telemetry_id_fk") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Telemetry"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.User", b => - { - b.HasOne("AsbCloudDb.Model.Company", "Company") - .WithMany("Users") - .HasForeignKey("IdCompany") - .HasConstraintName("t_user_t_company_id_fk") - .OnDelete(DeleteBehavior.SetNull); - - b.Navigation("Company"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Well", b => - { - b.HasOne("AsbCloudDb.Model.Cluster", "Cluster") - .WithMany("Wells") - .HasForeignKey("IdCluster") - .HasConstraintName("t_well_t_cluster_id_fk"); - - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithOne("Well") - .HasForeignKey("AsbCloudDb.Model.Well", "IdTelemetry") - .HasConstraintName("t_well_t_telemetry_id_fk") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("AsbCloudDb.Model.WellType", "WellType") - .WithMany("Wells") - .HasForeignKey("IdWellType"); - - b.Navigation("Cluster"); - - b.Navigation("Telemetry"); - - b.Navigation("WellType"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WellComposite", b => - { - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany("WellComposites") - .HasForeignKey("IdWell") - .HasConstraintName("t_well_сomposite_t_well_id_fk") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") - .WithMany("WellComposites") - .HasForeignKey("IdWellSectionType") - .HasConstraintName("t_well_сomposite_t_well_section_type_id_fk") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.Well", "WellSrc") - .WithMany("WellCompositeSrcs") - .HasForeignKey("IdWellSrc") - .HasConstraintName("t_well_сomposite_src_t_well_id_fk") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Well"); - - b.Navigation("WellSectionType"); - - b.Navigation("WellSrc"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WellOperation", b => - { - b.HasOne("AsbCloudDb.Model.WellOperationCategory", "OperationCategory") - .WithMany() - .HasForeignKey("IdCategory") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany("WellOperations") - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") - .WithMany("WellOperations") - .HasForeignKey("IdWellSectionType") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("OperationCategory"); - - b.Navigation("Well"); - - b.Navigation("WellSectionType"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => - { - b.Navigation("Wells"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Company", b => - { - b.Navigation("RelationCompaniesWells"); - - b.Navigation("Users"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.CompanyType", b => - { - b.Navigation("Companies"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Deposit", b => - { - b.Navigation("Clusters"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.FileInfo", b => - { - b.Navigation("FileMarks"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.MeasureCategory", b => - { - b.Navigation("Measures"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b => - { - b.Navigation("Analysis"); - - b.Navigation("DataSaub"); - - b.Navigation("DataSpin"); - - b.Navigation("Events"); - - b.Navigation("Messages"); - - b.Navigation("Users"); - - b.Navigation("Well"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.User", b => - { - b.Navigation("FileMarks"); - - b.Navigation("Files"); - - b.Navigation("RelationUsersUserRoles"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.UserRole", b => - { - b.Navigation("RelationUsersUserRoles"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Well", b => - { - b.Navigation("RelationCompaniesWells"); - - b.Navigation("WellComposites"); - - b.Navigation("WellCompositeSrcs"); - - b.Navigation("WellOperations"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WellOperationCategory", b => - { - b.Navigation("Analysis"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b => - { - b.Navigation("DrillParamsCollection"); - - b.Navigation("WellComposites"); - - b.Navigation("WellOperations"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WellType", b => - { - b.Navigation("Wells"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/AsbCloudDb/Migrations/20211126101932_Changed_Permissions_To_Bit_Collection.cs b/AsbCloudDb/Migrations/20211126101932_Changed_Permissions_To_Bit_Collection.cs deleted file mode 100644 index 2a41e547..00000000 --- a/AsbCloudDb/Migrations/20211126101932_Changed_Permissions_To_Bit_Collection.cs +++ /dev/null @@ -1,133 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -namespace AsbCloudDb.Migrations -{ - public partial class Changed_Permissions_To_Bit_Collection : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "t_relation_user_role_permission"); - - migrationBuilder.DropColumn( - name: "caption", - table: "t_permission"); - - migrationBuilder.DropColumn( - name: "type", - table: "t_permission"); - - migrationBuilder.AlterTable( - name: "t_permission", - comment: "Описание битов разрешений для ролей пользователей", - oldComment: "Разрешения на доступ к данным"); - - migrationBuilder.AddColumn( - name: "permissions", - table: "t_user_role", - type: "bigint", - nullable: false, - defaultValue: 0L, - comment: "Десятичное число, хранящее список разрешений для роли (в двоичном виде)"); - - migrationBuilder.AddColumn( - name: "description", - table: "t_permission", - type: "character varying(255)", - maxLength: 255, - nullable: true, - comment: "Описание разрешений"); - - migrationBuilder.AddColumn( - name: "index", - table: "t_permission", - type: "text", - nullable: true, - comment: "Порядковый номер бита. \n В нем 0-запрещено, 1-разрешено."); - - migrationBuilder.InsertData( - table: "t_relation_user_user_role", - columns: new[] { "id", "id_user", "id_user_role" }, - values: new object[] { 1, 1, 2 }); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DeleteData( - table: "t_relation_user_user_role", - keyColumn: "id", - keyValue: 1); - - migrationBuilder.DropColumn( - name: "permissions", - table: "t_user_role"); - - migrationBuilder.DropColumn( - name: "description", - table: "t_permission"); - - migrationBuilder.DropColumn( - name: "index", - table: "t_permission"); - - migrationBuilder.AlterTable( - name: "t_permission", - comment: "Разрешения на доступ к данным", - oldComment: "Описание битов разрешений для ролей пользователей"); - - migrationBuilder.AddColumn( - name: "caption", - table: "t_permission", - type: "character varying(255)", - maxLength: 255, - nullable: true, - comment: "Название"); - - migrationBuilder.AddColumn( - name: "type", - table: "t_permission", - type: "integer", - nullable: false, - defaultValue: 0, - comment: "1-чтение, 2-запись, 3-чтение и запись"); - - migrationBuilder.CreateTable( - name: "t_relation_user_role_permission", - columns: table => new - { - id = table.Column(type: "integer", nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - id_permission = table.Column(type: "integer", nullable: false), - id_user_role = table.Column(type: "integer", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_t_relation_user_role_permission", x => x.id); - table.ForeignKey( - name: "FK_t_relation_user_role_permission_t_permission_id_permission", - column: x => x.id_permission, - principalTable: "t_permission", - principalColumn: "id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_t_relation_user_role_permission_t_user_role_id_user_role", - column: x => x.id_user_role, - principalTable: "t_user_role", - principalColumn: "id", - onDelete: ReferentialAction.Cascade); - }, - comment: "Отношение ролей пользователей и разрешений доступа"); - - migrationBuilder.CreateIndex( - name: "IX_t_relation_user_role_permission_id_permission", - table: "t_relation_user_role_permission", - column: "id_permission"); - - migrationBuilder.CreateIndex( - name: "IX_t_relation_user_role_permission_id_user_role", - table: "t_relation_user_role_permission", - column: "id_user_role"); - } - } -} diff --git a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs index 5a93c563..6904c2df 100644 --- a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs +++ b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs @@ -689,23 +689,23 @@ namespace AsbCloudDb.Migrations .HasColumnName("id") .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - b.Property("Description") + b.Property("Caption") .HasMaxLength(255) .HasColumnType("character varying(255)") - .HasColumnName("description") - .HasComment("Описание разрешений"); + .HasColumnName("caption") + .HasComment("Название"); - b.Property("Index") - .HasColumnType("text") - .HasColumnName("index") - .HasComment("Порядковый номер бита. \n В нем 0-запрещено, 1-разрешено."); + b.Property("Type") + .HasColumnType("integer") + .HasColumnName("type") + .HasComment("1-чтение, 2-запись, 3-чтение и запись"); b.HasKey("Id"); b.ToTable("t_permission"); b - .HasComment("Описание битов разрешений для ролей пользователей"); + .HasComment("Разрешения на доступ к данным"); }); modelBuilder.Entity("AsbCloudDb.Model.RelationCompanyWell", b => @@ -728,6 +728,34 @@ namespace AsbCloudDb.Migrations .HasComment("отношение скважин и компаний"); }); + modelBuilder.Entity("AsbCloudDb.Model.RelationUserRolePermission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("IdPermission") + .HasColumnType("integer") + .HasColumnName("id_permission"); + + b.Property("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.HasKey("Id"); + + b.HasIndex("IdPermission"); + + b.HasIndex("IdUserRole"); + + b.ToTable("t_relation_user_role_permission"); + + b + .HasComment("Отношение ролей пользователей и разрешений доступа"); + }); + modelBuilder.Entity("AsbCloudDb.Model.RelationUserUserRole", b => { b.Property("Id") @@ -754,14 +782,6 @@ namespace AsbCloudDb.Migrations b .HasComment("Отношение пользователей и ролей"); - - b.HasData( - new - { - Id = 1, - IdUser = 1, - IdUserRole = 2 - }); }); modelBuilder.Entity("AsbCloudDb.Model.ReportProperty", b => @@ -1700,11 +1720,6 @@ namespace AsbCloudDb.Migrations .HasColumnName("id_parent") .HasComment("От какой роли унаследована данная роль"); - b.Property("Permissions") - .HasColumnType("bigint") - .HasColumnName("permissions") - .HasComment("Десятичное число, хранящее список разрешений для роли (в двоичном виде)"); - b.Property("RoleType") .HasColumnType("integer") .HasColumnName("role_type") @@ -1723,7 +1738,6 @@ namespace AsbCloudDb.Migrations Id = 1, Caption = "Администратор", IdParent = 0, - Permissions = 0L, RoleType = 0 }, new @@ -1731,7 +1745,6 @@ namespace AsbCloudDb.Migrations Id = 2, Caption = "Пользователь", IdParent = 0, - Permissions = 0L, RoleType = 0 }); }); @@ -2544,6 +2557,25 @@ namespace AsbCloudDb.Migrations b.Navigation("Well"); }); + modelBuilder.Entity("AsbCloudDb.Model.RelationUserRolePermission", b => + { + b.HasOne("AsbCloudDb.Model.Permission", "Permission") + .WithMany("RelationUserRolesPermissions") + .HasForeignKey("IdPermission") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.UserRole", "UserRole") + .WithMany("RelationUserRolesPermissions") + .HasForeignKey("IdUserRole") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Permission"); + + b.Navigation("UserRole"); + }); + modelBuilder.Entity("AsbCloudDb.Model.RelationUserUserRole", b => { b.HasOne("AsbCloudDb.Model.User", "User") @@ -2787,6 +2819,11 @@ namespace AsbCloudDb.Migrations b.Navigation("Measures"); }); + modelBuilder.Entity("AsbCloudDb.Model.Permission", b => + { + b.Navigation("RelationUserRolesPermissions"); + }); + modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b => { b.Navigation("Analysis"); @@ -2815,6 +2852,8 @@ namespace AsbCloudDb.Migrations modelBuilder.Entity("AsbCloudDb.Model.UserRole", b => { + b.Navigation("RelationUserRolesPermissions"); + b.Navigation("RelationUsersUserRoles"); }); diff --git a/AsbCloudDb/Model/AsbCloudDbContext.cs b/AsbCloudDb/Model/AsbCloudDbContext.cs index 3cc61e98..5f4c899b 100644 --- a/AsbCloudDb/Model/AsbCloudDbContext.cs +++ b/AsbCloudDb/Model/AsbCloudDbContext.cs @@ -39,6 +39,7 @@ namespace AsbCloudDb.Model public virtual DbSet DrillParams { get; set; } public virtual DbSet DrillFlowChart { get; set; } public virtual DbSet RelationUserUserRoles { get; set; } + public virtual DbSet RelationUserRolesPermissions { get; set; } public virtual DbSet Permissions { get; set; } //var options = new DbContextOptionsBuilder() @@ -272,13 +273,6 @@ namespace AsbCloudDb.Model }, }); }); - - modelBuilder.Entity(entity => - { - entity.HasData(new List{ - new RelationUserUserRole{ Id = 1, IdUser = 1, IdUserRole = 2 } - }); - }); modelBuilder.Entity(entity => { diff --git a/AsbCloudDb/Model/IAsbCloudDbContext.cs b/AsbCloudDb/Model/IAsbCloudDbContext.cs index 08797b2c..2ef37cce 100644 --- a/AsbCloudDb/Model/IAsbCloudDbContext.cs +++ b/AsbCloudDb/Model/IAsbCloudDbContext.cs @@ -37,6 +37,7 @@ namespace AsbCloudDb.Model DbSet DrillParams { get; set; } DbSet DrillFlowChart { get; set; } DbSet RelationUserUserRoles { get; set; } + DbSet RelationUserRolesPermissions { get; set; } DbSet Permissions { get; set; } DatabaseFacade Database { get; } diff --git a/AsbCloudDb/Model/Permission.cs b/AsbCloudDb/Model/Permission.cs index f3451889..23a87cc2 100644 --- a/AsbCloudDb/Model/Permission.cs +++ b/AsbCloudDb/Model/Permission.cs @@ -1,22 +1,25 @@ +using Microsoft.EntityFrameworkCore; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; -using Microsoft.EntityFrameworkCore; - namespace AsbCloudDb.Model { - [Table("t_permission"), Comment("Описание битов разрешений для ролей пользователей")] + [Table("t_permission"), Comment("Разрешения на доступ к данным")] public class Permission { [Key] [Column("id")] public int Id { get; set; } - [Column("index"), Comment("Порядковый номер бита. \n В нем 0-запрещено, 1-разрешено.")] - public string Index { get; set; } - - [Column("description"), Comment("Описание разрешений")] + [Column("caption"), Comment("Название")] [StringLength(255)] - public string Description { get; set; } + public string Caption { get; set; } + + [Column("type"), Comment("1-чтение, 2-запись, 3-чтение и запись")] + public int Type { get; set; } + + [InverseProperty(nameof(RelationUserRolePermission.Permission))] + public virtual ICollection RelationUserRolesPermissions { get; set; } } } \ No newline at end of file diff --git a/AsbCloudDb/Model/RelationUserRolePermission.cs b/AsbCloudDb/Model/RelationUserRolePermission.cs new file mode 100644 index 00000000..2f474640 --- /dev/null +++ b/AsbCloudDb/Model/RelationUserRolePermission.cs @@ -0,0 +1,28 @@ +using Microsoft.EntityFrameworkCore; +using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations; + +namespace AsbCloudDb.Model +{ + [Table("t_relation_user_role_permission"), Comment("Отношение ролей пользователей и разрешений доступа")] + public class RelationUserRolePermission + { + [Key] + [Column("id")] + public int Id { get; set; } + + [Column("id_user_role")] + public int IdUserRole { get; set; } + + [Column("id_permission")] + public int IdPermission { get; set; } + + [ForeignKey(nameof(IdUserRole))] + [InverseProperty(nameof(Model.UserRole.RelationUserRolesPermissions))] + public virtual UserRole UserRole { get; set; } + + [ForeignKey(nameof(IdPermission))] + [InverseProperty(nameof(Model.Permission.RelationUserRolesPermissions))] + public virtual Permission Permission { get; set; } + } +} \ No newline at end of file diff --git a/AsbCloudDb/Model/UserRole.cs b/AsbCloudDb/Model/UserRole.cs index 7789f558..24c460cc 100644 --- a/AsbCloudDb/Model/UserRole.cs +++ b/AsbCloudDb/Model/UserRole.cs @@ -1,8 +1,7 @@ -using System.Text.Json.Serialization; +using Microsoft.EntityFrameworkCore; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; -using Microsoft.EntityFrameworkCore; namespace AsbCloudDb.Model @@ -24,12 +23,11 @@ namespace AsbCloudDb.Model [Column("id_parent"), Comment("От какой роли унаследована данная роль")] public int IdParent { get; set; } - [Column("permissions"), Comment("Десятичное число, хранящее список разрешений для роли (в двоичном виде)")] - public long Permissions { get; set; } - - - [JsonIgnore] + [InverseProperty(nameof(RelationUserUserRole.UserRole))] public virtual ICollection RelationUsersUserRoles { get; set; } + + [InverseProperty(nameof(RelationUserRolePermission.UserRole))] + public virtual ICollection RelationUserRolesPermissions { get; set; } } } diff --git a/AsbCloudInfrastructure/Services/AuthService.cs b/AsbCloudInfrastructure/Services/AuthService.cs index e82a51ab..c40bd1b0 100644 --- a/AsbCloudInfrastructure/Services/AuthService.cs +++ b/AsbCloudInfrastructure/Services/AuthService.cs @@ -21,6 +21,8 @@ namespace AsbCloudInfrastructure.Services private readonly IAsbCloudDbContext db; private readonly CacheTable cacheUserRoles; private readonly CacheTable cacheUsersUserRoles; + private readonly CacheTable cachePermissions; + private readonly CacheTable cacheUserRolesPermissions; public const string issuer = "a"; public const string audience = "a"; @@ -40,6 +42,8 @@ namespace AsbCloudInfrastructure.Services this.db = db; cacheUserRoles = cacheDb.GetCachedTable((AsbCloudDbContext)db); cacheUsersUserRoles = cacheDb.GetCachedTable((AsbCloudDbContext)db); + cachePermissions = cacheDb.GetCachedTable((AsbCloudDbContext)db); + cacheUserRolesPermissions = cacheDb.GetCachedTable((AsbCloudDbContext)db); hashAlgoritm = SHA384.Create(); rnd = new Random((int)(DateTime.Now.Ticks % 2147480161)); } @@ -53,8 +57,10 @@ namespace AsbCloudInfrastructure.Services if (identity == default || user.State == 0) return null; - var userRoles = GetUserRoles(user.Id); + var idCaptionRoles = GetUserRolesIdsNames(user.Id); + var userPermissions = GetUserPermissions(idCaptionRoles.Select(r => r.Id)); + return new UserTokenDto { Id = user.Id, @@ -62,7 +68,8 @@ namespace AsbCloudInfrastructure.Services CompanyName = user.Company.Caption, Login = user.Login, Patronymic = user.Patronymic, - Roles = userRoles, + RoleNames = idCaptionRoles.Select(r => r.Caption), + Permissions = userPermissions, Surname = user.Surname, Token = MakeToken(identity.Claims), }; @@ -170,14 +177,22 @@ namespace AsbCloudInfrastructure.Services return new JwtSecurityTokenHandler().WriteToken(jwt); } - private IDictionary GetUserRoles(int idUser) + private IEnumerable<(int Id, string Caption)> GetUserRolesIdsNames(int idUser) { var userRolesIds = cacheUsersUserRoles.Where(r => r.IdUser == idUser).Select(r => r.IdUserRole); return cacheUserRoles.Where(r => userRolesIds.Contains(r.Id)) - .Select(r => (r.Caption, r.Permissions)) - .ToDictionary(k => k.Caption, v => v.Permissions); + .Select(r => (r.Id, r.Caption)); + } + + private IDictionary GetUserPermissions(IEnumerable idRoles) + { + var userPermissionIds = cacheUserRolesPermissions.Where(p => + idRoles.Contains(p.IdUserRole)).Select(r => r.IdPermission); + + return cachePermissions.Where(r => userPermissionIds.Contains(r.Id)) + .ToDictionary(k => k.Caption, v => v.Type); } private async Task<(ClaimsIdentity Identity, User User)> GetClaimsUserAsync(string login, @@ -195,8 +210,8 @@ namespace AsbCloudInfrastructure.Services if (!CheckPassword(user.PasswordHash, password)) return default; - var userRolesNames = GetUserRoles(user.Id) - .Select(r => r.Key); + var userRolesNames = GetUserRolesIdsNames(user.Id) + .Select(r => r.Caption); var claims = new List { @@ -205,11 +220,9 @@ namespace AsbCloudInfrastructure.Services new Claim(claimNameidCompany, user.IdCompany.ToString()), }; - claims.AddRange(userRolesNames.Select(roleName => - new Claim(ClaimsIdentity.DefaultRoleClaimType, roleName))); + claims.AddRange(userRolesNames.Select(roleName => new Claim(ClaimsIdentity.DefaultRoleClaimType, roleName))); - var claimsIdentity = new ClaimsIdentity(claims, "Token", - ClaimsIdentity.DefaultNameClaimType, ClaimsIdentity.DefaultRoleClaimType); + var claimsIdentity = new ClaimsIdentity(claims, "Token", ClaimsIdentity.DefaultNameClaimType, ClaimsIdentity.DefaultRoleClaimType); return (claimsIdentity, user); } diff --git a/AsbCloudInfrastructure/Services/UserRoleService.cs b/AsbCloudInfrastructure/Services/UserRoleService.cs index a43a6dd9..f34d7a95 100644 --- a/AsbCloudInfrastructure/Services/UserRoleService.cs +++ b/AsbCloudInfrastructure/Services/UserRoleService.cs @@ -1,6 +1,6 @@ -using System; -using System.Collections; +using System.Collections.Generic; using System.Diagnostics; +using System.Linq; using System.Threading; using System.Threading.Tasks; using AsbCloudApp.Data; @@ -13,11 +13,16 @@ namespace AsbCloudInfrastructure.Services public class UserRoleService : CrudServiceBase { private readonly CacheTable cacheUserRoles; + private readonly CacheTable cachePermissions; + private readonly CacheTable cacheUserRolesPermissions; private int counter = 0; public UserRoleService(IAsbCloudDbContext context, CacheDb cacheDb) : base(context) { cacheUserRoles = cacheDb.GetCachedTable((AsbCloudDbContext)context); + cachePermissions = cacheDb.GetCachedTable((AsbCloudDbContext)context); + cacheUserRolesPermissions = + cacheDb.GetCachedTable((AsbCloudDbContext)context); } public override async Task> GetPageAsync(int skip = 0, @@ -25,51 +30,97 @@ namespace AsbCloudInfrastructure.Services { var rolesDtos = await base.GetPageAsync(skip, take,token); + rolesDtos.Items = rolesDtos.Items.Select(FillUserRoleWithPermissions).ToList(); + return rolesDtos; } + public override async Task GetAsync(int id, CancellationToken token = default) + { + var roleDto = await base.GetAsync(id,token); + + return roleDto is null + ? null + : FillUserRoleWithPermissions(roleDto); + } + public override async Task InsertAsync(UserRoleDto dto, CancellationToken token = default) { - dto.Permissions = GetAncestorsPermissions(dto, ref counter); + dto.PermissionIds = GetAncestorsPermissionIds(dto, ref counter); - return await base.InsertAsync(dto, token); + var newRoleId = await base.InsertAsync(dto, token); + + if (dto.PermissionIds == default) + return newRoleId; + + foreach (var pId in dto.PermissionIds) + { + var relation = new RelationUserRolePermission() + { + IdUserRole = newRoleId, + IdPermission = pId + }; + + context.RelationUserRolesPermissions.Add(relation); + } + + return await context.SaveChangesAsync(token); } - private long GetAncestorsPermissions(UserRoleDto currentRoleDto, ref int counter) + public override async Task UpdateAsync(int id, UserRoleDto item, CancellationToken token = default) { - if (currentRoleDto.IdParent == default) - return currentRoleDto.Permissions; + var result = await base.UpdateAsync(id, item, token); + + if (item.PermissionIds == default) + return result; + + await cacheUserRolesPermissions.RemoveAsync(r => r.IdUserRole == item.Id, token) + .ConfigureAwait(false); + + var newRelations = item.PermissionIds.Select(p => new RelationUserRolePermission() + { + IdUserRole = item.Id, + IdPermission = p + }); + await cacheUserRolesPermissions.InsertAsync(newRelations, token); + + return result; + } + + private UserRoleDto FillUserRoleWithPermissions(UserRoleDto roleDto) + { + var rolePermissionIds = cacheUserRolesPermissions.Where(c => + c.IdUserRole == roleDto.Id).Select(p => p.IdPermission); + roleDto.Permissions = cachePermissions.Where(permission => rolePermissionIds.Contains(permission.Id)) + .Adapt(); + + return roleDto; + } + + private IEnumerable GetAncestorsPermissionIds(UserRoleDto userRoleDto, ref int counter) + { + var idParent = userRoleDto.IdParent; + var resultPermissionsIds = userRoleDto.PermissionIds ?? new List(); + + if (idParent == default) + return resultPermissionsIds; if (counter > 10) { - Trace.WriteLine($"User role with id: {currentRoleDto.Id} has more than 10 parents"); - return currentRoleDto.Permissions; + Trace.WriteLine($"User role with id: {userRoleDto.Id} has more than 10 nested parents"); + return resultPermissionsIds; } - var parentRole = cacheUserRoles.FirstOrDefault(r => r.Id == currentRoleDto.IdParent) + var parentRole = cacheUserRoles.FirstOrDefault(r => r.Id == idParent) .Adapt(); - - parentRole.Permissions = MakeBitwiseOr(currentRoleDto.Permissions, parentRole.Permissions); + var parentRolePermissionsIds = cacheUserRolesPermissions.Where(p => + p.IdUserRole == parentRole.Id).Select(perm => perm.IdPermission); + parentRole.PermissionIds = resultPermissionsIds.Union(parentRolePermissionsIds); counter++; - return GetAncestorsPermissions(parentRole, ref counter); - } - - private static long MakeBitwiseOr(long currentNum, long parentNum) - { - var parentBytes = BitConverter.GetBytes(parentNum); - var parentBits = new BitArray(parentBytes); - - var currentBytes = BitConverter.GetBytes(currentNum); - var currentBits = new BitArray(currentBytes); - - var resultBits = currentBits.Or(parentBits); - var resultBytes = new byte[8]; - resultBits.CopyTo(resultBytes, 0); - - return BitConverter.ToInt64(resultBytes); + return GetAncestorsPermissionIds(parentRole, ref counter); } } } \ No newline at end of file