Compare commits

...

3 Commits

11 changed files with 69 additions and 22 deletions

View File

@ -22,6 +22,9 @@ internal sealed class BlogPost : IBlogPost
/// <inheritdoc /> /// <inheritdoc />
public bool IsRedirect { get; internal set; } public bool IsRedirect { get; internal set; }
/// <inheritdoc />
public string? Password { get; internal set; }
/// <inheritdoc /> /// <inheritdoc />
public DateTimeOffset Published { get; internal set; } public DateTimeOffset Published { get; internal set; }
@ -37,6 +40,9 @@ internal sealed class BlogPost : IBlogPost
/// <inheritdoc /> /// <inheritdoc />
public DateTimeOffset? Updated { get; internal set; } public DateTimeOffset? Updated { get; internal set; }
/// <inheritdoc />
public BlogPostVisibility Visibility { get; internal set; }
/// <inheritdoc /> /// <inheritdoc />
public int? WordPressId { get; set; } public int? WordPressId { get; set; }

View File

@ -0,0 +1,22 @@
namespace OliverBooth.Data.Blog;
/// <summary>
/// An enumeration of the possible visibilities of a blog post.
/// </summary>
public enum BlogPostVisibility
{
/// <summary>
/// The post is private and only visible to the author, or those with the password.
/// </summary>
Private,
/// <summary>
/// The post is unlisted and only visible to those with the link.
/// </summary>
Unlisted,
/// <summary>
/// The post is published and visible to everyone.
/// </summary>
Published
}

View File

@ -26,5 +26,7 @@ internal sealed class BlogPostConfiguration : IEntityTypeConfiguration<BlogPost>
builder.Property(e => e.DisqusDomain).IsRequired(false); builder.Property(e => e.DisqusDomain).IsRequired(false);
builder.Property(e => e.DisqusIdentifier).IsRequired(false); builder.Property(e => e.DisqusIdentifier).IsRequired(false);
builder.Property(e => e.DisqusPath).IsRequired(false); builder.Property(e => e.DisqusPath).IsRequired(false);
builder.Property(e => e.Visibility).HasConversion(new EnumToStringConverter<BlogPostVisibility>()).IsRequired();
builder.Property(e => e.Password).HasMaxLength(255).IsRequired(false);
} }
} }

View File

@ -39,6 +39,12 @@ public interface IBlogPost
/// </value> /// </value>
bool IsRedirect { get; } bool IsRedirect { get; }
/// <summary>
/// Gets the password of the post.
/// </summary>
/// <value>The password of the post.</value>
string? Password { get; }
/// <summary> /// <summary>
/// Gets the date and time the post was published. /// Gets the date and time the post was published.
/// </summary> /// </summary>
@ -69,6 +75,12 @@ public interface IBlogPost
/// <value>The update date and time, or <see langword="null" /> if the post has not been updated.</value> /// <value>The update date and time, or <see langword="null" /> if the post has not been updated.</value>
DateTimeOffset? Updated { get; } DateTimeOffset? Updated { get; }
/// <summary>
/// Gets the visibility of the post.
/// </summary>
/// <value>The visibility of the post.</value>
BlogPostVisibility Visibility { get; }
/// <summary> /// <summary>
/// Gets the WordPress ID of the post. /// Gets the WordPress ID of the post.
/// </summary> /// </summary>

View File

@ -12,16 +12,16 @@ public sealed class BlogItem
[XmlElement("comments")] [XmlElement("comments")]
public string Comments { get; set; } = default!; public string Comments { get; set; } = default!;
[XmlElement("creator", Namespace = "http://purl.org/dc/elements/1.1/")] [XmlElement("creator", Namespace = "http://purl.org/dc/elements/1.1/")]
public string Creator { get; set; } = default!; public string Creator { get; set; } = default!;
[XmlElement("pubDate")] [XmlElement("pubDate")]
public string PubDate { get; set; } = default!; public string PubDate { get; set; } = default!;
[XmlElement("guid")] [XmlElement("guid")]
public string Guid { get; set; } = default!; public BlogItemGuid Guid { get; set; } = default!;
[XmlElement("description")] [XmlElement("description")]
public string Description { get; set; } = default!; public string Description { get; set; } = default!;
} }

View File

@ -0,0 +1,18 @@
using System.Xml.Serialization;
namespace OliverBooth.Data.Blog.Rss;
public struct BlogItemGuid
{
public BlogItemGuid()
{
}
[XmlAttribute("isPermaLink")]
public bool IsPermaLink { get; set; } = false;
[XmlText]
public string Value { get; set; } = default!;
public static implicit operator BlogItemGuid(string value) => new() { Value = value };
}

View File

@ -1,5 +1,4 @@
@page "/privacy/google-play" @page "/privacy/google-play"
@model OliverBooth.Pages.Privacy.GooglePlay
@{ @{
ViewData["Title"] = "Google Play Privacy Policy"; ViewData["Title"] = "Google Play Privacy Policy";
} }

View File

@ -1,7 +0,0 @@
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace OliverBooth.Pages.Privacy;
public class GooglePlay : PageModel
{
}

View File

@ -1,5 +1,4 @@
@page @page
@model OliverBooth.Pages.Privacy.Index
@{ @{
ViewData["Title"] = "Privacy Policy"; ViewData["Title"] = "Privacy Policy";
} }

View File

@ -1,7 +0,0 @@
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace OliverBooth.Pages.Privacy;
public class Index : PageModel
{
}

View File

@ -43,7 +43,9 @@ internal sealed class BlogPostService : IBlogPostService
public IReadOnlyList<IBlogPost> GetAllBlogPosts(int limit = -1) public IReadOnlyList<IBlogPost> GetAllBlogPosts(int limit = -1)
{ {
using BlogContext context = _dbContextFactory.CreateDbContext(); using BlogContext context = _dbContextFactory.CreateDbContext();
IQueryable<BlogPost> ordered = context.BlogPosts.OrderByDescending(post => post.Published); IQueryable<BlogPost> ordered = context.BlogPosts
.Where(p => p.Visibility == BlogPostVisibility.Published)
.OrderByDescending(post => post.Published);
if (limit > -1) if (limit > -1)
{ {
ordered = ordered.Take(limit); ordered = ordered.Take(limit);
@ -57,6 +59,7 @@ internal sealed class BlogPostService : IBlogPostService
{ {
using BlogContext context = _dbContextFactory.CreateDbContext(); using BlogContext context = _dbContextFactory.CreateDbContext();
return context.BlogPosts return context.BlogPosts
.Where(p => p.Visibility == BlogPostVisibility.Published)
.OrderByDescending(post => post.Published) .OrderByDescending(post => post.Published)
.Skip(page * pageSize) .Skip(page * pageSize)
.Take(pageSize) .Take(pageSize)