summaryrefslogtreecommitdiff
path: root/src/chef/pages/admin/api.clj
blob: a15b897df91273b669ec947fa7eaca64610e11a2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
(ns chef.pages.admin.api
  (:require [chef.utils :as cutils]
            [chef.database :as cdb]
            [next.jdbc :as jdbc]
            [honey.sql :as sql]
            [ring.util.response :as ruresp]))

(defn create-category [req]
  (cutils/auth-only req
                    (jdbc/execute! @cdb/db
                                   (sql/format {:insert-into [:categories]
                                                :values      [(merge {:name "New category"}
                                                                     (when-let [parent (get-in req [:params "parent"])]
                                                                       {:parent parent}))]}))
                    (-> (ruresp/created "Created.")
                        (ruresp/header "HX-Refresh" "true"))))

(defn- delete-category-children! [id]
  (let [children (->> (sql/format {:select [:*]
                                   :from   [:categories]
                                   :where  [:= :parent id]})
                      (jdbc/execute! @cdb/db)
                      (map #(:categories/id %)))]
    (doseq [child children]
      (jdbc/execute! @cdb/db
                     (sql/format {:delete-from [:categories]
                                  :where       [:= :id child]}))
      (delete-category-children! child))))

(defn delete-category [req]
  (cutils/auth-only req
                    (if-let [id (try (Integer/parseInt (get-in req [:path-params :id]))
                                     (catch Exception _ nil))]
                      (do (jdbc/execute! @cdb/db
                                         (sql/format {:delete-from [:categories]
                                                      :where       [:= :id id]}))
                          (delete-category-children! id)
                          (-> (ruresp/response "Deleted.")
                              (ruresp/status 200)
                              (ruresp/header "HX-Refresh" "true")))
                      (ruresp/bad-request "Bad request."))))