From d679ea194727ac2736ea6603e753be2951ec77b4 Mon Sep 17 00:00:00 2001 From: Daniel Nitsikopoulos Date: Sun, 7 May 2023 17:28:45 +1000 Subject: [PATCH] Admin post management --- config/routes.rb | 4 +++ slices/admin/actions/posts/archive.rb | 16 +++++++++++ slices/admin/actions/posts/delete.rb | 17 ++++++++++++ slices/admin/actions/posts/index.rb | 14 ++++++++++ slices/admin/repos/post_repo.rb | 14 ++++++++++ slices/admin/templates/index.html.slim | 2 ++ slices/admin/templates/posts/index.html.slim | 29 ++++++++++++++++++++ slices/admin/views/posts/index.rb | 14 ++++++++++ 8 files changed, 110 insertions(+) create mode 100644 slices/admin/actions/posts/archive.rb create mode 100644 slices/admin/actions/posts/delete.rb create mode 100644 slices/admin/actions/posts/index.rb create mode 100644 slices/admin/templates/posts/index.html.slim create mode 100644 slices/admin/views/posts/index.rb diff --git a/config/routes.rb b/config/routes.rb index f499952..186c71e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -70,6 +70,10 @@ module Adamantium delete "/bookmarks/:id", to: "bookmarks.delete" post "/bookmarks/cache/:id", to: "bookmarks.cache" post "/bookmarks/:id/archive", to: "bookmarks.archive" + + get "/posts", to: "posts.index" + delete "/posts/:id", to: "posts.delete" + post "/posts/:id/archive", to: "posts.archive" end end end diff --git a/slices/admin/actions/posts/archive.rb b/slices/admin/actions/posts/archive.rb new file mode 100644 index 0000000..cb4fce0 --- /dev/null +++ b/slices/admin/actions/posts/archive.rb @@ -0,0 +1,16 @@ +module Admin + module Actions + module Posts + class Archive < Action + + include Deps["repos.post_repo"] + + def handle(req, res) + post_id = req.params[:id] + + post_repo.archive(id: post_id) + end + end + end + end +end \ No newline at end of file diff --git a/slices/admin/actions/posts/delete.rb b/slices/admin/actions/posts/delete.rb new file mode 100644 index 0000000..a5b7c48 --- /dev/null +++ b/slices/admin/actions/posts/delete.rb @@ -0,0 +1,17 @@ +module Admin + module Actions + module Posts + class Delete < Action + + include Deps["repos.post_repo", "repos.post_tag_repo"] + + def handle(req, res) + post_id = req.params[:id] + + post_tag_repo.delete_by_post_id(post_id: post_id) + post_repo.delete(id: post_id) + end + end + end + end +end \ No newline at end of file diff --git a/slices/admin/actions/posts/index.rb b/slices/admin/actions/posts/index.rb new file mode 100644 index 0000000..85fe279 --- /dev/null +++ b/slices/admin/actions/posts/index.rb @@ -0,0 +1,14 @@ +module Admin + module Actions + module Posts + class Index < Action + + include Deps["views.posts.index"] + + def handle(req, res) + res.render index + end + end + end + end +end \ No newline at end of file diff --git a/slices/admin/repos/post_repo.rb b/slices/admin/repos/post_repo.rb index c9b1aa5..4f677cd 100644 --- a/slices/admin/repos/post_repo.rb +++ b/slices/admin/repos/post_repo.rb @@ -32,6 +32,20 @@ module Admin .published .where(Sequel.ilike(:content, "%#{body_contains}%")).to_a end + + def list + posts + .where(post_type: "post") + .to_a + end + + def delete(id:) + posts.where(id: id).delete + end + + def archive(id:) + posts.where(id: id).update(published_at: nil) + end end end end \ No newline at end of file diff --git a/slices/admin/templates/index.html.slim b/slices/admin/templates/index.html.slim index cf354f2..b6d6cd5 100644 --- a/slices/admin/templates/index.html.slim +++ b/slices/admin/templates/index.html.slim @@ -3,6 +3,8 @@ div class="mb-12 prose dark:prose-invert max-w-prose mx-auto text-gray-800 dark: div class="max-w-prose mx-auto prose dark:prose-invert" ul + li + a href="/admin/posts" Posts li a href="/admin/tags" Tags li diff --git a/slices/admin/templates/posts/index.html.slim b/slices/admin/templates/posts/index.html.slim new file mode 100644 index 0000000..3c5d833 --- /dev/null +++ b/slices/admin/templates/posts/index.html.slim @@ -0,0 +1,29 @@ +div class="mb-12 prose dark:prose-invert max-w-prose mx-auto text-gray-800 dark:text-gray-200" + h1 Admin // Posts + +div class="max-w-prose mx-auto" + table class="prose dark:prose-invert table-auto prose-a:text-blue-600 prose-a:no-underline" + thead + th Details + th Date + th Actions + tbody + - posts.each do |post| + tr id="post-#{post.id}" + td + div + = post.name + a class="no-underline" href=post.slug + small class="text-gray-400 dark:text-gray-600" = post.slug + td + = post.published_at&.strftime("%d %b %Y") + td + div + button hx-delete="/admin/bookmarks/#{post.id}" hx-target="#post-#{post.id}" delete + div + button hx-post="/admin/bookmarks/#{post.id}/archive" archive + +div class="max-w-screen-md mx-auto border-t-4 border-solid border-gray-400 dark:border-gray-600" + + + diff --git a/slices/admin/views/posts/index.rb b/slices/admin/views/posts/index.rb new file mode 100644 index 0000000..d68a734 --- /dev/null +++ b/slices/admin/views/posts/index.rb @@ -0,0 +1,14 @@ +module Admin + module Views + module Posts + class Index < Admin::View + + include Deps["repos.post_repo"] + + expose :posts do + post_repo.list + end + end + end + end +end \ No newline at end of file