link the logic of the client-server login logic
This commit is contained in:
1 parent
1b0d58d1dd
commit
82b43ddf90
11 files changed
+63
-26
No files matched your search
@@ -148,7 +148,6 @@
|
|||||||
|
|
||||||
|
|
||||||
:source-paths ["env/dev/clj"]
|
:source-paths ["env/dev/clj"]
|
||||||
:java-source-paths ["src/java"]
|
|
||||||
:plugins [[lein-figwheel "0.5.16"]
|
:plugins [[lein-figwheel "0.5.16"]
|
||||||
[deraen/lein-sass4clj "0.3.1"]]
|
[deraen/lein-sass4clj "0.3.1"]]
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
(ns skirmish.bookkeeper.core
|
(ns skirmish.bookkeeper.core
|
||||||
(:require [org.httpkit.server :refer [run-server]]
|
(:require [org.httpkit.server :refer [run-server]]
|
||||||
[compojure.handler :refer [api]]
|
[compojure.handler :refer [api]]
|
||||||
[skirmish.util :refer [block-thread]]
|
|
||||||
[taoensso.timbre :as timbre]
|
[taoensso.timbre :as timbre]
|
||||||
[skirmish.middleware.core :refer [create-map-exchange-apis]]
|
[skirmish.middleware.core :refer [create-map-exchange-apis]]
|
||||||
[skirmish.bookkeeper.bookkeeper :refer [create-routes-for-bookkeeper]]
|
[skirmish.bookkeeper.bookkeeper :refer [create-routes-for-bookkeeper]]
|
||||||
[ring.middleware.cors :refer [wrap-cors]]))
|
[skirmish.rest.util :refer [cors-middleware]]))
|
||||||
|
|
||||||
(defn -main [config securities-api exchange-apis-mult-chan]
|
(defn -main [config securities-api exchange-apis-mult-chan]
|
||||||
(let [bookkeeper-config (:api-bookkeeper config)
|
(let [bookkeeper-config (:api-bookkeeper config)
|
||||||
@@ -13,6 +12,5 @@
|
|||||||
api-routes (create-routes-for-bookkeeper exchange-apis config)]
|
api-routes (create-routes-for-bookkeeper exchange-apis config)]
|
||||||
(timbre/info "Running skirmish.bookkeeper.core server with config: " bookkeeper-config)
|
(timbre/info "Running skirmish.bookkeeper.core server with config: " bookkeeper-config)
|
||||||
(run-server
|
(run-server
|
||||||
(-> api-routes api (wrap-cors :access-control-allow-origin #"http://localhost:3449"
|
(-> api-routes api cors-middleware)
|
||||||
:access-control-allow-methods [:get :put :post :delete]))
|
|
||||||
bookkeeper-config)))
|
bookkeeper-config)))
|
||||||
@@ -1,12 +1,11 @@
|
|||||||
(ns skirmish.broker.core
|
(ns skirmish.broker.core
|
||||||
(:require [org.httpkit.server :refer [run-server]]
|
(:require [org.httpkit.server :refer [run-server]]
|
||||||
[compojure.handler :refer [api]]
|
[compojure.handler :refer [api]]
|
||||||
[skirmish.util :refer [block-thread]]
|
|
||||||
[skirmish.broker.broker :refer [create-routes]]
|
[skirmish.broker.broker :refer [create-routes]]
|
||||||
[taoensso.timbre :as timbre]
|
[taoensso.timbre :as timbre]
|
||||||
[skirmish.middleware.core :refer [create-map-exchange-apis]]
|
[skirmish.middleware.core :refer [create-map-exchange-apis]]
|
||||||
[skirmish.broker.db :refer [create-connection]]
|
[skirmish.broker.db :refer [create-connection]]
|
||||||
[ring.middleware.cors :refer [wrap-cors]]))
|
[skirmish.rest.util :refer [cors-middleware]]))
|
||||||
|
|
||||||
|
|
||||||
(defn -main [config securities-api exchange-apis]
|
(defn -main [config securities-api exchange-apis]
|
||||||
@@ -14,4 +13,6 @@
|
|||||||
conn (create-connection (-> webserver-config :datomic :transactor-url))
|
conn (create-connection (-> webserver-config :datomic :transactor-url))
|
||||||
api-routes (create-routes conn)]
|
api-routes (create-routes conn)]
|
||||||
(timbre/info "Running skirmish.broker.core server with config: " webserver-config)
|
(timbre/info "Running skirmish.broker.core server with config: " webserver-config)
|
||||||
(run-server (api api-routes) webserver-config)))
|
(run-server
|
||||||
|
(-> api-routes api cors-middleware)
|
||||||
|
webserver-config)))
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
(:require [cheshire.core :refer [generate-string]]
|
(:require [cheshire.core :refer [generate-string]]
|
||||||
[slingshot.slingshot :refer [try+ throw+]]
|
[slingshot.slingshot :refer [try+ throw+]]
|
||||||
[clojure.edn :as edn]
|
[clojure.edn :as edn]
|
||||||
|
[ring.middleware.cors :refer [wrap-cors]]
|
||||||
[clojure.string :refer [split starts-with? ends-with?]]))
|
[clojure.string :refer [split starts-with? ends-with?]]))
|
||||||
|
|
||||||
;; Access-Control-Allow-Origin
|
;; Access-Control-Allow-Origin
|
||||||
@@ -10,6 +11,11 @@
|
|||||||
[["application/json" generate-string]
|
[["application/json" generate-string]
|
||||||
["application/edn" str]])
|
["application/edn" str]])
|
||||||
|
|
||||||
|
(defn cors-middleware [handler]
|
||||||
|
(wrap-cors handler
|
||||||
|
:access-control-allow-origin #"http://localhost:3449"
|
||||||
|
:access-control-allow-credentials true
|
||||||
|
:access-control-allow-methods [:get :put :post :delete]))
|
||||||
|
|
||||||
|
|
||||||
(defn create-mime-type-predicate [accept]
|
(defn create-mime-type-predicate [accept]
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
(defn head []
|
(defn head []
|
||||||
[:head
|
[:head
|
||||||
[:meta {:charset "utf-8"}]
|
[:meta {:charset "utf-8"}]
|
||||||
|
[:title "Skirmish"]
|
||||||
[:meta {:name "viewport"
|
[:meta {:name "viewport"
|
||||||
:content "width=device-width, initial-scale=1"}]
|
:content "width=device-width, initial-scale=1"}]
|
||||||
(include-css "/css/site.css"); use "/css/site.min.css" in production
|
(include-css "/css/site.css"); use "/css/site.min.css" in production
|
||||||
|
|||||||
@@ -38,7 +38,7 @@
|
|||||||
[:div.columns
|
[:div.columns
|
||||||
[:div.column.content
|
[:div.column.content
|
||||||
[:div.columns.is-centered
|
[:div.columns.is-centered
|
||||||
[:column
|
[:div
|
||||||
[:div.field.has-addons
|
[:div.field.has-addons
|
||||||
(select-type order)
|
(select-type order)
|
||||||
(select-securities order)
|
(select-securities order)
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
(ns skirmish.wui.components.home-page
|
(ns skirmish.wui.components.home-page
|
||||||
(:require [reagent.core :refer [atom]]))
|
(:require [cljs-http.client :as http]
|
||||||
|
[reagent.core :refer [atom]]
|
||||||
|
[cljs.core.async :refer [<!] :refer-macros [go]]
|
||||||
|
[secretary.core :as secretary]))
|
||||||
|
|
||||||
|
|
||||||
(def lorem-ipsum ["Lorem ipsum dolor amet pickled bushwick next level adaptogen ugh franzen salvia hoodie man bun organic kinfolk. Hammock pickled banjo, artisan single-origin coffee brunch 90's occupy taxidermy. Put a bird on it gentrify offal tilde. Authentic put a bird on it prism semiotics, roof party banh mi typewriter. XOXO schlitz sriracha godard."
|
(def lorem-ipsum ["Lorem ipsum dolor amet pickled bushwick next level adaptogen ugh franzen salvia hoodie man bun organic kinfolk. Hammock pickled banjo, artisan single-origin coffee brunch 90's occupy taxidermy. Put a bird on it gentrify offal tilde. Authentic put a bird on it prism semiotics, roof party banh mi typewriter. XOXO schlitz sriracha godard."
|
||||||
@@ -11,8 +14,16 @@
|
|||||||
(let [email-pattern #"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"]
|
(let [email-pattern #"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"]
|
||||||
(->> s str (re-matches email-pattern) some?)))
|
(->> s str (re-matches email-pattern) some?)))
|
||||||
|
|
||||||
|
|
||||||
|
(defn create-user [email]
|
||||||
|
(go
|
||||||
|
(let [url "http://localhost:1605/api/1/users"
|
||||||
|
resp (<! (http/post url {:edn-params {:email email}}))]
|
||||||
|
(secretary/dispatch! (str "/home/" email)))))
|
||||||
|
|
||||||
|
|
||||||
(defn login [state]
|
(defn login [state]
|
||||||
(let [login-field (atom (get state :user ""))
|
(let [login-field (atom (get-in state [:user :skirmish.broker.user/email] ""))
|
||||||
on-change #(reset! login-field (-> % .-target .-value))]
|
on-change #(reset! login-field (-> % .-target .-value))]
|
||||||
(fn []
|
(fn []
|
||||||
(let [disabled? (-> @login-field email? not)
|
(let [disabled? (-> @login-field email? not)
|
||||||
@@ -27,7 +38,11 @@
|
|||||||
:placeholder "boris.johnson@redneck.co.uk"
|
:placeholder "boris.johnson@redneck.co.uk"
|
||||||
:style {:margin-right "1em"}}]
|
:style {:margin-right "1em"}}]
|
||||||
[:div.control
|
[:div.control
|
||||||
[:a.button.is-link.has-background-primary {:href href :disabled disabled?} "login"]]]]]))))
|
[:a.button.is-link.has-background-primary {:href href
|
||||||
|
:disabled disabled?} "login"]]
|
||||||
|
[:div.control
|
||||||
|
[:button.button.is-link.has-background-primary {:disabled disabled?
|
||||||
|
:on-click #(create-user @login-field)} "create"]]]]]))))
|
||||||
|
|
||||||
|
|
||||||
(defn page [state]
|
(defn page [state]
|
||||||
@@ -36,5 +51,5 @@
|
|||||||
[:div.container
|
[:div.container
|
||||||
[:h1.title "lorem ipsum"]
|
[:h1.title "lorem ipsum"]
|
||||||
[login state]
|
[login state]
|
||||||
(for [sentence lorem-ipsum]
|
(for [[i sentence] (map vector (range) lorem-ipsum)]
|
||||||
[:p sentence])]]])
|
[:p {:key i} sentence])]]])
|
||||||
@@ -8,14 +8,14 @@
|
|||||||
[:tr [:th "Security"] [:th "Amount"] [:th "Face Value"]]]
|
[:tr [:th "Security"] [:th "Amount"] [:th "Face Value"]]]
|
||||||
[:tbody
|
[:tbody
|
||||||
(for [sec-summary portfolio]
|
(for [sec-summary portfolio]
|
||||||
[:tr
|
[:tr {:key (:id sec-summary)}
|
||||||
[:td (:sec-id sec-summary)]
|
[:td (:sec-id sec-summary)]
|
||||||
[:td [secunit (:sec-id sec-summary) (:amount sec-summary)]]
|
[:td [secunit (:sec-id sec-summary) (:amount sec-summary)]]
|
||||||
[:td [secunit :dapm (:face-value sec-summary)]]])]])
|
[:td [secunit :dapm (:face-value sec-summary)]]])]])
|
||||||
|
|
||||||
(defn page []
|
(defn page []
|
||||||
(let [porfolio [{:sec-id :foo :amount 100 :face-value 1265}
|
(let [porfolio [{:id 12 :sec-id :foo :amount 100 :face-value 1265}
|
||||||
{:sec-id :toto :amount 100 :face-value 1265}
|
{:id 54 :sec-id :toto :amount 100 :face-value 1265}
|
||||||
{:sec-id :foo :amount 100 :face-value 1265}]]
|
{:id 66 :sec-id :foo :amount 100 :face-value 1265}]]
|
||||||
[:div.content
|
[:div.content
|
||||||
(make-portfolio-summary-table porfolio)]))
|
(make-portfolio-summary-table porfolio)]))
|
||||||
@@ -15,7 +15,7 @@
|
|||||||
[:li done "implement basic login in the wui"]
|
[:li done "implement basic login in the wui"]
|
||||||
[:li done "implement basic web server"]
|
[:li done "implement basic web server"]
|
||||||
[:li done "implement stupid login on server side."]
|
[:li done "implement stupid login on server side."]
|
||||||
[:li "link the logic of the client-server login logic"]
|
[:li on-it "link the logic of the client-server login logic"]
|
||||||
[:li "add the notion of 'accounts' in the server. An
|
[:li "add the notion of 'accounts' in the server. An
|
||||||
user should have many accounts; one for each security
|
user should have many accounts; one for each security
|
||||||
he owns"]
|
he owns"]
|
||||||
@@ -23,6 +23,11 @@
|
|||||||
[:li "when a new user logs in, he should receive some sort of money"]
|
[:li "when a new user logs in, he should receive some sort of money"]
|
||||||
[:li "implement buy/sell securities."]]]
|
[:li "implement buy/sell securities."]]]
|
||||||
|
|
||||||
|
[:li "Cleaning up..."
|
||||||
|
[:ul
|
||||||
|
[:li "All the urls on the client should be at the same place."]
|
||||||
|
[:li "We should have a nice way to handle routes on the server."]]]
|
||||||
|
|
||||||
[:li "Implement Ledger"
|
[:li "Implement Ledger"
|
||||||
[:ol
|
[:ol
|
||||||
[:li "Use ledger as source of through in each sub server."]
|
[:li "Use ledger as source of through in each sub server."]
|
||||||
|
|||||||
@@ -12,9 +12,10 @@
|
|||||||
|
|
||||||
(defn- user-dropdown [state]
|
(defn- user-dropdown [state]
|
||||||
(when (:user @state)
|
(when (:user @state)
|
||||||
(let [icon [:i.fa.fa-sign-out {:aria-hidden true}]]
|
(let [icon [:i.fa.fa-sign-out {:aria-hidden true}]
|
||||||
|
email (get-in @state [:user :skirmish.broker.user/email])]
|
||||||
[:div.navbar-item.has-dropdown.is-hoverable
|
[:div.navbar-item.has-dropdown.is-hoverable
|
||||||
[:a.navbar-link {} (str "[ " (:user @state) " ]")]
|
[:a.navbar-link {} (str "[ " email " ]")]
|
||||||
[:div.navbar-dropdown
|
[:div.navbar-dropdown
|
||||||
[:a.navbar-item {:href "/home/"} icon " logout"]]])))
|
[:a.navbar-item {:href "/home/"} icon " logout"]]])))
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,9 @@
|
|||||||
[skirmish.wui.pages :as pages]
|
[skirmish.wui.pages :as pages]
|
||||||
[skirmish.wui.components.topbar :refer [top-bar]]
|
[skirmish.wui.components.topbar :refer [top-bar]]
|
||||||
[reagent.session :as session]
|
[reagent.session :as session]
|
||||||
|
[cljs-http.client :as http]
|
||||||
|
;[taoensso.timbre :as timbre :refer-macros [info warn]]
|
||||||
|
[cljs.core.async :refer [<!] :refer-macros [go]]
|
||||||
[secretary.core :as secretary :include-macros true]
|
[secretary.core :as secretary :include-macros true]
|
||||||
[accountant.core :as accountant]))
|
[accountant.core :as accountant]))
|
||||||
|
|
||||||
@@ -12,7 +15,16 @@
|
|||||||
|
|
||||||
(defonce state (atom {}))
|
(defonce state (atom {}))
|
||||||
|
|
||||||
|
(defn login [email]
|
||||||
|
(go (let [resp (<! (http/get (str "http://localhost:1605/api/1/users/" email)))]
|
||||||
|
(if (= (:status resp) 200)
|
||||||
|
(do
|
||||||
|
(println "Logging in as:" (-> resp :body type))
|
||||||
|
(session/put! :current-page #'pages/home-page)
|
||||||
|
(swap! state #(into % {:page :home :user (:body resp)})))
|
||||||
|
(do
|
||||||
|
(println "Cannot log in as" email)
|
||||||
|
(swap! state #(dissoc % :user)))))))
|
||||||
|
|
||||||
;; -------------------------
|
;; -------------------------
|
||||||
;; Routes
|
;; Routes
|
||||||
@@ -26,9 +38,8 @@
|
|||||||
(session/put! :current-page #'pages/home-page)
|
(session/put! :current-page #'pages/home-page)
|
||||||
(swap! state #(into % {:page :home})))
|
(swap! state #(into % {:page :home})))
|
||||||
|
|
||||||
(secretary/defroute "/home/:username" [username]
|
(secretary/defroute "/home/:email" [email]
|
||||||
(session/put! :current-page #'pages/home-page)
|
(login email))
|
||||||
(swap! state #(into % {:page :home :user username})))
|
|
||||||
|
|
||||||
(secretary/defroute "/home/" []
|
(secretary/defroute "/home/" []
|
||||||
(session/put! :current-page #'pages/home-page)
|
(session/put! :current-page #'pages/home-page)
|
||||||
@@ -60,7 +71,7 @@
|
|||||||
(defn current-page []
|
(defn current-page []
|
||||||
"This is the basic page setup."
|
"This is the basic page setup."
|
||||||
[:div
|
[:div
|
||||||
(top-bar state)
|
[top-bar state]
|
||||||
[:div
|
[:div
|
||||||
[:div.columns
|
[:div.columns
|
||||||
[:div.column.is-8.is-offset-2
|
[:div.column.is-8.is-offset-2
|
||||||
|
|||||||
Reference in new issue
Block a user