using System.ComponentModel.DataAnnotations.Schema; using SmartFormat; namespace OliverBooth.Common.Data.Blog; /// internal sealed class BlogPostDraft : IBlogPostDraft { /// [NotMapped] public IAuthor Author { get; internal set; } = null!; /// public string Body { get; set; } = string.Empty; /// public bool EnableComments { get; internal set; } /// public Guid Id { get; private set; } = Guid.NewGuid(); /// public bool IsRedirect { get; internal set; } /// public string? Password { get; internal set; } /// public Uri? RedirectUrl { get; internal set; } /// public string Slug { get; internal set; } = string.Empty; /// public IReadOnlyList Tags { get; internal set; } = ArraySegment.Empty; /// public string Title { get; set; } = string.Empty; /// public DateTimeOffset Updated { get; internal set; } /// public BlogPostVisibility Visibility { get; internal set; } /// public int? WordPressId { get; set; } /// /// Gets or sets the ID of the author of this blog post. /// /// The ID of the author of this blog post. internal Guid AuthorId { get; set; } /// /// Gets or sets the base URL of the Disqus comments for the blog post. /// /// The Disqus base URL. internal string? DisqusDomain { get; set; } /// /// Gets or sets the identifier of the Disqus comments for the blog post. /// /// The Disqus identifier. internal string? DisqusIdentifier { get; set; } /// /// Gets or sets the URL path of the Disqus comments for the blog post. /// /// The Disqus URL path. internal string? DisqusPath { get; set; } /// /// Constructs a by copying values from an existing . /// /// The existing . /// The newly-constructed . /// is . public static BlogPostDraft CreateFromBlogPost(BlogPost post) { if (post is null) { throw new ArgumentNullException(nameof(post)); } return new BlogPostDraft { AuthorId = post.AuthorId, Body = post.Body, DisqusDomain = post.DisqusDomain, DisqusIdentifier = post.DisqusIdentifier, DisqusPath = post.DisqusPath, EnableComments = post.EnableComments, IsRedirect = post.IsRedirect, Password = post.Password, RedirectUrl = post.RedirectUrl, Tags = post.Tags, Title = post.Title, Visibility = post.Visibility, WordPressId = post.WordPressId }; } /// /// Gets the Disqus domain for the blog post. /// /// The Disqus domain. public string GetDisqusDomain() { return string.IsNullOrWhiteSpace(DisqusDomain) ? "https://oliverbooth.dev/blog" : Smart.Format(DisqusDomain, this); } /// public string GetDisqusIdentifier() { return string.IsNullOrWhiteSpace(DisqusIdentifier) ? $"post-{Id}" : Smart.Format(DisqusIdentifier, this); } /// public string GetDisqusPostId() { return WordPressId?.ToString() ?? Id.ToString(); } }