(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"}] [: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 [] (cutils/gen-page "chef - Admin" [: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 [:and [:is :parent :null] [:> :id 0]]}) (jdbc/execute! @cdb/db)))] [:h2 "Rezepte"] [:i "Coming soon..."])) (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))))