Compare commits

...

2 Commits

Author SHA1 Message Date
f48713c470
feat: add tag filtering (resolves WEB-1) 2023-09-24 17:03:06 +01:00
856c33a74f
chore: add MailKit 2023-09-24 16:46:49 +01:00
4 changed files with 41 additions and 1 deletions

View File

@ -41,6 +41,17 @@ public sealed class BlogApiController : ControllerBase
return Ok(allPosts.Select(post => CreatePostObject(post)));
}
[HttpGet("posts/tagged/{tag}/{page:int?}")]
public IActionResult GetTaggedBlogPosts(string tag, int page = 0)
{
const int itemsPerPage = 10;
tag = tag.Replace('-', ' ').ToLowerInvariant();
IReadOnlyList<IBlogPost> allPosts = _blogPostService.GetBlogPosts(page, itemsPerPage);
allPosts = allPosts.Where(post => post.Tags.Contains(tag)).ToList();
return Ok(allPosts.Select(post => CreatePostObject(post)));
}
[HttpGet("author/{id:guid}")]
public IActionResult GetAuthor(Guid id)
{

View File

@ -10,6 +10,8 @@
<ItemGroup>
<PackageReference Include="Alexinea.Extensions.Configuration.Toml" Version="7.0.0"/>
<PackageReference Include="Humanizer.Core" Version="2.14.1"/>
<PackageReference Include="MailKit" Version="4.1.0"/>
<PackageReference Include="MailKitSimplified.Sender" Version="2.5.2"/>
<PackageReference Include="Markdig" Version="0.32.0"/>
<PackageReference Include="Microsoft.AspNetCore.Components.Web" Version="7.0.10"/>
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="7.0.10"/>

View File

@ -20,6 +20,11 @@ class API {
return response.map(obj => new BlogPost(obj));
}
static async getBlogPostsByTag(tag: string, page: number): Promise<BlogPost[]> {
const response = await API.getResponse(`posts/tagged/${tag}/${page}`);
return response.map(obj => new BlogPost(obj));
}
static async getAuthor(id: string): Promise<Author> {
const response = await API.getResponse(`author/${id}`);
return new Author(response);

View File

@ -2,6 +2,7 @@ import API from "./API";
import UI from "./UI";
import Input from "./Input";
import Author from "./Author";
import BlogPost from "./BlogPost";
declare const Handlebars: any;
declare const Prism: any;
@ -27,6 +28,19 @@ declare const Prism: any;
}
});
function getQueryVariable(variable: string): string {
const query = window.location.search.substring(1);
const vars = query.split("&");
for (const element of vars) {
const pair = element.split("=");
if (pair[0] == variable) {
return pair[1];
}
}
return null;
}
Input.registerShortcut(Input.KONAMI_CODE, () => {
window.open("https://www.youtube.com/watch?v=dQw4w9WgXcQ", "_blank");
});
@ -46,7 +60,15 @@ declare const Prism: any;
const template = Handlebars.compile(UI.blogPostTemplate.innerHTML);
API.getBlogPostCount().then(async (count) => {
for (let i = 0; i <= count / 10; i++) {
const posts = await API.getBlogPosts(i);
let posts: BlogPost[];
const tag = getQueryVariable("tag");
if (tag !== null) {
posts = await API.getBlogPostsByTag(tag, i);
} else {
posts = await API.getBlogPosts(i);
}
for (const post of posts) {
let author: Author;
if (authors[post.authorId]) {