using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; namespace AsbCloudApp.Requests { /// /// класс с фильтрами для запроса /// public class SubsystemOperationTimeRequest: RequestBase, IValidatableObject { private static readonly DateTime validationMinDate = new DateTime(2020,01,01,0,0,0,DateTimeKind.Utc); /// /// идентификатор скважины /// [Required] public int IdWell { get; set; } /// /// идентификатор подсистемы /// public IEnumerable IdsSubsystems { get; set; } = Enumerable.Empty(); /// /// Больше или равно дате /// public DateTime? GtDate { get; set; }//TODO: its Ge* /// /// Меньше или равно дате /// public DateTime? LtDate { get; set; } /// /// Больше или равно глубины забоя /// public double? GtDepth { get; set; } /// /// Меньше или равно глубины забоя /// public double? LtDepth { get; set; } //TODO: Replace modes by DateTimeOffset LeDateStart, LeDateEnd /// /// информация попадает в выборку, если интервал выборки частично или полностью пересекается с запрашиваемым интервалом /// public const int SelectModeOuter = 0; /// /// информация попадает в выборку, если интервал выборки строго полностью пересекается с запрашиваемым интервалом. /// public const int SelectModeInner = 1; /// /// аналогично outer, но интервалы в частично пересекающиеся укорачиваются по границам интервала выборки. /// public const int SelectModeTrim = 2; /// /// Режим выборки элементов /// public int SelectMode { get; set; } = SelectModeOuter; /// public IEnumerable Validate(ValidationContext validationContext) { if (GtDate.HasValue && GtDate < validationMinDate) yield return new ValidationResult( $"Должно быть больше {validationMinDate:O})", new[] { nameof(GtDate) }); if (LtDate.HasValue && GtDate.HasValue) { if (LtDate < GtDate) yield return new ValidationResult( $"{nameof(LtDate)} должно быть больше {nameof(GtDate)}. ({LtDate:O} < {GtDate:O})", new[] { nameof(LtDate), nameof(GtDate) }); } if (LtDepth.HasValue && GtDepth.HasValue) { if (LtDepth < GtDepth) yield return new ValidationResult( $"{nameof(LtDepth)} должно быть больше {nameof(GtDepth)}. ({LtDepth} < {GtDepth})", new[] { nameof(LtDepth), nameof(GtDepth) }); } yield break; } } }