diff options
| author | Elias Haugsbakk <[email protected]> | 2026-07-27 19:42:22 +0200 |
|---|---|---|
| committer | Elias Haugsbakk <[email protected]> | 2026-07-27 19:42:22 +0200 |
| commit | 98d17162a927e42747ea8304981d66bcc2bdd327 (patch) | |
| tree | 33ec72b251733e58757cdbf76c8ced9910ddb46f /clams-server/src/main/java/no | |
| parent | fb2620847c88f1dbe42a23e9e1ec9134f47c3bf5 (diff) | |
update api to be more robust
Diffstat (limited to 'clams-server/src/main/java/no')
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); } |
