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

(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))))))))