You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
273 lines
8.2 KiB
273 lines
8.2 KiB
(ns blog.handlers
|
|
(:require [cljs.core.async :refer [go, take!, put!, <!, >!, chan]]
|
|
[cljs.core.async.interop :refer-macros [<p!]]
|
|
[blog.db :as db]))
|
|
|
|
(defn index-page-handler-factory
|
|
[client]
|
|
(fn [req res]
|
|
(let [channel (chan)
|
|
session (.-user (.-session req))
|
|
search (.-search (.-query req))]
|
|
(go
|
|
(try
|
|
(let [articles (if (nil? search)
|
|
(<! (db/get-articles-briefly client channel))
|
|
(<! (db/search-articles-briefly client search channel)))]
|
|
(res/status 200)
|
|
(.render res "index"
|
|
(-> {:articles articles
|
|
:authorized (some? session)
|
|
:url "/"}
|
|
(clj->js))))
|
|
(catch js/Error err
|
|
(res/status 500)
|
|
(res/send (ex-message err))))))))
|
|
|
|
(defn login-page-handler-factory
|
|
[]
|
|
(fn [req res]
|
|
(let [session (.-user (.-session req))]
|
|
(.render res "login" (-> {:authorized (some? session)}
|
|
(clj->js))))))
|
|
|
|
(defn login-page-auth-handler-factory
|
|
[]
|
|
(fn [req res]
|
|
(let [session (.-user (.-session req))
|
|
login (.-login (.-body req))
|
|
password (.-password (.-body req))]
|
|
(cond
|
|
(some? session)
|
|
(.redirect res "/")
|
|
|
|
(and (= login "admin")
|
|
(= password "admin"))
|
|
(do
|
|
; req.session.user = "admin";
|
|
(set! (.-user (.-session req)) "admin")
|
|
(.redirect res "/admin"))
|
|
|
|
:else
|
|
(.redirect res "/")
|
|
))))
|
|
|
|
(defn logout-page-handler-factory
|
|
[]
|
|
(fn [req res]
|
|
(let [session (.-user (.-session req))]
|
|
(cond
|
|
(some? session)
|
|
(do
|
|
(.destroy (.-session req))
|
|
(.redirect res "/"))
|
|
|
|
:else
|
|
(.redirect res "/")
|
|
))))
|
|
|
|
(defn is-user-authorized
|
|
"Middleware to check if user is authorized."
|
|
[req res next]
|
|
(if (some? (.-user (.-session req)))
|
|
(next)
|
|
(next (new js/Error "User not authorized!!!"))))
|
|
|
|
(defn user-not-authorized-factory
|
|
"Middleware to redirect authorized users to a url."
|
|
([url]
|
|
(fn [err req res next]
|
|
(.redirect res "/login")))
|
|
([]
|
|
(user-not-authorized-factory "/login")))
|
|
|
|
(defn admin-panel-handler-factory
|
|
[client]
|
|
(fn [req res]
|
|
(let [channel (chan)
|
|
session (.-user (.-session req))
|
|
search (.-search (.-query req))]
|
|
(go
|
|
(try
|
|
(let [articles (if (nil? search)
|
|
(<! (db/get-articles-briefly client channel))
|
|
(<! (db/search-articles-briefly client search channel)))]
|
|
(res/status 200)
|
|
(.render res "admin_panel"
|
|
(-> {:articles articles
|
|
:authorized (some? session)
|
|
:url "/admin"}
|
|
(clj->js))))
|
|
(catch js/Error err
|
|
(res/status 500)
|
|
(res/send (ex-message err))))))))
|
|
|
|
(defn htmx-get-article-handler-factory
|
|
[client]
|
|
(fn [req res]
|
|
(let [channel (chan)
|
|
id (.-id (.-params req))]
|
|
(go
|
|
(try
|
|
(let [article (<! (db/get-article client id channel))]
|
|
(if (empty? article)
|
|
(do
|
|
(res/status 404)
|
|
(res/send (ex-message "404")))
|
|
(do
|
|
(res/status 200)
|
|
(.render res "article_full"
|
|
(-> {:article article :layout false}
|
|
(clj->js))))))
|
|
(catch js/Error err
|
|
(res/status 500)
|
|
(res/send (ex-message err))))))))
|
|
|
|
(defn htmx-get-article-row-handler-factory
|
|
[client]
|
|
(fn [req res]
|
|
(let [channel (chan)
|
|
id (.-id (.-params req))]
|
|
(go
|
|
(try
|
|
(let [article (<! (db/get-article client id channel))]
|
|
(if (empty? article)
|
|
(do
|
|
(res/status 404)
|
|
(res/send (ex-message "404")))
|
|
(do
|
|
(res/status 200)
|
|
(.render res "article_row"
|
|
(-> {:article article :layout false }
|
|
(clj->js))))))
|
|
(catch js/Error err
|
|
(res/status 500)
|
|
(res/send (ex-message err))))))))
|
|
|
|
(defn htmx-get-article-preview-content-handler-factory
|
|
[client]
|
|
(fn [req res]
|
|
(let [channel (chan)
|
|
id (.-id (.-params req))]
|
|
(go
|
|
(try
|
|
(let [article (<! (db/get-article client id channel))]
|
|
(if (empty? article)
|
|
(do
|
|
(res/status 404)
|
|
(res/send (ex-message "404")))
|
|
(do
|
|
(res/status 200)
|
|
(.render res "admin_article_preview_content"
|
|
(-> {:article article :layout false }
|
|
(clj->js))))))
|
|
(catch js/Error err
|
|
(res/status 500)
|
|
(res/send (ex-message err))))))))
|
|
|
|
(defn htmx-get-article-edit-content-handler-factory
|
|
[client]
|
|
(fn [req res]
|
|
(let [channel (chan)
|
|
id (.-id (.-params req))]
|
|
(go
|
|
(try
|
|
(let [article (<! (db/get-article client id channel))]
|
|
(if (empty? article)
|
|
(do
|
|
(res/status 404)
|
|
(res/send (ex-message "404")))
|
|
(do
|
|
(res/status 200)
|
|
(.render res "admin_article_edit_content"
|
|
(-> {:article article :layout false }
|
|
(clj->js))))))
|
|
(catch js/Error err
|
|
(res/status 500)
|
|
(res/send (ex-message err))))))))
|
|
|
|
(defn htmx-update-article-handler-factory
|
|
[client]
|
|
(fn [req res]
|
|
(let [channel (chan)
|
|
article {:id (.-id (.-params req))
|
|
:title (.-title (.-body req))
|
|
:content (.-content (.-body req))}]
|
|
(go
|
|
(try
|
|
(let [id (<! (db/update-article client article channel))]
|
|
(res/status 200)
|
|
(.redirect res 303 (str "/htmx/admin/rows/article/" id)))
|
|
(catch js/Error err
|
|
(res/status 500)
|
|
(res/send (ex-message err))))))))
|
|
|
|
(defn htmx-delete-article-row-handler-factory
|
|
[client]
|
|
(fn [req res]
|
|
(let [channel (chan)
|
|
id (.-id (.-params req))]
|
|
(go
|
|
(try
|
|
(let [id (<! (db/delete-article client id channel))]
|
|
(res/status 200)
|
|
(.send res ""))
|
|
(catch js/Error err
|
|
(res/status 500)
|
|
(res/send (ex-message err))))))))
|
|
|
|
(defn htmx-search-articles-handler-factory
|
|
[client]
|
|
(fn [req res]
|
|
(let [channel (chan)
|
|
search (.-search (.-body req))]
|
|
(go
|
|
(try
|
|
(let [articles (<! (db/search-articles-briefly client search channel))]
|
|
(res/status 200)
|
|
(.render res "articles_briefly"
|
|
(-> {:articles articles
|
|
:layout false}
|
|
(clj->js))))
|
|
(catch js/Error err
|
|
(res/status 500)
|
|
(res/send (ex-message err))))))))
|
|
|
|
(defn htmx-admin-search-articles-handler-factory
|
|
[client]
|
|
(fn [req res]
|
|
(let [channel (chan)
|
|
search (.-search (.-body req))]
|
|
(go
|
|
(try
|
|
(let [articles (<! (db/search-articles-briefly client search channel))]
|
|
(res/status 200)
|
|
(.render res "article_rows"
|
|
(-> {:articles articles
|
|
:layout false}
|
|
(clj->js))))
|
|
(catch js/Error err
|
|
(res/status 500)
|
|
(res/send (ex-message err))))))))
|
|
|
|
(defn htmx-create-article-handler-factory
|
|
[client]
|
|
(fn [req res]
|
|
(let [channel (chan)
|
|
title (.-title (.-body req))
|
|
content (.-content (.-body req))]
|
|
(go
|
|
(try
|
|
(let [id (<! (db/insert-article client title content channel))]
|
|
(if (nil? id)
|
|
(do
|
|
(res/status 404)
|
|
(res/send (ex-message "404")))
|
|
(do
|
|
(res/status 200)
|
|
(.redirect res (str "/htmx/admin/rows/article/" id)))))
|
|
(catch js/Error err
|
|
(res/status 500)
|
|
(res/send (ex-message err))))))))
|
|
|