using System.Buffers.Text; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Security.Cryptography; using System.Text; using Microsoft.AspNetCore.Mvc; using Microsoft.VisualBasic; using NodaTime; using NodaTime.Extensions; namespace CoreWiki.Models; public class Comment { public int Id { get; set; } [Required] public int ArticleId { get; set; } [Required] [DisplayName("Display Name")] public string? DisplayName { get; set; } [Required] [DataType(DataType.EmailAddress)] [DisplayName("E-Mail")] public string? EMail { get; set; } [NotMapped] public string? GravatarHash { get { if (EMail == null) { return null; } var normalizedEmail = EMail.Trim().ToLower(); var bytes = SHA256.HashData(Encoding.UTF8.GetBytes(normalizedEmail)); return BitConverter.ToString(bytes).Replace("-", "").ToLower(); } } [Required] public string? Content { get; set; } [NotMapped] public Instant Submitted { get; set; } [Obsolete("This property only exists for EF-serialization purposes")] [DataType(DataType.DateTime)] [Column("Submitted")] public DateTime SubmittedDateTime { get => Submitted.ToDateTimeUtc(); // TODO: Remove this ugly hack set => Submitted = DateTime.SpecifyKind(value, DateTimeKind.Utc).ToInstant(); } public required Article Article { get; set; } }