using SmartFormat; namespace OliverBooth.Data.Blog; /// /// Represents a blog post. /// public sealed class BlogPost : IEquatable { /// /// Gets the ID of the author. /// /// The author ID. public int AuthorId { get; private set; } /// /// Gets or sets the body of the blog post. /// /// The body. public string Body { get; set; } = string.Empty; /// /// Gets or sets a value indicating whether comments are enabled for the blog post. /// /// if comments are enabled; otherwise, . public bool EnableComments { get; set; } = true; /// /// Gets or sets the base URL of the Disqus comments for the blog post. /// /// The Disqus base URL. public string? DisqusDomain { get; set; } /// /// Gets or sets the identifier of the Disqus comments for the blog post. /// /// The Disqus identifier. public string? DisqusIdentifier { get; set; } /// /// Gets or sets the URL path of the Disqus comments for the blog post. /// /// The Disqus URL path. public string? DisqusPath { get; set; } /// /// Gets the ID of the blog post. /// /// The ID. public int Id { get; private set; } /// /// Gets or sets a value indicating whether the blog post is a redirect. /// /// if the blog post is a redirect; otherwise, . public bool IsRedirect { get; set; } /// /// Gets or sets the date and time at which the blog post was published. /// /// The publish timestamp. public DateTimeOffset Published { get; set; } /// /// Gets or sets the redirect URL of the blog post. /// /// The redirect URL. public string? RedirectUrl { get; set; } /// /// Gets or sets the URL slug of the blog post. /// /// The URL slug. public string Slug { get; set; } = string.Empty; /// /// Gets or sets the title of the blog post. /// /// The title. public string Title { get; set; } = string.Empty; /// /// Gets or sets the date and time at which the blog post was updated. /// /// The update timestamp. public DateTimeOffset? Updated { get; set; } /// /// Gets or sets the legacy WordPress ID of the blog post. /// /// The legacy WordPress ID. public int? WordPressId { get; set; } public bool Equals(BlogPost? other) { if (ReferenceEquals(null, other)) return false; if (ReferenceEquals(this, other)) return true; return Id == other.Id; } public override bool Equals(object? obj) { return ReferenceEquals(this, obj) || obj is BlogPost other && Equals(other); } public override int GetHashCode() { return Id; } /// /// Gets the Disqus identifier for the blog post. /// /// The Disqus identifier. public string GetDisqusIdentifier() { return string.IsNullOrWhiteSpace(DisqusIdentifier) ? $"post-{Id}" : Smart.Format(DisqusIdentifier, this); } /// /// 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); } /// /// Gets the Disqus URL for the blog post. /// /// The Disqus URL. public string GetDisqusUrl() { string path = string.IsNullOrWhiteSpace(DisqusPath) ? $"{Published:yyyy/MM/dd}/{Slug}/" : Smart.Format(DisqusPath, this); return $"{GetDisqusDomain()}/{path}"; } }