From d90a5bede20d009c87aad357a1e94c529e683475 Mon Sep 17 00:00:00 2001 From: Josha von Gizycki Date: Mon, 26 Mar 2018 16:39:33 +0200 Subject: [PATCH] restructuring, some neo4j, css -> less --- .gitignore | 1 + project.clj | 21 +++++-- .../css/app.css => app/stylesheets/app.less} | 61 ++++++++++--------- src/wanijo/auth/routes.clj | 27 ++++++-- src/wanijo/auth/view.clj | 22 ------- src/wanijo/domain/schema.clj | 14 +++++ src/wanijo/handler.clj | 13 ++-- src/wanijo/home/routes.clj | 6 ++ src/wanijo/home/view.clj | 5 ++ src/wanijo/repl.clj | 13 ++-- src/wanijo/schema/routes.clj | 25 ++++++++ src/wanijo/view.clj | 9 ++- ...ler_test.clj => handler_test.clj.disabled} | 0 13 files changed, 138 insertions(+), 79 deletions(-) rename resources/{public/css/app.css => app/stylesheets/app.less} (57%) delete mode 100644 src/wanijo/auth/view.clj create mode 100644 src/wanijo/domain/schema.clj create mode 100644 src/wanijo/home/view.clj create mode 100644 src/wanijo/schema/routes.clj rename test/wanijo/{handler_test.clj => handler_test.clj.disabled} (100%) diff --git a/.gitignore b/.gitignore index 22d6a48..4e50b60 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ pom.xml.asc *.class /.lein-* /.nrepl-port +/resources/public/css diff --git a/project.clj b/project.clj index 9b48b07..53ae417 100644 --- a/project.clj +++ b/project.clj @@ -2,14 +2,23 @@ :description "FIXME: write description" :url "http://example.com/FIXME" :min-lein-version "2.0.0" - :dependencies [[org.clojure/clojure "1.8.0"] + :dependencies [[org.clojure/clojure "1.9.0"] [compojure "1.5.1"] [ring/ring-defaults "0.2.1"] - [clojurewerkz/neocons "3.2.0"] + [clojurewerkz/neocons "3.2.0" + :exclusions [commons-codec]] [hiccup "1.0.5"] - [buddy "2.0.0"]] + [buddy "2.0.0" + :exclusions [cheshire + commons-codec + com.fasterxml.jackson.core/jackson-core + com.fasterxml.jackson.core/jackson-dataformat-smile + com.fasterxml.jackson.core/jackson-dataformat-cbor]]] :plugins [[lein-ring "0.9.7"]] :ring {:handler wanijo.handler/app} - :profiles - {:dev {:dependencies [[javax.servlet/servlet-api "2.5"] - [ring/ring-mock "0.3.0"]]}}) + :profiles {:dev {:dependencies [[javax.servlet/servlet-api "2.5"] + [ring/ring-mock "0.3.0"]] + :plugins [[lein-less "1.7.5"]]}} + :less {:source-paths ["resources/app/stylesheets"] + :target-path "resources/public/css"} + :hooks [leiningen.less]) diff --git a/resources/public/css/app.css b/resources/app/stylesheets/app.less similarity index 57% rename from resources/public/css/app.css rename to resources/app/stylesheets/app.less index 298e713..44676ac 100644 --- a/resources/public/css/app.css +++ b/resources/app/stylesheets/app.less @@ -1,3 +1,8 @@ +@ci-color: #ccc; +@text-padding-v: .2rem; +@text-padding-h: 1rem; +@accent-border-width: 1rem; + body { font-family: sans-serif; } @@ -21,7 +26,7 @@ a:active { "nav main sidebar" "footer footer footer"; margin: auto; - max-width: 70%; + max-width: 900px; border-top: 1px solid #ccc; } @@ -39,15 +44,15 @@ aside { header, footer, main, nav, aside { border-bottom: 1px solid #ccc; - padding: .2rem 1rem .2rem 1rem; + padding: @text-padding-v @text-padding-h; } header { grid-area: header; display: grid; - grid-template-columns: 20% 80%; + grid-template-columns: 40% 60%; align-items: center; - border-left: 1rem solid #ccc; + border-left: @accent-border-width solid #ccc; } .app-title { @@ -57,7 +62,7 @@ header { .app-title__hello { font-size: 1rem; - margin-left: 1rem; + margin-left: @text-padding-h; font-weight: normal; font-style: italic; } @@ -68,7 +73,8 @@ header { .header-content__link { display: inline-block; - padding: .2rem .5rem; + padding: @text-padding-v @text-padding-h / 2; + margin-right: @accent-border-width; } footer { @@ -79,29 +85,24 @@ form { display: grid; grid-template-columns: 30% 70%; grid-auto-flow: row; -} - -form label, -form input, -form select, -form textarea, -form section.flash { - margin-bottom: .7rem; - padding: .2rem .5rem; -} - -form section.flash { - grid-column: 1/3; - border: 1px solid #ccc; - border-left-width: 1rem; - padding: .7rem; -} -form label { - grid-column: 1; -} - -form input, -form select { - grid-column: 2; + label, input, select, textarea, .flash { + margin-bottom: .7rem; + padding: @text-padding-v @text-padding-h / 2; + } + + label { + grid-column: 1; + } + + input, select { + grid-column: 2; + } + + .flash { + grid-column: 1/3; + border: 1px solid #ccc; + border-left-width: @accent-border-width; + padding: .7rem; + } } diff --git a/src/wanijo/auth/routes.clj b/src/wanijo/auth/routes.clj index eb5f753..883f101 100644 --- a/src/wanijo/auth/routes.clj +++ b/src/wanijo/auth/routes.clj @@ -1,13 +1,15 @@ (ns wanijo.auth.routes (:require [compojure.core :refer [POST GET defroutes]] [ring.util.response :refer [redirect]] + [ring.util.anti-forgery :refer [anti-forgery-field]] [buddy.hashers :as hashers] - [wanijo.auth.view :as auth-view] - [wanijo.neo4j :as neo])) + [hiccup.form :as hform] + [wanijo.view :as view] + [wanijo.neo4j :as neo4j])) (defn- login-check! [req] (let [{{:keys [uname pw]} :params} req - unode (neo/find-user! uname) + unode (neo4j/find-user! uname) pwmatch (when-let [hash (:pw unode)] (hashers/check pw hash))] (if pwmatch @@ -17,8 +19,25 @@ (-> (redirect "/login") (assoc :flash :invalid-credentials))))) +(defn login [req] + (view/layout! + :content + [[:h1 "Kama ken"] + (hform/form-to + [:post "/login-check"] + (when (:flash req) [:section.flash (:flash req)]) + ;; + (hform/label "uname" "Nimi") + (hform/text-field {:required "required"} "uname") + ;; + (hform/label "pw" "Toki Pimeja") + (hform/password-field {:required "required"} "pw") + ;; + (hform/submit-button "Kama") + (anti-forgery-field))])) + (defroutes auth-routes - (GET "/login" [] auth-view/login) + (GET "/login" [] login) (POST "/login-check" [] login-check!) (GET "/logout" [] (fn [_] (-> (redirect "/login") (assoc :session nil))))) diff --git a/src/wanijo/auth/view.clj b/src/wanijo/auth/view.clj deleted file mode 100644 index 71d0e79..0000000 --- a/src/wanijo/auth/view.clj +++ /dev/null @@ -1,22 +0,0 @@ -(ns wanijo.auth.view - (:require [hiccup.form :as hf] - [wanijo.view :refer [layout]] - [ring.util.anti-forgery :refer [anti-forgery-field]])) - -(defn login [req] - (layout - :authed? false - :content - [[:h1 "Kama ken"] - (hf/form-to - [:post "/login-check"] - (when (:flash req) [:section.flash (:flash req)]) - ;; - (hf/label "uname" "Nimi") - (hf/text-field {:required "required"} "uname") - ;; - (hf/label "pw" "Toki Pimeja") - (hf/password-field {:required "required"} "pw") - ;; - (hf/submit-button "Kama") - (anti-forgery-field))])) diff --git a/src/wanijo/domain/schema.clj b/src/wanijo/domain/schema.clj new file mode 100644 index 0000000..bfca590 --- /dev/null +++ b/src/wanijo/domain/schema.clj @@ -0,0 +1,14 @@ +(ns wanijo.domain.schema + (:require [clojurewerkz.neocons.rest.cypher :as cypher] + [wanijo.neo4j :as neo4j])) + +(defn all-created-by! [ident] + (->> + (cypher/tquery + neo4j/conn + "MATCH (s:schema)-[created_by]->(u:user) + WHERE u.ident = {ident} + RETURN s + ORDER BY s.created_at" + {:ident ident}) + (map #(:data (get "s"))))) diff --git a/src/wanijo/handler.clj b/src/wanijo/handler.clj index 0151fb1..3857080 100644 --- a/src/wanijo/handler.clj +++ b/src/wanijo/handler.clj @@ -1,14 +1,12 @@ (ns wanijo.handler - (:require [compojure.core :refer :all] + (:require [compojure.core :refer [defroutes + routes]] [compojure.route :as route] [ring.middleware.defaults :refer [wrap-defaults site-defaults]] [ring.util.response :as rur] - [hiccup.page :as hp] [wanijo.auth.routes :refer [auth-routes]] - [wanijo.view :refer [layout]])) - -(defn- home [req] - (layout :title "home" :session (:session req))) + [wanijo.home.routes :refer [home-routes]] + [wanijo.schema.routes :refer [schema-routes]])) (defn- wrap-login-redirect [handler] (fn [req] @@ -19,7 +17,8 @@ (defroutes app-routes (routes auth-routes) (wrap-login-redirect - (GET "/" [] home)) + (routes home-routes + schema-routes)) (route/not-found "Not Found")) (def app diff --git a/src/wanijo/home/routes.clj b/src/wanijo/home/routes.clj index e69de29..781a012 100644 --- a/src/wanijo/home/routes.clj +++ b/src/wanijo/home/routes.clj @@ -0,0 +1,6 @@ +(ns wanijo.home.routes + (:require [compojure.core :refer [defroutes GET]] + [wanijo.home.view :as home-view])) + +(defroutes home-routes + (GET "/" [] home-view/root!)) diff --git a/src/wanijo/home/view.clj b/src/wanijo/home/view.clj new file mode 100644 index 0000000..d3d0bab --- /dev/null +++ b/src/wanijo/home/view.clj @@ -0,0 +1,5 @@ +(ns wanijo.home.view + (:require [wanijo.view :as view])) + +(defn root! [req] + (view/layout! :session (:session req))) diff --git a/src/wanijo/repl.clj b/src/wanijo/repl.clj index 0f081e3..ec430ce 100644 --- a/src/wanijo/repl.clj +++ b/src/wanijo/repl.clj @@ -1,12 +1,15 @@ (ns wanijo.repl (:require [clojurewerkz.neocons.rest.nodes :as nodes] [clojurewerkz.neocons.rest.labels :as labels] + [clojurewerkz.neocons.rest.cypher :as cypher] [buddy.hashers :as hashers] [wanijo.neo4j :as neo4j])) (defn create-user! [ident pw] - (let [node (nodes/create - neo4j/conn - {:ident ident - :pw (hashers/derive pw)})] - (labels/add neo4j/conn node "user"))) + (cypher/tquery + neo4j/conn + "CREATE (n:user) + SET n.ident = {ident} + SET n.pw = {pw}" + {:ident ident + :pw (hashers/derivce pw)})) diff --git a/src/wanijo/schema/routes.clj b/src/wanijo/schema/routes.clj new file mode 100644 index 0000000..54ce2c7 --- /dev/null +++ b/src/wanijo/schema/routes.clj @@ -0,0 +1,25 @@ +(ns wanijo.schema.routes + (:require [compojure.core :refer [defroutes GET]] + [wanijo.domain.schema :as domain-schemas] + [wanijo.view :as view])) + +(defn- overview! [req] + (let [session (:session req) + ident (:ident session) + schemas (domain-schemas/all-created-by! ident)] + (view/layout! + :session session + :content + [[:table + [:thead + [:tr + [:th "Nimi"] + [:th "Tenpo kama"]]] + [:tbody + (for [schema schemas] + [:tr + [:td (:name schema)] + [:td (:created_at schema)]])]]]))) + +(defroutes schema-routes + (GET "/schema" [] overview!)) diff --git a/src/wanijo/view.clj b/src/wanijo/view.clj index 4272248..12adb0f 100644 --- a/src/wanijo/view.clj +++ b/src/wanijo/view.clj @@ -10,11 +10,12 @@ [:button {:class class} caption]])) -(defn layout +(defn layout! [& {:keys [content title session] :or {content [] title nil session {}}}] + (println session) (let [ident (:ident session) authed? (some? ident)] (html5 @@ -33,10 +34,8 @@ (str "O, " ident)])] (when authed? [:section.header-content - (btnlink - "/logout" - "Lape" - "header-content__link")])] + (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")] diff --git a/test/wanijo/handler_test.clj b/test/wanijo/handler_test.clj.disabled similarity index 100% rename from test/wanijo/handler_test.clj rename to test/wanijo/handler_test.clj.disabled