using System;
using System.ComponentModel.DataAnnotations;
namespace AsbCloudApp.Validation
{
///
/// Атрибут валидации даты-времени
///
[AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Property)]
public class DateValidationAttribute : ValidationAttribute
{
private DateTime? gtDate;
///
/// null разрешен
///
public bool AllowNull { get; set; } = true;
///
/// Разрешена только дат.
/// При наличии времени в DateTime инвалидирует.
/// При наличии UTC тоже инвалидирует.
///
public bool IsDateOnly { get; set; } = false;
///
/// Допустима дата-время в UTC
///
public bool AllowUtc { get; set; } = true;
///
/// Дата больше которой должно быть проверяемое значение.
/// Формат строки - любой поддерживаемый DateTime.Parse.
/// Желательно использовать ISO 8601 формат
///
public string? GtDate {
get => gtDate.ToString();
set
{
if(value is null)
gtDate = null;
else
gtDate = DateTime.Parse(value);
}
}
///
/// Проверка значения
///
///
///
public override bool IsValid(object? value)
{
if (value is null)
return AllowNull;
if (value is not DateTime dateTime)
return false;
if (IsDateOnly)
{
if (dateTime.Hour > 0 ||
dateTime.Minute > 0 ||
dateTime.Second > 0 ||
dateTime.Millisecond > 0 ||
dateTime.Kind == DateTimeKind.Utc)
return false;
}
if (!AllowUtc && dateTime.Kind == DateTimeKind.Utc)
return false;
if (gtDate.HasValue && dateTime <= gtDate)
return false;
return true;
}
}
}