summaryrefslogtreecommitdiff
path: root/clams-server/src/main/java/no
diff options
context:
space:
mode:
authorElias Haugsbakk <[email protected]>2026-07-01 21:18:58 +0200
committerElias Haugsbakk <[email protected]>2026-07-02 00:11:30 +0200
commit19c9cb227b343377853321e2cdc4285b2ea23e3a (patch)
tree697b1784c0e50b7d84a0ef8dcf2cfbba8e4357bc /clams-server/src/main/java/no
parent5b1e3672a1e6d9f7b54ed4267e8715f5dc3bb55a (diff)
implement blog index page with featured and all posts
Diffstat (limited to 'clams-server/src/main/java/no')
-rw-r--r--clams-server/src/main/java/no/eliashaugsbakk/clams/server/Main.java12
-rw-r--r--clams-server/src/main/java/no/eliashaugsbakk/clams/server/controller/BlogController.java75
-rw-r--r--clams-server/src/main/java/no/eliashaugsbakk/clams/server/model/Post.java2
-rw-r--r--clams-server/src/main/java/no/eliashaugsbakk/clams/server/repository/BlogPostRepoSqlite.java5
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();
}