diff options
| author | Elias Haugsbakk <[email protected]> | 2026-07-01 21:18:58 +0200 |
|---|---|---|
| committer | Elias Haugsbakk <[email protected]> | 2026-07-02 00:11:30 +0200 |
| commit | 19c9cb227b343377853321e2cdc4285b2ea23e3a (patch) | |
| tree | 697b1784c0e50b7d84a0ef8dcf2cfbba8e4357bc /clams-server/src/main/java/no/eliashaugsbakk/clams/server | |
| parent | 5b1e3672a1e6d9f7b54ed4267e8715f5dc3bb55a (diff) | |
implement blog index page with featured and all posts
Diffstat (limited to 'clams-server/src/main/java/no/eliashaugsbakk/clams/server')
4 files changed, 79 insertions, 15 deletions
diff --git a/clams-server/src/main/java/no/eliashaugsbakk/clams/server/Main.java b/clams-server/src/main/java/no/eliashaugsbakk/clams/server/Main.java index 93a42cb..e456e7b 100644 --- a/clams-server/src/main/java/no/eliashaugsbakk/clams/server/Main.java +++ b/clams-server/src/main/java/no/eliashaugsbakk/clams/server/Main.java @@ -2,6 +2,7 @@ package no.eliashaugsbakk.clams.server; import io.javalin.Javalin; import io.javalin.rendering.template.JavalinPebble; +import java.util.Map; import no.eliashaugsbakk.clams.server.controller.BlogController; import no.eliashaugsbakk.clams.server.repository.SqliteManager; @@ -11,17 +12,20 @@ public class Main { SqliteManager dbManager = new SqliteManager("testDb.db"); dbManager.init(); - BlogController blogController = new BlogController(); + BlogController blogController = new BlogController(dbManager); var app = Javalin.create(config -> { config.staticFiles.add("/public"); config.fileRenderer(new JavalinPebble()); - config.routes.error(404, ctx -> ctx.render("templates/404.html")); + config.routes.error(404, ctx -> ctx.render("templates/404.html", + Map.of("page_title", "404 - Page Not Found", "page_css", "404"))); config.routes.get("/", ctx -> ctx.redirect("/home")); - config.routes.get("/home", ctx -> ctx.render("templates/home.html")); - config.routes.get("/projects", ctx -> ctx.render("templates/projects.html")); + config.routes.get("/home", ctx -> ctx.render("templates/home.html", + Map.of("page_title", "Elias Haugsbakk", "page_css", "home"))); + config.routes.get("/projects", ctx -> ctx.render("templates/projects.html", + Map.of("page_title", "Projects - Elias Haugsbakk", "page_css", "projects"))); config.routes.get("/blog/{slug}", blogController::handleGetPost); config.routes.get("/blog", blogController::handleGetOverview); diff --git a/clams-server/src/main/java/no/eliashaugsbakk/clams/server/controller/BlogController.java b/clams-server/src/main/java/no/eliashaugsbakk/clams/server/controller/BlogController.java index d4fc9d3..076e0e3 100644 --- a/clams-server/src/main/java/no/eliashaugsbakk/clams/server/controller/BlogController.java +++ b/clams-server/src/main/java/no/eliashaugsbakk/clams/server/controller/BlogController.java @@ -1,21 +1,80 @@ package no.eliashaugsbakk.clams.server.controller; import io.javalin.http.Context; +import java.time.ZoneId; +import java.util.List; import java.util.Map; +import no.eliashaugsbakk.clams.server.repository.BlogPostRepo; +import no.eliashaugsbakk.clams.server.repository.BlogPostRepoSqlite; +import no.eliashaugsbakk.clams.server.repository.SqliteManager; public class BlogController { + private final BlogPostRepo blogPostRepo; + + public BlogController(SqliteManager sqliteManager) { + this.blogPostRepo = new BlogPostRepoSqlite(sqliteManager); + } + public void handleGetPost(Context ctx) { ctx.render("templates/post.html", - Map.of("title", "place holder Title", - "published_date", "place holder Release Date", - "author", "place holder Author", - "content", "place holder Content")); + Map.of("page_title", "place holder Title - Elias Haugsbakk", "page_css", "post", + "title", "place holder Title", "published_date", "place holder Release Date", + "author", "place holder Author", "content", "place holder Content")); } public void handleGetOverview(Context ctx) { - ctx.render("templates/blog.html", Map.of( - "all_posts_by_year", "place holder for all posts", - "recent_posts", " place holder for recent posts" - )); + StringBuilder allPosts = new StringBuilder(); + + int prevYear = blogPostRepo.listPostsByPublishedDesc().getFirst().published() + .atZone(ZoneId.of("Europe/Oslo")).getYear(); + + allPosts.append(String.format(""" + <details class="year-accordion" open> + <summary class="year-toggle">%d</summary> + <ul class="post-list"> + """, prevYear)); + + for (var post : blogPostRepo.listPostsByPublishedDesc()) { + int year = post.published().atZone(ZoneId.of("Europe/Oslo")).getYear(); + if (year == prevYear) { + allPosts.append(String.format(""" + <li><a href="/blog/%s">%s</a></li> + """, post.slug(), post.title())); + } else { + allPosts.append(String.format(""" + </ul> + </details> + <details class="year-accordion"> + <summary class="year-toggle">%d</summary> + <ul class="post-list"> + <li><a href="/blog/%s">%s</a></li> + """, year, post.slug(), post.title())); + prevYear = year; + } + } + allPosts.append(""" + </ul> + </details> + """); + + + var featuredSlugs = List.of("test-page", "another-one"); + + StringBuilder featuredPosts = new StringBuilder(); + featuredPosts.append("<ul class=\"recent-list\">"); + + for (String slug : featuredSlugs) { + blogPostRepo.getPost(slug).ifPresent(post -> featuredPosts.append( + String.format(""" + <li> + <a href="/blog/%s">%s</a> <span class="featured-desc">-- %s</span> + </li> + """, post.slug(), post.title(), post.summary()))); + } + featuredPosts.append("</ul>"); + + ctx.render("templates/blog.html", + Map.of("page_title", "Elias Haugsbakk's Blog", "page_css", "blog", + "all_posts", allPosts.toString(), "recent_posts", featuredPosts.toString())); } } diff --git a/clams-server/src/main/java/no/eliashaugsbakk/clams/server/model/Post.java b/clams-server/src/main/java/no/eliashaugsbakk/clams/server/model/Post.java index e4136d0..833c524 100644 --- a/clams-server/src/main/java/no/eliashaugsbakk/clams/server/model/Post.java +++ b/clams-server/src/main/java/no/eliashaugsbakk/clams/server/model/Post.java @@ -2,5 +2,5 @@ package no.eliashaugsbakk.clams.server.model; import java.time.Instant; -public record Post(String title, String slug, Instant timePublished, String content) { +public record Post(String title, String slug, String summary, Instant timePublished, String content) { } diff --git a/clams-server/src/main/java/no/eliashaugsbakk/clams/server/repository/BlogPostRepoSqlite.java b/clams-server/src/main/java/no/eliashaugsbakk/clams/server/repository/BlogPostRepoSqlite.java index 50daf39..2979589 100644 --- a/clams-server/src/main/java/no/eliashaugsbakk/clams/server/repository/BlogPostRepoSqlite.java +++ b/clams-server/src/main/java/no/eliashaugsbakk/clams/server/repository/BlogPostRepoSqlite.java @@ -54,7 +54,7 @@ public class BlogPostRepoSqlite implements BlogPostRepo { @Override public Optional<Post> getPost(String slug) { String sql = """ - SELECT title, slug, content, published + SELECT title, slug, summary, content, published FROM posts WHERE slug = ? """; @@ -68,12 +68,13 @@ public class BlogPostRepoSqlite implements BlogPostRepo { if (resultSet.next()) { String title = resultSet.getString("title"); String postSlug = resultSet.getString("slug"); + String summary = resultSet.getString("summary"); String content = resultSet.getString("content"); String publishedRaw = resultSet.getString("published"); Instant timePublished = Instant.parse(publishedRaw); - return Optional.of(new Post(title, postSlug, timePublished, content)); + return Optional.of(new Post(title, postSlug, summary, timePublished, content)); } return Optional.empty(); } |
