using System; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Reflection; using System.Text.Json.Serialization; using System.Threading; using System.Threading.Tasks; using Keyapis.EF.DataAnnotations; using Keyapis.EF.Extensions; using Keyapis.EF.ValueConverters; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.ChangeTracking; // ReSharper disable once CheckNamespace namespace Keyapis.EF.Preset.V1.Data.PresetDb; public interface IPresetDbContext : IAsyncDisposable, IDisposable { public DbSet Presets { get; set; } public Task SaveChangesAsync(CancellationToken cancellationToken = default); } public abstract class PresetDbContextBase : DbContext, IPresetDbContext { protected PresetDbContextBase(DbContextOptions options) : base(options) { } public DbSet Presets { get; set; } = null!; protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); builder.HasPostgresExtension("pg_trgm"); foreach(var entity in builder.Model.GetEntityTypes()) { foreach(var property in entity.GetProperties()) { var memberInfo = property.PropertyInfo ?? (MemberInfo ?)property.FieldInfo; if (memberInfo == null) continue; var customRangeAttribute = memberInfo.GetCustomAttribute(); if (customRangeAttribute != null) { var actualType = Nullable.GetUnderlyingType(property.ClrType) ?? property.ClrType; if (actualType == typeof(string) || typeof(IEnumerable).IsAssignableFrom(actualType)) { property.SetMaxLength(customRangeAttribute.Maximum > int.MaxValue ? int.MaxValue : (int)customRangeAttribute.Maximum); } } var customRequiredAttribute = memberInfo.GetCustomAttribute(); if (customRequiredAttribute != null) { property.IsNullable = false; } } } builder.Entity(e => { // Для поля id дополнительные конфигурации свойства не нужны // Найдено сопоставление: model.id ~ order.ID e.HasIndex(p => p.Id) .HasMethod("btree") .IsDescending(); // Для поля title дополнительные конфигурации свойства не нужны // Найдено сопоставление: model.title ~ filter.title e.HasIndex(p => p.Title) .IsDescending(); e.Property(p => p.MrfIds) .HasDefaultValue(new List()); // Найдено сопоставление: model.mrf_ids ~ filter.mrf_ids e.HasIndex(p => p.MrfIds); e.Property(p => p.RfIds) .HasDefaultValue(new List()); // Найдено сопоставление: model.rf_ids ~ filter.mrf_ids e.HasIndex(p => p.RfIds); // Для поля description дополнительные конфигурации свойства не нужны // Для поля description сопоствалений с фильтром и сортировкой не найденно e.Property(p => p.CreatedAt) .HasColumnType("timestamp without time zone") .HasConversion(DateTimeUtcConverter.Instance); // Найдено сопоставление: model.created_at ~ order.CREATED_AT e.HasIndex(p => p.CreatedAt) .HasMethod("btree") .IsDescending(); e.Property(p => p.ChangedAt) .HasColumnType("timestamp without time zone") .HasConversion(DateTimeUtcConverter.Instance) .IsConcurrencyToken(); // Найдено сопоставление: model.changed_at ~ order.CHANGED_AT e.HasIndex(p => p.ChangedAt) .HasMethod("btree") .IsDescending(); e.Property(p => p.StatusType) .HasMaxLength(32) .HasConversion(new EnumToStringConverter()); // Найдено сопоставление: model.status_type ~ filter.status_types e.HasIndex(p => p.StatusType) .IsDescending(); e.Property(p => p.Sip) .HasColumnType("jsonb") .HasConversion(new CustomJsonConverter()); e.HasIndex(p => p.Sip) .HasMethod("gin") .HasOperators("jsonb_path_ops"); e.Property(p => p.Ntp) .HasColumnType("jsonb") .HasConversion(new CustomJsonConverter()); e.HasIndex(p => p.Ntp) .HasMethod("gin") .HasOperators("jsonb_path_ops"); e.Property(p => p.Syslog) .HasColumnType("jsonb") .HasConversion(new CustomJsonConverter()); e.HasIndex(p => p.Syslog) .HasMethod("gin") .HasOperators("jsonb_path_ops"); e.Property(p => p.Rooms) .HasColumnType("jsonb") .HasConversion(new CustomJsonConverter>(), new ValueComparer>( (c1, c2) => (c1 != null && c2 != null && c1.SequenceEqual(c2)), c => c.Aggregate(0, (a, v) => HashCode.Combine(a, v.GetHashCode())), c => c.ToList() )) .HasDefaultValue(new List()) .HasColumnType("jsonb"); e.HasIndex(p => p.Rooms) .HasMethod("gin") .HasOperators("jsonb_ops"); e.Property(p => p.VideoConfig) .HasColumnType("jsonb") .HasConversion(new CustomJsonConverter()); e.HasIndex(p => p.VideoConfig) .HasMethod("gin") .HasOperators("jsonb_path_ops"); e.Property(p => p.Dtmf) .HasColumnType("jsonb") .HasConversion(new CustomJsonConverter>(), new ValueComparer>( (c1, c2) => (c1 != null && c2 != null && c1.SequenceEqual(c2)), c => c.Aggregate(0, (a, v) => HashCode.Combine(a, v.GetHashCode())), c => c.ToList() )) .HasDefaultValue(new List()) .HasColumnType("jsonb"); e.HasIndex(p => p.Dtmf) .HasMethod("gin") .HasOperators("jsonb_ops"); e.Property(p => p.FaceRecognition) .HasColumnType("jsonb") .HasConversion(new CustomJsonConverter()); e.HasIndex(p => p.FaceRecognition) .HasMethod("gin") .HasOperators("jsonb_path_ops"); // Дополнительные индексы: // По полю PresetFilter.(title,description) e.HasIndex(p => new { p.Title, p.Description }) .HasMethod("gin") .IsTsVectorExpressionIndex("russian"); }); builder.HasDefaultSchema("preset"); } } /// /// Пресет. /// Пресет с id=1 является дефолтным пресетом. /// # Описание модели /// [ Display(Name = @"Пресет"), Description(@"Пресет с id=1 является дефолтным пресетом. Описание модели") ] public partial class PresetModel { /// /// Идентификатор. /// # Диапазон: 0..2147483647 /// [ Display(Name = @"Идентификатор"), Description(@"Диапазон: 0..2147483647"), CustomRange(0, 2147483647) ] public int Id { get; set; } /// /// Наименование. /// # Диапазон: 3..256 /// [ Display(Name = @"Наименование"), Description(@"Диапазон: 3..256"), CustomRequired, CustomRange(3, 256) ] public string Title { get; set; } = null!; /// /// Идентификатор МРФ. /// # Диапазон: 0..10 /// [ Display(Name = @"Идентификатор МРФ"), Description(@"Диапазон: 0..10"), CustomRequired, CustomRange(0, 10) ] public List MrfIds { get; set; } = new(0); /// /// Идентификатор РФ. /// # Диапазон: 0..100 /// [ Display(Name = @"Идентификатор РФ"), Description(@"Диапазон: 0..100"), CustomRequired, CustomRange(0, 100) ] public List RfIds { get; set; } = new(0); /// /// Описание. /// # Диапазон: 3..1024 /// [ Display(Name = @"Описание"), Description(@"Диапазон: 3..1024"), CustomRange(3, 1024) ] public string? Description { get; set; } /// /// Дата и время создания. /// # Тип: DateTime /// [ Display(Name = @"Дата и время создания"), Description(@"Тип: DateTime"), Editable(false) ] public DateTime CreatedAt { get; set; } /// /// Дата последнего изменения. /// Заполняется и обновляется сервером. /// Заполняется при создании и изменении. /// Является версией объекта. /// # Тип: DateTime /// [ Display(Name = @"Дата последнего изменения"), Description(@"Заполняется и обновляется сервером. Заполняется при создании и изменении. Является версией объекта. Тип: DateTime"), Editable(false) ] public DateTime ChangedAt { get; set; } /// /// Статус /// [ Display(Name = @"Статус"), CustomRequired ] public PresetModel.PresetStatusType StatusType { get; set; } /// /// Параметр SIP /// [ Display(Name = @"Параметр SIP"), CustomRequired ] public PresetModel.SipModel Sip { get; set; } = null!; /// /// Параметр NTP /// [ Display(Name = @"Параметр NTP"), CustomRequired ] public PresetModel.NtpModel Ntp { get; set; } = null!; /// /// Параметр Syslog /// [ Display(Name = @"Параметр Syslog"), CustomRequired ] public PresetModel.SyslogModel Syslog { get; set; } = null!; /// /// Помещения. /// # Диапазон: 0..10000 /// [ Display(Name = @"Помещения"), Description(@"Диапазон: 0..10000"), CustomRequired, CustomRange(0, 10000) ] public List Rooms { get; set; } = new(0); /// /// Параметры конфигурации видео /// [ Display(Name = @"Параметры конфигурации видео"), CustomRequired ] public PresetModel.VideoConfigModel VideoConfig { get; set; } = null!; /// /// Параметр DTMF. /// # Диапазон: 0..64 /// [ Display(Name = @"Параметр DTMF"), Description(@"Диапазон: 0..64"), CustomRequired, CustomRange(0, 64) ] public List Dtmf { get; set; } = new(0); /// /// Распознование лиц /// [ Display(Name = @"Распознование лиц") ] public PresetModel.FaceRecognitionModel? FaceRecognition { get; set; } /// /// Параметр SIP /// [ Display(Name = @"Параметр SIP") ] public partial class SipModel { /// /// Хост. /// # Диапазон: 5..256 /// [ Display(Name = @"Хост"), Description(@"Диапазон: 5..256"), CustomRequired, CustomRange(5, 256) ] public string Host { get; set; } = null!; /// /// Порт. /// # Диапазон: 1..65536 /// [ Display(Name = @"Порт"), Description(@"Диапазон: 1..65536"), CustomRequired, CustomRange(1, 65536) ] public int Port { get; set; } /// /// Хост reg. /// # Диапазон: 5..256 /// [ Display(Name = @"Хост reg"), Description(@"Диапазон: 5..256"), CustomRequired, CustomRange(5, 256) ] public string RegHost { get; set; } = null!; /// /// Порт reg. /// # Диапазон: 1..65536 /// [ Display(Name = @"Порт reg"), Description(@"Диапазон: 1..65536"), CustomRequired, CustomRange(1, 65536) ] public int RegPort { get; set; } /// /// Хост proxy. /// # Диапазон: 5..256 /// [ Display(Name = @"Хост proxy"), Description(@"Диапазон: 5..256"), CustomRequired, CustomRange(5, 256) ] public string ProxyHost { get; set; } = null!; /// /// Порт proxy. /// # Диапазон: 1..65536 /// [ Display(Name = @"Порт proxy"), Description(@"Диапазон: 1..65536"), CustomRequired, CustomRange(1, 65536) ] public int ProxyPort { get; set; } } /// /// Параметр NTP /// [ Display(Name = @"Параметр NTP") ] public partial class NtpModel { /// /// Хост. /// # Диапазон: 5..256 /// [ Display(Name = @"Хост"), Description(@"Диапазон: 5..256"), CustomRequired, CustomRange(5, 256) ] public string Host { get; set; } = null!; /// /// Порт. /// # Диапазон: 1..65536 /// [ Display(Name = @"Порт"), Description(@"Диапазон: 1..65536"), CustomRequired, CustomRange(1, 65536) ] public int Port { get; set; } } /// /// Параметр Syslog /// [ Display(Name = @"Параметр Syslog") ] public partial class SyslogModel { /// /// Хост. /// # Диапазон: 5..256 /// [ Display(Name = @"Хост"), Description(@"Диапазон: 5..256"), CustomRequired, CustomRange(5, 256) ] public string Host { get; set; } = null!; /// /// Порт. /// # Диапазон: 1..65536 /// [ Display(Name = @"Порт"), Description(@"Диапазон: 1..65536"), CustomRequired, CustomRange(1, 65536) ] public int Port { get; set; } /// /// Протокол /// [ Display(Name = @"Протокол"), CustomRequired ] public PresetModel.SyslogModel.PresetSyslogProtocolType ProtocolType { get; set; } /// /// Тип протокола. /// # Тип: byte /// [ Description("Тип: byte") ] public enum PresetSyslogProtocolType : byte { /// /// Значение не указано /// [ Display(Name = @"Значение не указано"), JsonPropertyName("PROTOCOL_TYPE_UNKNOWN") ] Unknown = 0, /// /// Протокол UDP /// [ Display(Name = @"Протокол UDP"), JsonPropertyName("UDP") ] Udp = 1, /// /// Протокол TCP /// [ Display(Name = @"Протокол TCP"), JsonPropertyName("TCP") ] Tcp = 2, } } /// /// Помещение /// [ Display(Name = @"Помещение") ] public partial class RoomModel { /// /// Номер телефона. /// # Диапазон: 5..14 /// [ Display(Name = @"Номер телефона"), Description(@"Диапазон: 5..14"), CustomRequired, CustomRange(5, 14) ] public string Phone { get; set; } = null!; /// /// Номер помещения. /// # Диапазон: 1..10000 /// [ Display(Name = @"Номер помещения"), Description(@"Диапазон: 1..10000"), CustomRequired, CustomRange(1, 10000) ] public int Num { get; set; } } /// /// Параметры конфигурации видео /// [ Display(Name = @"Параметры конфигурации видео") ] public partial class VideoConfigModel { /// /// Тип пресета /// [ Display(Name = @"Тип пресета"), CustomRequired ] public PresetModel.VideoConfigModel.PresetVideoConfigQualityType QualityType { get; set; } /// /// Пользователь /// [ Display(Name = @"Пользователь"), CustomRequired ] public PresetModel.VideoConfigModel.RtspUserModel RtspUser { get; set; } = null!; /// /// Пользователь /// [ Display(Name = @"Пользователь") ] public partial class RtspUserModel { /// /// Имя пользователя. /// # Диапазон: 3..256 /// [ Display(Name = @"Имя пользователя"), Description(@"Диапазон: 3..256"), CustomRequired, CustomRange(3, 256) ] public string Username { get; set; } = null!; /// /// Пароль. /// # Диапазон: 3..256 /// [ Display(Name = @"Пароль"), Description(@"Диапазон: 3..256"), CustomRequired, CustomRange(3, 256) ] public string Password { get; set; } = null!; } /// /// Справочник качеств. /// # Тип: byte /// [ Description("Тип: byte") ] public enum PresetVideoConfigQualityType : byte { /// /// Значение не указано /// [ Display(Name = @"Значение не указано"), JsonPropertyName("QUALITY_TYPE_UNKNOWN") ] Unknown = 0, /// /// Высокое качество /// [ Display(Name = @"Высокое качество"), JsonPropertyName("HIGH") ] High = 1, /// /// Среднее качество /// [ Display(Name = @"Среднее качество"), JsonPropertyName("MEDIUM") ] Medium = 2, } } /// /// Параметр DTMF /// [ Display(Name = @"Параметр DTMF") ] public partial class DtmfModel { /// /// Код. /// # Диапазон: 1..1 /// [ Display(Name = @"Код"), Description(@"Диапазон: 1..1"), CustomRequired, CustomRange(1, 1) ] public string Code { get; set; } = null!; /// /// Индекс реле. /// # Диапазон: 0..64 /// [ Display(Name = @"Индекс реле"), Description(@"Диапазон: 0..64"), CustomRange(0, 64) ] public int RelayIndex { get; set; } } /// /// Распознование лиц /// [ Display(Name = @"Распознование лиц") ] public partial class FaceRecognitionModel { /// /// Адрес /// [ Display(Name = @"Адрес"), CustomRequired ] public string Host { get; set; } = null!; /// /// Альтернативный адрес /// [ Display(Name = @"Альтернативный адрес") ] public string? AltHost { get; set; } /// /// Путь запроса к серверу /// [ Display(Name = @"Путь запроса к серверу"), CustomRequired ] public string Endpoint { get; set; } = null!; /// /// Токен /// [ Display(Name = @"Токен"), CustomRequired ] public string AuthToken { get; set; } = null!; /// /// Тип конфигурации /// [ Display(Name = @"Тип конфигурации"), CustomRequired ] public PresetModel.FaceRecognitionModel.PresetFaceRecognitionConfigurationType ConfigurationType { get; set; } /// /// Идентификатор источника в identix /// [ Display(Name = @"Идентификатор источника в identix"), CustomRequired ] public string OriginId { get; set; } = null!; // WARNING Не удалось найти свойство навигации для поля Preset.FaceRecognition.origin_id /// /// Идентификаторы групп профилей в identix /// [ Display(Name = @"Идентификаторы групп профилей в identix") ] public List GroupIds { get; set; } = new(0); /// /// Тип конфигурации /// public enum PresetFaceRecognitionConfigurationType { /// /// Значение не указано /// [ Display(Name = @"Значение не указано"), JsonPropertyName("CONFIGURATION_TYPE_UNKNOWN") ] Unknown = 0, /// /// По умолчанию /// [ Display(Name = @"По умолчанию"), JsonPropertyName("DEFAULT") ] Default = 1, } } /// /// Ошибка сохранения. /// Эти проверки выполняются при работе с базой данных и сторонними сервисами /// [ Display(Name = @"Ошибка сохранения"), Description(@"Эти проверки выполняются при работе с базой данных и сторонними сервисами") ] public partial class SavingErrorModel { /// /// Конфликт версий /// [ Display(Name = @"Конфликт версий") ] public PresetModel.SavingErrorModel.ConflictModel? Conflict { get; set; } /// /// Запрещено для дефолтного пресета /// [ Display(Name = @"Запрещено для дефолтного пресета") ] public PresetModel.SavingErrorModel.NotAllowedForDefaultModel? NotAllowedForDefault { get; set; } /// /// Конфликт версий. /// Причины: /// - В базе хранится другая версия строки, значения changed_at отличаются /// [ Display(Name = @"Конфликт версий"), Description(@"Причины: - В базе хранится другая версия строки, значения changed_at отличаются") ] public partial class ConflictModel { } /// /// Недоступно для дефолтного пресета. /// Причины: /// - Смена статуса на Архивный /// [ Display(Name = @"Недоступно для дефолтного пресета"), Description(@"Причины: - Смена статуса на Архивный") ] public partial class NotAllowedForDefaultModel { } } /// /// Справочник статусов. /// # Тип: byte /// [ Description("Тип: byte") ] public enum PresetStatusType : byte { /// /// Значение не указано /// [ Display(Name = @"Значение не указано"), JsonPropertyName("STATUS_TYPE_UNKNOWN") ] Unknown = 0, /// /// Активный /// [ Display(Name = @"Активный"), JsonPropertyName("ACTIVE") ] Active = 1, /// /// Архивный /// [ Display(Name = @"Архивный"), JsonPropertyName("ARCHIVE") ] Archive = 2, } } /// /// Фильтр по пресетам /// [ Display(Name = @"Фильтр по пресетам") ] public partial class PresetFilterModel { /// /// По идентификаторам МРФ /// [ Display(Name = @"По идентификаторам МРФ") ] public List MrfIds { get; set; } = new(0); /// /// По идентификаторам РФ /// [ Display(Name = @"По идентификаторам РФ") ] public List RfIds { get; set; } = new(0); /// /// Поиск по тексту. /// Если значение не передано то поиск по нему не производится. /// # Диапазон: 3..64. /// # Поиск производится по полям: /// # - Наименование; /// # - Описание /// [ Display(Name = @"Поиск по тексту"), Description(@"Если значение не передано то поиск по нему не производится. Диапазон: 3..64. Поиск производится по полям: - Наименование; - Описание"), CustomRange(3, 64) ] public string? Text { get; set; } /// /// Поиск по наименованию. /// Если значение не передано то поиск по нему не производится. /// # Диапазон: 3..64. /// # Поиск производится по полям: /// # - Наименование /// [ Display(Name = @"Поиск по наименованию"), Description(@"Если значение не передано то поиск по нему не производится. Диапазон: 3..64. Поиск производится по полям: - Наименование"), CustomRange(3, 64) ] public string? Title { get; set; } /// /// По статусам /// [ Display(Name = @"По статусам") ] public List StatusTypes { get; set; } = new(0); } /// /// Запрос на установку пресета /// [ Display(Name = @"Запрос на установку пресета") ] public partial class PostEventPresetInstallRequestModel { /// /// Идентификатор пресета /// [ Display(Name = @"Идентификатор пресета"), CustomRequired ] public int Id { get; set; } } /// /// Ответ на запрос на установку пресета /// [ Display(Name = @"Ответ на запрос на установку пресета") ] public partial class PostEventPresetInstallResponseModel { } /// /// Задача ошибки при конфигурации устройства. /// Очередь key.preset.configuration_fail /// [ Display(Name = @"Задача ошибки при конфигурации устройства"), Description(@"Очередь key.preset.configuration_fail") ] public partial class PresetConfigurationFailTaskModel { /// /// Идентификатор ответа /// [ Display(Name = @"Идентификатор ответа"), CustomRequired ] public string RequestId { get; set; } = null!; // WARNING Не удалось найти свойство навигации для поля PresetConfigurationFailTask.request_id /// /// Идентификатор устройства /// [ Display(Name = @"Идентификатор устройства"), CustomRequired ] public int DeviceId { get; set; } // WARNING Не удалось найти свойство навигации для поля PresetConfigurationFailTask.device_id /// /// Идентификатор пресета /// [ Display(Name = @"Идентификатор пресета"), CustomRequired ] public int PresetId { get; set; } /// /// Свойство навигации /// [ JsonIgnore ] public PresetModel Preset { get; set; } = null!; /// /// Текст ошибки /// [ Display(Name = @"Текст ошибки"), CustomRequired ] public string ErrorMessage { get; set; } = null!; } /// /// Задача успешной конфигурации устройства. /// Очередь key.preset.configuration_success /// [ Display(Name = @"Задача успешной конфигурации устройства"), Description(@"Очередь key.preset.configuration_success") ] public partial class PresetConfigurationSuccessTaskModel { /// /// Идентификатор ответа /// [ Display(Name = @"Идентификатор ответа"), CustomRequired ] public string RequestId { get; set; } = null!; // WARNING Не удалось найти свойство навигации для поля PresetConfigurationSuccessTask.request_id /// /// Идентификатор устройства /// [ Display(Name = @"Идентификатор устройства"), CustomRequired ] public int DeviceId { get; set; } // WARNING Не удалось найти свойство навигации для поля PresetConfigurationSuccessTask.device_id /// /// Идентификатор пресета /// [ Display(Name = @"Идентификатор пресета"), CustomRequired ] public int PresetId { get; set; } /// /// Свойство навигации /// [ JsonIgnore ] public PresetModel Preset { get; set; } = null!; /// /// Дата и время конфигурации /// [ Display(Name = @"Дата и время конфигурации"), CustomRequired ] public DateTime ConfiguredAt { get; set; } } /// /// Задача на конфигурирование устройства. /// Очередь key.preset.configuration /// [ Display(Name = @"Задача на конфигурирование устройства"), Description(@"Очередь key.preset.configuration") ] public partial class PresetConfigurationTaskModel { /// /// Идентификатор запроса /// [ Display(Name = @"Идентификатор запроса"), CustomRequired ] public string RequestId { get; set; } = null!; // WARNING Не удалось найти свойство навигации для поля PresetConfigurationTask.request_id /// /// Пресет /// [ Display(Name = @"Пресет"), CustomRequired ] public PresetModel Preset { get; set; } = null!; /// /// Идентификатор устройства /// [ Display(Name = @"Идентификатор устройства"), CustomRequired ] public int DeviceId { get; set; } // WARNING Не удалось найти свойство навигации для поля PresetConfigurationTask.device_id /// /// Модель /// [ Display(Name = @"Модель"), CustomRequired ] public string Model { get; set; } = null!; /// /// Адрес устройства /// [ Display(Name = @"Адрес устройства"), CustomRequired ] public string Host { get; set; } = null!; /// /// Имя пользователя устройства /// [ Display(Name = @"Имя пользователя устройства"), CustomRequired ] public string Username { get; set; } = null!; /// /// Пароль пользователья устройства /// [ Display(Name = @"Пароль пользователья устройства"), CustomRequired ] public string Password { get; set; } = null!; /// /// Таймзона NTP /// [ Display(Name = @"Таймзона NTP"), CustomRequired ] public string NtpTimezone { get; set; } = null!; } /// /// Задача на установку пресета. /// Очередь key.preset.install /// [ Display(Name = @"Задача на установку пресета"), Description(@"Очередь key.preset.install") ] public partial class PresetInstallTaskModel { /// /// Идентификатор запроса /// [ Display(Name = @"Идентификатор запроса"), CustomRequired ] public string RequestId { get; set; } = null!; // WARNING Не удалось найти свойство навигации для поля PresetInstallTask.request_id /// /// Пресет /// [ Display(Name = @"Пресет"), CustomRequired ] public PresetModel Preset { get; set; } = null!; } /// /// Запрос удаления пресета /// [ Display(Name = @"Запрос удаления пресета") ] public partial class DeletePresetRequestModel { /// /// Идентификатор пресета /// [ Display(Name = @"Идентификатор пресета"), CustomRequired ] public int Id { get; set; } } /// /// Ответ на запрос удаления пресета /// [ Display(Name = @"Ответ на запрос удаления пресета") ] public partial class DeletePresetResponseModel { /// /// Ошибка при удалении /// [ Display(Name = @"Ошибка при удалении") ] public DeletePresetResponseModel.ErrorModel? Error { get; set; } /// /// Ошибка при удалении /// [ Display(Name = @"Ошибка при удалении") ] public partial class ErrorModel { /// /// Запрещено для дефолтного пресета /// [ Display(Name = @"Запрещено для дефолтного пресета") ] public DeletePresetResponseModel.ErrorModel.NotAllowedForDefaultModel? NotAllowedForDefault { get; set; } /// /// Недоступно для дефолтного пресета /// [ Display(Name = @"Недоступно для дефолтного пресета") ] public partial class NotAllowedForDefaultModel { } } } /// /// Запрос получения количества пресетов /// [ Display(Name = @"Запрос получения количества пресетов") ] public partial class GetPresetCountRequestModel { /// /// Фильтр /// [ Display(Name = @"Фильтр") ] public PresetFilterModel? Filter { get; set; } } /// /// Ответ на запрос получения количества пресетов /// [ Display(Name = @"Ответ на запрос получения количества пресетов") ] public partial class GetPresetCountResponseModel { /// /// Всего пресетов /// [ Display(Name = @"Всего пресетов") ] public int Data { get; set; } /// /// Ошибка /// [ Display(Name = @"Ошибка") ] public GetPresetCountResponseModel.ErrorModel? Error { get; set; } /// /// Ошибка запроса получения количества пресетов /// [ Display(Name = @"Ошибка запроса получения количества пресетов") ] public partial class ErrorModel { /// /// Ошибка валидации /// [ Display(Name = @"Ошибка валидации") ] public ValidationErrorModel? Validation { get; set; } } } /// /// Запрос получения дефолтного пресета /// [ Display(Name = @"Запрос получения дефолтного пресета") ] public partial class GetPresetDefaultRequestModel { } /// /// Ответ на запрос получения дефолтного пресета /// [ Display(Name = @"Ответ на запрос получения дефолтного пресета") ] public partial class GetPresetDefaultResponseModel { /// /// Пресет /// [ Display(Name = @"Пресет") ] public PresetModel? Data { get; set; } } /// /// Запрос на получение списка пресетов /// [ Display(Name = @"Запрос на получение списка пресетов") ] public partial class GetPresetListRequestModel { /// /// Фильтр /// [ Display(Name = @"Фильтр") ] public PresetFilterModel? Filter { get; set; } /// /// Стандартный постраничный вывод /// [ Display(Name = @"Стандартный постраничный вывод") ] public PresetPagingModel? Paging { get; set; } } /// /// Ответ на получение списка пресетов /// [ Display(Name = @"Ответ на получение списка пресетов") ] public partial class GetPresetListResponseModel { /// /// Пресет /// [ Display(Name = @"Пресет") ] public PresetModel? Data { get; set; } /// /// Ошибка /// [ Display(Name = @"Ошибка") ] public GetPresetListResponseModel.ErrorModel? Error { get; set; } /// /// Ошибка запроса получения списка пресетов /// [ Display(Name = @"Ошибка запроса получения списка пресетов") ] public partial class ErrorModel { /// /// Ошибка валидации /// [ Display(Name = @"Ошибка валидации") ] public ValidationErrorModel? Validation { get; set; } } } /// /// Запрос получения пресета /// [ Display(Name = @"Запрос получения пресета") ] public partial class GetPresetRequestModel { /// /// Идентификатор /// [ Display(Name = @"Идентификатор"), CustomRequired ] public int Id { get; set; } } /// /// Ответ на запрос получения пресета /// [ Display(Name = @"Ответ на запрос получения пресета") ] public partial class GetPresetResponseModel { /// /// Пресет /// [ Display(Name = @"Пресет") ] public PresetModel? Data { get; set; } } /// /// Запрос на создание/изменение пресета /// [ Display(Name = @"Запрос на создание/изменение пресета") ] public partial class PostPresetRequestModel { /// /// Пресет /// [ Display(Name = @"Пресет"), CustomRequired ] public PresetModel Data { get; set; } = null!; } /// /// Ответ на запрос на создание/изменение пресета /// [ Display(Name = @"Ответ на запрос на создание/изменение пресета") ] public partial class PostPresetResponseModel { /// /// Пресет /// [ Display(Name = @"Пресет") ] public PresetModel? Data { get; set; } /// /// Ошибка /// [ Display(Name = @"Ошибка") ] public PostPresetResponseModel.ErrorModel? Error { get; set; } /// /// Ошибка запроса сохранения пресета /// [ Display(Name = @"Ошибка запроса сохранения пресета") ] public partial class ErrorModel { /// /// Ошибка валидации /// [ Display(Name = @"Ошибка валидации") ] public ValidationErrorModel? Validation { get; set; } /// /// Ошибка сохранения /// [ Display(Name = @"Ошибка сохранения") ] public PresetModel.SavingErrorModel? Saving { get; set; } } } /// /// Постраничный вывод /// [ Display(Name = @"Постраничный вывод") ] public partial class PresetPagingModel { /// /// Тип значения сортировки. /// Если значение не передано, то будет взято значение по умолчанию. /// # По умолчанию: CHANGED_AT /// [ Display(Name = @"Тип значения сортировки"), Description(@"Если значение не передано, то будет взято значение по умолчанию. По умолчанию: CHANGED_AT") ] public PresetPagingModel.PresetPagingOrderByType OrderByType { get; set; } = PresetPagingOrderByType.ChangedAt; /// /// Тип направления сортировки. /// # По умолчанию: DESC /// [ Display(Name = @"Тип направления сортировки"), Description(@"По умолчанию: DESC") ] public PresetPagingModel.PresetPagingDirectionType DirectionType { get; set; } = PresetPagingDirectionType.Desc; /// /// Количество записей на страницу. /// Если значение 0 (не передано), то будет взято значение по умолчанию. /// # Диапазон: 0..100. /// # По умолчанию: 20 /// [ Display(Name = @"Количество записей на страницу"), Description(@"Если значение 0 (не передано), то будет взято значение по умолчанию. Диапазон: 0..100. По умолчанию: 20"), CustomRange(0, 100) ] public int Limit { get; set; } = 20; /// /// Сдвиг. /// # Диапазон: 0..2147483647 /// [ Display(Name = @"Сдвиг"), Description(@"Диапазон: 0..2147483647"), CustomRange(0, 2147483647) ] public int Offset { get; set; } /// /// Справочник типов значений сортировки. /// # Тип: byte /// [ Description("Тип: byte") ] public enum PresetPagingOrderByType : byte { /// /// Значение не указано /// [ Display(Name = @"Значение не указано"), JsonPropertyName("ORDER_BY_TYPE_UNKNOWN") ] Unknown = 0, /// /// По идентификатору /// [ Display(Name = @"По идентификатору"), JsonPropertyName("ID") ] Id = 1, /// /// По времени создания /// [ Display(Name = @"По времени создания"), JsonPropertyName("CREATED_AT") ] CreatedAt = 2, /// /// По времени изменения /// [ Display(Name = @"По времени изменения"), JsonPropertyName("CHANGED_AT") ] ChangedAt = 3, /// /// По рангу для поиска по тексту. /// Применяется когда передано поле для поиска по тексту. /// В случае если текстовое поле не передано, применяется значение по умолчанию /// [ Display(Name = @"По рангу для поиска по тексту"), Description(@"Применяется когда передано поле для поиска по тексту. В случае если текстовое поле не передано, применяется значение по умолчанию"), JsonPropertyName("RANK") ] Rank = 4, } /// /// Справочник типов направлений сортировки. /// # Тип: byte /// [ Description("Тип: byte") ] public enum PresetPagingDirectionType : byte { /// /// Значение не указано /// [ Display(Name = @"Значение не указано"), JsonPropertyName("DIRECTION_TYPE_UNKNOWN") ] Unknown = 0, /// /// От большего к меньшему /// [ Display(Name = @"От большего к меньшему"), JsonPropertyName("DESC") ] Desc = 1, /// /// От меньшего к большему /// [ Display(Name = @"От меньшего к большему"), JsonPropertyName("ASC") ] Asc = 2, } } /// /// Ошибки валидации. /// Эти проверки выполняются до обращения в базу данных /// [ Display(Name = @"Ошибки валидации"), Description(@"Эти проверки выполняются до обращения в базу данных") ] public partial class ValidationErrorModel { /// /// Путь к полю в формате наименования прото /// [ Display(Name = @"Путь к полю в формате наименования прото"), CustomRequired ] public string Path { get; set; } = null!; /// /// Валидационное сообщение /// [ Display(Name = @"Валидационное сообщение"), CustomRequired ] public string Message { get; set; } = null!; } /// /// Запрос проверки доступности сервиса /// [ Display(Name = @"Запрос проверки доступности сервиса") ] public partial class GetSystemStatusRequestModel { } /// /// Ответ на запрос проверки доступности сервиса /// [ Display(Name = @"Ответ на запрос проверки доступности сервиса") ] public partial class GetSystemStatusResponseModel { }