diff --git a/README.md b/README.md index da7d382..f6bbde3 100644 --- a/README.md +++ b/README.md @@ -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 ``` diff --git a/bruno/CodeSnippets/edit_snippet.bru b/bruno/CodeSnippets/edit_snippet.bru new file mode 100644 index 0000000..fa6d897 --- /dev/null +++ b/bruno/CodeSnippets/edit_snippet.bru @@ -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"] + } +} diff --git a/src/snippets/infra/api.clj b/src/snippets/infra/api.clj index f1dcfee..1e96047 100644 --- a/src/snippets/infra/api.clj +++ b/src/snippets/infra/api.clj @@ -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))) diff --git a/src/snippets/infra/db.clj b/src/snippets/infra/db.clj index ddf8715..d35eed5 100644 --- a/src/snippets/infra/db.clj +++ b/src/snippets/infra/db.clj @@ -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)]])) diff --git a/src/snippets/use_cases/edit.clj b/src/snippets/use_cases/edit.clj index 1aecad0..5db3816 100644 --- a/src/snippets/use_cases/edit.clj +++ b/src/snippets/use_cases/edit.clj @@ -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}))