summaryrefslogtreecommitdiff
path: root/src/chef/pages
diff options
context:
space:
mode:
Diffstat (limited to 'src/chef/pages')
-rw-r--r--src/chef/pages/admin.clj118
-rw-r--r--src/chef/pages/admin/api.clj126
-rw-r--r--src/chef/pages/admin/recipe_editor.clj71
-rw-r--r--src/chef/pages/home.clj51
-rw-r--r--src/chef/pages/recipe.clj77
5 files changed, 0 insertions, 443 deletions
diff --git a/src/chef/pages/admin.clj b/src/chef/pages/admin.clj
deleted file mode 100644
index ea19cc3..0000000
--- a/src/chef/pages/admin.clj
+++ /dev/null
@@ -1,118 +0,0 @@
-(ns chef.pages.admin
- (:require [chef.utils :as cutils]
- [hiccup2.core :as html]
- [ring.util.response :as ruresp]
- [chef.database :as cdb]
- [next.jdbc :as jdbc]
- [honey.sql :as sql]))
-
-(defn- render-category [data children]
- [:li
- [:p {:style {:display :inline-block}}
- (if (pos? (:categories/id data))
- [:input {:type :text :placeholder "Name"
- :value (:categories/name data)
- :name "name"
- :hx-post (str "/api/admin/edit-category/" (:categories/id data))
- :hx-trigger "change"}]
- "Startseite")]
- (when (or (neg? (:categories/id data))
- (->> (sql/format {:select [:*]
- :from [:categories]
- :where [:= :parent (:categories/id data)]})
- (jdbc/execute! @cdb/db)
- count
- pos?))
- (list [:p {:style {:display :inline-block
- :margin-left "1em"
- :margin-right "1em"}} "->"]
- [:input {:type :text :placeholder "Frage"
- :style {:display :inline-block
- :width :auto}
- :value (:categories/question data)
- :name "question"
- :hx-post (str "/api/admin/edit-category/" (:categories/id data))
- :hx-trigger "change"}]))
- [:img {:src "/static/icons/plus.svg" :height "30em"
- :style {:vertical-align :middle
- :margin-left "1em"}
- :hx-post (str "/api/admin/create-category"
- (when (pos? (:categories/id data)) (str "?parent=" (:categories/id data))))
- :hx-swap "none"}]
- (when (pos? (:categories/id data))
- [:img {:src "/static/icons/trash.svg" :height "30em"
- :style {:vertical-align :middle
- :margin-left "1em"}
- :hx-delete (str "/api/admin/delete-category/" (:categories/id data))
- :hx-swap "none"}])
- [:ul
- (for [child children]
- (render-category child (->> (sql/format {:select [:*]
- :from [:categories]
- :where [:= :parent (:categories/id child)]})
- (jdbc/execute! @cdb/db))))]])
-
-(defn- render-recipe-table-row [recipe]
- (let [tr-id (str "recipe-" (:recipes/id recipe))]
- [:tr {:id tr-id}
- [:td
- [:p (:recipes/title recipe)]]
- [:td
- (let [category (->> (sql/format {:select [:*]
- :from [:categories]
- :where [:= :id (:recipes/category recipe)]})
- (jdbc/execute! @cdb/db)
- first)]
- [:p (cutils/category-path category)])]
- [:td
- [:div
- [:button {:class ["button" "primary"]
- :onclick (str "window.open(\"/admin/recipe-editor/"
- (:recipes/id recipe)
- "\", \"\", \"width=900,height=900\")")}
- "Bearbeiten"]
- [:button {:class ["button error"]
- :hx-trigger "click"
- :hx-swap :none
- :hx-delete (str "/api/admin/delete-recipe/" (:recipes/id recipe))}
- "Löschen"]]]]))
-
-(defn- render []
- (cutils/gen-page "chef - Admin"
- [:div {:style {:margin-left "1em"}}
- [:h1 "chef - Admin"]
- [:h2 "Kategorien"]
- [:ul
- (render-category (first (->> (sql/format {:select [:*]
- :from [:categories]
- :where [:= :id -1]})
- (jdbc/execute! @cdb/db)))
- (->> (sql/format {:select [:*]
- :from [:categories]
- :where [:= :parent -1]})
- (jdbc/execute! @cdb/db)))]
- [:h2 "Rezepte"]
- [:table
- [:tr
- [:th "Titel"]
- [:th "Kategorie"]
- [:th "Aktionen"]]
- (for [recipe (jdbc/execute! @cdb/db
- (sql/format {:select [:*]
- :from [:recipes]}))]
- (render-recipe-table-row recipe))]
- [:button {:class "button primary"
- :hx-trigger "click"
- :hx-swap :none
- :hx-post "/api/admin/create-recipe"}
- "Rezept erstellen"]]))
-
-(defn handler [req]
- (let [access-token (get-in req [:oauth2/access-tokens :auth])
- resp (-> (render)
- html/html
- str
- ruresp/response)]
- (if (some? access-token)
- (assoc resp :session (assoc (:session req) :oauth-token access-token))
- (cutils/auth-only req resp))))
diff --git a/src/chef/pages/admin/api.clj b/src/chef/pages/admin/api.clj
deleted file mode 100644
index 1119607..0000000
--- a/src/chef/pages/admin/api.clj
+++ /dev/null
@@ -1,126 +0,0 @@
-(ns chef.pages.admin.api
- (:require [chef.utils :as cutils]
- [chef.database :as cdb]
- [clojure.string :as cstr]
- [next.jdbc :as jdbc]
- [honey.sql :as sql]
- [ring.util.response :as ruresp]
- [clojure.java.io :as cjio])
- (:import java.io.File))
-
-(defn create-category [req]
- (cutils/auth-only req
- (jdbc/execute! @cdb/db
- (sql/format {:insert-into [:categories]
- :values [(merge {:name "New category"
- :parent (or (get-in req [:params "parent"])
- -1)})]}))
- (-> (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))]
- (when (not= id -1)
- (do (jdbc/execute! @cdb/db
- (sql/format {:delete-from [:categories]
- :where [:= :id id]}))
- (delete-category-children! id)
- (-> (ruresp/response "Deleted.")
- (ruresp/header "HX-Refresh" "true"))))
- (ruresp/bad-request "Bad request."))))
-
-(defn edit-category [req]
- (cutils/auth-only req
- (if-let [id (try (Integer/parseInt (get-in req [:path-params :id]))
- (catch Exception _ nil))]
- (do (when-let [name (get-in req [:params "name"])]
- (jdbc/execute! @cdb/db (sql/format {:update :categories
- :set {:name name}
- :where [:= :id id]})))
- (when-let [question (get-in req [:params "question"])]
- (jdbc/execute! @cdb/db (sql/format {:update :categories
- :set {:question question}
- :where [:= :id id]})))
- (ruresp/response "Updated."))
- (ruresp/bad-request "Bad request."))))
-
-(defn create-recipe [req]
- (cutils/auth-only req
- (jdbc/execute! @cdb/db
- (sql/format {:insert-into [:recipes]
- :values [{:title "New recipe"}]}))
- (-> (ruresp/created "Created.")
- (ruresp/header "HX-Refresh" "true"))))
-
-(defn delete-recipe [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 [:recipes]
- :where [:= :id id]}))
- (-> (ruresp/response "Deleted.")
- (ruresp/header "HX-Refresh" "true")))
- (ruresp/bad-request "Bad request."))))
-
-(defn edit-recipe [req]
- (cutils/auth-only req
- (let [id (try (Integer/parseInt (get-in req [:path-params :id]))
- (catch Exception _ nil))
- ingredients (get-in req [:params "ingredients"])]
- (if (and (some? id)
- (cutils/valid-ingredients? ingredients))
- (do (when-let [thumbnail (get-in req [:params "thumbnail"])]
- (when-let [existing-thumbnail-file (->> {:select [:*]
- :from [:recipes]
- :where [:= :id id]}
- sql/format
- (jdbc/execute! @cdb/db)
- first
- cutils/get-thumbnail-file)]
- (.delete ^File existing-thumbnail-file))
- (cjio/copy (:tempfile thumbnail)
- (File. (str "./thumbnails/" id "."
- (-> thumbnail
- :filename
- (cstr/split #"\.")
- last)))))
- (jdbc/execute! @cdb/db
- (sql/format {:update :recipes
- :set {:title (get-in req [:params "title"])
- :category (get-in req [:params "category"])
- :unit (get-in req [:params "ingredients-unit"])
- :ingredients ingredients
- :preparation (get-in req [:params "preparation"])}
- :where [:= :id id]}))
- (ruresp/response "Saved."))
- (ruresp/bad-request "Bad request.")))))
-
-(defn delete-thumbnail [req]
- (cutils/auth-only req
- (if-let [id (try (Integer/parseInt (get-in req [:path-params :id]))
- (catch Exception _ nil))]
- (when-let [thumbnail-file (->> {:select [:*]
- :from [:recipes]
- :where [:= :id id]}
- sql/format
- (jdbc/execute! @cdb/db)
- first
- cutils/get-thumbnail-file)]
- (.delete ^File thumbnail-file)
- (ruresp/response "Done."))
- (ruresp/bad-request "Bad request."))))
diff --git a/src/chef/pages/admin/recipe_editor.clj b/src/chef/pages/admin/recipe_editor.clj
deleted file mode 100644
index cc30942..0000000
--- a/src/chef/pages/admin/recipe_editor.clj
+++ /dev/null
@@ -1,71 +0,0 @@
-(ns chef.pages.admin.recipe-editor
- (:require [hiccup2.core :as html]
- [hiccup.util :as hutil]
- [honey.sql :as sql]
- [next.jdbc :as jdbc]
- [chef.database :as cdb]
- [ring.util.response :as ruresp]
- [chef.utils :as cutils]))
-
-(defn render [recipe]
- (cutils/gen-page "chef - Rezept bearbeiten"
- [:div {:style {:margin-left "1em"}}
- [:h1 "Rezept bearbeiten"]
- [:form {:style {:width "50%"}
- :hx-post (str "/api/admin/edit-recipe/" (:recipes/id recipe))
- :hx-swap "none"
- :enctype "multipart/form-data"}
- [:input {:type :text :name "title" :placeholder "Titel"
- :value (:recipes/title recipe)}]
- [:div {:style {:display :flex}}
- [:p {:style {:margin-right "0.5em"}} "Thumbnail: "]
- [:input {:type :file :name "thumbnail"
- :style {:height :fit-content
- :padding "0.3em"}}]]
- [:button {:class ["button" "error"]
- :hx-trigger "click"
- :hx-delete (str "/api/admin/delete-thumbnail/" (:recipes/id recipe))
- :hx-swap :none}
- "Thumbnail entfernen"]
- [:h2 "Kategorie"]
- [:select {:name "category"}
- (for [category (->> (sql/format {:select [:*]
- :from [:categories]})
- (jdbc/execute! @cdb/db)
- (filter #(pos? (:categories/id %))))]
- [:option {:value (:categories/id category)
- :selected (= (:categories/id category) (:recipes/category recipe))}
- (cutils/category-path category)])]
- [:h2 "Zutaten"]
- [:div {:style {:display :flex}}
- [:p {:style {:margin-right "0.5em"}} "Pro"]
- [:select {:name "ingredients-unit"
- :style {:height :fit-content
- :padding "0.3em"}}
- [:option {:value 0 :selected (= (:recipes/unit recipe) 0)} "Portion"]
- [:option {:value 1 :selected (= (:recipes/unit recipe) 1)} "Person"]]
- [:p ":"]]
- [:textarea {:name "ingredients"}
- (:recipes/ingredients recipe)]
- [:p "(Je Zeile eine Zutat, in dem Format " [:code "[Beschreibung der Zutat]=[Menge als Zahl][Einheit der Menge]"] ".)"]
- [:h2 "Zubereitung"]
- [:textarea {:name "preparation"}
- (:recipes/preparation recipe)]
- [:button {:type :submit
- :style {:margin-top "1em"}} "Speichern"]]]
- [:script (hutil/raw-string "window.addEventListener(\"htmx:afterRequest\", () => window.close())")]))
-
-(defn handler [req]
- (cutils/auth-only req
- (if-let [id (try (Integer/parseInt (get-in req [:path-params :id]))
- (catch Exception _ nil))]
- (->> (sql/format {:select [:*]
- :from [:recipes]
- :where [:= :id id]})
- (jdbc/execute! @cdb/db)
- first
- render
- html/html
- str
- ruresp/response)
- (ruresp/bad-request "Bad request."))))
diff --git a/src/chef/pages/home.clj b/src/chef/pages/home.clj
deleted file mode 100644
index 9bc82fb..0000000
--- a/src/chef/pages/home.clj
+++ /dev/null
@@ -1,51 +0,0 @@
-(ns chef.pages.home
- (:require [chef.database :as cdb]
- [hiccup2.core :as html]
- [honey.sql :as sql]
- [next.jdbc :as jdbc]
- [ring.util.response :as ruresp]
- [chef.utils :as cutils]
-
- [chef.components.search :as ccsearch]))
-
-(defn- render [req]
- (cutils/gen-page "chef"
- (let [category (->> {:select [:*]
- :from [:categories]
- :where [:= :id (or (get-in req [:params "category"]) -1)]}
- sql/format
- (jdbc/execute! @cdb/db)
- first)]
- [:div {:style {:text-align :center}}
- [:h1 "chef"]
- [:h2 "Finde das perfekte Gericht für dich!"]
- [:b (:categories/question category)]
- [:div
- (for [child-category (->> {:select [:*]
- :from [:categories]
- :where [:= :parent (:categories/id category)]}
- sql/format
- (jdbc/execute! @cdb/db))]
- [:div
- [:button {:style {:margin-bottom "1em"}
- :onclick (str "window.location = \"/?category=" (:categories/id child-category) "\"")}
- (:categories/name child-category)]
- [:br]])]
- (when (pos? (:categories/id category))
- [:h3 (cutils/category-path category)])
- [:input {:type :text
- :style {:width "90%" :margin :auto}
- :placeholder "Suche"
- :hx-get (str "/components/search?category=" (:categories/id category))
- :name "query"
- :hx-swap "innerHTML"
- :hx-target "#search-results"}]
- [:div {:id "search-results"}
- (ccsearch/render "" (:categories/id category))]])))
-
-(defn handler [req]
- (-> req
- render
- html/html
- str
- ruresp/response))
diff --git a/src/chef/pages/recipe.clj b/src/chef/pages/recipe.clj
deleted file mode 100644
index be88b2d..0000000
--- a/src/chef/pages/recipe.clj
+++ /dev/null
@@ -1,77 +0,0 @@
-(ns chef.pages.recipe
- (:require [chef.database :as cdb]
- [chef.utils :as cutils]
- [clojure.string :as cstr]
- [hiccup2.core :as html]
- [honey.sql :as sql]
- [next.jdbc :as jdbc]
- [ring.util.response :as ruresp])
- (:import java.io.File))
-
-(defn- render [portions recipe]
- (cutils/gen-page (str "chef - " (:recipes/title recipe))
- [:div {:style {:margin-left "1em"}}
- [:div
- [:h1 {:style {:display :inline-block
- :margin-right "0.5em"}}
- (:recipes/title recipe)]
- [:i (str "(" (cutils/category-path (->> {:select [:*]
- :from [:categories]
- :where [:= :id (:recipes/category recipe)]}
- sql/format
- (jdbc/execute! @cdb/db)
- first)) ")")]]
- (when (some? (cutils/get-thumbnail-file recipe))
- [:img {:src (str "/recipes/" (:recipes/id recipe) "/thumbnail")
- :width "50%"}])
- [:h2
- "Zutaten pro "
- [:input {:type :number
- :value portions
- :style {:width "3em"
- :display :inline-block}
- "_" "on change go to url `?portions=${value of me}`"}]
- (condp = (:recipes/unit recipe)
- 0 " Portion(en)"
- 1 " Person(en)"
- "")
- ":"]
- [:ul (for [ingredient (-> recipe
- :recipes/ingredients
- cutils/parse-ingredients)]
- [:li
- [:b (:description ingredient)] ": "
- (* (:amount ingredient) portions)
- (:unit ingredient)])]
- [:h2 "Zubereitung"]
- (->> (:recipes/preparation recipe)
- cstr/split-lines
- (map #(if (cstr/blank? %)
- [:br]
- [:p %])))]))
-
-(defn handler [req]
- (->> {:select [:*]
- :from [:recipes]
- :where [:= :id (get-in req [:path-params :id])]}
- sql/format
- (jdbc/execute! @cdb/db)
- first
- (render (or (try (Integer/parseInt (get-in req [:params "portions"]))
- (catch Exception _ nil))
- 1))
- html/html
- str
- ruresp/response))
-
-(defn thumbnail-handler [req]
- (if-let [id (get-in req [:path-params :id])]
- (when-let [thumbnail-file (->> {:select [:*]
- :from [:recipes]
- :where [:= :id id]}
- sql/format
- (jdbc/execute! @cdb/db)
- first
- cutils/get-thumbnail-file)]
- (ruresp/file-response (.getPath ^File thumbnail-file)))
- (ruresp/bad-request "Bad request.")))