From 8d86458282efae6c3fc26ab8fb4bd61d1a4e01e3 Mon Sep 17 00:00:00 2001 From: Elias Haugsbakk Date: Wed, 22 Jul 2026 00:48:08 +0200 Subject: refine articles and article search styling --- .../clams/server/config/AppRoutes.java | 6 ++-- .../clams/server/controller/ArticleController.java | 2 +- .../server/controller/ArticlesController.java | 36 +++++++++++++--------- .../clams/server/controller/MediaController.java | 2 +- 4 files changed, 26 insertions(+), 20 deletions(-) (limited to 'clams-server/src/main/java/no/eliashaugsbakk/clams') diff --git a/clams-server/src/main/java/no/eliashaugsbakk/clams/server/config/AppRoutes.java b/clams-server/src/main/java/no/eliashaugsbakk/clams/server/config/AppRoutes.java index 3df4d6d..9deef6b 100644 --- a/clams-server/src/main/java/no/eliashaugsbakk/clams/server/config/AppRoutes.java +++ b/clams-server/src/main/java/no/eliashaugsbakk/clams/server/config/AppRoutes.java @@ -26,7 +26,7 @@ public class AppRoutes implements EndpointGroup { Map.of("page_title", "Projects - Elias Haugsbakk", "page_css", "projects"))); path("articles", () -> { - get(appContext.getArticlesController()::handleArticlesRequest); + get(appContext.getArticlesController()::handleGetArticles); get("{slug}", appContext.getArticlesController()::handleGetArticle); }); @@ -50,13 +50,13 @@ public class AppRoutes implements EndpointGroup { } }); - post("articles", appContext.getArticleController()::handleArticleArticle); + post("articles", appContext.getArticleController()::handlePostArticle); put("articles/{slug}", appContext.getArticleController()::handlePutArticle); delete("articles/{slug}", appContext.getArticleController()::handleDeleteArticle); get("media", appContext.getMediaController()::handleGetMediaIndex); get("media/{uuid}", appContext.getMediaController()::handleGetMedia); - post("media", appContext.getMediaController()::handleArticleMedia); + post("media", appContext.getMediaController()::handlePostMedia); delete("media/{uuid}", appContext.getMediaController()::handleDeleteMedia); }); } diff --git a/clams-server/src/main/java/no/eliashaugsbakk/clams/server/controller/ArticleController.java b/clams-server/src/main/java/no/eliashaugsbakk/clams/server/controller/ArticleController.java index a57414f..8759b1a 100644 --- a/clams-server/src/main/java/no/eliashaugsbakk/clams/server/controller/ArticleController.java +++ b/clams-server/src/main/java/no/eliashaugsbakk/clams/server/controller/ArticleController.java @@ -15,7 +15,7 @@ public class ArticleController { this.slugService = slugService; } - public void handleArticleArticle(Context ctx) { + public void handlePostArticle(Context ctx) { ArticleDTO newArticle = ctx.bodyAsClass(ArticleDTO.class); articlesRepo.addArticle(new Article(newArticle, slugService.toSlug(newArticle.title()))); } diff --git a/clams-server/src/main/java/no/eliashaugsbakk/clams/server/controller/ArticlesController.java b/clams-server/src/main/java/no/eliashaugsbakk/clams/server/controller/ArticlesController.java index f013419..80a1cb5 100644 --- a/clams-server/src/main/java/no/eliashaugsbakk/clams/server/controller/ArticlesController.java +++ b/clams-server/src/main/java/no/eliashaugsbakk/clams/server/controller/ArticlesController.java @@ -24,7 +24,7 @@ public class ArticlesController { private final ArticlesRepo articlesRepo; private final ArticlesSearchService articlesSearchService; - public record SearchResultItem(String title, String slug, String summary, String formattedDate) {} + public record ArticleItem(String title, String slug, String summary, String formattedDate, int year) {} public ArticlesController(SqliteManager sqliteManager) { this.articlesRepo = new ArticlesRepoSqlite(sqliteManager); @@ -58,7 +58,7 @@ public class ArticlesController { )); } - public void handleArticlesRequest(Context ctx) { + public void handleGetArticles(Context ctx) { String searchTerm = ctx.queryParam("search"); if (searchTerm != null) { handleSearch(ctx, searchTerm); @@ -71,23 +71,28 @@ public class ArticlesController { List allArticles = articlesRepo.listArticlesMetaData().stream() .filter(ArticleMetaData::isPublished) .toList(); - Map> articlesByYear = groupArticlesByYear(allArticles); - var featuredSlugs = List.of( - "" - ); + Map> articlesByYear = groupArticlesByYear(allArticles); - List
featuredArticles = new ArrayList<>(); - for (String slug : featuredSlugs) { - articlesRepo.getArticle(slug).ifPresent(featuredArticles::add); - } + Map> articleItemsByYear = articlesByYear.entrySet().stream() + .collect(Collectors.toMap( + Map.Entry::getKey, + entry -> entry.getValue().stream() + .map(article -> new ArticleItem( + article.title(), + article.slug(), + article.summary() != null ? article.summary() : "", + article.timePublished().atZone(OSLO_ZONE).format(DATE_FORMATTER), + article.timePublished().atZone(OSLO_ZONE).getYear() + )) + .toList() + )); ctx.render("templates/articles.html", Map.of( "page_title", "My articles", "page_css", "articles", - "articles_by_year", articlesByYear, - "featured_articles", featuredArticles, + "articles_by_year", articleItemsByYear, "search_value", "" )); } @@ -96,13 +101,14 @@ public class ArticlesController { String query = searchTerm.trim(); List results = query.isEmpty() ? List.of() : articlesSearchService.searchArticles(query); - List resultItems = results.stream() + List resultItems = results.stream() .filter(ArticleMetaData::isPublished) - .map(article -> new SearchResultItem( + .map(article -> new ArticleItem( article.title(), article.slug(), article.summary() != null ? article.summary() : "", - article.timePublished().atZone(OSLO_ZONE).format(DATE_FORMATTER) + article.timePublished().atZone(OSLO_ZONE).format(DATE_FORMATTER), + article.timePublished().atZone(OSLO_ZONE).getYear() )) .toList(); diff --git a/clams-server/src/main/java/no/eliashaugsbakk/clams/server/controller/MediaController.java b/clams-server/src/main/java/no/eliashaugsbakk/clams/server/controller/MediaController.java index d4e40b9..8855b7b 100644 --- a/clams-server/src/main/java/no/eliashaugsbakk/clams/server/controller/MediaController.java +++ b/clams-server/src/main/java/no/eliashaugsbakk/clams/server/controller/MediaController.java @@ -28,7 +28,7 @@ public class MediaController { this.appConfig = appConfig; } - public void handleArticleMedia(Context ctx) { + public void handlePostMedia(Context ctx) { UploadedFile file = ctx.uploadedFile("image"); if (file == null) { -- cgit v1.2.3