diff options
Diffstat (limited to 'src/chef/pages')
-rw-r--r-- | src/chef/pages/admin.clj | 118 | ||||
-rw-r--r-- | src/chef/pages/admin/api.clj | 126 | ||||
-rw-r--r-- | src/chef/pages/admin/recipe_editor.clj | 71 | ||||
-rw-r--r-- | src/chef/pages/home.clj | 51 | ||||
-rw-r--r-- | src/chef/pages/recipe.clj | 77 |
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."))) |