diff options
Diffstat (limited to 'src/dionysus/web/admin')
| -rw-r--r-- | src/dionysus/web/admin/home.clj | 32 | ||||
| -rw-r--r-- | src/dionysus/web/admin/home/blacklist.clj | 106 | ||||
| -rw-r--r-- | src/dionysus/web/admin/home/server_settings.clj | 25 |
3 files changed, 163 insertions, 0 deletions
diff --git a/src/dionysus/web/admin/home.clj b/src/dionysus/web/admin/home.clj new file mode 100644 index 0000000..a06a4ff --- /dev/null +++ b/src/dionysus/web/admin/home.clj @@ -0,0 +1,32 @@ +(ns dionysus.web.admin.home + (:require [dionysus.spotify :as dspotify] + [dionysus.web.utils :as dwutils] + [ring.util.response :as ruresp] + [dionysus.web.admin.home.blacklist :as dwahblacklist] + [dionysus.web.admin.home.server-settings :as dwahserver-settings])) + +(defn- render [_req] + (let [title (str @dwutils/title " - ADMIN")] + (dwutils/render-page title + [:div {:class "text"} + [:h1 title] + (dwahserver-settings/render-server-settings) + [:h2 "Blacklist"] + (dwahblacklist/render-blacklist-table nil)] + [:script {:src "/assets/htmx.js"}]))) + +(defn handle [req] + (let [access-token (get-in req [:oauth2/access-tokens :spotify]) + page-resp (delay (-> req + render + ruresp/response))] + (cond + (and (nil? access-token) (nil? @dspotify/token)) + (ruresp/redirect "/auth") + + (nil? @dspotify/token) + (do (reset! dspotify/token access-token) + @page-resp) + + :else + @page-resp))) diff --git a/src/dionysus/web/admin/home/blacklist.clj b/src/dionysus/web/admin/home/blacklist.clj new file mode 100644 index 0000000..81ac39d --- /dev/null +++ b/src/dionysus/web/admin/home/blacklist.clj @@ -0,0 +1,106 @@ +(ns dionysus.web.admin.home.blacklist + (:require [clojure.string :as cstr] + [dionysus.blacklist :as dblacklist] + [dionysus.spotify :as dspotify] + [dionysus.web.utils :as dwutils] + [ring.util.response :as ruresp])) + +(defn- blacklist-table-item [index edited-item] + (let [item (nth @dblacklist/blacklist index) + editor? (= (str index) edited-item)] + [:tr + [:td (when-not editor? (cstr/upper-case (:type item)))] + [:td (if editor? + [:input {:type :text :name "link" :value (:url item)}] + [:a {:href (:url item) :target "_blank"} + (condp = (:type item) + "track" + (-> (:id item) + dspotify/get-track! + :name) + + "artist" + (-> (:id item) + dspotify/get-artist! + :name) + + nil)])] + (if editor? + [:td + [:img {:src "/assets/icons/check.svg" + :class "icon" + :hx-trigger "click" + :hx-post (str "/blacklist/change/" index) + :hx-target "#blacklist" + :hx-swap "outerHTML" + :hx-include "previous input"}] + [:img {:src "/assets/icons/trash.svg" + :class "icon" + :hx-trigger "click" + :hx-delete (str "/blacklist/delete/" index) + :hx-target "#blacklist" + :hx-swap "outerHTML"}]] + [:td + [:img {:src "/assets/icons/edit.svg" + :class "icon" + :hx-trigger "click" + :hx-get (str "/blacklist?editing=" index) + :hx-target "#blacklist" + :hx-swap "outerHTML"}]])])) + +(defn render-blacklist-table [edited-item] + [:table {:id "blacklist"} + [:thead + [:tr + [:th "Typ"] + [:th "Link"] + [:th "Aktionen"]]] + [:tbody + (for [index (-> @dblacklist/blacklist + .length + range)] + (blacklist-table-item index edited-item)) + [:tr + [:td] + [:td [:input {:type :text + :placeholder "Link to track or artist" + :name "link"}]] + [:td [:img {:src "/assets/icons/plus.svg" + :class "icon" + :hx-trigger "click" + :hx-post "/blacklist/add" + :hx-target "#blacklist" + :hx-swap "outerHTML" + :hx-include "previous input"}]]]]]) + +(defn handle [req] + (-> (get-in req [:query-params "editing"]) + render-blacklist-table + dwutils/render-html + ruresp/response)) + +(defn handle-add [req] + (-> req + (get-in [:form-params "link"]) + dblacklist/add) + (handle {})) + +(defn- valid-index? [s] + (and (string? s) (string? (re-matches #"[0-9][0-9]*" s)))) + +(defn handle-change [req] + (let [index (get-in req [:path-params :index]) + link (get-in req [:form-params "link"])] + (if (and (valid-index? index) (string? link)) + (do (-> index + Integer/parseInt + (dblacklist/change link)) + (handle {})) + (ruresp/bad-request "Bad request.")))) + +(defn handle-delete [req] + (let [index (get-in req [:path-params :index])] + (if (valid-index? index) + (do (dblacklist/delete (Integer/parseInt index)) + (handle {})) + (ruresp/bad-request "Bad request.")))) diff --git a/src/dionysus/web/admin/home/server_settings.clj b/src/dionysus/web/admin/home/server_settings.clj new file mode 100644 index 0000000..e4a8d3f --- /dev/null +++ b/src/dionysus/web/admin/home/server_settings.clj @@ -0,0 +1,25 @@ +(ns dionysus.web.admin.home.server-settings + (:require [ring.util.response :as ruresp] + [dionysus.web.utils :as dwutils] + [dionysus.web.enduser :as dwenduser])) + +(defn render-server-settings [] + [:div {:id "server-settings"} + [:input {:type :checkbox + :name "enduser-ui" + :style {:display :inline-block} + :checked (dwenduser/server-runs?) + :hx-trigger "input" + :hx-post "/server-settings" + :hx-swap "outerHTML" + :hx-target "#server-settings"}] + [:p {:style {:display :inline-block + :margin-right "1ch"}} "Gäste UI"]]) + +(defn handle [req] + (if (= (get-in req [:form-params "enduser-ui"]) "on") + (dwenduser/start-server!) + (dwenduser/stop-server!)) + (-> (render-server-settings) + dwutils/render-html + ruresp/response)) |
