commit
96e48825d2
@ -0,0 +1,10 @@
|
|||||||
|
/target
|
||||||
|
/lib
|
||||||
|
/classes
|
||||||
|
/checkouts
|
||||||
|
pom.xml
|
||||||
|
pom.xml.asc
|
||||||
|
*.jar
|
||||||
|
*.class
|
||||||
|
/.lein-*
|
||||||
|
/.nrepl-port
|
@ -0,0 +1,8 @@
|
|||||||
|
version: '2'
|
||||||
|
|
||||||
|
services:
|
||||||
|
db:
|
||||||
|
image: neo4j
|
||||||
|
ports:
|
||||||
|
- 7474:7474
|
||||||
|
- 7687:7687
|
@ -0,0 +1,14 @@
|
|||||||
|
(defproject wanijo "0.1.0-SNAPSHOT"
|
||||||
|
:description "FIXME: write description"
|
||||||
|
:url "http://example.com/FIXME"
|
||||||
|
:min-lein-version "2.0.0"
|
||||||
|
:dependencies [[org.clojure/clojure "1.8.0"]
|
||||||
|
[compojure "1.5.1"]
|
||||||
|
[ring/ring-defaults "0.2.1"]
|
||||||
|
[clojurewerkz/neocons "3.2.0"]
|
||||||
|
[hiccup "1.0.5"]]
|
||||||
|
: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"]]}})
|
@ -0,0 +1,59 @@
|
|||||||
|
body {
|
||||||
|
font-family: sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 20% 70% 10%;
|
||||||
|
grid-template-areas:
|
||||||
|
"header header header"
|
||||||
|
"nav main sidebar"
|
||||||
|
"footer footer footer";
|
||||||
|
margin: auto;
|
||||||
|
max-width: 70%;
|
||||||
|
border-top: 1px solid #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav {
|
||||||
|
grid-area: nav;
|
||||||
|
}
|
||||||
|
|
||||||
|
main {
|
||||||
|
grid-area: main;
|
||||||
|
}
|
||||||
|
|
||||||
|
aside {
|
||||||
|
grid-area: sidebar;
|
||||||
|
}
|
||||||
|
|
||||||
|
header, footer, main, nav, aside {
|
||||||
|
border-bottom: 1px solid #ccc;
|
||||||
|
padding: .5rem 1rem .2rem 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
header {
|
||||||
|
grid-area: header;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer {
|
||||||
|
grid-area: footer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-group {
|
||||||
|
display: flex;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-group label {
|
||||||
|
width: 30%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-group input,
|
||||||
|
.form-group select {
|
||||||
|
width: 70%;
|
||||||
|
padding: .1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-group input[type=submit] {
|
||||||
|
width: auto;
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
(ns wanijo.auth.handler
|
||||||
|
(:require [ring.util.response :as rur]))
|
||||||
|
|
||||||
|
(defn login-check [req]
|
||||||
|
(let [{{:keys [uname pw]} :params} req]
|
||||||
|
(if (and (= uname "admin")
|
||||||
|
(= pw "pw"))
|
||||||
|
(-> (rur/redirect "/")
|
||||||
|
(assoc-in [:session :ident] uname))
|
||||||
|
(-> (rur/redirect "/login")
|
||||||
|
(assoc :flash :invalid-credentials)))))
|
@ -0,0 +1,8 @@
|
|||||||
|
(ns wanijo.auth.routes
|
||||||
|
(:require [compojure.core :refer [POST GET defroutes]]
|
||||||
|
[wanijo.auth.view :as auth-view]
|
||||||
|
[wanijo.auth.handler :as auth-handler]))
|
||||||
|
|
||||||
|
(defroutes auth-routes
|
||||||
|
(GET "/login" [] auth-view/login)
|
||||||
|
(POST "/login-check" [] auth-handler/login-check))
|
@ -0,0 +1,22 @@
|
|||||||
|
(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 "Login"]
|
||||||
|
(hf/form-to
|
||||||
|
[:post "/login-check"]
|
||||||
|
[:dif.form-group
|
||||||
|
(:flash req)]
|
||||||
|
[:div.form-group
|
||||||
|
(hf/label "uname" "Username")
|
||||||
|
[:input#uname {:name "uname"}]]
|
||||||
|
[:div.form-group
|
||||||
|
(hf/label "pw" "Password")
|
||||||
|
(hf/password-field {:id "pw"} "pw")]
|
||||||
|
[:div.form-group
|
||||||
|
(hf/submit-button "Login")]
|
||||||
|
(anti-forgery-field))]))
|
@ -0,0 +1,34 @@
|
|||||||
|
(ns wanijo.handler
|
||||||
|
(:require [compojure.core :refer :all]
|
||||||
|
[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 [_]
|
||||||
|
(layout :title "home"))
|
||||||
|
|
||||||
|
(defroutes app-routes
|
||||||
|
(routes auth-routes)
|
||||||
|
(GET "/" [] home)
|
||||||
|
(route/not-found "Not Found"))
|
||||||
|
|
||||||
|
(defn- wrap-login-redirect [handler]
|
||||||
|
(fn [req]
|
||||||
|
(let [ident (get-in req [:session :ident])
|
||||||
|
uri (:uri req)]
|
||||||
|
(println ident (:session req))
|
||||||
|
(if (and (nil? ident)
|
||||||
|
(not (or (clojure.string/ends-with? uri ".css")
|
||||||
|
(clojure.string/ends-with? uri ".js")
|
||||||
|
(= uri "/login-check")
|
||||||
|
(= uri "/login"))))
|
||||||
|
(rur/redirect "/login")
|
||||||
|
(handler req)))))
|
||||||
|
|
||||||
|
(def app
|
||||||
|
(-> app-routes
|
||||||
|
wrap-login-redirect
|
||||||
|
(wrap-defaults site-defaults)))
|
@ -0,0 +1,23 @@
|
|||||||
|
(ns wanijo.view
|
||||||
|
(:require [hiccup.page :refer [html5]]))
|
||||||
|
|
||||||
|
(defn layout
|
||||||
|
[& {:keys [authed? content title]
|
||||||
|
:or {authed? true
|
||||||
|
content []
|
||||||
|
title "wan ijo"}}]
|
||||||
|
(html5
|
||||||
|
[:head
|
||||||
|
[:meta {:charset "utf-8"}]
|
||||||
|
[:title title]
|
||||||
|
[:link {:rel "stylesheet"
|
||||||
|
:href "/css/app.css"}]]
|
||||||
|
[:body
|
||||||
|
[:section.grid
|
||||||
|
[:header
|
||||||
|
[:h1 "wan ijo"]]
|
||||||
|
[:nav (when authed? "nav")]
|
||||||
|
(vec (concat [:main] content))
|
||||||
|
[:aside (when authed? "aside")]
|
||||||
|
[:footer
|
||||||
|
[:small "stuff with objects"]]]]))
|
@ -0,0 +1,14 @@
|
|||||||
|
(ns wanijo.handler-test
|
||||||
|
(:require [clojure.test :refer :all]
|
||||||
|
[ring.mock.request :as mock]
|
||||||
|
[wanijo.handler :refer :all]))
|
||||||
|
|
||||||
|
(deftest test-app
|
||||||
|
(testing "main route"
|
||||||
|
(let [response (app (mock/request :get "/"))]
|
||||||
|
(is (= (:status response) 200))
|
||||||
|
(is (= (:body response) "Hello World"))))
|
||||||
|
|
||||||
|
(testing "not-found route"
|
||||||
|
(let [response (app (mock/request :get "/invalid"))]
|
||||||
|
(is (= (:status response) 404)))))
|
Loading…
Reference in new issue