(ns blog.server (:require ["express" :as express] ["express-handlebars" :refer [engine create]] ["body-parser" :as body-parser] [blog.db :as db] [blog.env :as env] [blog.handlers :as handlers] [blog.helpers :as helpers])) (def app (express)) (def port (env/get-port)) (def client (db/create-client)) (defn register-helpers "Register helpers to use them in the handlebars's templates." [] (let [hbs (create (clj->js {}))] (.registerHelper (.-handlebars hbs) "full-timestamp" (helpers/full-timestamp-factory)) (.registerHelper (.-handlebars hbs) "article-timestamp" (helpers/article-timestamp-factory)) (.registerHelper (.-handlebars hbs) "truncatestring" (helpers/truncatestring-factory)) (.registerHelper (.-handlebars hbs) "is-brief" (helpers/is-brief-factory)) (.registerHelper (.-handlebars hbs) "navbar-item-style" (helpers/navbar-item-style-factory)))) (defn setup-engine "Sets the engine to handlebars and simple set up." [] ; For using .hbs as the file extension instead of .handlebars (. app engine ".hbs" (engine (-> {:extname ".hbs" :defaultLayout "main"} (clj->js)))) (. app set "view engine" ".hbs") (. app set "views" "./views") (register-helpers)) (defn set-routes "Sets the routes for server." [] ;; need to parse request body for forms. (. app use (.urlencoded body-parser (-> {:extended false} (clj->js)))) (. app get "/" (handlers/index-page-handler-factory client)) (fn [req res] (. app get "/admin" (handlers/admin-panel-handler-factory client)) (. app post "/htmx/search/articles/" (handlers/htmx-search-articles-handler-factory client)) (. app post "/htmx/articles/" (handlers/htmx-create-article-handler-factory client)) (. app get "/htmx/articles/:id" (handlers/htmx-get-article-handler-factory client)) (. app get "/htmx/admin/rows/article/:id/" (handlers/htmx-get-article-row-handler-factory client)) (. app get "/htmx/admin/modals/article/content/:id/" (handlers/htmx-get-article-preview-content-handler-factory client)) (. app delete "/htmx/admin/rows/article/:id/" (handlers/htmx-delete-article-row-handler-factory client)) ) (defn start "Starts server." [] (setup-engine) (set-routes) (db/connect-client client) (db/create-tables client) (. app listen port (fn [] (println "Listen on " port))))