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.Rfidregistry.V1.Data.RfidregistryDb; public interface IRfidregistryDbContext : IAsyncDisposable, IDisposable { public DbSet Records { get; set; } public Task SaveChangesAsync(CancellationToken cancellationToken = default); } public abstract class RfidregistryDbContextBase : DbContext, IRfidregistryDbContext { protected RfidregistryDbContextBase(DbContextOptions options) : base(options) { } public DbSet Records { 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 ~ filter.uids e.HasIndex(p => p.Id) .IsDescending(); e.Property(p => p.RfidType) .HasMaxLength(32) .HasConversion(new EnumToStringConverter()); // Найдено сопоставление: model.rfid_type ~ filter.rfid_types e.HasIndex(p => p.RfidType) .IsDescending(); e.Property(p => p.EncryptionType) .HasMaxLength(32) .HasConversion(new EnumToStringConverter()); // Найдено сопоставление: model.encryption_type ~ filter.encryption_types e.HasIndex(p => p.EncryptionType) .IsDescending(); // Для поля uid дополнительные конфигурации свойства не нужны // Найдено сопоставление: model.uid ~ filter.uids e.HasIndex(p => p.Uid) .IsDescending(); e.Property(p => p.StatusType) .HasMaxLength(32) .HasConversion(new EnumToStringConverter()); // Найдено сопоставление: model.status_type ~ filter.status_types e.HasIndex(p => p.StatusType) .IsDescending(); // WARNING Для поля Record.new_at не указан диапазон e.Property(p => p.NewAt) .HasColumnType("timestamp without time zone") .HasConversion(DateTimeUtcConverter.Instance); // Найдено сопоставление: model.new_at ~ order.NEW_AT e.HasIndex(p => p.NewAt) .HasMethod("btree") .IsDescending(); // WARNING Для поля Record.shipped_at не указан диапазон e.Property(p => p.ShippedAt) .HasColumnType("timestamp without time zone") .HasConversion(DateTimeUtcConverter.Instance); // Найдено сопоставление: model.shipped_at ~ filter.start_shipped_at e.HasIndex(p => p.ShippedAt) .IsDescending(); // WARNING Для поля Record.defect_at не указан диапазон e.Property(p => p.DefectAt) .HasColumnType("timestamp without time zone") .HasConversion(DateTimeUtcConverter.Instance); // Для поля defect_at сопоствалений с фильтром и сортировкой не найденно // WARNING Для поля Record.in_use_at не указан диапазон e.Property(p => p.InUseAt) .HasColumnType("timestamp without time zone") .HasConversion(DateTimeUtcConverter.Instance); // Для поля in_use_at сопоствалений с фильтром и сортировкой не найденно // Для поля in_use_rfid_id дополнительные конфигурации свойства не нужны // Найдено сопоставление: model.in_use_rfid_id ~ filter.in_use_rfid_ids e.HasIndex(p => p.InUseRfidId) .IsDescending(); e.Property(p => p.DataCells) .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.DataCells) .HasMethod("gin") .HasOperators("jsonb_ops"); // Для поля resource_owner_id дополнительные конфигурации свойства не нужны // Найдено сопоставление: model.resource_owner_id ~ filter.resource_owner_ids e.HasIndex(p => p.ResourceOwnerId) .IsDescending(); // Для поля package_info_box дополнительные конфигурации свойства не нужны // Найдено сопоставление: model.package_info_box ~ filter.package_info_boxes e.HasIndex(p => p.PackageInfoBox) .IsDescending(); // Для поля package_info_place дополнительные конфигурации свойства не нужны // Найдено сопоставление: model.package_info_place ~ filter.package_info_places e.HasIndex(p => p.PackageInfoPlace) .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.AesKeyConfigurations) .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.AesKeyConfigurations) .HasMethod("gin") .HasOperators("jsonb_ops"); e.Property(p => p.Trailers) .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.Trailers) .HasMethod("gin") .HasOperators("jsonb_ops"); // Для поля order_number дополнительные конфигурации свойства не нужны // Найдено сопоставление: model.order_number ~ order.ORDER_NUMBER e.HasIndex(p => p.OrderNumber) .HasMethod("btree") .IsDescending(); // WARNING Для поля Record.order_at не указан диапазон e.Property(p => p.OrderAt) .HasColumnType("timestamp without time zone") .HasConversion(DateTimeUtcConverter.Instance); // Найдено сопоставление: model.order_at ~ order.ORDER_AT e.HasIndex(p => p.OrderAt) .HasMethod("btree") .IsDescending(); // Для поля in_use_resource_owner_id дополнительные конфигурации свойства не нужны // Найдено сопоставление: model.in_use_resource_owner_id ~ filter.in_use_resource_owner_ids e.HasIndex(p => p.InUseResourceOwnerId) .IsDescending(); // WARNING Для поля Record.is_deleted не указан диапазон // Для поля is_deleted дополнительные конфигурации свойства не нужны // Найдено сопоставление: model.is_deleted ~ filter.is_deleted e.HasIndex(p => p.IsDeleted) .IsDescending(); // WARNING Для поля Record.deleted_at не указан диапазон e.Property(p => p.DeletedAt) .HasColumnType("timestamp without time zone") .HasConversion(DateTimeUtcConverter.Instance); // Для поля deleted_at сопоствалений с фильтром и сортировкой не найденно // Для поля vendor_name дополнительные конфигурации свойства не нужны // Для поля vendor_name сопоствалений с фильтром и сортировкой не найденно e.Property(p => p.IdentificationMethodType) .HasMaxLength(32) .HasConversion(new EnumToStringConverter()); // Найдено сопоставление: model.identification_method_type ~ filter.identification_method_types e.HasIndex(p => p.IdentificationMethodType) .IsDescending(); // Дополнительные индексы: // По полю RecordFilter.(order_number,vendor_name) e.HasIndex(p => new { p.OrderNumber, p.VendorName }) .HasMethod("gin") .IsTsVectorExpressionIndex("russian"); // WARNING Не удалось найти свойство навигации для поля Record.in_use_rfid_id // WARNING Не удалось найти свойство навигации для поля Record.resource_owner_id // WARNING Не удалось найти свойство навигации для поля Record.in_use_resource_owner_id }); builder.HasDefaultSchema("rfidregistry"); } } /// /// Запись. /// # Описание модели /// [ Display(Name = @"Запись"), Description(@"Описание модели") ] public partial class RecordModel { /// /// Идентификатор. /// Если не передан создаётся сервером. /// # Тип: Guid /// [ Display(Name = @"Идентификатор"), Description(@"Если не передан создаётся сервером. Тип: Guid"), CustomPattern(@"^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$") ] public Guid Id { get; set; } /// /// Тип ключа /// [ Display(Name = @"Тип ключа"), CustomRequired ] public RecordModel.RecordRfidType RfidType { get; set; } /// /// Тип шифрования ключа. /// Максимально поддерживаемый ключом тип шифрования /// [ Display(Name = @"Тип шифрования ключа"), Description(@"Максимально поддерживаемый ключом тип шифрования"), CustomRequired ] public RecordModel.RecordEncryptionType EncryptionType { get; set; } /// /// Номер ключа. /// Указывается при создании. /// # Диапазон: 1..14 /// [ Display(Name = @"Номер ключа"), Description(@"Указывается при создании. Диапазон: 1..14"), CustomRequired, CustomRange(1, 14) ] public string Uid { get; set; } = null!; /// /// Тип статуса ключа /// [ Display(Name = @"Тип статуса ключа"), CustomRequired ] public RecordModel.RecordStatusType StatusType { get; set; } /// /// Дата перевода в статус \"Новый\". /// # Тип: DateTime /// [ Display(Name = @"Дата перевода в статус ""Новый"""), Description(@"Тип: DateTime"), Editable(false) ] public DateTime NewAt { get; set; } /// /// Дата перевода в статус \"Отгружен\". /// # Тип: DateTime /// [ Display(Name = @"Дата перевода в статус ""Отгружен"""), Description(@"Тип: DateTime"), Editable(false) ] public DateTime ShippedAt { get; set; } /// /// Дата перевода в статус \"Брак\". /// # Тип: DateTime /// [ Display(Name = @"Дата перевода в статус ""Брак"""), Description(@"Тип: DateTime"), Editable(false) ] public DateTime DefectAt { get; set; } /// /// Дата перевода в статус \"Использован\". /// # Тип: DateTime /// [ Display(Name = @"Дата перевода в статус ""Использован"""), Description(@"Тип: DateTime"), Editable(false) ] public DateTime InUseAt { get; set; } /// /// Идентификатор привязанного ключа. /// Заполняется при переводе в статус \"Использован\". /// # Диапазон: 0..16 /// [ Display(Name = @"Идентификатор привязанного ключа"), Description(@"Заполняется при переводе в статус ""Использован"". Диапазон: 0..16"), CustomRange(0, 16) ] public string? InUseRfidId { get; set; } // WARNING Не удалось найти свойство навигации для поля Record.in_use_rfid_id /// /// Содержимое ячеек ключа /// [ Display(Name = @"Содержимое ячеек ключа") ] public List DataCells { get; set; } = new(0); /// /// Идентификатор владельца. /// Заполняется сервером. /// # Диапазон: 0..255 /// [ Display(Name = @"Идентификатор владельца"), Description(@"Заполняется сервером. Диапазон: 0..255"), CustomRequired, CustomRange(0, 255), Editable(false) ] public string ResourceOwnerId { get; set; } = null!; // WARNING Не удалось найти свойство навигации для поля Record.resource_owner_id /// /// Номер коробки. /// # Диапазон: 1..2147483647 /// [ Display(Name = @"Номер коробки"), Description(@"Диапазон: 1..2147483647"), CustomRange(1, 2147483647) ] public int PackageInfoBox { get; set; } /// /// Номер места в коробке. /// # Диапазон: 1..2147483647 /// [ Display(Name = @"Номер места в коробке"), Description(@"Диапазон: 1..2147483647"), CustomRange(1, 2147483647) ] public int PackageInfoPlace { get; set; } /// /// Дата последнего изменения. /// Заполняется и обновляется сервером. /// Заполняется при создании и изменении. /// Является версией объекта. /// # Тип: DateTime /// [ Display(Name = @"Дата последнего изменения"), Description(@"Заполняется и обновляется сервером. Заполняется при создании и изменении. Является версией объекта. Тип: DateTime"), Editable(false) ] public DateTime ChangedAt { get; set; } /// /// Конфигурации шифрования ключа /// [ Display(Name = @"Конфигурации шифрования ключа") ] public List AesKeyConfigurations { get; set; } = new(0); /// /// Контрольные суммы. /// Нужны для ключей SL1 и SL3 /// [ Display(Name = @"Контрольные суммы"), Description(@"Нужны для ключей SL1 и SL3") ] public List Trailers { get; set; } = new(0); /// /// Номер заказа. /// # Диапазон: 0..256 /// [ Display(Name = @"Номер заказа"), Description(@"Диапазон: 0..256"), CustomRequired, CustomRange(0, 256) ] public string OrderNumber { get; set; } = null!; /// /// Дата заказа. /// # Тип: DateTime /// [ Display(Name = @"Дата заказа"), Description(@"Тип: DateTime"), CustomRequired ] public DateTime OrderAt { get; set; } /// /// Владелец привязанного ключа. /// Заполняется сервером, значение берётся из токена при использовании ключа. /// # Диапазон: 0..255 /// [ Display(Name = @"Владелец привязанного ключа"), Description(@"Заполняется сервером, значение берётся из токена при использовании ключа. Диапазон: 0..255"), CustomRange(0, 255), Editable(false) ] public string? InUseResourceOwnerId { get; set; } // WARNING Не удалось найти свойство навигации для поля Record.in_use_resource_owner_id /// /// Признак, удалена ли запись /// [ Display(Name = @"Признак, удалена ли запись"), Editable(false) ] public bool IsDeleted { get; set; } /// /// Дата удаления. /// # Тип: DateTime /// [ Display(Name = @"Дата удаления"), Description(@"Тип: DateTime"), Editable(false) ] public DateTime DeletedAt { get; set; } /// /// Производитель. /// # Диапазон: 3..100 /// [ Display(Name = @"Производитель"), Description(@"Диапазон: 3..100"), CustomRange(3, 100) ] public string? VendorName { get; set; } /// /// Метод идентификации /// [ Display(Name = @"Метод идентификации") ] public RecordModel.RecordIdentificationMethodType IdentificationMethodType { get; set; } /// /// Содержимое ячейки ключа /// [ Display(Name = @"Содержимое ячейки ключа") ] public partial class DataCellModel { /// /// Сектор. /// # Диапазон: 0..127 /// [ Display(Name = @"Сектор"), Description(@"Диапазон: 0..127"), CustomRequired, CustomRange(0, 127) ] public int Section { get; set; } /// /// Блок. /// # Диапазон: 0..127 /// [ Display(Name = @"Блок"), Description(@"Диапазон: 0..127"), CustomRequired, CustomRange(0, 127) ] public int Block { get; set; } /// /// Данные. /// # Паттерн: /^[A-Za-z0-9=]+$/ /// [ Display(Name = @"Данные"), Description(@"Паттерн: /^[A-Za-z0-9=]+$/"), CustomRequired, CustomPattern(@"^[A-Za-z0-9=]+$") ] public string Data { get; set; } = null!; } /// /// Конфигурация шифрования ключа /// [ Display(Name = @"Конфигурация шифрования ключа") ] public partial class AesKeyConfigurationModel { /// /// Адрес. /// # Паттерн: /^[A-Za-z0-9=]+$/ /// [ Display(Name = @"Адрес"), Description(@"Паттерн: /^[A-Za-z0-9=]+$/"), CustomRequired, CustomPattern(@"^[A-Za-z0-9=]+$") ] public string Address { get; set; } = null!; /// /// Данные. /// # Паттерн: /^[A-Za-z0-9=]+$/ /// [ Display(Name = @"Данные"), Description(@"Паттерн: /^[A-Za-z0-9=]+$/"), CustomRequired, CustomPattern(@"^[A-Za-z0-9=]+$") ] public string Data { get; set; } = null!; } /// /// Контрольная сумма /// [ Display(Name = @"Контрольная сумма") ] public partial class TrailerModel { /// /// Сектор. /// # Диапазон: 0..15 /// [ Display(Name = @"Сектор"), Description(@"Диапазон: 0..15"), CustomRequired, CustomRange(0, 15) ] public int Sector { get; set; } /// /// Ключ А. /// # Диапазон: 1..256 /// [ Display(Name = @"Ключ А"), Description(@"Диапазон: 1..256"), CustomRequired, CustomRange(1, 256) ] public string KeyA { get; set; } = null!; /// /// Ключ Б. /// # Диапазон: 1..256 /// [ Display(Name = @"Ключ Б"), Description(@"Диапазон: 1..256"), CustomRequired, CustomRange(1, 256) ] public string KeyB { get; set; } = null!; /// /// Маска доступа. /// # Диапазон: 1..512 /// [ Display(Name = @"Маска доступа"), Description(@"Диапазон: 1..512"), CustomRequired, CustomRange(1, 512) ] public string AccessMask { get; set; } = null!; } /// /// Ошибка сохранения записи. /// Эти проверки выполняются при работе с базой данных и сторонними сервисами /// [ Display(Name = @"Ошибка сохранения записи"), Description(@"Эти проверки выполняются при работе с базой данных и сторонними сервисами") ] public partial class SavingErrorModel { /// /// Перевод статуса запрещён /// [ Display(Name = @"Перевод статуса запрещён") ] public RecordModel.SavingErrorModel.StatusTypeRestrictedModel? StatusTypeRestricted { get; set; } /// /// Запись уже существует /// [ Display(Name = @"Запись уже существует") ] public RecordModel.SavingErrorModel.UidExistModel? UidExist { get; set; } /// /// Вы не владелец /// [ Display(Name = @"Вы не владелец") ] public RecordModel.SavingErrorModel.OwnedByAnotherUserModel? OwnedByAnotherUser { get; set; } /// /// Ключ уже использован /// [ Display(Name = @"Ключ уже использован") ] public RecordModel.SavingErrorModel.AlreadyLinkedModel? AlreadyLinked { get; set; } /// /// Конфликт версий /// [ Display(Name = @"Конфликт версий") ] public RecordModel.SavingErrorModel.ConflictModel? Conflict { get; set; } /// /// Причины: /// - Недопустимый перевод статуса. /// - Не переданы обязательные поля https://openapi-key.deploy.rtkit.dev/keyapis_rfidregistry_v1/#таблица-обязательности-передачи-полей-в-request /// [ Display(Name = @"Причины:"), Description(@"- Недопустимый перевод статуса. - Не переданы обязательные поля https://openapi-key.deploy.rtkit.dev/keyapis_rfidregistry_v1/#таблица-обязательности-передачи-полей-в-request") ] public partial class StatusTypeRestrictedModel { } /// /// Причины: /// - Ключ уже существует /// [ Display(Name = @"Причины:"), Description(@"- Ключ уже существует") ] public partial class UidExistModel { } /// /// Причины: /// - Запись принадлежит другому пользователю /// [ Display(Name = @"Причины:"), Description(@"- Запись принадлежит другому пользователю") ] public partial class OwnedByAnotherUserModel { } /// /// Причины: /// - Такой ключ уже привязан к другой записи /// [ Display(Name = @"Причины:"), Description(@"- Такой ключ уже привязан к другой записи") ] public partial class AlreadyLinkedModel { } /// /// Причины: /// - В базе хранится более новая версия записи, значения changed_at отличаются /// [ Display(Name = @"Причины:"), Description(@"- В базе хранится более новая версия записи, значения changed_at отличаются") ] public partial class ConflictModel { } } /// /// Справочник типов ключей. /// # Тип: byte /// [ Description("Тип: byte") ] public enum RecordRfidType : byte { /// /// Значение не указано /// [ Display(Name = @"Значение не указано"), JsonPropertyName("RFID_TYPE_UNKNOWN") ] Unknown = 0, /// /// Брелок /// [ Display(Name = @"Брелок"), JsonPropertyName("FOB") ] Fob = 1, /// /// Карта /// [ Display(Name = @"Карта"), JsonPropertyName("CARD") ] Card = 2, /// /// Браслет /// [ Display(Name = @"Браслет"), JsonPropertyName("BAND") ] Band = 3, /// /// Стикер /// [ Display(Name = @"Стикер"), JsonPropertyName("STICKER") ] Sticker = 4, /// /// Активная метка /// [ Display(Name = @"Активная метка"), JsonPropertyName("ACTIVE_TAG") ] ActiveTag = 5, } /// /// Справочник типов шифрования ключа. /// # Тип: byte /// [ Description("Тип: byte") ] public enum RecordEncryptionType : byte { /// /// Значение не указано /// [ Display(Name = @"Значение не указано"), JsonPropertyName("ENCRYPTION_TYPE_UNKNOWN") ] Unknown = 0, /// /// Без шифрования /// [ Display(Name = @"Без шифрования"), JsonPropertyName("SL0") ] Sl0 = 1, /// /// С шифрованием, копируемый /// [ Display(Name = @"С шифрованием, копируемый"), JsonPropertyName("SL1") ] Sl1 = 2, /// /// С шифрованием, не копируемый /// [ Display(Name = @"С шифрованием, не копируемый"), JsonPropertyName("SL3") ] Sl3 = 3, } /// /// Справочник типов статусов ключа. /// # Тип: byte /// [ Description("Тип: byte") ] public enum RecordStatusType : byte { /// /// Значение не указано /// [ Display(Name = @"Значение не указано"), JsonPropertyName("STATUS_TYPE_UNKNOWN") ] Unknown = 0, /// /// Новый /// [ Display(Name = @"Новый"), JsonPropertyName("NEW") ] New = 1, /// /// Отгружен /// [ Display(Name = @"Отгружен"), JsonPropertyName("SHIPPED") ] Shipped = 2, /// /// Брак /// [ Display(Name = @"Брак"), JsonPropertyName("DEFECT") ] Defect = 3, /// /// Использован /// [ Display(Name = @"Использован"), JsonPropertyName("IN_USE") ] InUse = 4, } /// /// Справочник методов идентификации. /// # Тип: byte /// [ Description("Тип: byte") ] public enum RecordIdentificationMethodType : byte { /// /// Значение не указано /// [ Display(Name = @"Значение не указано"), JsonPropertyName("IDENTIFICATION_METHOD_TYPE_UNKNOWN") ] Unknown = 0, /// /// Значение Mifare /// [ Display(Name = @"Значение Mifare"), JsonPropertyName("MIFARE") ] Mifare = 1, /// /// Значение Bluetooth low energy /// [ Display(Name = @"Значение Bluetooth low energy"), JsonPropertyName("BLE") ] Ble = 2, /// /// Значение Ultra high frequency /// [ Display(Name = @"Значение Ultra high frequency"), JsonPropertyName("UHF") ] Uhf = 3, /// /// Значение em-marine /// [ Display(Name = @"Значение em-marine"), JsonPropertyName("EM_MARINE") ] EmMarine = 4, } } /// /// Фильтр записей /// [ Display(Name = @"Фильтр записей") ] public partial class RecordFilterModel { /// /// По типам ключей /// [ Display(Name = @"По типам ключей") ] public List RfidTypes { get; set; } = new(0); /// /// По типам шифрования /// [ Display(Name = @"По типам шифрования") ] public List EncryptionTypes { get; set; } = new(0); /// /// По номерам ключей /// [ Display(Name = @"По номерам ключей") ] public List Uids { get; set; } = new(0); /// /// По типам статуса /// [ Display(Name = @"По типам статуса") ] public List StatusTypes { get; set; } = new(0); /// /// По номерам привязанных ключей /// [ Display(Name = @"По номерам привязанных ключей") ] public List InUseRfidIds { get; set; } = new(0); /// /// По владельцам /// [ Display(Name = @"По владельцам") ] public List ResourceOwnerIds { get; set; } = new(0); /// /// По номерам заказа /// [ Display(Name = @"По номерам заказа") ] public List OrderNumbers { get; set; } = new(0); /// /// По владельцам привязанных ключей /// [ Display(Name = @"По владельцам привязанных ключей") ] public List InUseResourceOwnerIds { get; set; } = new(0); /// /// По удалённым записям. /// По умолчанию: false /// [ Display(Name = @"По удалённым записям"), Description(@"По умолчанию: false") ] public bool? IsDeleted { get; set; } /// /// По тексту. /// Если значение не передано то поиск по нему не производится. /// # Диапазон: 3..64. /// # Поиск производится по полям: /// # - Номер заказа; /// # - Производитель /// [ Display(Name = @"По тексту"), Description(@"Если значение не передано то поиск по нему не производится. Диапазон: 3..64. Поиск производится по полям: - Номер заказа; - Производитель"), CustomRange(3, 64) ] public string? Text { get; set; } /// /// Дата отгрузки от /// [ Display(Name = @"Дата отгрузки от") ] public DateTime? StartShippedAt { get; set; } /// /// Дата отгрузки до /// [ Display(Name = @"Дата отгрузки до") ] public DateTime? EndShippedAt { get; set; } /// /// По номеру коробки /// [ Display(Name = @"По номеру коробки") ] public List PackageInfoBoxes { get; set; } = new(0); /// /// По номеру места в коробке /// [ Display(Name = @"По номеру места в коробке") ] public List PackageInfoPlaces { get; set; } = new(0); /// /// По методу идентификации /// [ Display(Name = @"По методу идентификации") ] public List IdentificationMethodTypes { get; set; } = new(0); } /// /// Запрос удаления записи из реестра. /// Можно удалить только свои записи /// [ Display(Name = @"Запрос удаления записи из реестра"), Description(@"Можно удалить только свои записи") ] public partial class DeleteRecordRequestModel { /// /// Идентификатор записи. /// # Тип: Guid /// [ Display(Name = @"Идентификатор записи"), Description(@"Тип: Guid"), CustomRequired, CustomPattern(@"^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$") ] public Guid Id { get; set; } } /// /// Ответ на запрос удаления записи из реестра /// [ Display(Name = @"Ответ на запрос удаления записи из реестра") ] public partial class DeleteRecordResponseModel { /// /// Ошибка /// [ Display(Name = @"Ошибка") ] public DeleteRecordResponseModel.ErrorModel? Error { get; set; } /// /// Ошибка удаления записи /// [ Display(Name = @"Ошибка удаления записи") ] public partial class ErrorModel { /// /// Ошибка валидации /// [ Display(Name = @"Ошибка валидации") ] public ValidationErrorModel? Validation { get; set; } } } /// /// Запрос получения количества записей /// [ Display(Name = @"Запрос получения количества записей") ] public partial class GetRecordCountRequestModel { /// /// Фильтр /// [ Display(Name = @"Фильтр") ] public RecordFilterModel? Filter { get; set; } } /// /// Ответ на запрос получения количества записей /// [ Display(Name = @"Ответ на запрос получения количества записей") ] public partial class GetRecordCountResponseModel { /// /// Всего записей /// [ Display(Name = @"Всего записей") ] public int Data { get; set; } /// /// Ошибка /// [ Display(Name = @"Ошибка") ] public GetRecordCountResponseModel.ErrorModel? Error { get; set; } /// /// Ошибка запроса получения количества записей /// [ Display(Name = @"Ошибка запроса получения количества записей") ] public partial class ErrorModel { /// /// Ошибка фильтрации записей /// [ Display(Name = @"Ошибка фильтрации записей") ] public ValidationErrorModel? Validation { get; set; } } } /// /// Запрос получения списка /// [ Display(Name = @"Запрос получения списка") ] public partial class GetRecordListRequestModel { /// /// Фильтр /// [ Display(Name = @"Фильтр") ] public RecordFilterModel? Filter { get; set; } /// /// Пагинация /// [ Display(Name = @"Пагинация") ] public RecordPagingModel? Paging { get; set; } } /// /// Ответ на запрос получения списка записей /// [ Display(Name = @"Ответ на запрос получения списка записей") ] public partial class GetRecordListResponseModel { /// /// Запись /// [ Display(Name = @"Запись") ] public RecordModel? Data { get; set; } /// /// Ошибка /// [ Display(Name = @"Ошибка") ] public GetRecordListResponseModel.ErrorModel? Error { get; set; } /// /// Ошибка запроса получения списка записей /// [ Display(Name = @"Ошибка запроса получения списка записей") ] public partial class ErrorModel { /// /// Ошибка фильтрации записей /// [ Display(Name = @"Ошибка фильтрации записей") ] public ValidationErrorModel? Validation { get; set; } } } /// /// Запрос получения записи /// [ Display(Name = @"Запрос получения записи") ] public partial class GetRecordRequestModel { /// /// Идентификатор. /// # Тип: Guid /// [ Display(Name = @"Идентификатор"), Description(@"Тип: Guid"), CustomRequired, CustomPattern(@"^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$") ] public Guid Id { get; set; } } /// /// Ответ на запрос получения записи /// [ Display(Name = @"Ответ на запрос получения записи") ] public partial class GetRecordResponseModel { /// /// Запись /// [ Display(Name = @"Запись") ] public RecordModel? Data { get; set; } } /// /// Запрос сохранения записи /// [ Display(Name = @"Запрос сохранения записи") ] public partial class PostRecordRequestModel { /// /// Запись /// [ Display(Name = @"Запись"), CustomRequired ] public RecordModel Data { get; set; } = null!; } /// /// Ответ на запрос сохранения записи /// [ Display(Name = @"Ответ на запрос сохранения записи") ] public partial class PostRecordResponseModel { /// /// Запись /// [ Display(Name = @"Запись") ] public RecordModel? Data { get; set; } /// /// Ошибка /// [ Display(Name = @"Ошибка") ] public PostRecordResponseModel.ErrorModel? Error { get; set; } /// /// Ошибка запроса сохранения записи /// [ Display(Name = @"Ошибка запроса сохранения записи") ] public partial class ErrorModel { /// /// Ошибка валидации /// [ Display(Name = @"Ошибка валидации") ] public ValidationErrorModel? Validation { get; set; } /// /// Ошибка сохранения записи /// [ Display(Name = @"Ошибка сохранения записи") ] public RecordModel.SavingErrorModel? Saving { get; set; } } } /// /// Пагинация записей /// [ Display(Name = @"Пагинация записей") ] public partial class RecordPagingModel { /// /// Тип значения сортировки. /// Если значение не передано, то будет взято значение по умолчанию. /// # По умолчанию: NEW_AT /// [ Display(Name = @"Тип значения сортировки"), Description(@"Если значение не передано, то будет взято значение по умолчанию. По умолчанию: NEW_AT") ] public RecordPagingModel.RecordPagingOrderByType OrderByType { get; set; } = RecordPagingOrderByType.NewAt; /// /// Тип направления сортировки. /// # По умолчанию: DESC /// [ Display(Name = @"Тип направления сортировки"), Description(@"По умолчанию: DESC") ] public RecordPagingModel.RecordPagingDirectionType DirectionType { get; set; } = RecordPagingDirectionType.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 RecordPagingOrderByType : byte { /// /// Значение не указано /// [ Display(Name = @"Значение не указано"), JsonPropertyName("ORDER_BY_TYPE_UNKNOWN") ] Unknown = 0, /// /// По дате перевода в статус new (дате создания) /// [ Display(Name = @"По дате перевода в статус new"), JsonPropertyName("NEW_AT") ] NewAt = 1, /// /// По времени изменения /// [ Display(Name = @"По времени изменения"), JsonPropertyName("CHANGED_AT") ] ChangedAt = 2, /// /// По времени заказа /// [ Display(Name = @"По времени заказа"), JsonPropertyName("ORDER_AT") ] OrderAt = 3, /// /// По номеру заказа /// [ Display(Name = @"По номеру заказа"), JsonPropertyName("ORDER_NUMBER") ] OrderNumber = 4, /// /// По рангу для поиска по тексту. /// Применяется когда передано поле для поиска по тексту. /// В случае если текстовое поле не передано, применяется значение по умолчанию /// [ Display(Name = @"По рангу для поиска по тексту"), Description(@"Применяется когда передано поле для поиска по тексту. В случае если текстовое поле не передано, применяется значение по умолчанию"), JsonPropertyName("RANK") ] Rank = 5, } /// /// Справочник типов направлений сортировки. /// # Тип: byte /// [ Description("Тип: byte") ] public enum RecordPagingDirectionType : 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 { }