From 872598dcdddcafc6ff1440848e8ee18e0735736b Mon Sep 17 00:00:00 2001 From: KharchenkoVladimir Date: Wed, 24 Nov 2021 11:30:29 +0500 Subject: [PATCH 01/17] CS2-123: Added models for user roles and permissions. Fixed auth UserToken. --- AsbCloudApp/Data/UserBaseDto.cs | 2 - AsbCloudApp/Data/UserDto.cs | 2 - AsbCloudApp/Data/UserTokenDto.cs | 7 +- ...0153_Add_UserRoles_Permissions.Designer.cs | 2894 +++++++++++++++++ ...0211123130153_Add_UserRoles_Permissions.cs | 184 ++ .../AsbCloudDbContextModelSnapshot.cs | 168 +- AsbCloudDb/Model/AsbCloudDbContext.cs | 8 +- AsbCloudDb/Model/IAsbCloudDbContext.cs | 3 + AsbCloudDb/Model/Permission.cs | 25 + .../Model/RelationUserRolePermission.cs | 28 + AsbCloudDb/Model/RelationUserUserRole.cs | 28 + AsbCloudDb/Model/User.cs | 16 +- AsbCloudDb/Model/UserRole.cs | 19 +- .../Services/AuthService.cs | 55 +- 14 files changed, 3383 insertions(+), 56 deletions(-) create mode 100644 AsbCloudDb/Migrations/20211123130153_Add_UserRoles_Permissions.Designer.cs create mode 100644 AsbCloudDb/Migrations/20211123130153_Add_UserRoles_Permissions.cs create mode 100644 AsbCloudDb/Model/Permission.cs create mode 100644 AsbCloudDb/Model/RelationUserRolePermission.cs create mode 100644 AsbCloudDb/Model/RelationUserUserRole.cs diff --git a/AsbCloudApp/Data/UserBaseDto.cs b/AsbCloudApp/Data/UserBaseDto.cs index b79cc5d4..fa870fb1 100644 --- a/AsbCloudApp/Data/UserBaseDto.cs +++ b/AsbCloudApp/Data/UserBaseDto.cs @@ -4,8 +4,6 @@ { public string Login { get; set; } - public int? Level { get; set; } - public string Name { get; set; } public string Surname { get; set; } diff --git a/AsbCloudApp/Data/UserDto.cs b/AsbCloudApp/Data/UserDto.cs index 00d5fd55..07bbb3dd 100644 --- a/AsbCloudApp/Data/UserDto.cs +++ b/AsbCloudApp/Data/UserDto.cs @@ -6,8 +6,6 @@ public int? IdCompany { get; set; } - public int? IdRole { get; set; } - public string Password { get; set; } public CompanyDto Company { get; set; } diff --git a/AsbCloudApp/Data/UserTokenDto.cs b/AsbCloudApp/Data/UserTokenDto.cs index 229e99fa..36a90374 100644 --- a/AsbCloudApp/Data/UserTokenDto.cs +++ b/AsbCloudApp/Data/UserTokenDto.cs @@ -1,10 +1,13 @@ -namespace AsbCloudApp.Data +using System.Collections.Generic; + +namespace AsbCloudApp.Data { public class UserTokenDto : UserBaseDto { public int Id { get; set; } public string CompanyName { get; set; } - public string RoleName { get; set; } + public IDictionary Permissions { get; set; } + public IEnumerable RoleNames { get; set; } public string Token { get; set; } } } diff --git a/AsbCloudDb/Migrations/20211123130153_Add_UserRoles_Permissions.Designer.cs b/AsbCloudDb/Migrations/20211123130153_Add_UserRoles_Permissions.Designer.cs new file mode 100644 index 00000000..b15370e0 --- /dev/null +++ b/AsbCloudDb/Migrations/20211123130153_Add_UserRoles_Permissions.Designer.cs @@ -0,0 +1,2894 @@ +// +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("20211123130153_Add_UserRoles_Permissions")] + partial class Add_UserRoles_Permissions + { + 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("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.Property("Type") + .HasColumnType("integer") + .HasColumnName("type") + .HasComment("1-чтение, 2-запись, 3-чтение и запись"); + + 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.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") + .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("Отношение пользователей и ролей"); + }); + + 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("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, + RoleType = 0 + }, + new + { + Id = 2, + Caption = "Пользователь", + IdParent = 0, + 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.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") + .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.Permission", b => + { + b.Navigation("RelationUserRolesPermissions"); + }); + + 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("RelationUserRolesPermissions"); + + 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/20211123130153_Add_UserRoles_Permissions.cs b/AsbCloudDb/Migrations/20211123130153_Add_UserRoles_Permissions.cs new file mode 100644 index 00000000..df65c7c0 --- /dev/null +++ b/AsbCloudDb/Migrations/20211123130153_Add_UserRoles_Permissions.cs @@ -0,0 +1,184 @@ +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +namespace AsbCloudDb.Migrations +{ + public partial class Add_UserRoles_Permissions : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_t_user_t_user_role_id_role", + table: "t_user"); + + migrationBuilder.DropIndex( + name: "IX_t_user_id_role", + table: "t_user"); + + migrationBuilder.DropColumn( + name: "id_role", + table: "t_user"); + + migrationBuilder.DropColumn( + name: "level", + table: "t_user"); + + migrationBuilder.AddColumn( + name: "id_parent", + table: "t_user_role", + type: "integer", + nullable: false, + defaultValue: 0, + comment: "От какой роли унаследована данная роль"); + + migrationBuilder.AddColumn( + name: "role_type", + table: "t_user_role", + type: "integer", + nullable: false, + defaultValue: 0, + comment: "0-роль из стандартной матрицы, \n1-специальная роль для какого-либо пользователя"); + + migrationBuilder.CreateTable( + name: "t_permission", + columns: table => new + { + id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + caption = table.Column(type: "character varying(255)", maxLength: 255, nullable: true, comment: "Название"), + type = table.Column(type: "integer", nullable: false, comment: "1-чтение, 2-запись, 3-чтение и запись") + }, + constraints: table => + { + table.PrimaryKey("PK_t_permission", x => x.id); + }, + comment: "Разрешения на доступ к данным"); + + migrationBuilder.CreateTable( + name: "t_relation_user_user_role", + columns: table => new + { + id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + id_user = table.Column(type: "integer", nullable: false), + id_user_role = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_t_relation_user_user_role", x => x.id); + table.ForeignKey( + name: "FK_t_relation_user_user_role_t_user_id_user", + column: x => x.id_user, + principalTable: "t_user", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_t_relation_user_user_role_t_user_role_id_user_role", + column: x => x.id_user_role, + principalTable: "t_user_role", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + }, + comment: "Отношение пользователей и ролей"); + + migrationBuilder.CreateTable( + name: "t_relation_user_role_permission", + columns: table => new + { + id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + id_user_role = table.Column(type: "integer", nullable: false), + id_permission = 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"); + + migrationBuilder.CreateIndex( + name: "IX_t_relation_user_user_role_id_user", + table: "t_relation_user_user_role", + column: "id_user"); + + migrationBuilder.CreateIndex( + name: "IX_t_relation_user_user_role_id_user_role", + table: "t_relation_user_user_role", + column: "id_user_role"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "t_relation_user_role_permission"); + + migrationBuilder.DropTable( + name: "t_relation_user_user_role"); + + migrationBuilder.DropTable( + name: "t_permission"); + + migrationBuilder.DropColumn( + name: "id_parent", + table: "t_user_role"); + + migrationBuilder.DropColumn( + name: "role_type", + table: "t_user_role"); + + migrationBuilder.AddColumn( + name: "id_role", + table: "t_user", + type: "integer", + nullable: true); + + migrationBuilder.AddColumn( + name: "level", + table: "t_user", + type: "integer", + nullable: true); + + migrationBuilder.UpdateData( + table: "t_user", + keyColumn: "id", + keyValue: 1, + columns: new[] { "id_role", "level" }, + values: new object[] { 1, 2147483647 }); + + migrationBuilder.CreateIndex( + name: "IX_t_user_id_role", + table: "t_user", + column: "id_role"); + + migrationBuilder.AddForeignKey( + name: "FK_t_user_t_user_role_id_role", + table: "t_user", + column: "id_role", + principalTable: "t_user_role", + principalColumn: "id", + onDelete: ReferentialAction.Restrict); + } + } +} diff --git a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs index 22260841..6904c2df 100644 --- a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs +++ b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs @@ -681,6 +681,33 @@ namespace AsbCloudDb.Migrations }); }); + modelBuilder.Entity("AsbCloudDb.Model.Permission", 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("Type") + .HasColumnType("integer") + .HasColumnName("type") + .HasComment("1-чтение, 2-запись, 3-чтение и запись"); + + b.HasKey("Id"); + + b.ToTable("t_permission"); + + b + .HasComment("Разрешения на доступ к данным"); + }); + modelBuilder.Entity("AsbCloudDb.Model.RelationCompanyWell", b => { b.Property("IdCompany") @@ -701,6 +728,62 @@ 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") + .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("Отношение пользователей и ролей"); + }); + modelBuilder.Entity("AsbCloudDb.Model.ReportProperty", b => { b.Property("Id") @@ -1549,14 +1632,6 @@ namespace AsbCloudDb.Migrations .HasColumnType("integer") .HasColumnName("id_company"); - b.Property("IdRole") - .HasColumnType("integer") - .HasColumnName("id_role"); - - b.Property("Level") - .HasColumnType("integer") - .HasColumnName("level"); - b.Property("Login") .HasMaxLength(255) .HasColumnType("character varying(255)") @@ -1607,8 +1682,6 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdCompany"); - b.HasIndex("IdRole"); - b.HasIndex("Login") .IsUnique(); @@ -1622,8 +1695,6 @@ namespace AsbCloudDb.Migrations { Id = 1, IdCompany = 1, - IdRole = 1, - Level = 2147483647, Login = "dev", Name = "Разработчик", PasswordHash = "Vlcj|4fa529103dde7ff72cfe76185f344d4aa87931f8e1b2044e8a7739947c3d18923464eaad93843e4f809c5e126d013072" @@ -1644,6 +1715,16 @@ namespace AsbCloudDb.Migrations .HasColumnName("caption") .HasComment("Название"); + b.Property("IdParent") + .HasColumnType("integer") + .HasColumnName("id_parent") + .HasComment("От какой роли унаследована данная роль"); + + b.Property("RoleType") + .HasColumnType("integer") + .HasColumnName("role_type") + .HasComment("0-роль из стандартной матрицы, \n1-специальная роль для какого-либо пользователя"); + b.HasKey("Id"); b.ToTable("t_user_role"); @@ -1655,12 +1736,16 @@ namespace AsbCloudDb.Migrations new { Id = 1, - Caption = "Администратор" + Caption = "Администратор", + IdParent = 0, + RoleType = 0 }, new { Id = 2, - Caption = "Пользователь" + Caption = "Пользователь", + IdParent = 0, + RoleType = 0 }); }); @@ -2472,6 +2557,44 @@ 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") + .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") @@ -2580,13 +2703,7 @@ namespace AsbCloudDb.Migrations .HasConstraintName("t_user_t_company_id_fk") .OnDelete(DeleteBehavior.SetNull); - b.HasOne("AsbCloudDb.Model.UserRole", "Role") - .WithMany("Users") - .HasForeignKey("IdRole"); - b.Navigation("Company"); - - b.Navigation("Role"); }); modelBuilder.Entity("AsbCloudDb.Model.Well", b => @@ -2702,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"); @@ -2724,11 +2846,15 @@ namespace AsbCloudDb.Migrations b.Navigation("FileMarks"); b.Navigation("Files"); + + b.Navigation("RelationUsersUserRoles"); }); modelBuilder.Entity("AsbCloudDb.Model.UserRole", b => { - b.Navigation("Users"); + b.Navigation("RelationUserRolesPermissions"); + + b.Navigation("RelationUsersUserRoles"); }); modelBuilder.Entity("AsbCloudDb.Model.Well", b => diff --git a/AsbCloudDb/Model/AsbCloudDbContext.cs b/AsbCloudDb/Model/AsbCloudDbContext.cs index 313d57c4..5f4c899b 100644 --- a/AsbCloudDb/Model/AsbCloudDbContext.cs +++ b/AsbCloudDb/Model/AsbCloudDbContext.cs @@ -38,6 +38,9 @@ namespace AsbCloudDb.Model public virtual DbSet WellTypes { get; set; } 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() // .UseNpgsql("Host=localhost;Database=postgres;Username=postgres;Password=q;Persist Security Info=True") @@ -264,8 +267,6 @@ namespace AsbCloudDb.Model new User{ Id = 1, IdCompany = 1, - IdRole = 1, - Level = int.MaxValue, Login = "dev", PasswordHash = "Vlcj|4fa529103dde7ff72cfe76185f344d4aa87931f8e1b2044e8a7739947c3d18923464eaad93843e4f809c5e126d013072", // dev Name = "Разработчик", @@ -437,7 +438,8 @@ namespace AsbCloudDb.Model public IQueryable GetUsersByLogin(string login) => Users - .Include(e => e.Role) + .Include(e => e.RelationUsersUserRoles) + .ThenInclude(r => r.UserRole) .Include(e => e.Company) .Where(e => e.Login == login); diff --git a/AsbCloudDb/Model/IAsbCloudDbContext.cs b/AsbCloudDb/Model/IAsbCloudDbContext.cs index c3085b8f..2ef37cce 100644 --- a/AsbCloudDb/Model/IAsbCloudDbContext.cs +++ b/AsbCloudDb/Model/IAsbCloudDbContext.cs @@ -36,6 +36,9 @@ namespace AsbCloudDb.Model DbSet TelemetryDataSpin { get; set; } 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 new file mode 100644 index 00000000..23a87cc2 --- /dev/null +++ b/AsbCloudDb/Model/Permission.cs @@ -0,0 +1,25 @@ +using Microsoft.EntityFrameworkCore; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace AsbCloudDb.Model +{ + [Table("t_permission"), Comment("Разрешения на доступ к данным")] + public class Permission + { + [Key] + [Column("id")] + public int Id { get; set; } + + [Column("caption"), Comment("Название")] + [StringLength(255)] + 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/RelationUserUserRole.cs b/AsbCloudDb/Model/RelationUserUserRole.cs new file mode 100644 index 00000000..f841446d --- /dev/null +++ b/AsbCloudDb/Model/RelationUserUserRole.cs @@ -0,0 +1,28 @@ +using Microsoft.EntityFrameworkCore; +using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations; + +namespace AsbCloudDb.Model +{ + [Table("t_relation_user_user_role"), Comment("Отношение пользователей и ролей")] + public class RelationUserUserRole + { + [Key] + [Column("id")] + public int Id { get; set; } + + [Column("id_user")] + public int IdUser { get; set; } + + [Column("id_user_role")] + public int IdUserRole { get; set; } + + [ForeignKey(nameof(IdUser))] + [InverseProperty(nameof(Model.User.RelationUsersUserRoles))] + public virtual User User { get; set; } + + [ForeignKey(nameof(IdUserRole))] + [InverseProperty(nameof(Model.UserRole.RelationUsersUserRoles))] + public virtual UserRole UserRole { get; set; } + } +} \ No newline at end of file diff --git a/AsbCloudDb/Model/User.cs b/AsbCloudDb/Model/User.cs index 328a54c5..da51bdb7 100644 --- a/AsbCloudDb/Model/User.cs +++ b/AsbCloudDb/Model/User.cs @@ -17,9 +17,6 @@ namespace AsbCloudDb.Model [Column("id_company")] public int? IdCompany { get; set; } - [Column("id_role")] - public int? IdRole { get; set; } - [Column("login")] [StringLength(255)] public string Login { get; set; } @@ -31,9 +28,6 @@ namespace AsbCloudDb.Model [Column("state"), Comment("состояние:\n100 - удален")] public short? State { get; set; } - [Column("level")] - public int? Level { get; set; } - [Column("name"), Comment("имя")] [StringLength(255)] public string Name { get; set; } @@ -62,12 +56,10 @@ namespace AsbCloudDb.Model [ForeignKey(nameof(IdCompany))] [InverseProperty(nameof(Model.Company.Users))] public virtual Company Company { get; set; } - - [ForeignKey(nameof(IdRole))] - [InverseProperty(nameof(Model.UserRole.Users))] - public virtual UserRole Role { get; set; } - - + + [InverseProperty(nameof(RelationUserUserRole.User))] + public virtual ICollection RelationUsersUserRoles { get; set; } + [InverseProperty(nameof(FileInfo.Author))] public virtual ICollection Files { get; set; } diff --git a/AsbCloudDb/Model/UserRole.cs b/AsbCloudDb/Model/UserRole.cs index 6eb46136..24c460cc 100644 --- a/AsbCloudDb/Model/UserRole.cs +++ b/AsbCloudDb/Model/UserRole.cs @@ -9,11 +9,6 @@ namespace AsbCloudDb.Model [Table("t_user_role"), Comment("Роли пользователей в системе")] public class UserRole : IId { - public UserRole() - { - Users = new HashSet(); - } - [Key] [Column("id")] public int Id { get; set; } @@ -22,7 +17,17 @@ namespace AsbCloudDb.Model [StringLength(255)] public string Caption { get; set; } - [InverseProperty(nameof(User.Role))] - public virtual ICollection Users { get; set; } + [Column("role_type"), Comment("0-роль из стандартной матрицы, \n1-специальная роль для какого-либо пользователя")] + public int RoleType { get; set; } + + [Column("id_parent"), Comment("От какой роли унаследована данная роль")] + public int IdParent { get; set; } + + + [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 811ec64e..c40bd1b0 100644 --- a/AsbCloudInfrastructure/Services/AuthService.cs +++ b/AsbCloudInfrastructure/Services/AuthService.cs @@ -12,12 +12,17 @@ using System.Security.Cryptography; using System.Text; using System.Threading; using System.Threading.Tasks; +using AsbCloudInfrastructure.Services.Cache; namespace AsbCloudInfrastructure.Services { public class AuthService : IAuthService { 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"; @@ -32,15 +37,19 @@ namespace AsbCloudInfrastructure.Services private readonly HashAlgorithm hashAlgoritm; private readonly Random rnd; - public AuthService(IAsbCloudDbContext db) + public AuthService(IAsbCloudDbContext db, CacheDb cacheDb) { 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)); } public async Task LoginAsync(string login, string password, - CancellationToken token = default) + CancellationToken token) { var (identity, user) = await GetClaimsUserAsync(login, password, token) .ConfigureAwait(false); @@ -48,15 +57,19 @@ namespace AsbCloudInfrastructure.Services if (identity == default || user.State == 0) return null; + var idCaptionRoles = GetUserRolesIdsNames(user.Id); + + var userPermissions = GetUserPermissions(idCaptionRoles.Select(r => r.Id)); + return new UserTokenDto { Id = user.Id, Name = user.Name, CompanyName = user.Company.Caption, - Level = user.Level, Login = user.Login, Patronymic = user.Patronymic, - RoleName = user.Role.Caption, + RoleNames = idCaptionRoles.Select(r => r.Caption), + Permissions = userPermissions, Surname = user.Surname, Token = MakeToken(identity.Claims), }; @@ -94,7 +107,6 @@ namespace AsbCloudInfrastructure.Services var newUser = new User { IdCompany = userDto.IdCompany, - IdRole = userDto.IdRole ?? 2, // simple user State = 0, Name = userDto.Name, Surname = userDto.Surname, @@ -102,15 +114,21 @@ namespace AsbCloudInfrastructure.Services Email = userDto.Email, Phone = userDto.Phone, Position = userDto.Position, - Level = userDto.Level, Login = userDto.Login, PasswordHash = salt + ComputeHash(salt, userDto.Password), }; db.Users.Add(newUser); + try { db.SaveChanges(); + db.RelationUserUserRoles.Add(new RelationUserUserRole() + { + IdUser = newUser.Id, + IdUserRole = 2 + }); + db.SaveChanges(); } catch //(Exception ex) { @@ -159,6 +177,24 @@ namespace AsbCloudInfrastructure.Services return new JwtSecurityTokenHandler().WriteToken(jwt); } + 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.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, string password, CancellationToken token = default) { @@ -174,13 +210,18 @@ namespace AsbCloudInfrastructure.Services if (!CheckPassword(user.PasswordHash, password)) return default; + var userRolesNames = GetUserRolesIdsNames(user.Id) + .Select(r => r.Caption); + var claims = new List { new Claim(claimIdUser, user.Id.ToString()), new Claim(ClaimsIdentity.DefaultNameClaimType, user.Login), - new Claim(ClaimsIdentity.DefaultRoleClaimType, user.Role?.Caption??"GUEST"), new Claim(claimNameidCompany, user.IdCompany.ToString()), }; + + claims.AddRange(userRolesNames.Select(roleName => new Claim(ClaimsIdentity.DefaultRoleClaimType, roleName))); + var claimsIdentity = new ClaimsIdentity(claims, "Token", ClaimsIdentity.DefaultNameClaimType, ClaimsIdentity.DefaultRoleClaimType); return (claimsIdentity, user); } From 908c855463d9715f3d1e7b3241250a3dc0f1973e Mon Sep 17 00:00:00 2001 From: KharchenkoVladimir Date: Wed, 24 Nov 2021 17:38:40 +0500 Subject: [PATCH 02/17] CS2-123: Added CRUD over user roles and their permissions (controller + service) --- AsbCloudApp/Data/PermissionDto.cs | 9 ++ AsbCloudApp/Data/UserRoleDto.cs | 4 + AsbCloudApp/Services/IUserRoleService.cs | 17 +++ AsbCloudInfrastructure/DependencyInjection.cs | 2 +- .../Services/UserRoleService.cs | 107 ++++++++++++++++++ .../Controllers/AdminUserRoleController.cs | 92 ++++++++++++++- 6 files changed, 226 insertions(+), 5 deletions(-) create mode 100644 AsbCloudApp/Data/PermissionDto.cs create mode 100644 AsbCloudApp/Services/IUserRoleService.cs create mode 100644 AsbCloudInfrastructure/Services/UserRoleService.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 e4abea51..4e428aac 100644 --- a/AsbCloudApp/Data/UserRoleDto.cs +++ b/AsbCloudApp/Data/UserRoleDto.cs @@ -6,6 +6,10 @@ namespace AsbCloudApp.Data { public int Id { get; set; } public string Caption { get; set; } + public int IdParent { 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/Services/IUserRoleService.cs b/AsbCloudApp/Services/IUserRoleService.cs new file mode 100644 index 00000000..1e7990a4 --- /dev/null +++ b/AsbCloudApp/Services/IUserRoleService.cs @@ -0,0 +1,17 @@ +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using AsbCloudApp.Data; + + +namespace AsbCloudApp.Services +{ + public interface IUserRoleService + { + Task> GetAllAsync(CancellationToken token); + Task GetAsync(int id, CancellationToken token); + Task InsertAsync(UserRoleDto dto, CancellationToken token = default); + Task UpdateAsync(UserRoleDto dto, CancellationToken token = default); + Task DeleteAsync(IEnumerable ids, CancellationToken token); + } +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 580bb356..080c9ac4 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -48,6 +48,7 @@ namespace AsbCloudInfrastructure services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); // admin crud services: services.AddTransient, CrudServiceBase>(); @@ -55,7 +56,6 @@ namespace AsbCloudInfrastructure services.AddTransient, CrudServiceBase>(); services.AddTransient, CrudServiceBase>(); services.AddTransient, CrudServiceBase>(); - services.AddTransient, CrudServiceBase>(); services.AddTransient, CrudServiceBase>(); services.AddTransient, DrillParamsService>(); diff --git a/AsbCloudInfrastructure/Services/UserRoleService.cs b/AsbCloudInfrastructure/Services/UserRoleService.cs new file mode 100644 index 00000000..286d333f --- /dev/null +++ b/AsbCloudInfrastructure/Services/UserRoleService.cs @@ -0,0 +1,107 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using AsbCloudApp.Data; +using AsbCloudApp.Services; +using AsbCloudDb.Model; +using AsbCloudInfrastructure.Services.Cache; +using Mapster; + +namespace AsbCloudInfrastructure.Services +{ + public class UserRoleService : IUserRoleService + { + private readonly IAsbCloudDbContext db; + private readonly CacheTable cacheUserRoles; + private readonly CacheTable cachePermissions; + private readonly CacheTable cacheUserRolesPermissions; + + public UserRoleService(IAsbCloudDbContext db, CacheDb cacheDb) + { + this.db = db; + cacheUserRoles = cacheDb.GetCachedTable((AsbCloudDbContext)db); + cachePermissions = cacheDb.GetCachedTable((AsbCloudDbContext)db); + cacheUserRolesPermissions = + cacheDb.GetCachedTable((AsbCloudDbContext)db); + } + + public async Task> GetAllAsync(CancellationToken token) + { + var rolesDtos = (await cacheUserRoles.WhereAsync(token).ConfigureAwait(false)) + .Adapt(); + + return rolesDtos.Select(FillUserRoleWithPermissions); + } + + public async Task GetAsync(int id, CancellationToken token) + { + var roleDto = (await cacheUserRoles.FirstOrDefaultAsync(r => r.Id == id, token) + .ConfigureAwait(false)).Adapt(); + + return roleDto is null ? null : FillUserRoleWithPermissions(roleDto); + } + + public async Task InsertAsync(UserRoleDto dto, CancellationToken token = default) + { + var newRole = dto.Adapt(); + db.UserRoles.Add(newRole); + var result = await db.SaveChangesAsync(token); + + if (dto.PermissionIds == default) + return result; + + foreach (var pId in dto.PermissionIds) + { + var relation = new RelationUserRolePermission() + { + IdUserRole = newRole.Id, + IdPermission = pId + }; + + db.RelationUserRolesPermissions.Add(relation); + } + + return await db.SaveChangesAsync(token); + } + + public async Task UpdateAsync(UserRoleDto dto, CancellationToken token = default) + { + var entity = dto.Adapt(); + db.UserRoles.Update(entity); + await db.SaveChangesAsync(token); + + if (dto.PermissionIds != default) + { + await cacheUserRolesPermissions.RemoveAsync(r => r.IdUserRole == dto.Id, token) + .ConfigureAwait(false); + + var newRelations = dto.PermissionIds.Select(p => new RelationUserRolePermission() + { + IdUserRole = dto.Id, + IdPermission = p + }); + await cacheUserRolesPermissions.InsertAsync(newRelations, token); + } + } + + public async Task DeleteAsync(IEnumerable ids, CancellationToken token) + { + var entities = cacheUserRoles.Where(e => ids.Contains(e.Id)); + if (entities == default) + return 0; + db.UserRoles.RemoveRange(entities); + return await db.SaveChangesAsync(token); + } + + 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; + } + } +} \ No newline at end of file diff --git a/AsbCloudWebApi/Controllers/AdminUserRoleController.cs b/AsbCloudWebApi/Controllers/AdminUserRoleController.cs index 62e2f546..d4dac698 100644 --- a/AsbCloudWebApi/Controllers/AdminUserRoleController.cs +++ b/AsbCloudWebApi/Controllers/AdminUserRoleController.cs @@ -1,4 +1,7 @@ -using AsbCloudApp.Data; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using AsbCloudApp.Data; using AsbCloudApp.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -8,12 +11,93 @@ namespace AsbCloudWebApi.Controllers [Route("api/admin/user/role")] [ApiController] [Authorize] - public class AdminUserRoleController : CrudController> + public class AdminUserRoleController : ControllerBase { - public AdminUserRoleController(ICrudService service) - : base(service) + private readonly IUserRoleService userRoleService; + + public AdminUserRoleController(IUserRoleService userRoleService) + { + this.userRoleService = userRoleService; + } + + /// + /// Получает список всех доступных ролей + /// + /// Токен отмены задачи + /// Список всех доступных ролей + [HttpGet] + [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] + public async Task GetAllAsync(CancellationToken token = default) + { + // TODO: Как будем делать проверку ролей пользователя? Админ, не админ. + + var result = await userRoleService.GetAllAsync(token) + .ConfigureAwait(false); + return Ok(result); + } + + /// + /// Получает информацию о запрашиваемой роли + /// + /// id запрашиваемой задачи + /// Токен отмены задачи + /// Информацию о запрашиваемой роли + [HttpGet("{idRole}")] + [ProducesResponseType(typeof(UserRoleDto), (int)System.Net.HttpStatusCode.OK)] + public async Task GetAsync(int idRole, CancellationToken token = default) { + var result = await userRoleService.GetAsync(idRole, token) + .ConfigureAwait(false); + return Ok(result); + } + + /// + /// Добавить запись + /// + /// Объект с параметрами добавляемой роли + /// Токен отмены задачи + /// 1 - добавлено, 0 - нет + [HttpPost] + [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] + public async Task Insert([FromBody] UserRoleDto dto, + CancellationToken token = default) + { + var result = await userRoleService.InsertAsync(dto, token) + .ConfigureAwait(false); + return Ok(result); + } + + /// + /// Редактировать запись по id + /// + /// Объект с параметрами добавляемой роли + /// Id добавляемых к роли разрешений + /// + /// 1 - успешно отредактировано, 0 - нет + [HttpPut("{id}")] + [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] + public async Task Update([FromBody] UserRoleDto dto, + CancellationToken token = default) + { + + await userRoleService.UpdateAsync(dto, token).ConfigureAwait(false); + return Ok(); + } + + /// + /// Удаляет роли по указанным id + /// + /// Список id ролей для удаления + /// + /// + [HttpDelete] + [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] + public async Task Update(IEnumerable ids, CancellationToken token = default) + { + + var result = await userRoleService.DeleteAsync(ids, token).ConfigureAwait(false); + return Ok(result); } } } From 576d119674f015cd3526ee6e970afbdf01779559 Mon Sep 17 00:00:00 2001 From: KharchenkoVladimir Date: Thu, 25 Nov 2021 11:55:52 +0500 Subject: [PATCH 03/17] CS2-123: Changed UserRoleService and controller to inherit CrudController/service --- AsbCloudInfrastructure/DependencyInjection.cs | 2 +- .../Services/CrudServiceBase.cs | 5 +- .../Services/UserRoleService.cs | 74 ++++++-------- .../Controllers/AdminUserRoleController.cs | 96 +------------------ 4 files changed, 38 insertions(+), 139 deletions(-) diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 080c9ac4..580bb356 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -48,7 +48,6 @@ namespace AsbCloudInfrastructure services.AddTransient(); services.AddTransient(); services.AddTransient(); - services.AddTransient(); // admin crud services: services.AddTransient, CrudServiceBase>(); @@ -56,6 +55,7 @@ namespace AsbCloudInfrastructure services.AddTransient, CrudServiceBase>(); services.AddTransient, CrudServiceBase>(); services.AddTransient, CrudServiceBase>(); + services.AddTransient, CrudServiceBase>(); services.AddTransient, CrudServiceBase>(); services.AddTransient, DrillParamsService>(); diff --git a/AsbCloudInfrastructure/Services/CrudServiceBase.cs b/AsbCloudInfrastructure/Services/CrudServiceBase.cs index e1b1cdb0..e0a49083 100644 --- a/AsbCloudInfrastructure/Services/CrudServiceBase.cs +++ b/AsbCloudInfrastructure/Services/CrudServiceBase.cs @@ -81,12 +81,13 @@ namespace AsbCloudInfrastructure.Services return dto; } - public virtual Task InsertAsync(TDto item, CancellationToken token = default) + public virtual async Task InsertAsync(TDto item, CancellationToken token = default) { var entity = Convert(item); entity.Id = 0; dbSet.Add(entity); - return context.SaveChangesAsync(token); + await context.SaveChangesAsync(token); + return entity.Id; } public virtual Task InsertRangeAsync(IEnumerable items, CancellationToken token = default) diff --git a/AsbCloudInfrastructure/Services/UserRoleService.cs b/AsbCloudInfrastructure/Services/UserRoleService.cs index 286d333f..dbc7050e 100644 --- a/AsbCloudInfrastructure/Services/UserRoleService.cs +++ b/AsbCloudInfrastructure/Services/UserRoleService.cs @@ -3,95 +3,79 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using AsbCloudApp.Data; -using AsbCloudApp.Services; using AsbCloudDb.Model; using AsbCloudInfrastructure.Services.Cache; using Mapster; namespace AsbCloudInfrastructure.Services { - public class UserRoleService : IUserRoleService + public class UserRoleService : CrudServiceBase { - private readonly IAsbCloudDbContext db; private readonly CacheTable cacheUserRoles; private readonly CacheTable cachePermissions; private readonly CacheTable cacheUserRolesPermissions; - public UserRoleService(IAsbCloudDbContext db, CacheDb cacheDb) + public UserRoleService(IAsbCloudDbContext context, CacheDb cacheDb) : base(context) { - this.db = db; - cacheUserRoles = cacheDb.GetCachedTable((AsbCloudDbContext)db); - cachePermissions = cacheDb.GetCachedTable((AsbCloudDbContext)db); + cacheUserRoles = cacheDb.GetCachedTable((AsbCloudDbContext)context); + cachePermissions = cacheDb.GetCachedTable((AsbCloudDbContext)context); cacheUserRolesPermissions = - cacheDb.GetCachedTable((AsbCloudDbContext)db); + cacheDb.GetCachedTable((AsbCloudDbContext)context); } - public async Task> GetAllAsync(CancellationToken token) + public override async Task> GetAllAsync(CancellationToken token = default) { - var rolesDtos = (await cacheUserRoles.WhereAsync(token).ConfigureAwait(false)) - .Adapt(); + var rolesDtos = await base.GetAllAsync(token); return rolesDtos.Select(FillUserRoleWithPermissions); } - public async Task GetAsync(int id, CancellationToken token) + public override async Task GetAsync(int id, CancellationToken token = default) { - var roleDto = (await cacheUserRoles.FirstOrDefaultAsync(r => r.Id == id, token) - .ConfigureAwait(false)).Adapt(); + var roleDto = await base.GetAsync(id,token); return roleDto is null ? null : FillUserRoleWithPermissions(roleDto); } - public async Task InsertAsync(UserRoleDto dto, CancellationToken token = default) + public override async Task InsertAsync(UserRoleDto dto, CancellationToken token = default) { - var newRole = dto.Adapt(); - db.UserRoles.Add(newRole); - var result = await db.SaveChangesAsync(token); + var newRoleId = await base.InsertAsync(dto, token); if (dto.PermissionIds == default) - return result; + return newRoleId; foreach (var pId in dto.PermissionIds) { var relation = new RelationUserRolePermission() { - IdUserRole = newRole.Id, + IdUserRole = newRoleId, IdPermission = pId }; - db.RelationUserRolesPermissions.Add(relation); + context.RelationUserRolesPermissions.Add(relation); } - return await db.SaveChangesAsync(token); + return await context.SaveChangesAsync(token); } - public async Task UpdateAsync(UserRoleDto dto, CancellationToken token = default) + public override async Task UpdateAsync(int id, UserRoleDto item, CancellationToken token = default) { - var entity = dto.Adapt(); - db.UserRoles.Update(entity); - await db.SaveChangesAsync(token); + var result = await base.UpdateAsync(id, item, token); - if (dto.PermissionIds != default) + 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() { - await cacheUserRolesPermissions.RemoveAsync(r => r.IdUserRole == dto.Id, token) - .ConfigureAwait(false); + IdUserRole = item.Id, + IdPermission = p + }); + await cacheUserRolesPermissions.InsertAsync(newRelations, token); - var newRelations = dto.PermissionIds.Select(p => new RelationUserRolePermission() - { - IdUserRole = dto.Id, - IdPermission = p - }); - await cacheUserRolesPermissions.InsertAsync(newRelations, token); - } - } - - public async Task DeleteAsync(IEnumerable ids, CancellationToken token) - { - var entities = cacheUserRoles.Where(e => ids.Contains(e.Id)); - if (entities == default) - return 0; - db.UserRoles.RemoveRange(entities); - return await db.SaveChangesAsync(token); + return result; } private UserRoleDto FillUserRoleWithPermissions(UserRoleDto roleDto) diff --git a/AsbCloudWebApi/Controllers/AdminUserRoleController.cs b/AsbCloudWebApi/Controllers/AdminUserRoleController.cs index d4dac698..c0325326 100644 --- a/AsbCloudWebApi/Controllers/AdminUserRoleController.cs +++ b/AsbCloudWebApi/Controllers/AdminUserRoleController.cs @@ -1,7 +1,4 @@ -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using AsbCloudApp.Data; +using AsbCloudApp.Data; using AsbCloudApp.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -11,93 +8,10 @@ namespace AsbCloudWebApi.Controllers [Route("api/admin/user/role")] [ApiController] [Authorize] - public class AdminUserRoleController : ControllerBase + public class AdminUserRoleController : CrudController> { - private readonly IUserRoleService userRoleService; - - public AdminUserRoleController(IUserRoleService userRoleService) - { - this.userRoleService = userRoleService; - } - - /// - /// Получает список всех доступных ролей - /// - /// Токен отмены задачи - /// Список всех доступных ролей - [HttpGet] - [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] - public async Task GetAllAsync(CancellationToken token = default) - { - // TODO: Как будем делать проверку ролей пользователя? Админ, не админ. - - var result = await userRoleService.GetAllAsync(token) - .ConfigureAwait(false); - return Ok(result); - } - - /// - /// Получает информацию о запрашиваемой роли - /// - /// id запрашиваемой задачи - /// Токен отмены задачи - /// Информацию о запрашиваемой роли - [HttpGet("{idRole}")] - [ProducesResponseType(typeof(UserRoleDto), (int)System.Net.HttpStatusCode.OK)] - public async Task GetAsync(int idRole, CancellationToken token = default) - { - - var result = await userRoleService.GetAsync(idRole, token) - .ConfigureAwait(false); - return Ok(result); - } - - /// - /// Добавить запись - /// - /// Объект с параметрами добавляемой роли - /// Токен отмены задачи - /// 1 - добавлено, 0 - нет - [HttpPost] - [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] - public async Task Insert([FromBody] UserRoleDto dto, - CancellationToken token = default) - { - var result = await userRoleService.InsertAsync(dto, token) - .ConfigureAwait(false); - return Ok(result); - } - - /// - /// Редактировать запись по id - /// - /// Объект с параметрами добавляемой роли - /// Id добавляемых к роли разрешений - /// - /// 1 - успешно отредактировано, 0 - нет - [HttpPut("{id}")] - [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] - public async Task Update([FromBody] UserRoleDto dto, - CancellationToken token = default) - { - - await userRoleService.UpdateAsync(dto, token).ConfigureAwait(false); - return Ok(); - } - - /// - /// Удаляет роли по указанным id - /// - /// Список id ролей для удаления - /// - /// - [HttpDelete] - [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] - public async Task Update(IEnumerable ids, CancellationToken token = default) - { - - var result = await userRoleService.DeleteAsync(ids, token).ConfigureAwait(false); - return Ok(result); - } + public AdminUserRoleController(ICrudService service) + : base(service) + { } } } From 2f23fbce702f56a93bbf00976e484bb6b659cb81 Mon Sep 17 00:00:00 2001 From: KharchenkoVladimir Date: Thu, 25 Nov 2021 12:24:53 +0500 Subject: [PATCH 04/17] CS2-123: Fixed UserRoleController to user UserRoleService, not CRUD service --- AsbCloudInfrastructure/DependencyInjection.cs | 2 +- AsbCloudInfrastructure/Services/UserRoleService.cs | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 580bb356..d7d06ba9 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -55,7 +55,7 @@ namespace AsbCloudInfrastructure services.AddTransient, CrudServiceBase>(); services.AddTransient, CrudServiceBase>(); services.AddTransient, CrudServiceBase>(); - services.AddTransient, CrudServiceBase>(); + services.AddTransient, UserRoleService>(); services.AddTransient, CrudServiceBase>(); services.AddTransient, DrillParamsService>(); diff --git a/AsbCloudInfrastructure/Services/UserRoleService.cs b/AsbCloudInfrastructure/Services/UserRoleService.cs index dbc7050e..dc9226be 100644 --- a/AsbCloudInfrastructure/Services/UserRoleService.cs +++ b/AsbCloudInfrastructure/Services/UserRoleService.cs @@ -23,11 +23,14 @@ namespace AsbCloudInfrastructure.Services cacheDb.GetCachedTable((AsbCloudDbContext)context); } - public override async Task> GetAllAsync(CancellationToken token = default) + public override async Task> GetPageAsync(int skip = 0, + int take = 32, CancellationToken token = default) { - var rolesDtos = await base.GetAllAsync(token); + var rolesDtos = await base.GetPageAsync(skip, take,token); - return rolesDtos.Select(FillUserRoleWithPermissions); + rolesDtos.Items = rolesDtos.Items.Select(FillUserRoleWithPermissions).ToList(); + + return rolesDtos; } public override async Task GetAsync(int id, CancellationToken token = default) From c3c601c2a055ba47fc644ad7a2a1ef9b92516f4a Mon Sep 17 00:00:00 2001 From: KharchenkoVladimir Date: Thu, 25 Nov 2021 17:44:07 +0500 Subject: [PATCH 05/17] CS2-123: Added get of parent's permissions for new role --- .../Services/UserRoleService.cs | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/AsbCloudInfrastructure/Services/UserRoleService.cs b/AsbCloudInfrastructure/Services/UserRoleService.cs index dc9226be..f34d7a95 100644 --- a/AsbCloudInfrastructure/Services/UserRoleService.cs +++ b/AsbCloudInfrastructure/Services/UserRoleService.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -14,6 +15,7 @@ namespace AsbCloudInfrastructure.Services private readonly CacheTable cacheUserRoles; private readonly CacheTable cachePermissions; private readonly CacheTable cacheUserRolesPermissions; + private int counter = 0; public UserRoleService(IAsbCloudDbContext context, CacheDb cacheDb) : base(context) { @@ -37,11 +39,16 @@ namespace AsbCloudInfrastructure.Services { var roleDto = await base.GetAsync(id,token); - return roleDto is null ? null : FillUserRoleWithPermissions(roleDto); + return roleDto is null + ? null + : FillUserRoleWithPermissions(roleDto); } public override async Task InsertAsync(UserRoleDto dto, CancellationToken token = default) { + + dto.PermissionIds = GetAncestorsPermissionIds(dto, ref counter); + var newRoleId = await base.InsertAsync(dto, token); if (dto.PermissionIds == default) @@ -90,5 +97,30 @@ namespace AsbCloudInfrastructure.Services 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: {userRoleDto.Id} has more than 10 nested parents"); + return resultPermissionsIds; + } + + var parentRole = cacheUserRoles.FirstOrDefault(r => r.Id == idParent) + .Adapt(); + var parentRolePermissionsIds = cacheUserRolesPermissions.Where(p => + p.IdUserRole == parentRole.Id).Select(perm => perm.IdPermission); + parentRole.PermissionIds = resultPermissionsIds.Union(parentRolePermissionsIds); + + counter++; + + return GetAncestorsPermissionIds(parentRole, ref counter); + } } } \ No newline at end of file From ad34e6445c1e96ca88a647169f8b4e8f8bc50260 Mon Sep 17 00:00:00 2001 From: KharchenkoVladimir Date: Fri, 26 Nov 2021 17:05:41 +0500 Subject: [PATCH 06/17] CS2-123: Changed role permissions to bit collection --- 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, 3075 insertions(+), 226 deletions(-) delete mode 100644 AsbCloudApp/Data/PermissionDto.cs create mode 100644 AsbCloudDb/Migrations/20211126101932_Changed_Permissions_To_Bit_Collection.Designer.cs create mode 100644 AsbCloudDb/Migrations/20211126101932_Changed_Permissions_To_Bit_Collection.cs delete mode 100644 AsbCloudDb/Model/RelationUserRolePermission.cs diff --git a/AsbCloudApp/Data/PermissionDto.cs b/AsbCloudApp/Data/PermissionDto.cs deleted file mode 100644 index 84bd59f9..00000000 --- a/AsbCloudApp/Data/PermissionDto.cs +++ /dev/null @@ -1,9 +0,0 @@ -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 4e428aac..64b28ee0 100644 --- a/AsbCloudApp/Data/UserRoleDto.cs +++ b/AsbCloudApp/Data/UserRoleDto.cs @@ -6,10 +6,8 @@ namespace AsbCloudApp.Data { public int Id { get; set; } public string Caption { get; set; } - public int IdParent { get; set; } public int RoleType { get; set; } - public virtual ICollection Users { get; set; } - public IEnumerable PermissionIds { get; set; } - public IEnumerable Permissions { get; set; } + public int IdParent { get; set; } + public long Permissions { get; set; } } } diff --git a/AsbCloudApp/Data/UserTokenDto.cs b/AsbCloudApp/Data/UserTokenDto.cs index 36a90374..5dab69ab 100644 --- a/AsbCloudApp/Data/UserTokenDto.cs +++ b/AsbCloudApp/Data/UserTokenDto.cs @@ -6,8 +6,7 @@ namespace AsbCloudApp.Data { public int Id { get; set; } public string CompanyName { get; set; } - public IDictionary Permissions { get; set; } - public IEnumerable RoleNames { get; set; } + public IDictionary Roles { 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 new file mode 100644 index 00000000..cf29d38b --- /dev/null +++ b/AsbCloudDb/Migrations/20211126101932_Changed_Permissions_To_Bit_Collection.Designer.cs @@ -0,0 +1,2855 @@ +// +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 new file mode 100644 index 00000000..2a41e547 --- /dev/null +++ b/AsbCloudDb/Migrations/20211126101932_Changed_Permissions_To_Bit_Collection.cs @@ -0,0 +1,133 @@ +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 6904c2df..5a93c563 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("Caption") + b.Property("Description") .HasMaxLength(255) .HasColumnType("character varying(255)") - .HasColumnName("caption") - .HasComment("Название"); + .HasColumnName("description") + .HasComment("Описание разрешений"); - b.Property("Type") - .HasColumnType("integer") - .HasColumnName("type") - .HasComment("1-чтение, 2-запись, 3-чтение и запись"); + b.Property("Index") + .HasColumnType("text") + .HasColumnName("index") + .HasComment("Порядковый номер бита. \n В нем 0-запрещено, 1-разрешено."); b.HasKey("Id"); b.ToTable("t_permission"); b - .HasComment("Разрешения на доступ к данным"); + .HasComment("Описание битов разрешений для ролей пользователей"); }); modelBuilder.Entity("AsbCloudDb.Model.RelationCompanyWell", b => @@ -728,34 +728,6 @@ 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") @@ -782,6 +754,14 @@ namespace AsbCloudDb.Migrations b .HasComment("Отношение пользователей и ролей"); + + b.HasData( + new + { + Id = 1, + IdUser = 1, + IdUserRole = 2 + }); }); modelBuilder.Entity("AsbCloudDb.Model.ReportProperty", b => @@ -1720,6 +1700,11 @@ namespace AsbCloudDb.Migrations .HasColumnName("id_parent") .HasComment("От какой роли унаследована данная роль"); + b.Property("Permissions") + .HasColumnType("bigint") + .HasColumnName("permissions") + .HasComment("Десятичное число, хранящее список разрешений для роли (в двоичном виде)"); + b.Property("RoleType") .HasColumnType("integer") .HasColumnName("role_type") @@ -1738,6 +1723,7 @@ namespace AsbCloudDb.Migrations Id = 1, Caption = "Администратор", IdParent = 0, + Permissions = 0L, RoleType = 0 }, new @@ -1745,6 +1731,7 @@ namespace AsbCloudDb.Migrations Id = 2, Caption = "Пользователь", IdParent = 0, + Permissions = 0L, RoleType = 0 }); }); @@ -2557,25 +2544,6 @@ 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") @@ -2819,11 +2787,6 @@ namespace AsbCloudDb.Migrations b.Navigation("Measures"); }); - modelBuilder.Entity("AsbCloudDb.Model.Permission", b => - { - b.Navigation("RelationUserRolesPermissions"); - }); - modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b => { b.Navigation("Analysis"); @@ -2852,8 +2815,6 @@ 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 5f4c899b..3cc61e98 100644 --- a/AsbCloudDb/Model/AsbCloudDbContext.cs +++ b/AsbCloudDb/Model/AsbCloudDbContext.cs @@ -39,7 +39,6 @@ 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() @@ -273,6 +272,13 @@ 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 2ef37cce..08797b2c 100644 --- a/AsbCloudDb/Model/IAsbCloudDbContext.cs +++ b/AsbCloudDb/Model/IAsbCloudDbContext.cs @@ -37,7 +37,6 @@ 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 23a87cc2..f3451889 100644 --- a/AsbCloudDb/Model/Permission.cs +++ b/AsbCloudDb/Model/Permission.cs @@ -1,25 +1,22 @@ -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("caption"), Comment("Название")] + [Column("index"), Comment("Порядковый номер бита. \n В нем 0-запрещено, 1-разрешено.")] + public string Index { get; set; } + + [Column("description"), Comment("Описание разрешений")] [StringLength(255)] - 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; } + public string Description { get; set; } } } \ No newline at end of file diff --git a/AsbCloudDb/Model/RelationUserRolePermission.cs b/AsbCloudDb/Model/RelationUserRolePermission.cs deleted file mode 100644 index 2f474640..00000000 --- a/AsbCloudDb/Model/RelationUserRolePermission.cs +++ /dev/null @@ -1,28 +0,0 @@ -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 24c460cc..7789f558 100644 --- a/AsbCloudDb/Model/UserRole.cs +++ b/AsbCloudDb/Model/UserRole.cs @@ -1,7 +1,8 @@ -using Microsoft.EntityFrameworkCore; +using System.Text.Json.Serialization; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Microsoft.EntityFrameworkCore; namespace AsbCloudDb.Model @@ -23,11 +24,12 @@ 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 c40bd1b0..e82a51ab 100644 --- a/AsbCloudInfrastructure/Services/AuthService.cs +++ b/AsbCloudInfrastructure/Services/AuthService.cs @@ -21,8 +21,6 @@ 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"; @@ -42,8 +40,6 @@ 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)); } @@ -57,10 +53,8 @@ namespace AsbCloudInfrastructure.Services if (identity == default || user.State == 0) return null; - var idCaptionRoles = GetUserRolesIdsNames(user.Id); + var userRoles = GetUserRoles(user.Id); - var userPermissions = GetUserPermissions(idCaptionRoles.Select(r => r.Id)); - return new UserTokenDto { Id = user.Id, @@ -68,8 +62,7 @@ namespace AsbCloudInfrastructure.Services CompanyName = user.Company.Caption, Login = user.Login, Patronymic = user.Patronymic, - RoleNames = idCaptionRoles.Select(r => r.Caption), - Permissions = userPermissions, + Roles = userRoles, Surname = user.Surname, Token = MakeToken(identity.Claims), }; @@ -177,22 +170,14 @@ namespace AsbCloudInfrastructure.Services return new JwtSecurityTokenHandler().WriteToken(jwt); } - private IEnumerable<(int Id, string Caption)> GetUserRolesIdsNames(int idUser) + private IDictionary GetUserRoles(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.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); + .Select(r => (r.Caption, r.Permissions)) + .ToDictionary(k => k.Caption, v => v.Permissions); } private async Task<(ClaimsIdentity Identity, User User)> GetClaimsUserAsync(string login, @@ -210,8 +195,8 @@ namespace AsbCloudInfrastructure.Services if (!CheckPassword(user.PasswordHash, password)) return default; - var userRolesNames = GetUserRolesIdsNames(user.Id) - .Select(r => r.Caption); + var userRolesNames = GetUserRoles(user.Id) + .Select(r => r.Key); var claims = new List { @@ -220,9 +205,11 @@ 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 f34d7a95..a43a6dd9 100644 --- a/AsbCloudInfrastructure/Services/UserRoleService.cs +++ b/AsbCloudInfrastructure/Services/UserRoleService.cs @@ -1,6 +1,6 @@ -using System.Collections.Generic; +using System; +using System.Collections; using System.Diagnostics; -using System.Linq; using System.Threading; using System.Threading.Tasks; using AsbCloudApp.Data; @@ -13,16 +13,11 @@ 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, @@ -30,97 +25,51 @@ 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.PermissionIds = GetAncestorsPermissionIds(dto, ref counter); + dto.Permissions = GetAncestorsPermissions(dto, ref counter); - 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); + return await base.InsertAsync(dto, token); } - public override async Task UpdateAsync(int id, UserRoleDto item, CancellationToken token = default) + private long GetAncestorsPermissions(UserRoleDto currentRoleDto, ref int counter) { - 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 (currentRoleDto.IdParent == default) + return currentRoleDto.Permissions; if (counter > 10) { - Trace.WriteLine($"User role with id: {userRoleDto.Id} has more than 10 nested parents"); - return resultPermissionsIds; + Trace.WriteLine($"User role with id: {currentRoleDto.Id} has more than 10 parents"); + return currentRoleDto.Permissions; } - var parentRole = cacheUserRoles.FirstOrDefault(r => r.Id == idParent) + var parentRole = cacheUserRoles.FirstOrDefault(r => r.Id == currentRoleDto.IdParent) .Adapt(); - var parentRolePermissionsIds = cacheUserRolesPermissions.Where(p => - p.IdUserRole == parentRole.Id).Select(perm => perm.IdPermission); - parentRole.PermissionIds = resultPermissionsIds.Union(parentRolePermissionsIds); + + parentRole.Permissions = MakeBitwiseOr(currentRoleDto.Permissions, parentRole.Permissions); counter++; - return GetAncestorsPermissionIds(parentRole, ref 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); } } } \ No newline at end of file From 2d9388cb2a4963a3633fe6a524199f54fb0ad75b Mon Sep 17 00:00:00 2001 From: KharchenkoVladimir Date: Mon, 29 Nov 2021 12:39:28 +0500 Subject: [PATCH 07/17] 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 From 9280b28e10cb59c766ae538f8c805c87d7f49d9a Mon Sep 17 00:00:00 2001 From: KharchenkoVladimir Date: Mon, 29 Nov 2021 17:34:53 +0500 Subject: [PATCH 08/17] CS2-123: Returned table for roles permissions. --- AsbCloudApp/Data/PermissionDto.cs | 5 +- AsbCloudApp/Data/UserRoleDto.cs | 4 +- AsbCloudApp/Data/UserTokenDto.cs | 2 +- ...6_Fixed_Role_Permissions_Value.Designer.cs | 2893 +++++++++++++++++ ...1129122956_Fixed_Role_Permissions_Value.cs | 223 ++ .../AsbCloudDbContextModelSnapshot.cs | 69 +- AsbCloudDb/Model/AsbCloudDbContext.cs | 19 +- AsbCloudDb/Model/IAsbCloudDbContext.cs | 2 +- AsbCloudDb/Model/Permission.cs | 16 +- ...ermission.cs => RelationRolePermission.cs} | 13 +- AsbCloudDb/Model/RelationUserUserRole.cs | 4 - AsbCloudDb/Model/UserRole.cs | 10 +- AsbCloudDbDemoData/DbDemoDataFiller.cs | 32 + .../Services/AuthService.cs | 40 +- .../Services/UserRoleService.cs | 18 +- 15 files changed, 3259 insertions(+), 91 deletions(-) create mode 100644 AsbCloudDb/Migrations/20211129122956_Fixed_Role_Permissions_Value.Designer.cs create mode 100644 AsbCloudDb/Migrations/20211129122956_Fixed_Role_Permissions_Value.cs rename AsbCloudDb/Model/{RelationUserRolePermission.cs => RelationRolePermission.cs} (79%) diff --git a/AsbCloudApp/Data/PermissionDto.cs b/AsbCloudApp/Data/PermissionDto.cs index 84bd59f9..b6e0d827 100644 --- a/AsbCloudApp/Data/PermissionDto.cs +++ b/AsbCloudApp/Data/PermissionDto.cs @@ -3,7 +3,8 @@ namespace AsbCloudApp.Data public class PermissionDto { public int Id { get; set; } - public string Caption { get; set; } - public int Type { get; set; } + public string Name { get; set; } + public string Description { get; set; } + public string BitDescription { get; set; } } } \ No newline at end of file diff --git a/AsbCloudApp/Data/UserRoleDto.cs b/AsbCloudApp/Data/UserRoleDto.cs index 4e428aac..ade68871 100644 --- a/AsbCloudApp/Data/UserRoleDto.cs +++ b/AsbCloudApp/Data/UserRoleDto.cs @@ -6,8 +6,8 @@ namespace AsbCloudApp.Data { public int Id { get; set; } public string Caption { get; set; } - public int IdParent { get; set; } - public int RoleType { get; set; } + public int? IdParent { get; set; } + public int IdType { 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 36a90374..9b420c7e 100644 --- a/AsbCloudApp/Data/UserTokenDto.cs +++ b/AsbCloudApp/Data/UserTokenDto.cs @@ -6,8 +6,8 @@ namespace AsbCloudApp.Data { public int Id { get; set; } public string CompanyName { get; set; } - public IDictionary Permissions { get; set; } public IEnumerable RoleNames { get; set; } + public IDictionary Permissions { get; set; } public string Token { get; set; } } } diff --git a/AsbCloudDb/Migrations/20211129122956_Fixed_Role_Permissions_Value.Designer.cs b/AsbCloudDb/Migrations/20211129122956_Fixed_Role_Permissions_Value.Designer.cs new file mode 100644 index 00000000..9bef23ab --- /dev/null +++ b/AsbCloudDb/Migrations/20211129122956_Fixed_Role_Permissions_Value.Designer.cs @@ -0,0 +1,2893 @@ +// +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("20211129122956_Fixed_Role_Permissions_Value")] + partial class Fixed_Role_Permissions_Value + { + 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("BitDescription") + .HasColumnType("jsonb") + .HasColumnName("bit_description") + .HasComment("Описание каждого бита разрешений"); + + b.Property("Description") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("description") + .HasComment("Краткое описание"); + + b.Property("Name") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name") + .HasComment("Название"); + + 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.RelationRolePermission", b => + { + b.Property("IdRole") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.Property("IdPermission") + .HasColumnType("integer") + .HasColumnName("id_permission"); + + b.Property("PermissionValue") + .HasColumnType("integer") + .HasColumnName("permission_value"); + + b.HasKey("IdRole", "IdPermission"); + + b.HasIndex("IdPermission"); + + b.ToTable("t_relation_user_role_permission"); + + b + .HasComment("Отношение ролей пользователей и разрешений доступа"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserUserRole", b => + { + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.HasKey("IdUser", "IdUserRole"); + + b.HasIndex("IdUserRole"); + + b.ToTable("t_relation_user_user_role"); + + b + .HasComment("Отношение пользователей и ролей"); + + b.HasData( + new + { + 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("IdType") + .HasColumnType("integer") + .HasColumnName("id_type") + .HasComment("0-роль из стандартной матрицы, \n1-специальная роль для какого-либо пользователя"); + + b.HasKey("Id"); + + b.ToTable("t_user_role"); + + b + .HasComment("Роли пользователей в системе"); + + b.HasData( + new + { + Id = 1, + Caption = "Администратор", + IdType = 0 + }, + new + { + Id = 2, + Caption = "Пользователь", + IdType = 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.RelationRolePermission", b => + { + b.HasOne("AsbCloudDb.Model.Permission", "Permission") + .WithMany("RelationUserRolesPermissions") + .HasForeignKey("IdPermission") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.UserRole", "UserRole") + .WithMany("RelationUserRolesPermissions") + .HasForeignKey("IdRole") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Permission"); + + b.Navigation("UserRole"); + }); + + 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.Permission", b => + { + b.Navigation("RelationUserRolesPermissions"); + }); + + 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("RelationUserRolesPermissions"); + + 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/20211129122956_Fixed_Role_Permissions_Value.cs b/AsbCloudDb/Migrations/20211129122956_Fixed_Role_Permissions_Value.cs new file mode 100644 index 00000000..cce8fba7 --- /dev/null +++ b/AsbCloudDb/Migrations/20211129122956_Fixed_Role_Permissions_Value.cs @@ -0,0 +1,223 @@ +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +namespace AsbCloudDb.Migrations +{ + public partial class Fixed_Role_Permissions_Value : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropPrimaryKey( + name: "PK_t_relation_user_user_role", + table: "t_relation_user_user_role"); + + migrationBuilder.DropIndex( + name: "IX_t_relation_user_user_role_id_user", + table: "t_relation_user_user_role"); + + migrationBuilder.DropPrimaryKey( + name: "PK_t_relation_user_role_permission", + table: "t_relation_user_role_permission"); + + migrationBuilder.DropIndex( + name: "IX_t_relation_user_role_permission_id_user_role", + table: "t_relation_user_role_permission"); + + migrationBuilder.DropColumn( + name: "id", + table: "t_relation_user_user_role"); + + migrationBuilder.DropColumn( + name: "type", + table: "t_permission"); + + migrationBuilder.RenameColumn( + name: "role_type", + table: "t_user_role", + newName: "id_type"); + + migrationBuilder.RenameColumn( + name: "id", + table: "t_relation_user_role_permission", + newName: "permission_value"); + + migrationBuilder.RenameColumn( + name: "caption", + table: "t_permission", + newName: "name"); + + migrationBuilder.AlterColumn( + name: "id_parent", + table: "t_user_role", + type: "integer", + nullable: true, + comment: "От какой роли унаследована данная роль", + oldClrType: typeof(int), + oldType: "integer", + oldComment: "От какой роли унаследована данная роль"); + + migrationBuilder.AlterColumn( + name: "permission_value", + table: "t_relation_user_role_permission", + type: "integer", + nullable: false, + oldClrType: typeof(int), + oldType: "integer") + .OldAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + migrationBuilder.AddColumn( + name: "bit_description", + table: "t_permission", + type: "jsonb", + nullable: true, + comment: "Описание каждого бита разрешений"); + + migrationBuilder.AddColumn( + name: "description", + table: "t_permission", + type: "character varying(255)", + maxLength: 255, + nullable: true, + comment: "Краткое описание"); + + migrationBuilder.AddPrimaryKey( + name: "PK_t_relation_user_user_role", + table: "t_relation_user_user_role", + columns: new[] { "id_user", "id_user_role" }); + + migrationBuilder.AddPrimaryKey( + name: "PK_t_relation_user_role_permission", + table: "t_relation_user_role_permission", + columns: new[] { "id_user_role", "id_permission" }); + + migrationBuilder.InsertData( + table: "t_relation_user_user_role", + columns: new[] { "id_user", "id_user_role" }, + values: new object[] { 1, 2 }); + + migrationBuilder.UpdateData( + table: "t_user_role", + keyColumn: "id", + keyValue: 1, + column: "id_parent", + value: null); + + migrationBuilder.UpdateData( + table: "t_user_role", + keyColumn: "id", + keyValue: 2, + column: "id_parent", + value: null); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropPrimaryKey( + name: "PK_t_relation_user_user_role", + table: "t_relation_user_user_role"); + + migrationBuilder.DropPrimaryKey( + name: "PK_t_relation_user_role_permission", + table: "t_relation_user_role_permission"); + + migrationBuilder.DeleteData( + table: "t_relation_user_user_role", + keyColumns: new[] { "id_user", "id_user_role" }, + keyValues: new object[] { 1, 2 }); + + migrationBuilder.DropColumn( + name: "bit_description", + table: "t_permission"); + + migrationBuilder.DropColumn( + name: "description", + table: "t_permission"); + + migrationBuilder.RenameColumn( + name: "id_type", + table: "t_user_role", + newName: "role_type"); + + migrationBuilder.RenameColumn( + name: "permission_value", + table: "t_relation_user_role_permission", + newName: "id"); + + migrationBuilder.RenameColumn( + name: "name", + table: "t_permission", + newName: "caption"); + + migrationBuilder.AlterColumn( + name: "id_parent", + table: "t_user_role", + type: "integer", + nullable: false, + defaultValue: 0, + comment: "От какой роли унаследована данная роль", + oldClrType: typeof(int), + oldType: "integer", + oldNullable: true, + oldComment: "От какой роли унаследована данная роль"); + + migrationBuilder.AddColumn( + name: "id", + table: "t_relation_user_user_role", + type: "integer", + nullable: false, + defaultValue: 0) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + migrationBuilder.AlterColumn( + name: "id", + table: "t_relation_user_role_permission", + type: "integer", + nullable: false, + oldClrType: typeof(int), + oldType: "integer") + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + migrationBuilder.AddColumn( + name: "type", + table: "t_permission", + type: "integer", + nullable: false, + defaultValue: 0, + comment: "1-чтение, 2-запись, 3-чтение и запись"); + + migrationBuilder.AddPrimaryKey( + name: "PK_t_relation_user_user_role", + table: "t_relation_user_user_role", + column: "id"); + + migrationBuilder.AddPrimaryKey( + name: "PK_t_relation_user_role_permission", + table: "t_relation_user_role_permission", + column: "id"); + + migrationBuilder.UpdateData( + table: "t_user_role", + keyColumn: "id", + keyValue: 1, + column: "id_parent", + value: 0); + + migrationBuilder.UpdateData( + table: "t_user_role", + keyColumn: "id", + keyValue: 2, + column: "id_parent", + value: 0); + + migrationBuilder.CreateIndex( + name: "IX_t_relation_user_user_role_id_user", + table: "t_relation_user_user_role", + column: "id_user"); + + 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 6904c2df..b7a93bfc 100644 --- a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs +++ b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs @@ -689,16 +689,22 @@ namespace AsbCloudDb.Migrations .HasColumnName("id") .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - b.Property("Caption") + b.Property("BitDescription") + .HasColumnType("jsonb") + .HasColumnName("bit_description") + .HasComment("Описание каждого бита разрешений"); + + b.Property("Description") .HasMaxLength(255) .HasColumnType("character varying(255)") - .HasColumnName("caption") - .HasComment("Название"); + .HasColumnName("description") + .HasComment("Краткое описание"); - b.Property("Type") - .HasColumnType("integer") - .HasColumnName("type") - .HasComment("1-чтение, 2-запись, 3-чтение и запись"); + b.Property("Name") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name") + .HasComment("Название"); b.HasKey("Id"); @@ -728,28 +734,24 @@ namespace AsbCloudDb.Migrations .HasComment("отношение скважин и компаний"); }); - modelBuilder.Entity("AsbCloudDb.Model.RelationUserRolePermission", b => + modelBuilder.Entity("AsbCloudDb.Model.RelationRolePermission", b => { - b.Property("Id") - .ValueGeneratedOnAdd() + b.Property("IdRole") .HasColumnType("integer") - .HasColumnName("id") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + .HasColumnName("id_user_role"); b.Property("IdPermission") .HasColumnType("integer") .HasColumnName("id_permission"); - b.Property("IdUserRole") + b.Property("PermissionValue") .HasColumnType("integer") - .HasColumnName("id_user_role"); + .HasColumnName("permission_value"); - b.HasKey("Id"); + b.HasKey("IdRole", "IdPermission"); b.HasIndex("IdPermission"); - b.HasIndex("IdUserRole"); - b.ToTable("t_relation_user_role_permission"); b @@ -758,12 +760,6 @@ namespace AsbCloudDb.Migrations 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"); @@ -772,9 +768,7 @@ namespace AsbCloudDb.Migrations .HasColumnType("integer") .HasColumnName("id_user_role"); - b.HasKey("Id"); - - b.HasIndex("IdUser"); + b.HasKey("IdUser", "IdUserRole"); b.HasIndex("IdUserRole"); @@ -782,6 +776,13 @@ namespace AsbCloudDb.Migrations b .HasComment("Отношение пользователей и ролей"); + + b.HasData( + new + { + IdUser = 1, + IdUserRole = 2 + }); }); modelBuilder.Entity("AsbCloudDb.Model.ReportProperty", b => @@ -1715,14 +1716,14 @@ namespace AsbCloudDb.Migrations .HasColumnName("caption") .HasComment("Название"); - b.Property("IdParent") + b.Property("IdParent") .HasColumnType("integer") .HasColumnName("id_parent") .HasComment("От какой роли унаследована данная роль"); - b.Property("RoleType") + b.Property("IdType") .HasColumnType("integer") - .HasColumnName("role_type") + .HasColumnName("id_type") .HasComment("0-роль из стандартной матрицы, \n1-специальная роль для какого-либо пользователя"); b.HasKey("Id"); @@ -1737,15 +1738,13 @@ namespace AsbCloudDb.Migrations { Id = 1, Caption = "Администратор", - IdParent = 0, - RoleType = 0 + IdType = 0 }, new { Id = 2, Caption = "Пользователь", - IdParent = 0, - RoleType = 0 + IdType = 0 }); }); @@ -2557,7 +2556,7 @@ namespace AsbCloudDb.Migrations b.Navigation("Well"); }); - modelBuilder.Entity("AsbCloudDb.Model.RelationUserRolePermission", b => + modelBuilder.Entity("AsbCloudDb.Model.RelationRolePermission", b => { b.HasOne("AsbCloudDb.Model.Permission", "Permission") .WithMany("RelationUserRolesPermissions") @@ -2567,7 +2566,7 @@ namespace AsbCloudDb.Migrations b.HasOne("AsbCloudDb.Model.UserRole", "UserRole") .WithMany("RelationUserRolesPermissions") - .HasForeignKey("IdUserRole") + .HasForeignKey("IdRole") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); diff --git a/AsbCloudDb/Model/AsbCloudDbContext.cs b/AsbCloudDb/Model/AsbCloudDbContext.cs index 5f4c899b..b57dc14f 100644 --- a/AsbCloudDb/Model/AsbCloudDbContext.cs +++ b/AsbCloudDb/Model/AsbCloudDbContext.cs @@ -39,7 +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 RelationUserRolesPermissions { get; set; } public virtual DbSet Permissions { get; set; } //var options = new DbContextOptionsBuilder() @@ -247,6 +247,16 @@ namespace AsbCloudDb.Model .OnDelete(DeleteBehavior.Cascade) .HasConstraintName("t_file_mark_t_file_info_fk"); }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => new { e.IdUser, e.IdUserRole }); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => new { e.IdRole, e.IdPermission }); + }); FillData(modelBuilder); } @@ -273,6 +283,13 @@ namespace AsbCloudDb.Model }, }); }); + + modelBuilder.Entity(entity => + { + entity.HasData(new List{ + new RelationUserUserRole{ IdUser = 1, IdUserRole = 2, }, + }); + }); modelBuilder.Entity(entity => { diff --git a/AsbCloudDb/Model/IAsbCloudDbContext.cs b/AsbCloudDb/Model/IAsbCloudDbContext.cs index 2ef37cce..13f27606 100644 --- a/AsbCloudDb/Model/IAsbCloudDbContext.cs +++ b/AsbCloudDb/Model/IAsbCloudDbContext.cs @@ -37,7 +37,7 @@ namespace AsbCloudDb.Model DbSet DrillParams { get; set; } DbSet DrillFlowChart { get; set; } DbSet RelationUserUserRoles { get; set; } - DbSet RelationUserRolesPermissions { 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 23a87cc2..3b8f1a1c 100644 --- a/AsbCloudDb/Model/Permission.cs +++ b/AsbCloudDb/Model/Permission.cs @@ -12,14 +12,18 @@ namespace AsbCloudDb.Model [Column("id")] public int Id { get; set; } - [Column("caption"), Comment("Название")] + [Column("name"), Comment("Название")] [StringLength(255)] - public string Caption { get; set; } + public string Name { get; set; } - [Column("type"), Comment("1-чтение, 2-запись, 3-чтение и запись")] - public int Type { get; set; } + [Column("description"), Comment("Краткое описание")] + [StringLength(255)] + public string Description { get; set; } - [InverseProperty(nameof(RelationUserRolePermission.Permission))] - public virtual ICollection RelationUserRolesPermissions { get; set; } + [Column("bit_description", TypeName = "jsonb"), Comment("Описание каждого бита разрешений")] + public string BitDescription { get; set; } + + [InverseProperty(nameof(RelationRolePermission.Permission))] + public virtual ICollection RelationUserRolesPermissions { get; set; } } } \ No newline at end of file diff --git a/AsbCloudDb/Model/RelationUserRolePermission.cs b/AsbCloudDb/Model/RelationRolePermission.cs similarity index 79% rename from AsbCloudDb/Model/RelationUserRolePermission.cs rename to AsbCloudDb/Model/RelationRolePermission.cs index 2f474640..f31f1d18 100644 --- a/AsbCloudDb/Model/RelationUserRolePermission.cs +++ b/AsbCloudDb/Model/RelationRolePermission.cs @@ -5,19 +5,18 @@ using System.ComponentModel.DataAnnotations; namespace AsbCloudDb.Model { [Table("t_relation_user_role_permission"), Comment("Отношение ролей пользователей и разрешений доступа")] - public class RelationUserRolePermission + public class RelationRolePermission { - [Key] - [Column("id")] - public int Id { get; set; } - [Column("id_user_role")] - public int IdUserRole { get; set; } + public int IdRole { get; set; } [Column("id_permission")] public int IdPermission { get; set; } + + [Column("permission_value")] + public int PermissionValue { get; set; } - [ForeignKey(nameof(IdUserRole))] + [ForeignKey(nameof(IdRole))] [InverseProperty(nameof(Model.UserRole.RelationUserRolesPermissions))] public virtual UserRole UserRole { get; set; } diff --git a/AsbCloudDb/Model/RelationUserUserRole.cs b/AsbCloudDb/Model/RelationUserUserRole.cs index f841446d..132875fa 100644 --- a/AsbCloudDb/Model/RelationUserUserRole.cs +++ b/AsbCloudDb/Model/RelationUserUserRole.cs @@ -7,10 +7,6 @@ namespace AsbCloudDb.Model [Table("t_relation_user_user_role"), Comment("Отношение пользователей и ролей")] public class RelationUserUserRole { - [Key] - [Column("id")] - public int Id { get; set; } - [Column("id_user")] public int IdUser { get; set; } diff --git a/AsbCloudDb/Model/UserRole.cs b/AsbCloudDb/Model/UserRole.cs index 24c460cc..de3f4e77 100644 --- a/AsbCloudDb/Model/UserRole.cs +++ b/AsbCloudDb/Model/UserRole.cs @@ -17,17 +17,17 @@ namespace AsbCloudDb.Model [StringLength(255)] public string Caption { get; set; } - [Column("role_type"), Comment("0-роль из стандартной матрицы, \n1-специальная роль для какого-либо пользователя")] - public int RoleType { get; set; } + [Column("id_type"), Comment("0-роль из стандартной матрицы, \n1-специальная роль для какого-либо пользователя")] + public int IdType { get; set; } [Column("id_parent"), Comment("От какой роли унаследована данная роль")] - public int IdParent { get; set; } + public int? IdParent { get; set; } [InverseProperty(nameof(RelationUserUserRole.UserRole))] public virtual ICollection RelationUsersUserRoles { get; set; } - [InverseProperty(nameof(RelationUserRolePermission.UserRole))] - public virtual ICollection RelationUserRolesPermissions { get; set; } + [InverseProperty(nameof(RelationRolePermission.UserRole))] + public virtual ICollection RelationUserRolesPermissions { get; set; } } } diff --git a/AsbCloudDbDemoData/DbDemoDataFiller.cs b/AsbCloudDbDemoData/DbDemoDataFiller.cs index d4756b37..9285fafd 100644 --- a/AsbCloudDbDemoData/DbDemoDataFiller.cs +++ b/AsbCloudDbDemoData/DbDemoDataFiller.cs @@ -168,6 +168,38 @@ namespace AsbCloudDevOperations new WellOperation { Id = 51329, IdWell = 1, IdWellSectionType = 1, IdCategory = 1026, IdType = 0, DepthEnd = 1400, DateStart = DateTime.Parse("2021-08-27 08:30"), DurationHours = 3.5 }, new WellOperation { Id = 76341, IdWell = 1, IdWellSectionType = 1, IdCategory = 1047, IdType = 0, DepthEnd = 1250, DateStart = DateTime.Parse("2021-08-26 11:30"), DurationHours = 3.5 } ); + + demoContext.Permissions.AddRange( + new Permission() + { + Id = 1, + Name = "test permission", + Description = "some description", + BitDescription = "{\"0\": \"some zero bit description\"}" + }, + new Permission() + { + Id = 2, + Name = "second test permission", + Description = "some second description", + BitDescription = "{\"1\": \"some first bit description\"}" + } + ); + + demoContext.RelationUserRolesPermissions.AddRange( + new RelationRolePermission() + { + IdRole = 2, + IdPermission = 1, + PermissionValue = 143 + }, + new RelationRolePermission() + { + IdRole = 2, + IdPermission = 2, + PermissionValue = 12 + } + ); int res = demoContext.SaveChanges(); diff --git a/AsbCloudInfrastructure/Services/AuthService.cs b/AsbCloudInfrastructure/Services/AuthService.cs index c40bd1b0..ad2040f0 100644 --- a/AsbCloudInfrastructure/Services/AuthService.cs +++ b/AsbCloudInfrastructure/Services/AuthService.cs @@ -22,7 +22,7 @@ namespace AsbCloudInfrastructure.Services private readonly CacheTable cacheUserRoles; private readonly CacheTable cacheUsersUserRoles; private readonly CacheTable cachePermissions; - private readonly CacheTable cacheUserRolesPermissions; + private readonly CacheTable cacheUserRolesPermissions; public const string issuer = "a"; public const string audience = "a"; @@ -43,7 +43,7 @@ namespace AsbCloudInfrastructure.Services cacheUserRoles = cacheDb.GetCachedTable((AsbCloudDbContext)db); cacheUsersUserRoles = cacheDb.GetCachedTable((AsbCloudDbContext)db); cachePermissions = cacheDb.GetCachedTable((AsbCloudDbContext)db); - cacheUserRolesPermissions = cacheDb.GetCachedTable((AsbCloudDbContext)db); + cacheUserRolesPermissions = cacheDb.GetCachedTable((AsbCloudDbContext)db); hashAlgoritm = SHA384.Create(); rnd = new Random((int)(DateTime.Now.Ticks % 2147480161)); } @@ -57,10 +57,10 @@ namespace AsbCloudInfrastructure.Services if (identity == default || user.State == 0) return null; - var idCaptionRoles = GetUserRolesIdsNames(user.Id); - - var userPermissions = GetUserPermissions(idCaptionRoles.Select(r => r.Id)); + var userRoles = GetUserRoles(user.Id); + var roleNames = userRoles.Select(r => r.Caption); + return new UserTokenDto { Id = user.Id, @@ -68,8 +68,8 @@ namespace AsbCloudInfrastructure.Services CompanyName = user.Company.Caption, Login = user.Login, Patronymic = user.Patronymic, - RoleNames = idCaptionRoles.Select(r => r.Caption), - Permissions = userPermissions, + RoleNames = roleNames, + Permissions = GetUserPermissions(userRoles), Surname = user.Surname, Token = MakeToken(identity.Claims), }; @@ -177,22 +177,26 @@ namespace AsbCloudInfrastructure.Services return new JwtSecurityTokenHandler().WriteToken(jwt); } - private IEnumerable<(int Id, string Caption)> GetUserRolesIdsNames(int idUser) + private IEnumerable GetUserRoles(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.Id, r.Caption)); + return cacheUserRoles.Where(r => userRolesIds.Contains(r.Id)); } - - private IDictionary GetUserPermissions(IEnumerable idRoles) + + private IDictionary GetUserPermissions(IEnumerable userRoles) { - 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); + var rolesIds = userRoles.Select(r => r.Id); + var userPermissionsInfo = cacheUserRolesPermissions.Where(p => + rolesIds.Contains(p.IdRole)) + .Select(perm => new { perm.IdPermission, perm.PermissionValue }); + + return userPermissionsInfo.Select(p => new + { + PermissionName = cachePermissions.FirstOrDefault(c => c.Id == p.IdPermission)?.Name, + PermissionValue = p.PermissionValue + }).ToDictionary(k => k.PermissionName, v => v.PermissionValue); } private async Task<(ClaimsIdentity Identity, User User)> GetClaimsUserAsync(string login, @@ -210,7 +214,7 @@ namespace AsbCloudInfrastructure.Services if (!CheckPassword(user.PasswordHash, password)) return default; - var userRolesNames = GetUserRolesIdsNames(user.Id) + var userRolesNames = GetUserRoles(user.Id) .Select(r => r.Caption); var claims = new List diff --git a/AsbCloudInfrastructure/Services/UserRoleService.cs b/AsbCloudInfrastructure/Services/UserRoleService.cs index f34d7a95..244dd127 100644 --- a/AsbCloudInfrastructure/Services/UserRoleService.cs +++ b/AsbCloudInfrastructure/Services/UserRoleService.cs @@ -14,7 +14,7 @@ namespace AsbCloudInfrastructure.Services { private readonly CacheTable cacheUserRoles; private readonly CacheTable cachePermissions; - private readonly CacheTable cacheUserRolesPermissions; + private readonly CacheTable cacheUserRolesPermissions; private int counter = 0; public UserRoleService(IAsbCloudDbContext context, CacheDb cacheDb) : base(context) @@ -22,7 +22,7 @@ namespace AsbCloudInfrastructure.Services cacheUserRoles = cacheDb.GetCachedTable((AsbCloudDbContext)context); cachePermissions = cacheDb.GetCachedTable((AsbCloudDbContext)context); cacheUserRolesPermissions = - cacheDb.GetCachedTable((AsbCloudDbContext)context); + cacheDb.GetCachedTable((AsbCloudDbContext)context); } public override async Task> GetPageAsync(int skip = 0, @@ -56,9 +56,9 @@ namespace AsbCloudInfrastructure.Services foreach (var pId in dto.PermissionIds) { - var relation = new RelationUserRolePermission() + var relation = new RelationRolePermission() { - IdUserRole = newRoleId, + IdRole = newRoleId, IdPermission = pId }; @@ -75,12 +75,12 @@ namespace AsbCloudInfrastructure.Services if (item.PermissionIds == default) return result; - await cacheUserRolesPermissions.RemoveAsync(r => r.IdUserRole == item.Id, token) + await cacheUserRolesPermissions.RemoveAsync(r => r.IdRole == item.Id, token) .ConfigureAwait(false); - var newRelations = item.PermissionIds.Select(p => new RelationUserRolePermission() + var newRelations = item.PermissionIds.Select(p => new RelationRolePermission() { - IdUserRole = item.Id, + IdRole = item.Id, IdPermission = p }); await cacheUserRolesPermissions.InsertAsync(newRelations, token); @@ -91,7 +91,7 @@ namespace AsbCloudInfrastructure.Services private UserRoleDto FillUserRoleWithPermissions(UserRoleDto roleDto) { var rolePermissionIds = cacheUserRolesPermissions.Where(c => - c.IdUserRole == roleDto.Id).Select(p => p.IdPermission); + c.IdRole == roleDto.Id).Select(p => p.IdPermission); roleDto.Permissions = cachePermissions.Where(permission => rolePermissionIds.Contains(permission.Id)) .Adapt(); @@ -115,7 +115,7 @@ namespace AsbCloudInfrastructure.Services var parentRole = cacheUserRoles.FirstOrDefault(r => r.Id == idParent) .Adapt(); var parentRolePermissionsIds = cacheUserRolesPermissions.Where(p => - p.IdUserRole == parentRole.Id).Select(perm => perm.IdPermission); + p.IdRole == parentRole.Id).Select(perm => perm.IdPermission); parentRole.PermissionIds = resultPermissionsIds.Union(parentRolePermissionsIds); counter++; From fd139079a47d9cc9af5f66cefbdd0b58e8189f7a Mon Sep 17 00:00:00 2001 From: KharchenkoVladimir Date: Tue, 30 Nov 2021 09:34:23 +0500 Subject: [PATCH 09/17] CS2-123: Added [JsonIgnore] to UserRoleDto --- AsbCloudApp/Data/UserRoleDto.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/AsbCloudApp/Data/UserRoleDto.cs b/AsbCloudApp/Data/UserRoleDto.cs index ade68871..6a2348e4 100644 --- a/AsbCloudApp/Data/UserRoleDto.cs +++ b/AsbCloudApp/Data/UserRoleDto.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Text.Json.Serialization; namespace AsbCloudApp.Data { @@ -8,8 +9,9 @@ namespace AsbCloudApp.Data public string Caption { get; set; } public int? IdParent { get; set; } public int IdType { get; set; } - public virtual ICollection Users { get; set; } public IEnumerable PermissionIds { get; set; } public IEnumerable Permissions { get; set; } + [JsonIgnore] + public virtual ICollection Users { get; set; } } } From ad061bbca58cc46b7518c2efba620aae034df60a Mon Sep 17 00:00:00 2001 From: KharchenkoVladimir Date: Tue, 30 Nov 2021 17:22:38 +0500 Subject: [PATCH 10/17] CS2-123: Renamed permission tables, removed roles from claims, etc --- AsbCloudApp/Services/IUserRoleService.cs | 17 - ...716_Renamed_Permissions_Tables.Designer.cs | 2893 +++++++++++++++++ ...211130121716_Renamed_Permissions_Tables.cs | 214 ++ .../AsbCloudDbContextModelSnapshot.cs | 92 +- AsbCloudDb/Model/AsbCloudDbContext.cs | 6 +- AsbCloudDb/Model/IAsbCloudDbContext.cs | 4 +- AsbCloudDb/Model/Permission.cs | 36 +- AsbCloudDb/Model/PermissionInfo.cs | 29 + AsbCloudDb/Model/RelationRolePermission.cs | 27 - AsbCloudDb/Model/UserRole.cs | 4 +- AsbCloudDbDemoData/DbDemoDataFiller.cs | 12 +- .../Services/AuthService.cs | 10 +- .../Services/UserRoleService.cs | 31 +- 13 files changed, 3232 insertions(+), 143 deletions(-) delete mode 100644 AsbCloudApp/Services/IUserRoleService.cs create mode 100644 AsbCloudDb/Migrations/20211130121716_Renamed_Permissions_Tables.Designer.cs create mode 100644 AsbCloudDb/Migrations/20211130121716_Renamed_Permissions_Tables.cs create mode 100644 AsbCloudDb/Model/PermissionInfo.cs delete mode 100644 AsbCloudDb/Model/RelationRolePermission.cs diff --git a/AsbCloudApp/Services/IUserRoleService.cs b/AsbCloudApp/Services/IUserRoleService.cs deleted file mode 100644 index 1e7990a4..00000000 --- a/AsbCloudApp/Services/IUserRoleService.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using AsbCloudApp.Data; - - -namespace AsbCloudApp.Services -{ - public interface IUserRoleService - { - Task> GetAllAsync(CancellationToken token); - Task GetAsync(int id, CancellationToken token); - Task InsertAsync(UserRoleDto dto, CancellationToken token = default); - Task UpdateAsync(UserRoleDto dto, CancellationToken token = default); - Task DeleteAsync(IEnumerable ids, CancellationToken token); - } -} \ No newline at end of file diff --git a/AsbCloudDb/Migrations/20211130121716_Renamed_Permissions_Tables.Designer.cs b/AsbCloudDb/Migrations/20211130121716_Renamed_Permissions_Tables.Designer.cs new file mode 100644 index 00000000..fe9b2043 --- /dev/null +++ b/AsbCloudDb/Migrations/20211130121716_Renamed_Permissions_Tables.Designer.cs @@ -0,0 +1,2893 @@ +// +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("20211130121716_Renamed_Permissions_Tables")] + partial class Renamed_Permissions_Tables + { + 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("IdRole") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.Property("IdPermission") + .HasColumnType("integer") + .HasColumnName("id_permission"); + + b.Property("PermissionValue") + .HasColumnType("integer") + .HasColumnName("permission_value"); + + b.HasKey("IdRole", "IdPermission"); + + b.HasIndex("IdPermission"); + + b.ToTable("t_permission"); + + b + .HasComment("Отношение ролей пользователей и разрешений доступа"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.PermissionInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property>("BitDescription") + .HasColumnType("jsonb") + .HasColumnName("bit_description") + .HasComment("Описание каждого бита разрешений"); + + b.Property("Description") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("description") + .HasComment("Краткое описание"); + + b.Property("Name") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name") + .HasComment("Название"); + + b.HasKey("Id"); + + b.ToTable("t_permission_info"); + + 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("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.HasKey("IdUser", "IdUserRole"); + + b.HasIndex("IdUserRole"); + + b.ToTable("t_relation_user_user_role"); + + b + .HasComment("Отношение пользователей и ролей"); + + b.HasData( + new + { + 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("IdType") + .HasColumnType("integer") + .HasColumnName("id_type") + .HasComment("0-роль из стандартной матрицы, \n1-специальная роль для какого-либо пользователя"); + + b.HasKey("Id"); + + b.ToTable("t_user_role"); + + b + .HasComment("Роли пользователей в системе"); + + b.HasData( + new + { + Id = 1, + Caption = "Администратор", + IdType = 0 + }, + new + { + Id = 2, + Caption = "Пользователь", + IdType = 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.Permission", b => + { + b.HasOne("AsbCloudDb.Model.PermissionInfo", "PermissionInfo") + .WithMany("RelationUserRolesPermissions") + .HasForeignKey("IdPermission") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.UserRole", "UserRole") + .WithMany("RelationUserRolesPermissions") + .HasForeignKey("IdRole") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("PermissionInfo"); + + b.Navigation("UserRole"); + }); + + 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.PermissionInfo", b => + { + b.Navigation("RelationUserRolesPermissions"); + }); + + 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("RelationUserRolesPermissions"); + + 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/20211130121716_Renamed_Permissions_Tables.cs b/AsbCloudDb/Migrations/20211130121716_Renamed_Permissions_Tables.cs new file mode 100644 index 00000000..74265926 --- /dev/null +++ b/AsbCloudDb/Migrations/20211130121716_Renamed_Permissions_Tables.cs @@ -0,0 +1,214 @@ +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +namespace AsbCloudDb.Migrations +{ + public partial class Renamed_Permissions_Tables : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "t_relation_user_role_permission"); + + migrationBuilder.DropPrimaryKey( + name: "PK_t_permission", + table: "t_permission"); + + migrationBuilder.DropColumn( + name: "bit_description", + table: "t_permission"); + + migrationBuilder.DropColumn( + name: "description", + table: "t_permission"); + + migrationBuilder.DropColumn( + name: "name", + table: "t_permission"); + + migrationBuilder.RenameColumn( + name: "id", + table: "t_permission", + newName: "permission_value"); + + migrationBuilder.AlterTable( + name: "t_permission", + comment: "Отношение ролей пользователей и разрешений доступа", + oldComment: "Разрешения на доступ к данным"); + + migrationBuilder.AlterColumn( + name: "permission_value", + table: "t_permission", + type: "integer", + nullable: false, + oldClrType: typeof(int), + oldType: "integer") + .OldAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + migrationBuilder.AddColumn( + name: "id_user_role", + table: "t_permission", + type: "integer", + nullable: false, + defaultValue: 0); + + migrationBuilder.AddColumn( + name: "id_permission", + table: "t_permission", + type: "integer", + nullable: false, + defaultValue: 0); + + migrationBuilder.AddPrimaryKey( + name: "PK_t_permission", + table: "t_permission", + columns: new[] { "id_user_role", "id_permission" }); + + migrationBuilder.CreateTable( + name: "t_permission_info", + columns: table => new + { + id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + name = table.Column(type: "character varying(255)", maxLength: 255, nullable: true, comment: "Название"), + description = table.Column(type: "character varying(255)", maxLength: 255, nullable: true, comment: "Краткое описание"), + bit_description = table.Column>(type: "jsonb", nullable: true, comment: "Описание каждого бита разрешений") + }, + constraints: table => + { + table.PrimaryKey("PK_t_permission_info", x => x.id); + }, + comment: "Разрешения на доступ к данным"); + + migrationBuilder.CreateIndex( + name: "IX_t_permission_id_permission", + table: "t_permission", + column: "id_permission"); + + migrationBuilder.AddForeignKey( + name: "FK_t_permission_t_permission_info_id_permission", + table: "t_permission", + column: "id_permission", + principalTable: "t_permission_info", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_t_permission_t_user_role_id_user_role", + table: "t_permission", + column: "id_user_role", + principalTable: "t_user_role", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_t_permission_t_permission_info_id_permission", + table: "t_permission"); + + migrationBuilder.DropForeignKey( + name: "FK_t_permission_t_user_role_id_user_role", + table: "t_permission"); + + migrationBuilder.DropTable( + name: "t_permission_info"); + + migrationBuilder.DropPrimaryKey( + name: "PK_t_permission", + table: "t_permission"); + + migrationBuilder.DropIndex( + name: "IX_t_permission_id_permission", + table: "t_permission"); + + migrationBuilder.DropColumn( + name: "id_user_role", + table: "t_permission"); + + migrationBuilder.DropColumn( + name: "id_permission", + table: "t_permission"); + + migrationBuilder.RenameColumn( + name: "permission_value", + table: "t_permission", + newName: "id"); + + migrationBuilder.AlterTable( + name: "t_permission", + comment: "Разрешения на доступ к данным", + oldComment: "Отношение ролей пользователей и разрешений доступа"); + + migrationBuilder.AlterColumn( + name: "id", + table: "t_permission", + type: "integer", + nullable: false, + oldClrType: typeof(int), + oldType: "integer") + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + migrationBuilder.AddColumn( + name: "bit_description", + table: "t_permission", + type: "jsonb", + nullable: true, + comment: "Описание каждого бита разрешений"); + + migrationBuilder.AddColumn( + name: "description", + table: "t_permission", + type: "character varying(255)", + maxLength: 255, + nullable: true, + comment: "Краткое описание"); + + migrationBuilder.AddColumn( + name: "name", + table: "t_permission", + type: "character varying(255)", + maxLength: 255, + nullable: true, + comment: "Название"); + + migrationBuilder.AddPrimaryKey( + name: "PK_t_permission", + table: "t_permission", + column: "id"); + + migrationBuilder.CreateTable( + name: "t_relation_user_role_permission", + columns: table => new + { + id_user_role = table.Column(type: "integer", nullable: false), + id_permission = table.Column(type: "integer", nullable: false), + permission_value = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_t_relation_user_role_permission", x => new { x.id_user_role, x.id_permission }); + 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"); + } + } +} diff --git a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs index b7a93bfc..8e8fc68a 100644 --- a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs +++ b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs @@ -682,6 +682,30 @@ namespace AsbCloudDb.Migrations }); modelBuilder.Entity("AsbCloudDb.Model.Permission", b => + { + b.Property("IdRole") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.Property("IdPermission") + .HasColumnType("integer") + .HasColumnName("id_permission"); + + b.Property("PermissionValue") + .HasColumnType("integer") + .HasColumnName("permission_value"); + + b.HasKey("IdRole", "IdPermission"); + + b.HasIndex("IdPermission"); + + b.ToTable("t_permission"); + + b + .HasComment("Отношение ролей пользователей и разрешений доступа"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.PermissionInfo", b => { b.Property("Id") .ValueGeneratedOnAdd() @@ -689,7 +713,7 @@ namespace AsbCloudDb.Migrations .HasColumnName("id") .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - b.Property("BitDescription") + b.Property>("BitDescription") .HasColumnType("jsonb") .HasColumnName("bit_description") .HasComment("Описание каждого бита разрешений"); @@ -708,7 +732,7 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_permission"); + b.ToTable("t_permission_info"); b .HasComment("Разрешения на доступ к данным"); @@ -734,30 +758,6 @@ namespace AsbCloudDb.Migrations .HasComment("отношение скважин и компаний"); }); - modelBuilder.Entity("AsbCloudDb.Model.RelationRolePermission", b => - { - b.Property("IdRole") - .HasColumnType("integer") - .HasColumnName("id_user_role"); - - b.Property("IdPermission") - .HasColumnType("integer") - .HasColumnName("id_permission"); - - b.Property("PermissionValue") - .HasColumnType("integer") - .HasColumnName("permission_value"); - - b.HasKey("IdRole", "IdPermission"); - - b.HasIndex("IdPermission"); - - b.ToTable("t_relation_user_role_permission"); - - b - .HasComment("Отношение ролей пользователей и разрешений доступа"); - }); - modelBuilder.Entity("AsbCloudDb.Model.RelationUserUserRole", b => { b.Property("IdUser") @@ -2535,6 +2535,25 @@ namespace AsbCloudDb.Migrations b.Navigation("Well"); }); + modelBuilder.Entity("AsbCloudDb.Model.Permission", b => + { + b.HasOne("AsbCloudDb.Model.PermissionInfo", "PermissionInfo") + .WithMany("RelationUserRolesPermissions") + .HasForeignKey("IdPermission") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.UserRole", "UserRole") + .WithMany("RelationUserRolesPermissions") + .HasForeignKey("IdRole") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("PermissionInfo"); + + b.Navigation("UserRole"); + }); + modelBuilder.Entity("AsbCloudDb.Model.RelationCompanyWell", b => { b.HasOne("AsbCloudDb.Model.Company", "Company") @@ -2556,25 +2575,6 @@ namespace AsbCloudDb.Migrations b.Navigation("Well"); }); - modelBuilder.Entity("AsbCloudDb.Model.RelationRolePermission", b => - { - b.HasOne("AsbCloudDb.Model.Permission", "Permission") - .WithMany("RelationUserRolesPermissions") - .HasForeignKey("IdPermission") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.UserRole", "UserRole") - .WithMany("RelationUserRolesPermissions") - .HasForeignKey("IdRole") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Permission"); - - b.Navigation("UserRole"); - }); - modelBuilder.Entity("AsbCloudDb.Model.RelationUserUserRole", b => { b.HasOne("AsbCloudDb.Model.User", "User") @@ -2818,7 +2818,7 @@ namespace AsbCloudDb.Migrations b.Navigation("Measures"); }); - modelBuilder.Entity("AsbCloudDb.Model.Permission", b => + modelBuilder.Entity("AsbCloudDb.Model.PermissionInfo", b => { b.Navigation("RelationUserRolesPermissions"); }); diff --git a/AsbCloudDb/Model/AsbCloudDbContext.cs b/AsbCloudDb/Model/AsbCloudDbContext.cs index b57dc14f..c52b66fe 100644 --- a/AsbCloudDb/Model/AsbCloudDbContext.cs +++ b/AsbCloudDb/Model/AsbCloudDbContext.cs @@ -39,8 +39,8 @@ 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; } + public virtual DbSet RelationUserRolesPermissions { get; set; } + public virtual DbSet Permissions { get; set; } //var options = new DbContextOptionsBuilder() // .UseNpgsql("Host=localhost;Database=postgres;Username=postgres;Password=q;Persist Security Info=True") @@ -253,7 +253,7 @@ namespace AsbCloudDb.Model entity.HasKey(e => new { e.IdUser, e.IdUserRole }); }); - modelBuilder.Entity(entity => + modelBuilder.Entity(entity => { entity.HasKey(e => new { e.IdRole, e.IdPermission }); }); diff --git a/AsbCloudDb/Model/IAsbCloudDbContext.cs b/AsbCloudDb/Model/IAsbCloudDbContext.cs index 13f27606..c17261ad 100644 --- a/AsbCloudDb/Model/IAsbCloudDbContext.cs +++ b/AsbCloudDb/Model/IAsbCloudDbContext.cs @@ -37,8 +37,8 @@ namespace AsbCloudDb.Model DbSet DrillParams { get; set; } DbSet DrillFlowChart { get; set; } DbSet RelationUserUserRoles { get; set; } - DbSet RelationUserRolesPermissions { get; set; } - DbSet Permissions { 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 3b8f1a1c..d973890f 100644 --- a/AsbCloudDb/Model/Permission.cs +++ b/AsbCloudDb/Model/Permission.cs @@ -1,29 +1,27 @@ using Microsoft.EntityFrameworkCore; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations; namespace AsbCloudDb.Model { - [Table("t_permission"), Comment("Разрешения на доступ к данным")] + [Table("t_permission"), Comment("Отношение ролей пользователей и разрешений доступа")] public class Permission { - [Key] - [Column("id")] - public int Id { get; set; } + [Column("id_user_role")] + public int IdRole { get; set; } + + [Column("id_permission")] + public int IdPermission { get; set; } - [Column("name"), Comment("Название")] - [StringLength(255)] - public string Name { get; set; } - - [Column("description"), Comment("Краткое описание")] - [StringLength(255)] - public string Description { get; set; } - - [Column("bit_description", TypeName = "jsonb"), Comment("Описание каждого бита разрешений")] - public string BitDescription { get; set; } - - [InverseProperty(nameof(RelationRolePermission.Permission))] - public virtual ICollection RelationUserRolesPermissions { get; set; } + [Column("permission_value")] + public int PermissionValue { get; set; } + + [ForeignKey(nameof(IdRole))] + [InverseProperty(nameof(Model.UserRole.Permissions))] + public virtual UserRole UserRole { get; set; } + + [ForeignKey(nameof(IdPermission))] + [InverseProperty(nameof(Model.PermissionInfo.Permissions))] + public virtual PermissionInfo PermissionInfo { get; set; } } } \ No newline at end of file diff --git a/AsbCloudDb/Model/PermissionInfo.cs b/AsbCloudDb/Model/PermissionInfo.cs new file mode 100644 index 00000000..901400a7 --- /dev/null +++ b/AsbCloudDb/Model/PermissionInfo.cs @@ -0,0 +1,29 @@ +using Microsoft.EntityFrameworkCore; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace AsbCloudDb.Model +{ + [Table("t_permission_info"), Comment("Разрешения на доступ к данным")] + public class PermissionInfo + { + [Key] + [Column("id")] + public int Id { get; set; } + + [Column("name"), Comment("Название")] + [StringLength(255)] + public string Name { get; set; } + + [Column("description"), Comment("Краткое описание")] + [StringLength(255)] + public string Description { get; set; } + + [Column("bit_description", TypeName = "jsonb"), Comment("Описание каждого бита разрешений")] + public IDictionary BitDescription { get; set; } + + [InverseProperty(nameof(Permission.PermissionInfo))] + public virtual ICollection Permissions { get; set; } + } +} \ No newline at end of file diff --git a/AsbCloudDb/Model/RelationRolePermission.cs b/AsbCloudDb/Model/RelationRolePermission.cs deleted file mode 100644 index f31f1d18..00000000 --- a/AsbCloudDb/Model/RelationRolePermission.cs +++ /dev/null @@ -1,27 +0,0 @@ -using Microsoft.EntityFrameworkCore; -using System.ComponentModel.DataAnnotations.Schema; -using System.ComponentModel.DataAnnotations; - -namespace AsbCloudDb.Model -{ - [Table("t_relation_user_role_permission"), Comment("Отношение ролей пользователей и разрешений доступа")] - public class RelationRolePermission - { - [Column("id_user_role")] - public int IdRole { get; set; } - - [Column("id_permission")] - public int IdPermission { get; set; } - - [Column("permission_value")] - public int PermissionValue { get; set; } - - [ForeignKey(nameof(IdRole))] - [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 de3f4e77..c8c83c22 100644 --- a/AsbCloudDb/Model/UserRole.cs +++ b/AsbCloudDb/Model/UserRole.cs @@ -27,7 +27,7 @@ namespace AsbCloudDb.Model [InverseProperty(nameof(RelationUserUserRole.UserRole))] public virtual ICollection RelationUsersUserRoles { get; set; } - [InverseProperty(nameof(RelationRolePermission.UserRole))] - public virtual ICollection RelationUserRolesPermissions { get; set; } + [InverseProperty(nameof(Permission.UserRole))] + public virtual ICollection Permissions { get; set; } } } diff --git a/AsbCloudDbDemoData/DbDemoDataFiller.cs b/AsbCloudDbDemoData/DbDemoDataFiller.cs index 9285fafd..c8dc19bd 100644 --- a/AsbCloudDbDemoData/DbDemoDataFiller.cs +++ b/AsbCloudDbDemoData/DbDemoDataFiller.cs @@ -170,30 +170,30 @@ namespace AsbCloudDevOperations ); demoContext.Permissions.AddRange( - new Permission() + new PermissionInfo() { Id = 1, Name = "test permission", Description = "some description", - BitDescription = "{\"0\": \"some zero bit description\"}" + BitDescription = new Dictionary() {{0, "some zero bit description"}} }, - new Permission() + new PermissionInfo() { Id = 2, Name = "second test permission", Description = "some second description", - BitDescription = "{\"1\": \"some first bit description\"}" + BitDescription = new Dictionary() {{1, "some first bit description"}} } ); demoContext.RelationUserRolesPermissions.AddRange( - new RelationRolePermission() + new Permission() { IdRole = 2, IdPermission = 1, PermissionValue = 143 }, - new RelationRolePermission() + new Permission() { IdRole = 2, IdPermission = 2, diff --git a/AsbCloudInfrastructure/Services/AuthService.cs b/AsbCloudInfrastructure/Services/AuthService.cs index ad2040f0..c6ed3b1d 100644 --- a/AsbCloudInfrastructure/Services/AuthService.cs +++ b/AsbCloudInfrastructure/Services/AuthService.cs @@ -21,8 +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; + private readonly CacheTable cachePermissions; + private readonly CacheTable cacheUserRolesPermissions; public const string issuer = "a"; public const string audience = "a"; @@ -42,8 +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); + cachePermissions = cacheDb.GetCachedTable((AsbCloudDbContext)db); + cacheUserRolesPermissions = cacheDb.GetCachedTable((AsbCloudDbContext)db); hashAlgoritm = SHA384.Create(); rnd = new Random((int)(DateTime.Now.Ticks % 2147480161)); } @@ -223,8 +223,6 @@ namespace AsbCloudInfrastructure.Services new Claim(ClaimsIdentity.DefaultNameClaimType, user.Login), new Claim(claimNameidCompany, user.IdCompany.ToString()), }; - - claims.AddRange(userRolesNames.Select(roleName => new Claim(ClaimsIdentity.DefaultRoleClaimType, roleName))); 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 244dd127..4647fa30 100644 --- a/AsbCloudInfrastructure/Services/UserRoleService.cs +++ b/AsbCloudInfrastructure/Services/UserRoleService.cs @@ -13,16 +13,16 @@ namespace AsbCloudInfrastructure.Services public class UserRoleService : CrudServiceBase { private readonly CacheTable cacheUserRoles; - private readonly CacheTable cachePermissions; - private readonly CacheTable cacheUserRolesPermissions; + 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); + cachePermissions = cacheDb.GetCachedTable((AsbCloudDbContext)context); cacheUserRolesPermissions = - cacheDb.GetCachedTable((AsbCloudDbContext)context); + cacheDb.GetCachedTable((AsbCloudDbContext)context); } public override async Task> GetPageAsync(int skip = 0, @@ -47,7 +47,7 @@ namespace AsbCloudInfrastructure.Services public override async Task InsertAsync(UserRoleDto dto, CancellationToken token = default) { - dto.PermissionIds = GetAncestorsPermissionIds(dto, ref counter); + dto.PermissionIds = GetAncestorsPermissionIds(dto.Id, dto.PermissionIds, dto.IdParent, ref counter); var newRoleId = await base.InsertAsync(dto, token); @@ -56,7 +56,7 @@ namespace AsbCloudInfrastructure.Services foreach (var pId in dto.PermissionIds) { - var relation = new RelationRolePermission() + var relation = new Permission() { IdRole = newRoleId, IdPermission = pId @@ -78,7 +78,7 @@ namespace AsbCloudInfrastructure.Services await cacheUserRolesPermissions.RemoveAsync(r => r.IdRole == item.Id, token) .ConfigureAwait(false); - var newRelations = item.PermissionIds.Select(p => new RelationRolePermission() + var newRelations = item.PermissionIds.Select(p => new Permission() { IdRole = item.Id, IdPermission = p @@ -98,29 +98,30 @@ namespace AsbCloudInfrastructure.Services return roleDto; } - private IEnumerable GetAncestorsPermissionIds(UserRoleDto userRoleDto, ref int counter) + private IEnumerable GetAncestorsPermissionIds(int idRole, IEnumerable currentPermissionsIds, + int? idParent, ref int counter) { - var idParent = userRoleDto.IdParent; - var resultPermissionsIds = userRoleDto.PermissionIds ?? new List(); + //var currentPermissionsIds = userRoleDto.PermissionIds ?? new List(); if (idParent == default) - return resultPermissionsIds; + return currentPermissionsIds; if (counter > 10) { - Trace.WriteLine($"User role with id: {userRoleDto.Id} has more than 10 nested parents"); - return resultPermissionsIds; + Trace.WriteLine($"User role with id: {idRole} has more than 10 nested parents"); + return currentPermissionsIds; } var parentRole = cacheUserRoles.FirstOrDefault(r => r.Id == idParent) .Adapt(); var parentRolePermissionsIds = cacheUserRolesPermissions.Where(p => p.IdRole == parentRole.Id).Select(perm => perm.IdPermission); - parentRole.PermissionIds = resultPermissionsIds.Union(parentRolePermissionsIds); + var resultPermissions = currentPermissionsIds.Union(parentRolePermissionsIds); counter++; - return GetAncestorsPermissionIds(parentRole, ref counter); + return GetAncestorsPermissionIds(parentRole.Id, resultPermissions, + parentRole.IdParent, ref counter); } } } \ No newline at end of file From 1d078379b4a4a56094eecf4135be6a7d77c5c03d Mon Sep 17 00:00:00 2001 From: KharchenkoVladimir Date: Tue, 30 Nov 2021 17:25:08 +0500 Subject: [PATCH 11/17] CS2-123: Renamed Permission collections in EF models --- ..._Renamed_PermissionCollections.Designer.cs | 2893 +++++++++++++++++ ...130122321_Renamed_PermissionCollections.cs | 17 + .../AsbCloudDbContextModelSnapshot.cs | 8 +- 3 files changed, 2914 insertions(+), 4 deletions(-) create mode 100644 AsbCloudDb/Migrations/20211130122321_Renamed_PermissionCollections.Designer.cs create mode 100644 AsbCloudDb/Migrations/20211130122321_Renamed_PermissionCollections.cs diff --git a/AsbCloudDb/Migrations/20211130122321_Renamed_PermissionCollections.Designer.cs b/AsbCloudDb/Migrations/20211130122321_Renamed_PermissionCollections.Designer.cs new file mode 100644 index 00000000..b2dc583b --- /dev/null +++ b/AsbCloudDb/Migrations/20211130122321_Renamed_PermissionCollections.Designer.cs @@ -0,0 +1,2893 @@ +// +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("20211130122321_Renamed_PermissionCollections")] + partial class Renamed_PermissionCollections + { + 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("IdRole") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.Property("IdPermission") + .HasColumnType("integer") + .HasColumnName("id_permission"); + + b.Property("PermissionValue") + .HasColumnType("integer") + .HasColumnName("permission_value"); + + b.HasKey("IdRole", "IdPermission"); + + b.HasIndex("IdPermission"); + + b.ToTable("t_permission"); + + b + .HasComment("Отношение ролей пользователей и разрешений доступа"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.PermissionInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property>("BitDescription") + .HasColumnType("jsonb") + .HasColumnName("bit_description") + .HasComment("Описание каждого бита разрешений"); + + b.Property("Description") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("description") + .HasComment("Краткое описание"); + + b.Property("Name") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name") + .HasComment("Название"); + + b.HasKey("Id"); + + b.ToTable("t_permission_info"); + + 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("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.HasKey("IdUser", "IdUserRole"); + + b.HasIndex("IdUserRole"); + + b.ToTable("t_relation_user_user_role"); + + b + .HasComment("Отношение пользователей и ролей"); + + b.HasData( + new + { + 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("IdType") + .HasColumnType("integer") + .HasColumnName("id_type") + .HasComment("0-роль из стандартной матрицы, \n1-специальная роль для какого-либо пользователя"); + + b.HasKey("Id"); + + b.ToTable("t_user_role"); + + b + .HasComment("Роли пользователей в системе"); + + b.HasData( + new + { + Id = 1, + Caption = "Администратор", + IdType = 0 + }, + new + { + Id = 2, + Caption = "Пользователь", + IdType = 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.Permission", b => + { + b.HasOne("AsbCloudDb.Model.PermissionInfo", "PermissionInfo") + .WithMany("Permissions") + .HasForeignKey("IdPermission") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.UserRole", "UserRole") + .WithMany("Permissions") + .HasForeignKey("IdRole") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("PermissionInfo"); + + b.Navigation("UserRole"); + }); + + 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.PermissionInfo", b => + { + b.Navigation("Permissions"); + }); + + 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("Permissions"); + + 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/20211130122321_Renamed_PermissionCollections.cs b/AsbCloudDb/Migrations/20211130122321_Renamed_PermissionCollections.cs new file mode 100644 index 00000000..8c96152b --- /dev/null +++ b/AsbCloudDb/Migrations/20211130122321_Renamed_PermissionCollections.cs @@ -0,0 +1,17 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace AsbCloudDb.Migrations +{ + public partial class Renamed_PermissionCollections : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + + } + } +} diff --git a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs index 8e8fc68a..a300cd01 100644 --- a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs +++ b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs @@ -2538,13 +2538,13 @@ namespace AsbCloudDb.Migrations modelBuilder.Entity("AsbCloudDb.Model.Permission", b => { b.HasOne("AsbCloudDb.Model.PermissionInfo", "PermissionInfo") - .WithMany("RelationUserRolesPermissions") + .WithMany("Permissions") .HasForeignKey("IdPermission") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("AsbCloudDb.Model.UserRole", "UserRole") - .WithMany("RelationUserRolesPermissions") + .WithMany("Permissions") .HasForeignKey("IdRole") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); @@ -2820,7 +2820,7 @@ namespace AsbCloudDb.Migrations modelBuilder.Entity("AsbCloudDb.Model.PermissionInfo", b => { - b.Navigation("RelationUserRolesPermissions"); + b.Navigation("Permissions"); }); modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b => @@ -2851,7 +2851,7 @@ namespace AsbCloudDb.Migrations modelBuilder.Entity("AsbCloudDb.Model.UserRole", b => { - b.Navigation("RelationUserRolesPermissions"); + b.Navigation("Permissions"); b.Navigation("RelationUsersUserRoles"); }); From cf517eabd5f5027516222cec1b1afcecd15391f1 Mon Sep 17 00:00:00 2001 From: KharchenkoVladimir Date: Wed, 1 Dec 2021 16:09:06 +0500 Subject: [PATCH 12/17] CS2-123: Fixed role permissions create/update operations --- AsbCloudApp/Data/PermissionDto.cs | 8 +- AsbCloudApp/Data/UserRoleDto.cs | 1 - ..._Renamed_Permission_Role_Files.Designer.cs | 2893 +++++++++++++++++ ...201105010_Renamed_Permission_Role_Files.cs | 17 + .../AsbCloudDbContextModelSnapshot.cs | 6 +- AsbCloudDb/Model/AsbCloudDbContext.cs | 2 +- AsbCloudDb/Model/Permission.cs | 5 +- AsbCloudDbDemoData/DbDemoDataFiller.cs | 4 +- .../Services/AuthService.cs | 2 +- .../Services/UserRoleService.cs | 107 +- 10 files changed, 2960 insertions(+), 85 deletions(-) create mode 100644 AsbCloudDb/Migrations/20211201105010_Renamed_Permission_Role_Files.Designer.cs create mode 100644 AsbCloudDb/Migrations/20211201105010_Renamed_Permission_Role_Files.cs diff --git a/AsbCloudApp/Data/PermissionDto.cs b/AsbCloudApp/Data/PermissionDto.cs index b6e0d827..9bedc10a 100644 --- a/AsbCloudApp/Data/PermissionDto.cs +++ b/AsbCloudApp/Data/PermissionDto.cs @@ -1,10 +1,10 @@ namespace AsbCloudApp.Data { - public class PermissionDto + public class PermissionDto : IId { public int Id { get; set; } - public string Name { get; set; } - public string Description { get; set; } - public string BitDescription { get; set; } + public int IdUserRole { get; set; } + public int IdPermission { get; set; } + public int PermissionValue { get; set; } } } \ No newline at end of file diff --git a/AsbCloudApp/Data/UserRoleDto.cs b/AsbCloudApp/Data/UserRoleDto.cs index 6a2348e4..a16a4959 100644 --- a/AsbCloudApp/Data/UserRoleDto.cs +++ b/AsbCloudApp/Data/UserRoleDto.cs @@ -9,7 +9,6 @@ namespace AsbCloudApp.Data public string Caption { get; set; } public int? IdParent { get; set; } public int IdType { get; set; } - public IEnumerable PermissionIds { get; set; } public IEnumerable Permissions { get; set; } [JsonIgnore] public virtual ICollection Users { get; set; } diff --git a/AsbCloudDb/Migrations/20211201105010_Renamed_Permission_Role_Files.Designer.cs b/AsbCloudDb/Migrations/20211201105010_Renamed_Permission_Role_Files.Designer.cs new file mode 100644 index 00000000..206fe985 --- /dev/null +++ b/AsbCloudDb/Migrations/20211201105010_Renamed_Permission_Role_Files.Designer.cs @@ -0,0 +1,2893 @@ +// +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("20211201105010_Renamed_Permission_Role_Files")] + partial class Renamed_Permission_Role_Files + { + 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("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.Property("IdPermission") + .HasColumnType("integer") + .HasColumnName("id_permission"); + + b.Property("PermissionValue") + .HasColumnType("integer") + .HasColumnName("permission_value"); + + b.HasKey("IdUserRole", "IdPermission"); + + b.HasIndex("IdPermission"); + + b.ToTable("t_permission"); + + b + .HasComment("Отношение ролей пользователей и разрешений доступа"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.PermissionInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property>("BitDescription") + .HasColumnType("jsonb") + .HasColumnName("bit_description") + .HasComment("Описание каждого бита разрешений"); + + b.Property("Description") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("description") + .HasComment("Краткое описание"); + + b.Property("Name") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name") + .HasComment("Название"); + + b.HasKey("Id"); + + b.ToTable("t_permission_info"); + + 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("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.HasKey("IdUser", "IdUserRole"); + + b.HasIndex("IdUserRole"); + + b.ToTable("t_relation_user_user_role"); + + b + .HasComment("Отношение пользователей и ролей"); + + b.HasData( + new + { + 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("IdType") + .HasColumnType("integer") + .HasColumnName("id_type") + .HasComment("0-роль из стандартной матрицы, \n1-специальная роль для какого-либо пользователя"); + + b.HasKey("Id"); + + b.ToTable("t_user_role"); + + b + .HasComment("Роли пользователей в системе"); + + b.HasData( + new + { + Id = 1, + Caption = "Администратор", + IdType = 0 + }, + new + { + Id = 2, + Caption = "Пользователь", + IdType = 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.Permission", b => + { + b.HasOne("AsbCloudDb.Model.PermissionInfo", "PermissionInfo") + .WithMany("Permissions") + .HasForeignKey("IdPermission") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.UserRole", "UserRole") + .WithMany("Permissions") + .HasForeignKey("IdUserRole") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("PermissionInfo"); + + b.Navigation("UserRole"); + }); + + 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.PermissionInfo", b => + { + b.Navigation("Permissions"); + }); + + 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("Permissions"); + + 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/20211201105010_Renamed_Permission_Role_Files.cs b/AsbCloudDb/Migrations/20211201105010_Renamed_Permission_Role_Files.cs new file mode 100644 index 00000000..90c2beab --- /dev/null +++ b/AsbCloudDb/Migrations/20211201105010_Renamed_Permission_Role_Files.cs @@ -0,0 +1,17 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace AsbCloudDb.Migrations +{ + public partial class Renamed_Permission_Role_Files : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + + } + } +} diff --git a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs index a300cd01..27307d74 100644 --- a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs +++ b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs @@ -683,7 +683,7 @@ namespace AsbCloudDb.Migrations modelBuilder.Entity("AsbCloudDb.Model.Permission", b => { - b.Property("IdRole") + b.Property("IdUserRole") .HasColumnType("integer") .HasColumnName("id_user_role"); @@ -695,7 +695,7 @@ namespace AsbCloudDb.Migrations .HasColumnType("integer") .HasColumnName("permission_value"); - b.HasKey("IdRole", "IdPermission"); + b.HasKey("IdUserRole", "IdPermission"); b.HasIndex("IdPermission"); @@ -2545,7 +2545,7 @@ namespace AsbCloudDb.Migrations b.HasOne("AsbCloudDb.Model.UserRole", "UserRole") .WithMany("Permissions") - .HasForeignKey("IdRole") + .HasForeignKey("IdUserRole") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); diff --git a/AsbCloudDb/Model/AsbCloudDbContext.cs b/AsbCloudDb/Model/AsbCloudDbContext.cs index c52b66fe..41e67d43 100644 --- a/AsbCloudDb/Model/AsbCloudDbContext.cs +++ b/AsbCloudDb/Model/AsbCloudDbContext.cs @@ -255,7 +255,7 @@ namespace AsbCloudDb.Model modelBuilder.Entity(entity => { - entity.HasKey(e => new { e.IdRole, e.IdPermission }); + entity.HasKey(e => new { e.IdUserRole, e.IdPermission }); }); FillData(modelBuilder); diff --git a/AsbCloudDb/Model/Permission.cs b/AsbCloudDb/Model/Permission.cs index d973890f..654897de 100644 --- a/AsbCloudDb/Model/Permission.cs +++ b/AsbCloudDb/Model/Permission.cs @@ -1,6 +1,5 @@ using Microsoft.EntityFrameworkCore; using System.ComponentModel.DataAnnotations.Schema; -using System.ComponentModel.DataAnnotations; namespace AsbCloudDb.Model { @@ -8,7 +7,7 @@ namespace AsbCloudDb.Model public class Permission { [Column("id_user_role")] - public int IdRole { get; set; } + public int IdUserRole { get; set; } [Column("id_permission")] public int IdPermission { get; set; } @@ -16,7 +15,7 @@ namespace AsbCloudDb.Model [Column("permission_value")] public int PermissionValue { get; set; } - [ForeignKey(nameof(IdRole))] + [ForeignKey(nameof(IdUserRole))] [InverseProperty(nameof(Model.UserRole.Permissions))] public virtual UserRole UserRole { get; set; } diff --git a/AsbCloudDbDemoData/DbDemoDataFiller.cs b/AsbCloudDbDemoData/DbDemoDataFiller.cs index c8dc19bd..7a1d5f8b 100644 --- a/AsbCloudDbDemoData/DbDemoDataFiller.cs +++ b/AsbCloudDbDemoData/DbDemoDataFiller.cs @@ -189,13 +189,13 @@ namespace AsbCloudDevOperations demoContext.RelationUserRolesPermissions.AddRange( new Permission() { - IdRole = 2, + IdUserRole = 2, IdPermission = 1, PermissionValue = 143 }, new Permission() { - IdRole = 2, + IdUserRole = 2, IdPermission = 2, PermissionValue = 12 } diff --git a/AsbCloudInfrastructure/Services/AuthService.cs b/AsbCloudInfrastructure/Services/AuthService.cs index c6ed3b1d..470ef9a0 100644 --- a/AsbCloudInfrastructure/Services/AuthService.cs +++ b/AsbCloudInfrastructure/Services/AuthService.cs @@ -189,7 +189,7 @@ namespace AsbCloudInfrastructure.Services { var rolesIds = userRoles.Select(r => r.Id); var userPermissionsInfo = cacheUserRolesPermissions.Where(p => - rolesIds.Contains(p.IdRole)) + rolesIds.Contains(p.IdUserRole)) .Select(perm => new { perm.IdPermission, perm.PermissionValue }); return userPermissionsInfo.Select(p => new diff --git a/AsbCloudInfrastructure/Services/UserRoleService.cs b/AsbCloudInfrastructure/Services/UserRoleService.cs index 4647fa30..1053b10a 100644 --- a/AsbCloudInfrastructure/Services/UserRoleService.cs +++ b/AsbCloudInfrastructure/Services/UserRoleService.cs @@ -1,5 +1,3 @@ -using System.Collections.Generic; -using System.Diagnostics; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -13,15 +11,15 @@ namespace AsbCloudInfrastructure.Services public class UserRoleService : CrudServiceBase { private readonly CacheTable cacheUserRoles; - private readonly CacheTable cachePermissions; - private readonly CacheTable cacheUserRolesPermissions; + private readonly CacheTable cachePermissionsInfo; + private readonly CacheTable cachePermissions; private int counter = 0; public UserRoleService(IAsbCloudDbContext context, CacheDb cacheDb) : base(context) { cacheUserRoles = cacheDb.GetCachedTable((AsbCloudDbContext)context); - cachePermissions = cacheDb.GetCachedTable((AsbCloudDbContext)context); - cacheUserRolesPermissions = + cachePermissionsInfo = cacheDb.GetCachedTable((AsbCloudDbContext)context); + cachePermissions = cacheDb.GetCachedTable((AsbCloudDbContext)context); } @@ -44,84 +42,53 @@ namespace AsbCloudInfrastructure.Services : FillUserRoleWithPermissions(roleDto); } - public override async Task InsertAsync(UserRoleDto dto, CancellationToken token = default) - { - - dto.PermissionIds = GetAncestorsPermissionIds(dto.Id, dto.PermissionIds, dto.IdParent, ref counter); - - var newRoleId = await base.InsertAsync(dto, token); - - if (dto.PermissionIds == default) - return newRoleId; - - foreach (var pId in dto.PermissionIds) - { - var relation = new Permission() - { - IdRole = newRoleId, - IdPermission = pId - }; - - context.RelationUserRolesPermissions.Add(relation); - } - - return await context.SaveChangesAsync(token); - } - public override async Task UpdateAsync(int id, UserRoleDto item, CancellationToken token = default) { + foreach (var p in item.Permissions) + p.IdUserRole = item.Id; + var result = await base.UpdateAsync(id, item, token); - if (item.PermissionIds == default) - return result; - - await cacheUserRolesPermissions.RemoveAsync(r => r.IdRole == item.Id, token) + await cachePermissions.RemoveAsync(r => r.IdUserRole == item.Id, token) .ConfigureAwait(false); - var newRelations = item.PermissionIds.Select(p => new Permission() - { - IdRole = item.Id, - IdPermission = p - }); - await cacheUserRolesPermissions.InsertAsync(newRelations, token); - + var newPermissions = item.Permissions.Adapt(); + + await cachePermissions.InsertAsync(newPermissions, token); + return result; } private UserRoleDto FillUserRoleWithPermissions(UserRoleDto roleDto) { - var rolePermissionIds = cacheUserRolesPermissions.Where(c => - c.IdRole == roleDto.Id).Select(p => p.IdPermission); - roleDto.Permissions = cachePermissions.Where(permission => rolePermissionIds.Contains(permission.Id)) - .Adapt(); + roleDto.Permissions = cachePermissions.Where(c => + c.IdUserRole == roleDto.Id).Adapt(); return roleDto; } - private IEnumerable GetAncestorsPermissionIds(int idRole, IEnumerable currentPermissionsIds, - int? idParent, ref int counter) - { - //var currentPermissionsIds = userRoleDto.PermissionIds ?? new List(); - - if (idParent == default) - return currentPermissionsIds; - - if (counter > 10) - { - Trace.WriteLine($"User role with id: {idRole} has more than 10 nested parents"); - return currentPermissionsIds; - } - - var parentRole = cacheUserRoles.FirstOrDefault(r => r.Id == idParent) - .Adapt(); - var parentRolePermissionsIds = cacheUserRolesPermissions.Where(p => - p.IdRole == parentRole.Id).Select(perm => perm.IdPermission); - var resultPermissions = currentPermissionsIds.Union(parentRolePermissionsIds); - - counter++; - - return GetAncestorsPermissionIds(parentRole.Id, resultPermissions, - parentRole.IdParent, ref counter); - } + // private IEnumerable GetAncestorsPermissionIds(int idRole, IEnumerable currentPermissionsIds, + // int? idParent, ref int counter) + // { + // if (idParent == default) + // return currentPermissionsIds; + // + // if (counter > 10) + // { + // Trace.WriteLine($"User role with id: {idRole} has more than 10 nested parents"); + // return currentPermissionsIds; + // } + // + // var parentRole = cacheUserRoles.FirstOrDefault(r => r.Id == idParent) + // .Adapt(); + // var parentRolePermissionsIds = cachePermissions.Where(p => + // p.IdUserRole == parentRole.Id).Select(perm => perm.IdPermission); + // var resultPermissions = currentPermissionsIds.Union(parentRolePermissionsIds); + // + // counter++; + // + // return GetAncestorsPermissionIds(parentRole.Id, resultPermissions, + // parentRole.IdParent, ref counter); + // } } } \ No newline at end of file From 22c5d33b7eebe4fe48b0027003bd43dfc760ee8e Mon Sep 17 00:00:00 2001 From: KharchenkoVladimir Date: Wed, 1 Dec 2021 17:10:17 +0500 Subject: [PATCH 13/17] CS2-123: Added AdminPermissionController and Service --- AsbCloudApp/Data/PermissionDto.cs | 3 +- AsbCloudApp/Data/PermissionInfoDto.cs | 12 ++++ AsbCloudApp/Services/IPermissionService.cs | 17 +++++ AsbCloudDb/Model/AsbCloudDbContext.cs | 4 +- AsbCloudDb/Model/IAsbCloudDbContext.cs | 4 +- AsbCloudDb/Model/PermissionInfo.cs | 2 +- AsbCloudDbDemoData/DbDemoDataFiller.cs | 4 +- AsbCloudInfrastructure/DependencyInjection.cs | 2 + .../Services/PermissionService.cs | 66 +++++++++++++++++++ .../Controllers/AdminPermissionController.cs | 23 +++++++ 10 files changed, 128 insertions(+), 9 deletions(-) create mode 100644 AsbCloudApp/Data/PermissionInfoDto.cs create mode 100644 AsbCloudApp/Services/IPermissionService.cs create mode 100644 AsbCloudInfrastructure/Services/PermissionService.cs create mode 100644 AsbCloudWebApi/Controllers/AdminPermissionController.cs diff --git a/AsbCloudApp/Data/PermissionDto.cs b/AsbCloudApp/Data/PermissionDto.cs index 9bedc10a..7145ce70 100644 --- a/AsbCloudApp/Data/PermissionDto.cs +++ b/AsbCloudApp/Data/PermissionDto.cs @@ -1,8 +1,7 @@ namespace AsbCloudApp.Data { - public class PermissionDto : IId + public class PermissionDto { - public int Id { get; set; } public int IdUserRole { get; set; } public int IdPermission { get; set; } public int PermissionValue { get; set; } diff --git a/AsbCloudApp/Data/PermissionInfoDto.cs b/AsbCloudApp/Data/PermissionInfoDto.cs new file mode 100644 index 00000000..bcbe06ca --- /dev/null +++ b/AsbCloudApp/Data/PermissionInfoDto.cs @@ -0,0 +1,12 @@ +using System.Collections.Generic; + +namespace AsbCloudApp.Data +{ + public class PermissionInfoDto : IId + { + public int Id { get; set; } + public string Name { get; set; } + public string Description { get; set; } + public IDictionary BitDescription { get; set; } + } +} \ No newline at end of file diff --git a/AsbCloudApp/Services/IPermissionService.cs b/AsbCloudApp/Services/IPermissionService.cs new file mode 100644 index 00000000..93f4f595 --- /dev/null +++ b/AsbCloudApp/Services/IPermissionService.cs @@ -0,0 +1,17 @@ +using AsbCloudApp.Data; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudApp.Services +{ + public interface IPermissionService + { + Task> GetPermissionsAsync(int idRole, CancellationToken token); + Task InsertPermissionAsync(PermissionDto dto, CancellationToken token); + Task InsertPermissionsRangeAsync(IEnumerable dtos, CancellationToken token); + Task UpdatePermissionAsync(int id, PermissionDto dto, CancellationToken token); + Task DeletePermissionAsync(int idRole, int idPermission, CancellationToken token); + + } +} \ No newline at end of file diff --git a/AsbCloudDb/Model/AsbCloudDbContext.cs b/AsbCloudDb/Model/AsbCloudDbContext.cs index 41e67d43..745165f3 100644 --- a/AsbCloudDb/Model/AsbCloudDbContext.cs +++ b/AsbCloudDb/Model/AsbCloudDbContext.cs @@ -39,8 +39,8 @@ 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; } + public virtual DbSet Permissions { get; set; } + public virtual DbSet PermissionInfos { get; set; } //var options = new DbContextOptionsBuilder() // .UseNpgsql("Host=localhost;Database=postgres;Username=postgres;Password=q;Persist Security Info=True") diff --git a/AsbCloudDb/Model/IAsbCloudDbContext.cs b/AsbCloudDb/Model/IAsbCloudDbContext.cs index c17261ad..f0125ea9 100644 --- a/AsbCloudDb/Model/IAsbCloudDbContext.cs +++ b/AsbCloudDb/Model/IAsbCloudDbContext.cs @@ -37,8 +37,8 @@ namespace AsbCloudDb.Model DbSet DrillParams { get; set; } DbSet DrillFlowChart { get; set; } DbSet RelationUserUserRoles { get; set; } - DbSet RelationUserRolesPermissions { get; set; } - DbSet Permissions { get; set; } + DbSet Permissions { get; set; } + DbSet PermissionInfos { get; set; } DatabaseFacade Database { get; } diff --git a/AsbCloudDb/Model/PermissionInfo.cs b/AsbCloudDb/Model/PermissionInfo.cs index 901400a7..d159086e 100644 --- a/AsbCloudDb/Model/PermissionInfo.cs +++ b/AsbCloudDb/Model/PermissionInfo.cs @@ -6,7 +6,7 @@ using System.ComponentModel.DataAnnotations.Schema; namespace AsbCloudDb.Model { [Table("t_permission_info"), Comment("Разрешения на доступ к данным")] - public class PermissionInfo + public class PermissionInfo : IId { [Key] [Column("id")] diff --git a/AsbCloudDbDemoData/DbDemoDataFiller.cs b/AsbCloudDbDemoData/DbDemoDataFiller.cs index 7a1d5f8b..fb991f2f 100644 --- a/AsbCloudDbDemoData/DbDemoDataFiller.cs +++ b/AsbCloudDbDemoData/DbDemoDataFiller.cs @@ -169,7 +169,7 @@ namespace AsbCloudDevOperations new WellOperation { Id = 76341, IdWell = 1, IdWellSectionType = 1, IdCategory = 1047, IdType = 0, DepthEnd = 1250, DateStart = DateTime.Parse("2021-08-26 11:30"), DurationHours = 3.5 } ); - demoContext.Permissions.AddRange( + demoContext.PermissionInfos.AddRange( new PermissionInfo() { Id = 1, @@ -186,7 +186,7 @@ namespace AsbCloudDevOperations } ); - demoContext.RelationUserRolesPermissions.AddRange( + demoContext.Permissions.AddRange( new Permission() { IdUserRole = 2, diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index d7d06ba9..e1900270 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -58,6 +58,8 @@ namespace AsbCloudInfrastructure services.AddTransient, UserRoleService>(); services.AddTransient, CrudServiceBase>(); services.AddTransient, DrillParamsService>(); + services.AddTransient(); + services.AddTransient, CrudServiceBase>(); // TelemetryData services services.AddTransient, TelemetryDataSaubService>(); diff --git a/AsbCloudInfrastructure/Services/PermissionService.cs b/AsbCloudInfrastructure/Services/PermissionService.cs new file mode 100644 index 00000000..05cf9bfe --- /dev/null +++ b/AsbCloudInfrastructure/Services/PermissionService.cs @@ -0,0 +1,66 @@ +using AsbCloudApp.Data; +using AsbCloudApp.Services; +using AsbCloudDb.Model; +using Mapster; +using Microsoft.EntityFrameworkCore; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudInfrastructure.Services +{ + public class PermissionService : IPermissionService + { + private readonly IAsbCloudDbContext db; + + public PermissionService(IAsbCloudDbContext db) + { + this.db = db; + } + + + public async Task> GetPermissionsAsync(int idRole, CancellationToken token) + { + var entities = await (from p in db.Permissions + where p.IdUserRole == idRole + select p) + .ToListAsync(token).ConfigureAwait(false); + var dto = entities.Adapt(); + return dto; + } + + public Task InsertPermissionAsync(PermissionDto dto, CancellationToken token) + { + var entity = dto.Adapt(); + db.Permissions.Add(entity); + return db.SaveChangesAsync(token); + } + + public Task InsertPermissionsRangeAsync(IEnumerable dtos, CancellationToken token) + { + var entities = dtos.Adapt(); + + db.Permissions.AddRange(entities); + return db.SaveChangesAsync(token); + } + + public Task UpdatePermissionAsync(int id, PermissionDto dto, CancellationToken token) + { + var entity = dto.Adapt(); + db.Permissions.Update(entity); + return db.SaveChangesAsync(token); + } + + public Task DeletePermissionAsync(int idRole, int idPermission, CancellationToken token) + { + var entities = db.Permissions.AsNoTracking() + .Where(e => e.IdUserRole == idRole && e.IdPermission == idPermission) + .ToList(); + if (!entities.Any()) + return Task.FromResult(0); + db.Permissions.RemoveRange(entities); + return db.SaveChangesAsync(token); + } + } +} \ No newline at end of file diff --git a/AsbCloudWebApi/Controllers/AdminPermissionController.cs b/AsbCloudWebApi/Controllers/AdminPermissionController.cs new file mode 100644 index 00000000..508793a2 --- /dev/null +++ b/AsbCloudWebApi/Controllers/AdminPermissionController.cs @@ -0,0 +1,23 @@ +using AsbCloudApp.Data; +using AsbCloudApp.Services; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace AsbCloudWebApi.Controllers +{ + [Route("api/admin/user/permission")] + [ApiController] + [Authorize] + public class AdminPermissionController : ControllerBase + { + private readonly IPermissionService permissionService; + private readonly ICrudService permissionInfoService; + + public AdminPermissionController(IPermissionService permissionService, + ICrudService permissionInfoService) + { + this.permissionService = permissionService; + this.permissionInfoService = permissionInfoService; + } + } +} \ No newline at end of file From b655360835735807680f758a547967ec078ecb61 Mon Sep 17 00:00:00 2001 From: KharchenkoVladimir Date: Thu, 2 Dec 2021 12:03:30 +0500 Subject: [PATCH 14/17] CS2-123: Added AdminPermissionController methods --- AsbCloudApp/Services/IPermissionService.cs | 9 +- .../Services/PermissionService.cs | 15 +- .../Controllers/AdminPermissionController.cs | 138 +++++++++++++++++- 3 files changed, 145 insertions(+), 17 deletions(-) diff --git a/AsbCloudApp/Services/IPermissionService.cs b/AsbCloudApp/Services/IPermissionService.cs index 93f4f595..c3bdf2c9 100644 --- a/AsbCloudApp/Services/IPermissionService.cs +++ b/AsbCloudApp/Services/IPermissionService.cs @@ -7,11 +7,10 @@ namespace AsbCloudApp.Services { public interface IPermissionService { - Task> GetPermissionsAsync(int idRole, CancellationToken token); - Task InsertPermissionAsync(PermissionDto dto, CancellationToken token); - Task InsertPermissionsRangeAsync(IEnumerable dtos, CancellationToken token); - Task UpdatePermissionAsync(int id, PermissionDto dto, CancellationToken token); - Task DeletePermissionAsync(int idRole, int idPermission, CancellationToken token); + Task> GetallAsync(int idRole, CancellationToken token); + Task InsertRangeAsync(IEnumerable dtos, CancellationToken token); + Task UpdateAsync(int id, PermissionDto dto, CancellationToken token); + Task DeleteAsync(int idRole, int idPermission, CancellationToken token); } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/PermissionService.cs b/AsbCloudInfrastructure/Services/PermissionService.cs index 05cf9bfe..b79824ae 100644 --- a/AsbCloudInfrastructure/Services/PermissionService.cs +++ b/AsbCloudInfrastructure/Services/PermissionService.cs @@ -20,7 +20,7 @@ namespace AsbCloudInfrastructure.Services } - public async Task> GetPermissionsAsync(int idRole, CancellationToken token) + public async Task> GetallAsync(int idRole, CancellationToken token) { var entities = await (from p in db.Permissions where p.IdUserRole == idRole @@ -30,14 +30,7 @@ namespace AsbCloudInfrastructure.Services return dto; } - public Task InsertPermissionAsync(PermissionDto dto, CancellationToken token) - { - var entity = dto.Adapt(); - db.Permissions.Add(entity); - return db.SaveChangesAsync(token); - } - - public Task InsertPermissionsRangeAsync(IEnumerable dtos, CancellationToken token) + public Task InsertRangeAsync(IEnumerable dtos, CancellationToken token) { var entities = dtos.Adapt(); @@ -45,14 +38,14 @@ namespace AsbCloudInfrastructure.Services return db.SaveChangesAsync(token); } - public Task UpdatePermissionAsync(int id, PermissionDto dto, CancellationToken token) + public Task UpdateAsync(int id, PermissionDto dto, CancellationToken token) { var entity = dto.Adapt(); db.Permissions.Update(entity); return db.SaveChangesAsync(token); } - public Task DeletePermissionAsync(int idRole, int idPermission, CancellationToken token) + public Task DeleteAsync(int idRole, int idPermission, CancellationToken token) { var entities = db.Permissions.AsNoTracking() .Where(e => e.IdUserRole == idRole && e.IdPermission == idPermission) diff --git a/AsbCloudWebApi/Controllers/AdminPermissionController.cs b/AsbCloudWebApi/Controllers/AdminPermissionController.cs index 508793a2..b7e6c2a4 100644 --- a/AsbCloudWebApi/Controllers/AdminPermissionController.cs +++ b/AsbCloudWebApi/Controllers/AdminPermissionController.cs @@ -1,3 +1,6 @@ +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; using AsbCloudApp.Data; using AsbCloudApp.Services; using Microsoft.AspNetCore.Authorization; @@ -5,7 +8,7 @@ using Microsoft.AspNetCore.Mvc; namespace AsbCloudWebApi.Controllers { - [Route("api/admin/user/permission")] + [Route("api/admin/user")] [ApiController] [Authorize] public class AdminPermissionController : ControllerBase @@ -19,5 +22,138 @@ namespace AsbCloudWebApi.Controllers this.permissionService = permissionService; this.permissionInfoService = permissionInfoService; } + + /// + /// Получает список доступных в справочнике разрешений + /// + /// Токен отмены задачи + /// + [HttpGet("permissionInfo")] + [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] + public async Task GetAllAsync(CancellationToken token = default) + { + var result = await permissionInfoService.GetAllAsync(token); + return Ok(result); + } + + /// + /// Получает запрашиваемое из справочника разрешение + /// + /// id запрашиваемого разрешения из справочника + /// Токен отмены задачи + /// + [HttpGet("permissionInfo/{id}")] + [ProducesResponseType(typeof(PermissionInfoDto), (int)System.Net.HttpStatusCode.OK)] + public async Task GetAsync(int id, CancellationToken token = default) + { + var result = await permissionInfoService.GetAsync(id, token); + return Ok(result); + } + + /// + /// Добавляет разрешения для роли + /// + /// Объекты новых разрешений для справочника + /// Токен отмены задачи + /// + [HttpPost("permissionInfo")] + [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] + public async Task InsertRangeAsync(IEnumerable dtos, + CancellationToken token = default) + { + var result = await permissionInfoService.InsertRangeAsync(dtos, token); + return Ok(result); + } + + /// + /// Обновляет разрешение для роли + /// + /// id объекта разрешения + /// Объект разрешения + /// Токен отмены задачи + /// + [HttpPut("permissionInfo")] + [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] + public async Task UpdateAsync(int id, PermissionInfoDto dto, + CancellationToken token = default) + { + var result = await permissionInfoService.UpdateAsync(id, dto, token); + return Ok(result); + } + + /// + /// Удаляет разрешение для роли + /// + /// id объекта разрешения из справочника + /// Токен отмены задачи + /// + [HttpDelete("permissionInfo")] + [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] + public async Task DeleteAsync(int id, CancellationToken token = default) + { + var result = await permissionInfoService.DeleteAsync(id, token); + return Ok(result); + } + + /// + /// Получает список всех разрешений для роли + /// + /// id роли + /// Токен отмены задачи + /// + [HttpGet("permission")] + [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] + public async Task GetAllAsync(int idRole, CancellationToken token = default) + { + var result = await permissionService.GetallAsync(idRole, token); + return Ok(result); + } + + /// + /// Добавляет разрешения для роли + /// + /// Объекты новых разрешений для справочника + /// Токен отмены задачи + /// + [HttpPost("permission")] + [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] + public async Task InsertRangeAsync(IEnumerable dtos, + CancellationToken token = default) + { + var result = await permissionService.InsertRangeAsync(dtos, token); + return Ok(result); + } + + /// + /// Обновляет разрешение в правочник + /// + /// id объекта разрешения для справочника + /// Объект разрешения для справочника + /// Токен отмены задачи + /// + [HttpPut("permission")] + [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] + public async Task UpdateAsync(int id, PermissionDto dto, + CancellationToken token = default) + { + var result = await permissionService.UpdateAsync(id, dto, token); + return Ok(result); + } + + /// + /// Удаляет разрешение для роли + /// + /// id роли для удаления разрешения + /// id разрешения + /// Токен отмены задачи + /// + [HttpDelete("permission")] + [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] + public async Task DeleteAsync(int idRole, int idPermission, + CancellationToken token = default) + { + var result = await permissionService.DeleteAsync(idRole, idPermission, token); + return Ok(result); + } } } \ No newline at end of file From aff16dc84bd060cdb085ba12348d99584e7c1500 Mon Sep 17 00:00:00 2001 From: KharchenkoVladimir Date: Thu, 2 Dec 2021 13:35:15 +0500 Subject: [PATCH 15/17] CS2-123: Returned parent user role permissions inheritance --- .../Services/UserRoleService.cs | 57 +++++++++++-------- 1 file changed, 34 insertions(+), 23 deletions(-) diff --git a/AsbCloudInfrastructure/Services/UserRoleService.cs b/AsbCloudInfrastructure/Services/UserRoleService.cs index 1053b10a..0deb7e14 100644 --- a/AsbCloudInfrastructure/Services/UserRoleService.cs +++ b/AsbCloudInfrastructure/Services/UserRoleService.cs @@ -1,3 +1,5 @@ +using System.Diagnostics; +using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -42,6 +44,16 @@ namespace AsbCloudInfrastructure.Services : FillUserRoleWithPermissions(roleDto); } + public override async Task InsertAsync(UserRoleDto dto, CancellationToken token = default) + { + var newRoleId = await base.InsertAsync(dto, token); + + var newRolePermissions = GetAncestorsPermissions(newRoleId, + dto.Permissions.Adapt(), dto.IdParent, ref counter); + + return await cachePermissions.InsertAsync(newRolePermissions, token); + } + public override async Task UpdateAsync(int id, UserRoleDto item, CancellationToken token = default) { foreach (var p in item.Permissions) @@ -67,28 +79,27 @@ namespace AsbCloudInfrastructure.Services return roleDto; } - // private IEnumerable GetAncestorsPermissionIds(int idRole, IEnumerable currentPermissionsIds, - // int? idParent, ref int counter) - // { - // if (idParent == default) - // return currentPermissionsIds; - // - // if (counter > 10) - // { - // Trace.WriteLine($"User role with id: {idRole} has more than 10 nested parents"); - // return currentPermissionsIds; - // } - // - // var parentRole = cacheUserRoles.FirstOrDefault(r => r.Id == idParent) - // .Adapt(); - // var parentRolePermissionsIds = cachePermissions.Where(p => - // p.IdUserRole == parentRole.Id).Select(perm => perm.IdPermission); - // var resultPermissions = currentPermissionsIds.Union(parentRolePermissionsIds); - // - // counter++; - // - // return GetAncestorsPermissionIds(parentRole.Id, resultPermissions, - // parentRole.IdParent, ref counter); - // } + private IEnumerable GetAncestorsPermissions(int idRole, IEnumerable currentPermissions, + int? idParent, ref int counter) + { + if (idParent == null) + return currentPermissions; + + if (counter > 10) + { + Trace.WriteLine($"User role with id: {idRole} has more than 10 nested parents"); + return currentPermissions; + } + + var parentRole = cacheUserRoles.FirstOrDefault(r => r.Id == idParent); + var parentRolePermissions = cachePermissions.Where(p => + p.IdUserRole == parentRole.Id); + var resultPermissions = currentPermissions.Union(parentRolePermissions); + + counter++; + + return GetAncestorsPermissions(parentRole.Id, resultPermissions, + parentRole.IdParent, ref counter); + } } } \ No newline at end of file From 4aaac31c431f20f77308b746413ecb7d9d8ac304 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A4=D1=80=D0=BE=D0=BB=D0=BE=D0=B2?= Date: Fri, 3 Dec 2021 09:44:10 +0500 Subject: [PATCH 16/17] nit refacroring before merge --- AsbCloudApp/Services/IPermissionService.cs | 6 +- AsbCloudInfrastructure/DependencyInjection.cs | 36 +++--- .../Services/PermissionService.cs | 38 +++--- .../Services/UserRoleService.cs | 95 ++++++++------- .../Controllers/AdminPermissionController.cs | 108 +++--------------- .../AdminPermissionInfoController.cs | 18 +++ .../Controllers/AdminUserRoleController.cs | 2 +- AsbCloudWebApi/Controllers/CrudController.cs | 17 ++- 8 files changed, 142 insertions(+), 178 deletions(-) create mode 100644 AsbCloudWebApi/Controllers/AdminPermissionInfoController.cs diff --git a/AsbCloudApp/Services/IPermissionService.cs b/AsbCloudApp/Services/IPermissionService.cs index c3bdf2c9..e5b9101e 100644 --- a/AsbCloudApp/Services/IPermissionService.cs +++ b/AsbCloudApp/Services/IPermissionService.cs @@ -7,10 +7,10 @@ namespace AsbCloudApp.Services { public interface IPermissionService { - Task> GetallAsync(int idRole, CancellationToken token); + Task> GetByIdRoleAsync(int idRole, CancellationToken token); Task InsertRangeAsync(IEnumerable dtos, CancellationToken token); - Task UpdateAsync(int id, PermissionDto dto, CancellationToken token); - Task DeleteAsync(int idRole, int idPermission, CancellationToken token); + Task UpdateAsync(PermissionDto dto, CancellationToken token); + Task DeleteAsync(int idUserRole, int idPermission, CancellationToken token); } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index e1900270..87728603 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -30,36 +30,36 @@ namespace AsbCloudInfrastructure services.AddSingleton(); services.AddTransient(); - services.AddTransient(); services.AddTransient(); - services.AddTransient(); - services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); services.AddTransient(); - services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); - services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); + services.AddTransient(); // admin crud services: - services.AddTransient, CrudServiceBase>(); services.AddTransient, CrudServiceBase>(); - services.AddTransient, CrudServiceBase>(); services.AddTransient, CrudServiceBase>(); + services.AddTransient, CrudServiceBase>(); + services.AddTransient, DrillParamsService>(); + services.AddTransient, CrudServiceBase>(); + services.AddTransient, CrudServiceBase>(); services.AddTransient, CrudServiceBase>(); services.AddTransient, UserRoleService>(); - services.AddTransient, CrudServiceBase>(); - services.AddTransient, DrillParamsService>(); - services.AddTransient(); - services.AddTransient, CrudServiceBase>(); + services.AddTransient, CrudServiceBase>(); // TelemetryData services services.AddTransient, TelemetryDataSaubService>(); diff --git a/AsbCloudInfrastructure/Services/PermissionService.cs b/AsbCloudInfrastructure/Services/PermissionService.cs index b79824ae..0bd178b2 100644 --- a/AsbCloudInfrastructure/Services/PermissionService.cs +++ b/AsbCloudInfrastructure/Services/PermissionService.cs @@ -10,7 +10,7 @@ using System.Threading.Tasks; namespace AsbCloudInfrastructure.Services { - public class PermissionService : IPermissionService + public class PermissionService : IPermissionService, IConverter { private readonly IAsbCloudDbContext db; @@ -18,42 +18,52 @@ namespace AsbCloudInfrastructure.Services { this.db = db; } - - public async Task> GetallAsync(int idRole, CancellationToken token) + public async Task> GetByIdRoleAsync(int idRole, CancellationToken token) { - var entities = await (from p in db.Permissions - where p.IdUserRole == idRole - select p) - .ToListAsync(token).ConfigureAwait(false); - var dto = entities.Adapt(); + var entities = await db.Permissions + .Where(p => p.IdUserRole == idRole) + .ToListAsync(token) + .ConfigureAwait(false); + var dto = entities.Select(Convert); return dto; } public Task InsertRangeAsync(IEnumerable dtos, CancellationToken token) { - var entities = dtos.Adapt(); - + var entities = dtos.Select(Convert); db.Permissions.AddRange(entities); return db.SaveChangesAsync(token); } - public Task UpdateAsync(int id, PermissionDto dto, CancellationToken token) + public Task UpdateAsync(PermissionDto dto, CancellationToken token) { - var entity = dto.Adapt(); + var entity = Convert(dto); db.Permissions.Update(entity); return db.SaveChangesAsync(token); } - public Task DeleteAsync(int idRole, int idPermission, CancellationToken token) + public Task DeleteAsync(int idUserRole, int idPermission, CancellationToken token) { var entities = db.Permissions.AsNoTracking() - .Where(e => e.IdUserRole == idRole && e.IdPermission == idPermission) + .Where(e => e.IdUserRole == idUserRole && e.IdPermission == idPermission) .ToList(); if (!entities.Any()) return Task.FromResult(0); db.Permissions.RemoveRange(entities); return db.SaveChangesAsync(token); } + + public Permission Convert(PermissionDto src) + { + var entity = src.Adapt(); + return entity; + } + + public PermissionDto Convert(Permission src) + { + var dto = src.Adapt(); + return dto; + } } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/UserRoleService.cs b/AsbCloudInfrastructure/Services/UserRoleService.cs index 0deb7e14..f5a154f1 100644 --- a/AsbCloudInfrastructure/Services/UserRoleService.cs +++ b/AsbCloudInfrastructure/Services/UserRoleService.cs @@ -7,31 +7,25 @@ using AsbCloudApp.Data; using AsbCloudDb.Model; using AsbCloudInfrastructure.Services.Cache; using Mapster; +using AsbCloudApp.Services; namespace AsbCloudInfrastructure.Services { public class UserRoleService : CrudServiceBase { private readonly CacheTable cacheUserRoles; - private readonly CacheTable cachePermissionsInfo; - private readonly CacheTable cachePermissions; - private int counter = 0; + private readonly IPermissionService permissionService; - public UserRoleService(IAsbCloudDbContext context, CacheDb cacheDb) : base(context) + public UserRoleService(IAsbCloudDbContext context, CacheDb cacheDb, IPermissionService permissionService) : base(context) { cacheUserRoles = cacheDb.GetCachedTable((AsbCloudDbContext)context); - cachePermissionsInfo = cacheDb.GetCachedTable((AsbCloudDbContext)context); - cachePermissions = - cacheDb.GetCachedTable((AsbCloudDbContext)context); + this.permissionService = permissionService; } public override async Task> GetPageAsync(int skip = 0, int take = 32, CancellationToken token = default) { - var rolesDtos = await base.GetPageAsync(skip, take,token); - - rolesDtos.Items = rolesDtos.Items.Select(FillUserRoleWithPermissions).ToList(); - + var rolesDtos = await base.GetPageAsync(skip, take, token); return rolesDtos; } @@ -39,19 +33,19 @@ namespace AsbCloudInfrastructure.Services { var roleDto = await base.GetAsync(id,token); - return roleDto is null - ? null - : FillUserRoleWithPermissions(roleDto); + return roleDto; } public override async Task InsertAsync(UserRoleDto dto, CancellationToken token = default) { - var newRoleId = await base.InsertAsync(dto, token); - - var newRolePermissions = GetAncestorsPermissions(newRoleId, - dto.Permissions.Adapt(), dto.IdParent, ref counter); - - return await cachePermissions.InsertAsync(newRolePermissions, token); + var id = await base.InsertAsync(dto, token).ConfigureAwait(false); + if (dto.Permissions is not null && dto.Permissions.Any()) + { + foreach (var permission in dto.Permissions) + permission.IdUserRole = id; + await permissionService.InsertRangeAsync(dto.Permissions, token).ConfigureAwait(false); + } + return id; } public override async Task UpdateAsync(int id, UserRoleDto item, CancellationToken token = default) @@ -61,45 +55,48 @@ namespace AsbCloudInfrastructure.Services var result = await base.UpdateAsync(id, item, token); - await cachePermissions.RemoveAsync(r => r.IdUserRole == item.Id, token) - .ConfigureAwait(false); - - var newPermissions = item.Permissions.Adapt(); - - await cachePermissions.InsertAsync(newPermissions, token); - return result; } - private UserRoleDto FillUserRoleWithPermissions(UserRoleDto roleDto) + private IEnumerable GetNestedPermissions(UserRole role, int counter = 10) { - roleDto.Permissions = cachePermissions.Where(c => - c.IdUserRole == roleDto.Id).Adapt(); + List permissions = role.Permissions.ToList(); + if (role.IdParent is not null) + { + if(counter == 0) + { + Trace.WriteLine($"User role with id: {role.Id} has more than 10 nested childs"); + return permissions; + } + var parentRole = cacheUserRoles.FirstOrDefault(r => r.Id == role.IdParent); + + if(parentRole is null) + return permissions; - return roleDto; + var parentPermissions = GetNestedPermissions(parentRole, counter--); + Merge(ref permissions, parentPermissions); + } + return permissions; } - private IEnumerable GetAncestorsPermissions(int idRole, IEnumerable currentPermissions, - int? idParent, ref int counter) + private static void Merge(ref List permissions, IEnumerable newPermissions) { - if (idParent == null) - return currentPermissions; - - if (counter > 10) + foreach (var newPermission in newPermissions) { - Trace.WriteLine($"User role with id: {idRole} has more than 10 nested parents"); - return currentPermissions; + var permissionIndex = permissions.FindIndex(p => p.IdPermission == newPermission.IdPermission); + if (permissionIndex == -1) + permissions.Add(newPermission); + else + { + var permission = permissions[permissionIndex]; + permissions[permissionIndex] = new Permission + { + IdPermission = permission.IdPermission, + IdUserRole = permission.IdUserRole, + PermissionValue = permission.PermissionValue | newPermission.PermissionValue, + }; + } } - - var parentRole = cacheUserRoles.FirstOrDefault(r => r.Id == idParent); - var parentRolePermissions = cachePermissions.Where(p => - p.IdUserRole == parentRole.Id); - var resultPermissions = currentPermissions.Union(parentRolePermissions); - - counter++; - - return GetAncestorsPermissions(parentRole.Id, resultPermissions, - parentRole.IdParent, ref counter); } } } \ No newline at end of file diff --git a/AsbCloudWebApi/Controllers/AdminPermissionController.cs b/AsbCloudWebApi/Controllers/AdminPermissionController.cs index b7e6c2a4..aa6a77b3 100644 --- a/AsbCloudWebApi/Controllers/AdminPermissionController.cs +++ b/AsbCloudWebApi/Controllers/AdminPermissionController.cs @@ -8,91 +8,16 @@ using Microsoft.AspNetCore.Mvc; namespace AsbCloudWebApi.Controllers { - [Route("api/admin/user")] + [Route("api/admin/permission")] [ApiController] [Authorize] public class AdminPermissionController : ControllerBase { private readonly IPermissionService permissionService; - private readonly ICrudService permissionInfoService; - public AdminPermissionController(IPermissionService permissionService, - ICrudService permissionInfoService) + public AdminPermissionController(IPermissionService permissionService) { this.permissionService = permissionService; - this.permissionInfoService = permissionInfoService; - } - - /// - /// Получает список доступных в справочнике разрешений - /// - /// Токен отмены задачи - /// - [HttpGet("permissionInfo")] - [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] - public async Task GetAllAsync(CancellationToken token = default) - { - var result = await permissionInfoService.GetAllAsync(token); - return Ok(result); - } - - /// - /// Получает запрашиваемое из справочника разрешение - /// - /// id запрашиваемого разрешения из справочника - /// Токен отмены задачи - /// - [HttpGet("permissionInfo/{id}")] - [ProducesResponseType(typeof(PermissionInfoDto), (int)System.Net.HttpStatusCode.OK)] - public async Task GetAsync(int id, CancellationToken token = default) - { - var result = await permissionInfoService.GetAsync(id, token); - return Ok(result); - } - - /// - /// Добавляет разрешения для роли - /// - /// Объекты новых разрешений для справочника - /// Токен отмены задачи - /// - [HttpPost("permissionInfo")] - [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] - public async Task InsertRangeAsync(IEnumerable dtos, - CancellationToken token = default) - { - var result = await permissionInfoService.InsertRangeAsync(dtos, token); - return Ok(result); - } - - /// - /// Обновляет разрешение для роли - /// - /// id объекта разрешения - /// Объект разрешения - /// Токен отмены задачи - /// - [HttpPut("permissionInfo")] - [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] - public async Task UpdateAsync(int id, PermissionInfoDto dto, - CancellationToken token = default) - { - var result = await permissionInfoService.UpdateAsync(id, dto, token); - return Ok(result); - } - - /// - /// Удаляет разрешение для роли - /// - /// id объекта разрешения из справочника - /// Токен отмены задачи - /// - [HttpDelete("permissionInfo")] - [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] - public async Task DeleteAsync(int id, CancellationToken token = default) - { - var result = await permissionInfoService.DeleteAsync(id, token); - return Ok(result); } /// @@ -101,11 +26,11 @@ namespace AsbCloudWebApi.Controllers /// id роли /// Токен отмены задачи /// - [HttpGet("permission")] + [HttpGet] [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] - public async Task GetAllAsync(int idRole, CancellationToken token = default) + public async Task GetByIdRoleAsync(int idRole, CancellationToken token = default) { - var result = await permissionService.GetallAsync(idRole, token); + var result = await permissionService.GetByIdRoleAsync(idRole, token); return Ok(result); } @@ -115,7 +40,7 @@ namespace AsbCloudWebApi.Controllers /// Объекты новых разрешений для справочника /// Токен отмены задачи /// - [HttpPost("permission")] + [HttpPost] [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] public async Task InsertRangeAsync(IEnumerable dtos, CancellationToken token = default) @@ -123,36 +48,35 @@ namespace AsbCloudWebApi.Controllers var result = await permissionService.InsertRangeAsync(dtos, token); return Ok(result); } - + /// - /// Обновляет разрешение в правочник + /// Обновляет разрешение для роли /// - /// id объекта разрешения для справочника /// Объект разрешения для справочника /// Токен отмены задачи /// - [HttpPut("permission")] + [HttpPut] [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] - public async Task UpdateAsync(int id, PermissionDto dto, + public async Task UpdateAsync(PermissionDto dto, CancellationToken token = default) { - var result = await permissionService.UpdateAsync(id, dto, token); + var result = await permissionService.UpdateAsync(dto, token); return Ok(result); } - + /// /// Удаляет разрешение для роли /// - /// id роли для удаления разрешения /// id разрешения + /// id роли для удаления разрешения /// Токен отмены задачи /// - [HttpDelete("permission")] + [HttpDelete("{idPermission}/{idRole}")] [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] - public async Task DeleteAsync(int idRole, int idPermission, + public async Task DeleteAsync(int idUserRole, int idPermission, CancellationToken token = default) { - var result = await permissionService.DeleteAsync(idRole, idPermission, token); + var result = await permissionService.DeleteAsync(idUserRole, idPermission, token); return Ok(result); } } diff --git a/AsbCloudWebApi/Controllers/AdminPermissionInfoController.cs b/AsbCloudWebApi/Controllers/AdminPermissionInfoController.cs new file mode 100644 index 00000000..99a0a673 --- /dev/null +++ b/AsbCloudWebApi/Controllers/AdminPermissionInfoController.cs @@ -0,0 +1,18 @@ +using AsbCloudApp.Data; +using AsbCloudApp.Services; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace AsbCloudWebApi.Controllers +{ + [Route("api/admin/permissionInfo")] + [ApiController] + [Authorize] + public class AdminPermissionInfoController : CrudController> + { + public AdminPermissionInfoController(ICrudService permissionInfoService) + :base(permissionInfoService) + {} + + } +} \ No newline at end of file diff --git a/AsbCloudWebApi/Controllers/AdminUserRoleController.cs b/AsbCloudWebApi/Controllers/AdminUserRoleController.cs index c0325326..7a2a0067 100644 --- a/AsbCloudWebApi/Controllers/AdminUserRoleController.cs +++ b/AsbCloudWebApi/Controllers/AdminUserRoleController.cs @@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Mvc; namespace AsbCloudWebApi.Controllers { - [Route("api/admin/user/role")] + [Route("api/admin/role")] [ApiController] [Authorize] public class AdminUserRoleController : CrudController> diff --git a/AsbCloudWebApi/Controllers/CrudController.cs b/AsbCloudWebApi/Controllers/CrudController.cs index 20cf2c4e..c990da79 100644 --- a/AsbCloudWebApi/Controllers/CrudController.cs +++ b/AsbCloudWebApi/Controllers/CrudController.cs @@ -48,6 +48,21 @@ namespace AsbCloudWebApi.Controllers return Ok(result); } + /// + /// Получить все записи + /// + /// CancellationToken + /// все записи + [HttpGet("all")] + public virtual async Task>> GetAll(CancellationToken token = default) + { + if (!Roles.Any(role => User.IsInRole(role))) + return Forbid(); + + var result = await service.GetAllAsync(token).ConfigureAwait(false); + return Ok(result); + } + /// /// Получить одну запись по Id /// @@ -69,7 +84,7 @@ namespace AsbCloudWebApi.Controllers /// /// запись /// - /// 1 - добавлено, 0 - нет + /// id [HttpPost] [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] public virtual async Task Insert([FromBody] T value, CancellationToken token = default) From 539905e8e0fc6c20f8dde194e60b711192db9659 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A4=D1=80=D0=BE=D0=BB=D0=BE=D0=B2?= Date: Fri, 3 Dec 2021 15:03:33 +0500 Subject: [PATCH 17/17] Use cacheTable for roles and permissions --- AsbCloudApp/Services/ICrudService.cs | 9 +- AsbCloudApp/Services/IPaginationService.cs | 10 + AsbCloudApp/Services/IPermissionService.cs | 2 +- AsbCloudApp/Services/IUserRoleService.cs | 8 + AsbCloudApp/Services/IWellCompositeService.cs | 3 - AsbCloudInfrastructure/DependencyInjection.cs | 30 +-- .../Services/Cache/CacheTable.cs | 206 +++++++++--------- .../Services/CrudServiceBase.cs | 8 +- .../Services/PermissionService.cs | 52 +++-- .../Services/UserRoleService.cs | 87 +++++--- .../Controllers/AdminPermissionController.cs | 2 +- .../AdminPermissionInfoController.cs | 3 +- .../Controllers/AdminUserRoleController.cs | 9 +- AsbCloudWebApi/Controllers/CrudController.cs | 22 +- 14 files changed, 250 insertions(+), 201 deletions(-) create mode 100644 AsbCloudApp/Services/IPaginationService.cs create mode 100644 AsbCloudApp/Services/IUserRoleService.cs diff --git a/AsbCloudApp/Services/ICrudService.cs b/AsbCloudApp/Services/ICrudService.cs index e80c1a16..99f42035 100644 --- a/AsbCloudApp/Services/ICrudService.cs +++ b/AsbCloudApp/Services/ICrudService.cs @@ -8,13 +8,12 @@ namespace AsbCloudApp.Services where Tdto : Data.IId { List Incledes { get; } - Task DeleteAsync(int id, CancellationToken token = default); - Task DeleteAsync(IEnumerable ids, CancellationToken token = default); - Task> GetAllAsync(CancellationToken token = default); - Task GetAsync(int id, CancellationToken token = default); - Task> GetPageAsync(int skip = 0, int take = 32, CancellationToken token = default); Task InsertAsync(Tdto newItem, CancellationToken token = default); Task InsertRangeAsync(IEnumerable newItems, CancellationToken token = default); + Task> GetAllAsync(CancellationToken token = default); + Task GetAsync(int id, CancellationToken token = default); Task UpdateAsync(int id, Tdto item, CancellationToken token = default); + Task DeleteAsync(int id, CancellationToken token = default); + Task DeleteAsync(IEnumerable ids, CancellationToken token = default); } } \ No newline at end of file diff --git a/AsbCloudApp/Services/IPaginationService.cs b/AsbCloudApp/Services/IPaginationService.cs new file mode 100644 index 00000000..57195edb --- /dev/null +++ b/AsbCloudApp/Services/IPaginationService.cs @@ -0,0 +1,10 @@ +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudApp.Services +{ + public interface IPaginationService + { + Task> GetPageAsync(int skip = 0, int take = 32, CancellationToken token = default); + } +} \ No newline at end of file diff --git a/AsbCloudApp/Services/IPermissionService.cs b/AsbCloudApp/Services/IPermissionService.cs index e5b9101e..a4c6cb66 100644 --- a/AsbCloudApp/Services/IPermissionService.cs +++ b/AsbCloudApp/Services/IPermissionService.cs @@ -11,6 +11,6 @@ namespace AsbCloudApp.Services Task InsertRangeAsync(IEnumerable dtos, CancellationToken token); Task UpdateAsync(PermissionDto dto, CancellationToken token); Task DeleteAsync(int idUserRole, int idPermission, CancellationToken token); - + Task DeleteAllByRoleAsync(int idUserRole, CancellationToken token); } } \ No newline at end of file diff --git a/AsbCloudApp/Services/IUserRoleService.cs b/AsbCloudApp/Services/IUserRoleService.cs new file mode 100644 index 00000000..1cf59eb5 --- /dev/null +++ b/AsbCloudApp/Services/IUserRoleService.cs @@ -0,0 +1,8 @@ +using AsbCloudApp.Data; + +namespace AsbCloudApp.Services +{ + public interface IUserRoleService: ICrudService + { + } +} \ No newline at end of file diff --git a/AsbCloudApp/Services/IWellCompositeService.cs b/AsbCloudApp/Services/IWellCompositeService.cs index 16132642..0e0be853 100644 --- a/AsbCloudApp/Services/IWellCompositeService.cs +++ b/AsbCloudApp/Services/IWellCompositeService.cs @@ -1,8 +1,5 @@ using AsbCloudApp.Data; -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading; using System.Threading.Tasks; diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 78b7635f..84267023 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -42,41 +42,35 @@ namespace AsbCloudInfrastructure services.AddTransient(); services.AddTransient(); services.AddTransient(); - services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); // admin crud services: - services.AddTransient, CrudServiceBase>(); - services.AddTransient, CrudServiceBase>(); - services.AddTransient, CrudServiceBase>(); - services.AddTransient, DrillParamsService>(); - services.AddTransient, CrudServiceBase>(); - services.AddTransient, CrudServiceBase>(); - services.AddTransient, CrudServiceBase>(); - services.AddTransient, UserRoleService>(); services.AddTransient, CrudServiceBase>(); + services.AddTransient, CrudServiceBase>(); + services.AddTransient, CrudServiceBase>(); + services.AddTransient, CrudServiceBase>(); + services.AddTransient, DrillParamsService>(); + services.AddTransient, CrudServiceBase>(); + services.AddTransient, CrudServiceBase>(); + services.AddTransient, CrudServiceBase>(); // TelemetryData services services.AddTransient, TelemetryDataSaubService>(); diff --git a/AsbCloudInfrastructure/Services/Cache/CacheTable.cs b/AsbCloudInfrastructure/Services/Cache/CacheTable.cs index b68637fa..ebee1683 100644 --- a/AsbCloudInfrastructure/Services/Cache/CacheTable.cs +++ b/AsbCloudInfrastructure/Services/Cache/CacheTable.cs @@ -14,7 +14,7 @@ namespace AsbCloudInfrastructure.Services.Cache { private const int semaphoreTimeout = 5_000; private static readonly SemaphoreSlim semaphore = new(1); - private static readonly TimeSpan minPeriodRefresh = TimeSpan.FromSeconds(5); + private static readonly TimeSpan minPeriodRefresh = TimeSpan.FromSeconds(5); private static readonly string nameOfTEntity = typeof(TEntity).Name; private readonly CacheTableDataStore data; @@ -37,7 +37,7 @@ namespace AsbCloudInfrastructure.Services.Cache result = result.Include(include); return result; }; - + cached = (List)data.Entities; if ((cached.Count == 0) || data.IsObsolete) @@ -47,7 +47,7 @@ namespace AsbCloudInfrastructure.Services.Cache internal CacheTable(DbContext context, CacheTableDataStore data, Func, IQueryable> configureDbSet = null) { this.context = context; - this.data = data; + this.data = data; this.configureDbSet = configureDbSet; dbSet = context.Set(); @@ -65,15 +65,17 @@ namespace AsbCloudInfrastructure.Services.Cache /// It may be needed to avoid multiple operations like Refresh(). /// /// (wasFree) => {...} - /// false - semaphore.Wait returned by timeout - private static bool Sync(Action action) + /// default if semaphoreTimeout. Or result of func(..) + private static T Sync(Func func) { var wasFree = semaphore.CurrentCount > 0; - if (!semaphore.Wait(semaphoreTimeout)) - return false; + T result = default; + if (func is null || !semaphore.Wait(semaphoreTimeout)) + return result; + try { - action?.Invoke(wasFree); + result = func.Invoke(wasFree); } catch (Exception ex) { @@ -85,7 +87,7 @@ namespace AsbCloudInfrastructure.Services.Cache { semaphore.Release(); } - return true; + return result; } /// @@ -94,15 +96,18 @@ namespace AsbCloudInfrastructure.Services.Cache /// It may be needed to avoid multiple operations like Refresh(). /// /// (wasFree) => {...} - /// false - semaphore.Wait returned by timeout - private static async Task SyncAsync(Func task, CancellationToken token = default) + /// default if semaphoreTimeout. Or result of func(..) + private static async Task SyncAsync(Func> funcAsync, CancellationToken token = default) { var wasFree = semaphore.CurrentCount > 0; - if (!await semaphore.WaitAsync(semaphoreTimeout, token).ConfigureAwait(false)) - return false; + T result = default; + + if (funcAsync is null || !await semaphore.WaitAsync(semaphoreTimeout, token).ConfigureAwait(false)) + return result; + try { - await task?.Invoke(wasFree, token); + result = await funcAsync.Invoke(wasFree, token); } catch (Exception ex) { @@ -114,10 +119,10 @@ namespace AsbCloudInfrastructure.Services.Cache { semaphore.Release(); } - return true; + return result; } - private void InternalRefresh(bool force) + private int InternalRefresh(bool force) { if (force || data.LastResreshDate + minPeriodRefresh < DateTime.Now) { @@ -126,11 +131,12 @@ namespace AsbCloudInfrastructure.Services.Cache var entities = query.AsNoTracking().ToList(); //Trace.WriteLine($"CacheTable<{nameOfTEntity}> refresh"); cached.AddRange(entities); - data.LastResreshDate = DateTime.Now; + data.LastResreshDate = DateTime.Now; } + return cached.Count; } - private async Task InternalRefreshAsync(bool force, CancellationToken token = default) + private async Task InternalRefreshAsync(bool force, CancellationToken token = default) { if (force || data.LastResreshDate + minPeriodRefresh < DateTime.Now) { @@ -142,24 +148,18 @@ namespace AsbCloudInfrastructure.Services.Cache cached.AddRange(entities); data.LastResreshDate = DateTime.Now; } + return cached.Count; } public int Refresh(bool force) - { - Sync((wasFree) => { - if (wasFree) - InternalRefresh(force); - }); - return cached.Count; - } + => Sync((wasFree) => wasFree ? InternalRefresh(force) : 0); - public async Task RefreshAsync(bool force, CancellationToken token = default) + public Task RefreshAsync(bool force, CancellationToken token = default) { - await SyncAsync(async (wasFree, token) => { - if (wasFree) - await InternalRefreshAsync(force, token).ConfigureAwait(false); - }, token).ConfigureAwait(false); - return cached.Count; + return SyncAsync(async (wasFree, token) => + { + return wasFree ? await InternalRefreshAsync(force, token).ConfigureAwait(false) : 0; + }, token); } public bool Contains(Func predicate) @@ -169,25 +169,22 @@ namespace AsbCloudInfrastructure.Services.Cache => await FirstOrDefaultAsync(predicate, token) != default; public TEntity GetOrCreate(Func predicate, Func makeNew) + => Sync(wasFree => { - TEntity result = default; - Sync(wasFree => { - result = cached.FirstOrDefault(predicate); - if (result != default) - return; + var result = cached.FirstOrDefault(predicate); + if (result != default) + return result; - InternalRefresh(true); - result = cached.FirstOrDefault(predicate); - if (result != default) - return; + InternalRefresh(true); + result = cached.FirstOrDefault(predicate); + if (result != default) + return result; - var entry = dbSet.Add(makeNew()); - context.SaveChanges(); - InternalRefresh(true); - result = entry.Entity; - }); - return result; - } + var entry = dbSet.Add(makeNew()); + context.SaveChanges(); + InternalRefresh(true); + return entry.Entity; + }); public TEntity FirstOrDefault() { @@ -206,7 +203,7 @@ namespace AsbCloudInfrastructure.Services.Cache return result; await RefreshAsync(false, token); - return cached.FirstOrDefault(); + return cached.FirstOrDefault(); } public TEntity FirstOrDefault(Func predicate) @@ -263,11 +260,11 @@ namespace AsbCloudInfrastructure.Services.Cache return result; } - public void Upsert(TEntity entity) + public int Upsert(TEntity entity) { if (entity == default) - return; - Sync((wasFree) => + return 0; + return Sync((wasFree) => { if (dbSet.Contains(entity)) dbSet.Update(entity); @@ -276,46 +273,51 @@ namespace AsbCloudInfrastructure.Services.Cache var affected = context.SaveChanges(); if (affected > 0) InternalRefresh(true); - }); + return affected; + }); } - public Task UpsertAsync(TEntity entity, CancellationToken token = default) - => SyncAsync(async (wasFree, token) => { - if (dbSet.Contains(entity)) - dbSet.Update(entity); - else - dbSet.Add(entity); - var affected = await context.SaveChangesAsync(token).ConfigureAwait(false); - if(affected > 0) - await InternalRefreshAsync(true, token).ConfigureAwait(false); - }, token); + public Task UpsertAsync(TEntity entity, CancellationToken token = default) + => SyncAsync(async (wasFree, token) => + { + if (dbSet.Contains(entity)) + dbSet.Update(entity); + else + dbSet.Add(entity); + var affected = await context.SaveChangesAsync(token).ConfigureAwait(false); + if (affected > 0) + await InternalRefreshAsync(true, token).ConfigureAwait(false); + return affected; + }, token); - public void Upsert(IEnumerable entities) + public int Upsert(IEnumerable entities) { if (!entities.Any()) - return; + return 0; - Sync((wasFree) => + return Sync((wasFree) => { foreach (var entity in entities) { if (dbSet.Contains(entity)) // TODO: это очень ммедленно dbSet.Update(entity); else - dbSet.Add(entity); + dbSet.Add(entity); } var affected = context.SaveChanges(); if (affected > 0) InternalRefresh(true); + return affected; }); } - public async Task UpsertAsync(IEnumerable entities, CancellationToken token = default) + public Task UpsertAsync(IEnumerable entities, CancellationToken token = default) { if (!entities.Any()) - return; + return Task.FromResult(0); - await SyncAsync(async (wasFree, token) => { + return SyncAsync(async (wasFree, token) => + { var upsertedEntries = new List(entities.Count()); foreach (var entity in entities) { @@ -327,76 +329,76 @@ namespace AsbCloudInfrastructure.Services.Cache var affected = await context.SaveChangesAsync(token).ConfigureAwait(false); if (affected > 0) await InternalRefreshAsync(true, token).ConfigureAwait(false); + return affected; }, token); } - public void Remove(Func predicate) + public int Remove(Func predicate) => Sync(_ => { dbSet.RemoveRange(dbSet.Where(predicate)); var affected = context.SaveChanges(); if (affected > 0) InternalRefresh(true); + return affected; }); - - public Task RemoveAsync(Func predicate, CancellationToken token = default) - => SyncAsync(async (wasFree, token) => { + + public Task RemoveAsync(Func predicate, CancellationToken token = default) + => SyncAsync(async (wasFree, token) => + { dbSet.RemoveRange(dbSet.Where(predicate)); var affected = await context.SaveChangesAsync(token).ConfigureAwait(false); if (affected > 0) await InternalRefreshAsync(true, token).ConfigureAwait(false); + return affected; }, token); public TEntity Insert(TEntity entity) { - TEntity result = default; - Sync(_ => + return Sync(_ => { var entry = dbSet.Add(entity); var affected = context.SaveChanges(); if (affected > 0) InternalRefresh(true); - result = entry.Entity; + return entry.Entity; }); - return result; } - public async Task InsertAsync(TEntity entity, CancellationToken token = default) + public Task InsertAsync(TEntity entity, CancellationToken token = default) { - TEntity result = default; - await SyncAsync(async (wasFree, token) => - { - var entry = dbSet.Add(entity); - var affected = await context.SaveChangesAsync(token).ConfigureAwait(false); - if (affected > 0) - await InternalRefreshAsync(true, token).ConfigureAwait(false); - result = entry.Entity; - }, token); - return result; + return SyncAsync(async (wasFree, token) => + { + var entry = dbSet.Add(entity); + var affected = await context.SaveChangesAsync(token).ConfigureAwait(false); + if (affected > 0) + await InternalRefreshAsync(true, token).ConfigureAwait(false); + return entry.Entity; + }, token); } public int Insert(IEnumerable newEntities) { - int result = 0; - Sync(_ => { - dbSet.AddRange(newEntities); - result = context.SaveChanges(); - if (result > 0) - InternalRefresh(true); - }); - return result; + return Sync(_ => + { + dbSet.AddRange(newEntities); + var affected = context.SaveChanges(); + if (affected > 0) + InternalRefresh(true); + return affected; + }); } - public async Task InsertAsync(IEnumerable newEntities, CancellationToken token = default) + public Task InsertAsync(IEnumerable newEntities, CancellationToken token = default) { - int result = 0; - await SyncAsync(async (wasFree, token) => { + return SyncAsync(async (wasFree, token) => + { dbSet.AddRange(newEntities); - result = await context.SaveChangesAsync(token).ConfigureAwait(false); - if (result > 0) + var affected = await context.SaveChangesAsync(token).ConfigureAwait(false); + if (affected > 0) await InternalRefreshAsync(true, token).ConfigureAwait(false); + return affected; }, token); - return result; } public IEnumerator GetEnumerator() => Where().GetEnumerator(); diff --git a/AsbCloudInfrastructure/Services/CrudServiceBase.cs b/AsbCloudInfrastructure/Services/CrudServiceBase.cs index e0a49083..1dc6d100 100644 --- a/AsbCloudInfrastructure/Services/CrudServiceBase.cs +++ b/AsbCloudInfrastructure/Services/CrudServiceBase.cs @@ -102,11 +102,15 @@ namespace AsbCloudInfrastructure.Services return context.SaveChangesAsync(token); } - public virtual Task UpdateAsync(int id, TDto item, CancellationToken token = default) + public virtual async Task UpdateAsync(int id, TDto item, CancellationToken token = default) { + var existingEntity = await dbSet.AsNoTracking().FirstOrDefaultAsync(e => e.Id == id).ConfigureAwait(false); + if (existingEntity is null) + return 0; var entity = Convert(item); + entity.Id = id; dbSet.Update(entity); - return context.SaveChangesAsync(token); + return await context.SaveChangesAsync(token); } public virtual Task DeleteAsync(int id, CancellationToken token = default) diff --git a/AsbCloudInfrastructure/Services/PermissionService.cs b/AsbCloudInfrastructure/Services/PermissionService.cs index 0bd178b2..33ded1b5 100644 --- a/AsbCloudInfrastructure/Services/PermissionService.cs +++ b/AsbCloudInfrastructure/Services/PermissionService.cs @@ -1,8 +1,9 @@ using AsbCloudApp.Data; using AsbCloudApp.Services; using AsbCloudDb.Model; +using AsbCloudInfrastructure.Services.Cache; using Mapster; -using Microsoft.EntityFrameworkCore; +using System; using System.Collections.Generic; using System.Linq; using System.Threading; @@ -12,18 +13,19 @@ namespace AsbCloudInfrastructure.Services { public class PermissionService : IPermissionService, IConverter { - private readonly IAsbCloudDbContext db; - - public PermissionService(IAsbCloudDbContext db) + private readonly CacheTable cachePermission; + + public PermissionService(IAsbCloudDbContext db, CacheDb cacheDb) { - this.db = db; + cachePermission = cacheDb.GetCachedTable( + (AsbCloudDbContext)db, + new string[] { nameof(Permission.PermissionInfo) }); } public async Task> GetByIdRoleAsync(int idRole, CancellationToken token) { - var entities = await db.Permissions - .Where(p => p.IdUserRole == idRole) - .ToListAsync(token) + var entities = await cachePermission + .WhereAsync(p => p.IdUserRole == idRole, token) .ConfigureAwait(false); var dto = entities.Select(Convert); return dto; @@ -32,26 +34,36 @@ namespace AsbCloudInfrastructure.Services public Task InsertRangeAsync(IEnumerable dtos, CancellationToken token) { var entities = dtos.Select(Convert); - db.Permissions.AddRange(entities); - return db.SaveChangesAsync(token); + return cachePermission.InsertAsync(entities, token); } - public Task UpdateAsync(PermissionDto dto, CancellationToken token) + public async Task UpdateAsync(PermissionDto dto, CancellationToken token) { var entity = Convert(dto); - db.Permissions.Update(entity); - return db.SaveChangesAsync(token); + await cachePermission.UpsertAsync(entity, token) + .ConfigureAwait(false); + return 1; } public Task DeleteAsync(int idUserRole, int idPermission, CancellationToken token) { - var entities = db.Permissions.AsNoTracking() - .Where(e => e.IdUserRole == idUserRole && e.IdPermission == idPermission) - .ToList(); - if (!entities.Any()) - return Task.FromResult(0); - db.Permissions.RemoveRange(entities); - return db.SaveChangesAsync(token); + bool predicate(Permission p) => p.IdUserRole == idUserRole && p.IdPermission == idPermission; + return DeleteAsync(predicate, token); + } + + public Task DeleteAllByRoleAsync(int idUserRole, CancellationToken token) + { + bool predicate(Permission p) => p.IdUserRole == idUserRole; + return DeleteAsync(predicate, token); + } + + private async Task DeleteAsync(Func predicate, CancellationToken token) + { + var count = (await cachePermission.WhereAsync(predicate, token).ConfigureAwait(false)).Count(); + if (count > 0) + await cachePermission.RemoveAsync(predicate, token) + .ConfigureAwait(false); + return count; } public Permission Convert(PermissionDto src) diff --git a/AsbCloudInfrastructure/Services/UserRoleService.cs b/AsbCloudInfrastructure/Services/UserRoleService.cs index f5a154f1..85adf9ff 100644 --- a/AsbCloudInfrastructure/Services/UserRoleService.cs +++ b/AsbCloudInfrastructure/Services/UserRoleService.cs @@ -11,51 +11,82 @@ using AsbCloudApp.Services; namespace AsbCloudInfrastructure.Services { - public class UserRoleService : CrudServiceBase + public class UserRoleService : IUserRoleService { private readonly CacheTable cacheUserRoles; private readonly IPermissionService permissionService; - public UserRoleService(IAsbCloudDbContext context, CacheDb cacheDb, IPermissionService permissionService) : base(context) + public List Incledes { get; } = new(); + + public UserRoleService(IAsbCloudDbContext context, CacheDb cacheDb, IPermissionService permissionService) { - cacheUserRoles = cacheDb.GetCachedTable((AsbCloudDbContext)context); + cacheUserRoles = cacheDb.GetCachedTable((AsbCloudDbContext)context, new string[] { nameof(UserRole.Permissions) }); this.permissionService = permissionService; } - public override async Task> GetPageAsync(int skip = 0, - int take = 32, CancellationToken token = default) + public async Task> GetAllAsync(CancellationToken token = default) { - var rolesDtos = await base.GetPageAsync(skip, take, token); - return rolesDtos; + var entities = await cacheUserRoles.WhereAsync(token) + .ConfigureAwait(false); + var dtos = entities.Adapt(); + return dtos; } - public override async Task GetAsync(int id, CancellationToken token = default) + public async Task GetAsync(int id, CancellationToken token = default) { - var roleDto = await base.GetAsync(id,token); - - return roleDto; + var entity = await cacheUserRoles.FirstOrDefaultAsync(r=>r.Id == id, token) + .ConfigureAwait(false); + var dto = entity?.Adapt(); + return dto; } - public override async Task InsertAsync(UserRoleDto dto, CancellationToken token = default) + public async Task InsertAsync(UserRoleDto dto, CancellationToken token = default) { - var id = await base.InsertAsync(dto, token).ConfigureAwait(false); - if (dto.Permissions is not null && dto.Permissions.Any()) + var entity = dto.Adapt(); + var updatedEntity = await cacheUserRoles.InsertAsync(entity, token).ConfigureAwait(false); + if (dto.Permissions?.Any() == true) { foreach (var permission in dto.Permissions) - permission.IdUserRole = id; + permission.IdUserRole = updatedEntity.Id; await permissionService.InsertRangeAsync(dto.Permissions, token).ConfigureAwait(false); + await cacheUserRoles.RefreshAsync(true, token) + .ConfigureAwait(false); } - return id; + return updatedEntity?.Id ?? 0; } - public override async Task UpdateAsync(int id, UserRoleDto item, CancellationToken token = default) + public async Task InsertRangeAsync(IEnumerable dtos, CancellationToken token = default) { - foreach (var p in item.Permissions) - p.IdUserRole = item.Id; - - var result = await base.UpdateAsync(id, item, token); + var entities = dtos.Adapt(); + return await cacheUserRoles.InsertAsync(entities, token).ConfigureAwait(false); + } - return result; + public async Task UpdateAsync(int id, UserRoleDto dto, CancellationToken token = default) + { + var entity = dto.Adapt(); + entity.Id = id; + await cacheUserRoles.UpsertAsync(entity, token) + .ConfigureAwait(false); + + if(dto.Permissions is not null) + { + await permissionService.DeleteAllByRoleAsync(id, token) + .ConfigureAwait(false); + + if (dto.Permissions.Any()) + { + foreach (var permission in dto.Permissions) + permission.IdUserRole = id; + + await permissionService.InsertRangeAsync(dto.Permissions, token) + .ConfigureAwait(false); + } + + await cacheUserRoles.RefreshAsync(true, token) + .ConfigureAwait(false); + } + + return id; } private IEnumerable GetNestedPermissions(UserRole role, int counter = 10) @@ -63,14 +94,14 @@ namespace AsbCloudInfrastructure.Services List permissions = role.Permissions.ToList(); if (role.IdParent is not null) { - if(counter == 0) + if (counter == 0) { Trace.WriteLine($"User role with id: {role.Id} has more than 10 nested childs"); return permissions; } var parentRole = cacheUserRoles.FirstOrDefault(r => r.Id == role.IdParent); - - if(parentRole is null) + + if (parentRole is null) return permissions; var parentPermissions = GetNestedPermissions(parentRole, counter--); @@ -98,5 +129,11 @@ namespace AsbCloudInfrastructure.Services } } } + + public Task DeleteAsync(int id, CancellationToken token = default) + => cacheUserRoles.RemoveAsync(r => r.Id == id, token); + + public Task DeleteAsync(IEnumerable ids, CancellationToken token = default) + => cacheUserRoles.RemoveAsync(r => ids.Contains(r.Id), token); } } \ No newline at end of file diff --git a/AsbCloudWebApi/Controllers/AdminPermissionController.cs b/AsbCloudWebApi/Controllers/AdminPermissionController.cs index aa6a77b3..f525fc07 100644 --- a/AsbCloudWebApi/Controllers/AdminPermissionController.cs +++ b/AsbCloudWebApi/Controllers/AdminPermissionController.cs @@ -71,7 +71,7 @@ namespace AsbCloudWebApi.Controllers /// id роли для удаления разрешения /// Токен отмены задачи /// - [HttpDelete("{idPermission}/{idRole}")] + [HttpDelete("{idPermission}/{idUserRole}")] [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] public async Task DeleteAsync(int idUserRole, int idPermission, CancellationToken token = default) diff --git a/AsbCloudWebApi/Controllers/AdminPermissionInfoController.cs b/AsbCloudWebApi/Controllers/AdminPermissionInfoController.cs index 99a0a673..1950e362 100644 --- a/AsbCloudWebApi/Controllers/AdminPermissionInfoController.cs +++ b/AsbCloudWebApi/Controllers/AdminPermissionInfoController.cs @@ -12,7 +12,6 @@ namespace AsbCloudWebApi.Controllers { public AdminPermissionInfoController(ICrudService permissionInfoService) :base(permissionInfoService) - {} - + {} } } \ No newline at end of file diff --git a/AsbCloudWebApi/Controllers/AdminUserRoleController.cs b/AsbCloudWebApi/Controllers/AdminUserRoleController.cs index 7a2a0067..5876ece4 100644 --- a/AsbCloudWebApi/Controllers/AdminUserRoleController.cs +++ b/AsbCloudWebApi/Controllers/AdminUserRoleController.cs @@ -8,10 +8,11 @@ namespace AsbCloudWebApi.Controllers [Route("api/admin/role")] [ApiController] [Authorize] - public class AdminUserRoleController : CrudController> + public class AdminUserRoleController : CrudController> { - public AdminUserRoleController(ICrudService service) - : base(service) - { } + public AdminUserRoleController(IUserRoleService service) + :base(service) + { + } } } diff --git a/AsbCloudWebApi/Controllers/CrudController.cs b/AsbCloudWebApi/Controllers/CrudController.cs index c990da79..c5d4d926 100644 --- a/AsbCloudWebApi/Controllers/CrudController.cs +++ b/AsbCloudWebApi/Controllers/CrudController.cs @@ -30,24 +30,6 @@ namespace AsbCloudWebApi.Controllers this.service = service; } - /// - /// Получить страницу с записями в PaginationContainer - /// - /// пропустить skip записей - /// получить take записей - /// CancellationToken - /// страница с записями в PaginationContainer - [HttpGet()] - public virtual async Task>> GetPage(int skip = 0, int take = 32, - CancellationToken token = default) - { - if (!Roles.Any(role => User.IsInRole(role))) - return Forbid(); - - var result = await service.GetPageAsync(skip, take, token).ConfigureAwait(false); - return Ok(result); - } - /// /// Получить все записи /// @@ -111,6 +93,8 @@ namespace AsbCloudWebApi.Controllers return Forbid(); var result = await service.UpdateAsync(id, value, token).ConfigureAwait(false); + if (result == 0) + return BadRequest($"id:{id} does not exist in the db"); return Ok(result); } @@ -131,4 +115,6 @@ namespace AsbCloudWebApi.Controllers return Ok(result); } } + + }