add edit snippet use case

This commit is contained in:
Travis Shears 2025-06-10 10:42:33 +02:00
parent f58db3d88b
commit 2197dd0c1d
5 changed files with 56 additions and 1 deletions

View file

@ -14,5 +14,5 @@ App to store my code snippets.
### How to run dev server
```
$ clojure -M -m snippets.api
$ clojure -M -m snippets.infra.api
```

View file

@ -0,0 +1,22 @@
meta {
name: edit_snippet
type: http
seq: 7
}
patch {
url: {{host}}/api/snippet?id=680a3508-7709-4f71-b5c3-3dcbffe6f5cf
body: json
auth: none
}
params:query {
id: 680a3508-7709-4f71-b5c3-3dcbffe6f5cf
}
body:json {
{
"title": "Updated from Bruno",
"tags": ["code", "mock"]
}
}

View file

@ -6,6 +6,7 @@
[snippets.use-cases.view]
[snippets.use-cases.delete]
[snippets.use-cases.create]
[snippets.use-cases.edit]
[snippets.infra.config :as config]
[muuntaja.middleware :as mm]
[ring.middleware.params]
@ -20,6 +21,15 @@
(snippets.use-cases.create/create-snippet body)
{:status 200, :body "snippet created"})
(defn handle-edit-snippet [{body :body-params params :query-params}]
(let [id (get params "id")]
(t/log! {:level :info, :data {:body body :id id}} "Received request to edit snippet")
(let [{success :success :as res} (snippets.use-cases.edit/edit-snippet id body)]
(cond
success {:status 200, :body "snippet updated"}
(= (:reason res) :invalid-patch) {:status 400, :body "invalid patch"}
:else {:status 500, :body "internal server error"}))))
(defn handle-view-snippets [{params :query-params}]
(let [limit (Integer/parseInt (get params "limit" "10"))
skip (Integer/parseInt (get params "skip" "0"))]
@ -51,6 +61,7 @@
["/snippets" {:get handle-view-snippets}]
["/snippet" {:post handle-create-snippet
:get handle-view-snippet
:patch handle-edit-snippet
:delete handle-delete-snippet}]])
(rr/create-default-handler)))

View file

@ -35,3 +35,7 @@
(defn erase-snippet [id]
(t/log! {:level :info, :data {:id id}} "Erasing snippet, aka removing it completely through out time")
(xt/execute-tx client [[:erase-docs :snippets id]]))
(defn patch-snippet [id patch]
(t/log! {:level :info, :data {:patch patch :id id}} "Patching snippet")
(xt/execute-tx client [[:patch-docs :snippets (merge {:xt/id id} patch)]]))

View file

@ -1,4 +1,22 @@
(ns snippets.use-cases.edit
(:require
[taoensso.telemere :as t]
[malli.core :as m]
[snippets.infra.db :as db]))
(def valid-patch?
(m/validator
[:map {:closed true}
[:markdown {:optional true} :string]
[:title {:optional true} :string]
[:tags [:seqable :string]]
[:slug {:optional true} :string]]))
(defn edit-snippet [id patch]
(t/log! {:level :info, :data {:patch patch :id id}} "Editing snippet")
(if (valid-patch? patch)
(do
(t/log! {:level :info, :data {:patch patch :id id}} "Valid changes editing snippet")
(db/patch-snippet id patch)
{:success true})
{:success false :reason :invalid-patch}))