From 82cd9ed367842716032cf1875826bd71d690c618 Mon Sep 17 00:00:00 2001 From: Josha von Gizycki Date: Wed, 27 Jun 2018 11:05:39 +0200 Subject: [PATCH] major structure overhaul --- src/wanijo/{ => framework}/auth.clj | 10 ++-- src/wanijo/{ => framework}/devmode.clj | 2 +- src/wanijo/framework/form.clj | 43 ++++++++++++++++ src/wanijo/{ => framework}/neo4j.clj | 7 +-- src/wanijo/{ => framework}/repl.clj | 2 +- src/wanijo/framework/view.clj | 49 +++++++++++++++++++ src/wanijo/handler.clj | 4 +- src/wanijo/home/view.clj | 4 +- .../{domain/schema.clj => schema/domain.clj} | 4 +- src/wanijo/schema/routes.clj | 9 ++-- src/wanijo/schema/view.clj | 12 ++--- .../{domain/user.clj => user/domain.clj} | 4 +- src/wanijo/view/forms.clj | 43 ---------------- src/wanijo/view/page.clj | 49 ------------------- 14 files changed, 122 insertions(+), 120 deletions(-) rename src/wanijo/{ => framework}/auth.clj (87%) rename src/wanijo/{ => framework}/devmode.clj (97%) create mode 100644 src/wanijo/framework/form.clj rename src/wanijo/{ => framework}/neo4j.clj (82%) rename src/wanijo/{ => framework}/repl.clj (93%) create mode 100644 src/wanijo/framework/view.clj rename src/wanijo/{domain/schema.clj => schema/domain.clj} (92%) rename src/wanijo/{domain/user.clj => user/domain.clj} (72%) delete mode 100644 src/wanijo/view/forms.clj delete mode 100644 src/wanijo/view/page.clj diff --git a/src/wanijo/auth.clj b/src/wanijo/framework/auth.clj similarity index 87% rename from src/wanijo/auth.clj rename to src/wanijo/framework/auth.clj index 95c8def..ccf214f 100644 --- a/src/wanijo/auth.clj +++ b/src/wanijo/framework/auth.clj @@ -1,15 +1,15 @@ -(ns wanijo.auth +(ns wanijo.framework.auth (:require [compojure.core :refer [POST GET defroutes]] [ring.util.response :refer [redirect]] [ring.util.anti-forgery :refer [anti-forgery-field]] [buddy.hashers :as hashers] [hiccup.form :as hform] - [wanijo.view.page :as page] - [wanijo.domain.user :as domain-user])) + [wanijo.framework.view :as view] + [wanijo.user.domain :as user-domain])) (defn- login-check! [req] (let [{{:keys [uname pw]} :params} req - unode (domain-user/find! uname) + unode (user-domain/find! uname) pwmatch (when-let [hash (:pw unode)] (hashers/check pw hash))] (if pwmatch @@ -20,7 +20,7 @@ (assoc :flash :invalid-credentials))))) (defn login [req] - (page/layout! + (view/layout! :content [[:h1 "Kama ken"] (hform/form-to diff --git a/src/wanijo/devmode.clj b/src/wanijo/framework/devmode.clj similarity index 97% rename from src/wanijo/devmode.clj rename to src/wanijo/framework/devmode.clj index e3e1694..7a1b558 100644 --- a/src/wanijo/devmode.clj +++ b/src/wanijo/framework/devmode.clj @@ -1,4 +1,4 @@ -(ns wanijo.devmode +(ns wanijo.framework.devmode (:require [hiccup.core :as hcore])) (def bar-entries (atom [])) diff --git a/src/wanijo/framework/form.clj b/src/wanijo/framework/form.clj new file mode 100644 index 0000000..667bda8 --- /dev/null +++ b/src/wanijo/framework/form.clj @@ -0,0 +1,43 @@ +(ns wanijo.framework.form + (:require [clojure.spec.alpha :as spec] + [hiccup.form :as hform] + [wanijo.framework.view :as view])) + +(defn spec-to-errmsg [label spec-key field-value] + (view/flash-error + (map + (fn [prob] + [:p + "Field " + [:span.flash__field label] + " must comply to " + [:span.flash__pred (:pred prob)]]) + (:clojure.spec.alpha/problems + (spec/explain-data spec-key field-value))))) + +(defn field-valid? [value spec-key req] + (or (empty? (:form-params req)) + (spec/valid? spec-key value))) + +(defn field [form-def field req] + (let [field-value (get-in req [:params field]) + field-def (get-in form-def [:fields field]) + {:keys [label required] spec-key :spec} field-def] + (list + (when-not (field-valid? field-value spec-key req) + (spec-to-errmsg label spec-key field-value)) + (hform/label field label) + (hform/text-field {:required (when required "required")} + field + field-value)))) + +(defn valid? [form-def req] + (reduce-kv + (fn [result field value] + (if-let [field-spec (get-in form-def [:fields field :spec])] + (if (spec/valid? field-spec value) + true + (reduced false)) + result)) + true + (:params req))) diff --git a/src/wanijo/neo4j.clj b/src/wanijo/framework/neo4j.clj similarity index 82% rename from src/wanijo/neo4j.clj rename to src/wanijo/framework/neo4j.clj index 250bc05..bfcbe49 100644 --- a/src/wanijo/neo4j.clj +++ b/src/wanijo/framework/neo4j.clj @@ -1,6 +1,7 @@ -(ns wanijo.neo4j +(ns wanijo.framework.neo4j (:require [neo4j-clj.core :as db] - [wanijo.devmode :as devmode])) + [wanijo.framework.devmode :as devmode]) + (:import (java.util UUID))) (def conn (delay (db/connect @@ -11,7 +12,7 @@ (defmacro defquery [& args] `(db/defquery ~@args)) (defn uuid [] - (str (java.util.UUID/randomUUID))) + (str (UUID/randomUUID))) (defn butiful-query [qry] (->> qry diff --git a/src/wanijo/repl.clj b/src/wanijo/framework/repl.clj similarity index 93% rename from src/wanijo/repl.clj rename to src/wanijo/framework/repl.clj index d955a76..e441f49 100644 --- a/src/wanijo/repl.clj +++ b/src/wanijo/framework/repl.clj @@ -1,4 +1,4 @@ -(ns wanijo.repl +(ns wanijo.framework.repl (:require [buddy.hashers :as hashers] [neo4j-clj.core :as db] [wanijo.neo4j :as neo4j])) diff --git a/src/wanijo/framework/view.clj b/src/wanijo/framework/view.clj new file mode 100644 index 0000000..d7eb809 --- /dev/null +++ b/src/wanijo/framework/view.clj @@ -0,0 +1,49 @@ +(ns wanijo.framework.view + (:require [hiccup.page :refer + [html5 include-css]])) + +(defn btnlink + ([target caption] + (btnlink target caption "")) + ([target caption class] + [:a {:href target} + [:button {:class class} + caption]])) + +(defn layout! + [& {:keys [content title session] + :or {content [] + title nil + session {}}}] + (let [ident (:ident session) + authed? (some? ident) + devmode? (:devmode session)] + (html5 + [:head + [:meta {:charset "utf-8"}] + [:meta {:name "viewport" + :content "width=device-width,initial-scale=1,shrink-to-fit=no"}] + [:title (str "wan ijo" (when title (str " - " title)))] + (include-css "/css/app.css") + (when devmode? (include-css "/css/devmode.css"))] + [:body + [:section.grid + [:header + [:h1.app-title "wan ijo" + (when authed? + [:small.app-title__hello + (str "O, " ident)])] + (when authed? + [:section.header-content + (btnlink "/schema" "Jaki ijo" "header-content__link") + (btnlink "/logout" "Lape" "header-content__link")])] + [:nav (when authed? "nav")] + (vec (concat [:main] content)) + [:aside (when authed? "aside")] + [:footer + [:small "Ilo pali e ijo"]]]]))) + +(defn flash-error [content] + [:section.flash--error + [:h2.flash__heading--error "Pakala"] + content]) diff --git a/src/wanijo/handler.clj b/src/wanijo/handler.clj index 74fd809..cde7491 100644 --- a/src/wanijo/handler.clj +++ b/src/wanijo/handler.clj @@ -6,10 +6,10 @@ :refer [wrap-defaults site-defaults]] [ring.util.response :as rur] [ring.middleware.session.cookie :as session-cookie] - [wanijo.auth :refer [auth-routes]] [wanijo.home.routes :refer [home-routes]] [wanijo.schema.routes :refer [schema-routes]] - [wanijo.devmode :as devmode])) + [wanijo.framework.auth :refer [auth-routes]] + [wanijo.framework.devmode :as devmode])) (defn- wrap-login-redirect [handler] (fn [req] diff --git a/src/wanijo/home/view.clj b/src/wanijo/home/view.clj index 3741e36..edfba66 100644 --- a/src/wanijo/home/view.clj +++ b/src/wanijo/home/view.clj @@ -1,5 +1,5 @@ (ns wanijo.home.view - (:require [wanijo.view.page :as page])) + (:require [wanijo.framework.view :as view])) (defn root! [req] - (page/layout! :session (:session req))) + (view/layout! :session (:session req))) diff --git a/src/wanijo/domain/schema.clj b/src/wanijo/schema/domain.clj similarity index 92% rename from src/wanijo/domain/schema.clj rename to src/wanijo/schema/domain.clj index 26be080..94a2910 100644 --- a/src/wanijo/domain/schema.clj +++ b/src/wanijo/schema/domain.clj @@ -1,6 +1,6 @@ -(ns wanijo.domain.schema +(ns wanijo.schema.domain (:require [clojure.spec.alpha :as spec] - [wanijo.neo4j :as neo4j])) + [wanijo.framework.neo4j :as neo4j])) (spec/def ::name (spec/and string? not-empty)) diff --git a/src/wanijo/schema/routes.clj b/src/wanijo/schema/routes.clj index c27b51f..5be7b0d 100644 --- a/src/wanijo/schema/routes.clj +++ b/src/wanijo/schema/routes.clj @@ -1,14 +1,15 @@ (ns wanijo.schema.routes (:require [compojure.core :refer [defroutes GET POST]] [ring.util.response :as resp] - [wanijo.domain.schema :as domain-schema] - [wanijo.view.forms :as forms] + [wanijo.framework.view :as view] + [wanijo.framework.form :as form] + [wanijo.schema.domain :as domain] [wanijo.schema.view :as view-schema])) (defn- new! [req] - (if (forms/valid? view-schema/new-form req) + (if (form/valid? view-schema/new-form req) (do - (domain-schema/create-new! + (domain/create-new! (get-in req [:params :schema-name]) (get-in req [:session :uuid])) (resp/redirect "/schema")) diff --git a/src/wanijo/schema/view.clj b/src/wanijo/schema/view.clj index d6f7973..f623038 100644 --- a/src/wanijo/schema/view.clj +++ b/src/wanijo/schema/view.clj @@ -1,9 +1,9 @@ (ns wanijo.schema.view (:require [hiccup.form :as hform] [ring.util.anti-forgery :refer [anti-forgery-field]] - [wanijo.view.page :as page] - [wanijo.domain.schema :as domain-schema] - [wanijo.view.forms :as forms])) + [wanijo.framework.view :as view] + [wanijo.framework.form :as form] + [wanijo.schema.domain :as domain])) (def new-form {:fields {:schema-name {:label "Nimi" @@ -13,8 +13,8 @@ (defn overview! [req] (let [session (:session req) uuid (:uuid session) - schemas (domain-schema/all-created-by! uuid)] - (page/layout! + schemas (domain/all-created-by! uuid)] + (view/layout! :session session :content [[:h1 "Ali jaki ijo"] @@ -31,6 +31,6 @@ [:h1 "Pali sin e jaki ijo"] (hform/form-to [:post "/schema/new"] - (forms/field new-form :schema-name req) + (form/field new-form :schema-name req) (hform/submit-button "Pali") (anti-forgery-field))]))) diff --git a/src/wanijo/domain/user.clj b/src/wanijo/user/domain.clj similarity index 72% rename from src/wanijo/domain/user.clj rename to src/wanijo/user/domain.clj index efe9725..ac8c543 100644 --- a/src/wanijo/domain/user.clj +++ b/src/wanijo/user/domain.clj @@ -1,5 +1,5 @@ -(ns wanijo.domain.user - (:require [wanijo.neo4j :as neo4j])) +(ns wanijo.user.domain + (:require [wanijo.framework.neo4j :as neo4j])) (neo4j/defquery find-user diff --git a/src/wanijo/view/forms.clj b/src/wanijo/view/forms.clj deleted file mode 100644 index d83494b..0000000 --- a/src/wanijo/view/forms.clj +++ /dev/null @@ -1,43 +0,0 @@ -(ns wanijo.view.forms - (:require [hiccup.form :as hform] - [clojure.spec.alpha :as spec] - [wanijo.view.page :as page])) - -(defn spec-to-errmsg [label spec-key field-value] - (page/flash-error - (map - (fn [prob] - [:p - "Field " - [:span.flash__field label] - " must comply to " - [:span.flash__pred (:pred prob)]]) - (:clojure.spec.alpha/problems - (spec/explain-data spec-key field-value))))) - -(defn field-valid? [value spec-key req] - (or (empty? (:form-params req)) - (spec/valid? spec-key value))) - -(defn field [form-def field req] - (let [field-value (get-in req [:params field]) - field-def (get-in form-def [:fields field]) - {:keys [label required] spec-key :spec} field-def] - (list - (when-not (field-valid? field-value spec-key req) - (spec-to-errmsg label spec-key field-value)) - (hform/label field label) - (hform/text-field {:required (when required "required")} - field - field-value)))) - -(defn valid? [form-def req] - (reduce-kv - (fn [result field value] - (if-let [field-spec (get-in form-def [:fields field :spec])] - (if (spec/valid? field-spec value) - true - (reduced false)) - result)) - true - (:params req))) diff --git a/src/wanijo/view/page.clj b/src/wanijo/view/page.clj deleted file mode 100644 index d0025f2..0000000 --- a/src/wanijo/view/page.clj +++ /dev/null @@ -1,49 +0,0 @@ -(ns wanijo.view.page - (:require [hiccup.page :refer - [html5 include-css]])) - -(defn btnlink - ([target caption] - (btnlink target caption "")) - ([target caption class] - [:a {:href target} - [:button {:class class} - caption]])) - -(defn layout! - [& {:keys [content title session] - :or {content [] - title nil - session {}}}] - (let [ident (:ident session) - authed? (some? ident) - devmode? (:devmode session)] - (html5 - [:head - [:meta {:charset "utf-8"}] - [:meta {:name "viewport" - :content "width=device-width,initial-scale=1,shrink-to-fit=no"}] - [:title (str "wan ijo" (when title (str " - " title)))] - (include-css "/css/app.css") - (when devmode? (include-css "/css/devmode.css"))] - [:body - [:section.grid - [:header - [:h1.app-title "wan ijo" - (when authed? - [:small.app-title__hello - (str "O, " ident)])] - (when authed? - [:section.header-content - (btnlink "/schema" "Jaki ijo" "header-content__link") - (btnlink "/logout" "Lape" "header-content__link")])] - [:nav (when authed? "nav")] - (vec (concat [:main] content)) - [:aside (when authed? "aside")] - [:footer - [:small "Ilo pali e ijo"]]]]))) - -(defn flash-error [content] - [:section.flash--error - [:h2.flash__heading--error "Pakala"] - content])