summaryrefslogtreecommitdiff
path: root/clams-server/src
diff options
context:
space:
mode:
Diffstat (limited to 'clams-server/src')
-rw-r--r--clams-server/src/main/java/no/eliashaugsbakk/clams/server/config/AppContext.java8
-rw-r--r--clams-server/src/main/java/no/eliashaugsbakk/clams/server/controller/PostController.java13
-rw-r--r--clams-server/src/main/java/no/eliashaugsbakk/clams/server/controller/ProjectController.java75
-rw-r--r--clams-server/src/main/java/no/eliashaugsbakk/clams/server/controller/ProjectsController.java44
-rw-r--r--clams-server/src/main/java/no/eliashaugsbakk/clams/server/model/Project.java2
-rw-r--r--clams-server/src/main/java/no/eliashaugsbakk/clams/server/repository/ProjectsRepo.java4
-rw-r--r--clams-server/src/main/java/no/eliashaugsbakk/clams/server/repository/ProjectsRepoSqlite.java13
7 files changed, 99 insertions, 60 deletions
diff --git a/clams-server/src/main/java/no/eliashaugsbakk/clams/server/config/AppContext.java b/clams-server/src/main/java/no/eliashaugsbakk/clams/server/config/AppContext.java
index 189edc7..647bcfa 100644
--- a/clams-server/src/main/java/no/eliashaugsbakk/clams/server/config/AppContext.java
+++ b/clams-server/src/main/java/no/eliashaugsbakk/clams/server/config/AppContext.java
@@ -4,7 +4,7 @@ import java.nio.file.Path;
import no.eliashaugsbakk.clams.server.controller.PostsController;
import no.eliashaugsbakk.clams.server.controller.MediaController;
import no.eliashaugsbakk.clams.server.controller.PostController;
-import no.eliashaugsbakk.clams.server.controller.ProjectsController;
+import no.eliashaugsbakk.clams.server.controller.ProjectController;
import no.eliashaugsbakk.clams.server.repository.PostsRepo;
import no.eliashaugsbakk.clams.server.repository.PostsRepoSqlite;
import no.eliashaugsbakk.clams.server.repository.MediaRepo;
@@ -21,7 +21,7 @@ public class AppContext implements AutoCloseable {
private final PostsController postsController;
private final MediaController mediaController;
private final PostController postController;
- private final ProjectsController projectsController;
+ private final ProjectController projectController;
private final AuthService authService;
private final PageCache pageCache;
@@ -40,7 +40,7 @@ public class AppContext implements AutoCloseable {
this.postsController = new PostsController(dbManager);
this.mediaController = new MediaController(mediaRepo, appConfig);
- this.projectsController = new ProjectsController(projectsRepo);
+ this.projectController = new ProjectController(projectsRepo);
this.postController = new PostController(postsRepo, slugService);
this.authService = new AuthService(appConfig);
this.pageCache = new PageCache(15);
@@ -48,7 +48,7 @@ public class AppContext implements AutoCloseable {
public PostsController getPostsController() { return postsController; }
public MediaController getMediaController() { return mediaController; }
- public ProjectsController getProjectsController() { return projectsController; }
+ public ProjectController getProjectsController() { return projectController; }
public PostController getPostController() { return postController; }
public AuthService getAuthService() { return authService; }
public PageCache pageCache() { return pageCache; }
diff --git a/clams-server/src/main/java/no/eliashaugsbakk/clams/server/controller/PostController.java b/clams-server/src/main/java/no/eliashaugsbakk/clams/server/controller/PostController.java
index e4b3595..01deb7d 100644
--- a/clams-server/src/main/java/no/eliashaugsbakk/clams/server/controller/PostController.java
+++ b/clams-server/src/main/java/no/eliashaugsbakk/clams/server/controller/PostController.java
@@ -1,6 +1,7 @@
package no.eliashaugsbakk.clams.server.controller;
import io.javalin.http.Context;
+import io.javalin.http.HttpStatus;
import no.eliashaugsbakk.clams.server.model.Post;
import no.eliashaugsbakk.clams.server.model.PostDTO;
import no.eliashaugsbakk.clams.server.repository.PostsRepo;
@@ -18,19 +19,25 @@ public class PostController {
public void handlePostPost(Context ctx) {
PostDTO newPost = ctx.bodyAsClass(PostDTO.class);
postsRepo.addPost(new Post(newPost, slugService.toSlug(newPost.title())));
+ ctx.status(HttpStatus.CREATED);
}
public void handlePutPost(Context ctx) {
String slug = ctx.pathParam("slug");
PostDTO updatedPost = ctx.bodyAsClass(PostDTO.class);
- postsRepo.getPost(slug).map(existing -> Post.fromUpdated(existing, updatedPost))
- .ifPresentOrElse(postsRepo::updatePost, () -> ctx.status(404));
+ postsRepo.getPost(slug)
+ .map(existing -> Post.fromUpdated(existing, updatedPost))
+ .ifPresentOrElse(
+ postsRepo::updatePost,
+ () -> ctx.status(HttpStatus.NOT_FOUND));
}
public void handleDeletePost(Context ctx) {
if (!postsRepo.deletePost(ctx.pathParam("slug"))) {
- ctx.status(404);
+ ctx.status(HttpStatus.NOT_FOUND);
+ } else {
+ ctx.status(HttpStatus.NO_CONTENT);
}
}
}
diff --git a/clams-server/src/main/java/no/eliashaugsbakk/clams/server/controller/ProjectController.java b/clams-server/src/main/java/no/eliashaugsbakk/clams/server/controller/ProjectController.java
new file mode 100644
index 0000000..ea2b3d4
--- /dev/null
+++ b/clams-server/src/main/java/no/eliashaugsbakk/clams/server/controller/ProjectController.java
@@ -0,0 +1,75 @@
+package no.eliashaugsbakk.clams.server.controller;
+
+import io.javalin.http.BadRequestResponse;
+import io.javalin.http.Context;
+import io.javalin.http.HttpStatus;
+import java.util.List;
+import java.util.Map;
+import no.eliashaugsbakk.clams.server.model.Project;
+import no.eliashaugsbakk.clams.server.repository.ProjectsRepo;
+
+public class ProjectController {
+ private final ProjectsRepo projectsRepo;
+
+ public ProjectController(ProjectsRepo projectsRepo) {
+ this.projectsRepo = projectsRepo;
+ }
+
+ public void handleGetProjects(Context ctx) {
+ List<Project> allProjects = projectsRepo.getAllProjects();
+ ctx.render("templates/projects.html", Map.of(
+ "page_title", "Blog",
+ "page_css", "projects",
+ "projects", allProjects));
+ }
+
+ public void handleGetProjectsApi(Context ctx) {
+ ctx.json(projectsRepo.getAllProjects());
+ }
+
+ public void handlePostProject(Context ctx) {
+ Project newProject = ctx.bodyAsClass(Project.class);
+ projectsRepo.addProject(newProject);
+ ctx.status(HttpStatus.CREATED);
+ }
+
+ public void handlePutProject(Context ctx) {
+ long id = parseId(ctx);
+ Project updateProject = ctx.bodyAsClass(Project.class);
+
+ Project projectToUpdate = new Project(
+ id,
+ updateProject.name(),
+ updateProject.readMoreUrl(),
+ updateProject.gitUrl(),
+ updateProject.gitHubUrl(),
+ updateProject.description()
+ );
+
+ boolean updated = projectsRepo.updateProject(projectToUpdate);
+ if (!updated) {
+ ctx.status(HttpStatus.NOT_FOUND);
+ return;
+ }
+
+ ctx.status(HttpStatus.NO_CONTENT);
+ }
+
+ public void handleDeleteProject(Context ctx) {
+ long id = parseId(ctx);
+ boolean deleted = projectsRepo.deleteProject(id);
+ if (!deleted) {
+ ctx.status(HttpStatus.NOT_FOUND);
+ return;
+ }
+ ctx.status(HttpStatus.NO_CONTENT);
+ }
+
+ private long parseId(Context ctx) {
+ try {
+ return Long.parseLong(ctx.pathParam("id"));
+ } catch (NumberFormatException e) {
+ throw new BadRequestResponse("Invalid project ID format");
+ }
+ }
+}
diff --git a/clams-server/src/main/java/no/eliashaugsbakk/clams/server/controller/ProjectsController.java b/clams-server/src/main/java/no/eliashaugsbakk/clams/server/controller/ProjectsController.java
deleted file mode 100644
index f3e0463..0000000
--- a/clams-server/src/main/java/no/eliashaugsbakk/clams/server/controller/ProjectsController.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package no.eliashaugsbakk.clams.server.controller;
-
-import io.javalin.http.Context;
-import java.util.List;
-import java.util.Map;
-import no.eliashaugsbakk.clams.server.model.Project;
-import no.eliashaugsbakk.clams.server.repository.ProjectsRepo;
-
-public class ProjectsController {
- private final ProjectsRepo projectsRepo;
-
- public ProjectsController(ProjectsRepo projectsRepo) {
- this.projectsRepo = projectsRepo;
- }
-
- public void handleGetProjects(Context ctx) {
- List<Project> allProjects = projectsRepo.getAllProjects();
- ctx.render("templates/projects.html",
- Map.of(
- "page_title", "Blog",
- "page_css", "projects",
- "projects", allProjects
- ));
- }
-
- public void handlePostProject(Context ctx) {
- Project newProject = ctx.bodyAsClass(Project.class);
- projectsRepo.addProject(newProject);
- }
-
- public void handlePutProject(Context ctx) {
- Project updateProject = ctx.bodyAsClass(Project.class);
- projectsRepo.updateProject(Long.parseLong(ctx.pathParam("id")), updateProject);
- }
-
- public void handleDeleteProject(Context ctx) {
- projectsRepo.deleteProject(Long.parseLong(ctx.pathParam("id")));
- }
-
- public void handleGetProjectsApi(Context ctx) {
- List<Project> allProjects = projectsRepo.getAllProjects();
- ctx.json(allProjects);
- }
-}
diff --git a/clams-server/src/main/java/no/eliashaugsbakk/clams/server/model/Project.java b/clams-server/src/main/java/no/eliashaugsbakk/clams/server/model/Project.java
index fb4e313..11efec9 100644
--- a/clams-server/src/main/java/no/eliashaugsbakk/clams/server/model/Project.java
+++ b/clams-server/src/main/java/no/eliashaugsbakk/clams/server/model/Project.java
@@ -1,4 +1,4 @@
package no.eliashaugsbakk.clams.server.model;
-public record Project(long id, String name, String readMoreUrl, String gitUrl, String gitHubUrl, String description) {
+public record Project(Long id, String name, String readMoreUrl, String gitUrl, String gitHubUrl, String description) {
}
diff --git a/clams-server/src/main/java/no/eliashaugsbakk/clams/server/repository/ProjectsRepo.java b/clams-server/src/main/java/no/eliashaugsbakk/clams/server/repository/ProjectsRepo.java
index 6477d68..a0937eb 100644
--- a/clams-server/src/main/java/no/eliashaugsbakk/clams/server/repository/ProjectsRepo.java
+++ b/clams-server/src/main/java/no/eliashaugsbakk/clams/server/repository/ProjectsRepo.java
@@ -5,8 +5,8 @@ import no.eliashaugsbakk.clams.server.model.Project;
public interface ProjectsRepo {
void addProject(Project post);
- void updateProject(long id, Project project);
- void deleteProject(long id);
+ boolean updateProject(Project project);
+ boolean deleteProject(long id);
List<Project> getAllProjects();
}
diff --git a/clams-server/src/main/java/no/eliashaugsbakk/clams/server/repository/ProjectsRepoSqlite.java b/clams-server/src/main/java/no/eliashaugsbakk/clams/server/repository/ProjectsRepoSqlite.java
index b761286..f627afd 100644
--- a/clams-server/src/main/java/no/eliashaugsbakk/clams/server/repository/ProjectsRepoSqlite.java
+++ b/clams-server/src/main/java/no/eliashaugsbakk/clams/server/repository/ProjectsRepoSqlite.java
@@ -38,7 +38,7 @@ public class ProjectsRepoSqlite implements ProjectsRepo {
}
@Override
- public void updateProject(long id, Project project) {
+ public boolean updateProject(Project project) {
String sql = """
UPDATE projects
SET name = ?, read_more_url = ?, git_url = ?, git_hub_url = ?, description = ?
@@ -53,16 +53,17 @@ public class ProjectsRepoSqlite implements ProjectsRepo {
stmt.setString(3, project.gitUrl());
stmt.setString(4, project.gitHubUrl());
stmt.setString(5, project.description());
- stmt.setLong(6, id);
+ stmt.setLong(6, project.id());
- stmt.executeUpdate();
+ int rowsUpdated = stmt.executeUpdate();
+ return rowsUpdated > 0;
} catch (SQLException e) {
throw new RepoException("Error updating project: ", e);
}
}
@Override
- public void deleteProject(long id) {
+ public boolean deleteProject(long id) {
String sql = """
DELETE FROM projects
WHERE id = ?
@@ -73,8 +74,8 @@ public class ProjectsRepoSqlite implements ProjectsRepo {
stmt.setLong(1, id);
- stmt.executeUpdate();
-
+ int rowsUpdated = stmt.executeUpdate();
+ return rowsUpdated > 0;
} catch (SQLException e) {
throw new RepoException("Error deleting project " + id + ": ", e);
}