-
Notifications
You must be signed in to change notification settings - Fork 1
/
wallet.clj
114 lines (98 loc) · 3.48 KB
/
wallet.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
(ns i2conomy.wallet
(:require [i2conomy.mint :as mint])
(:use i2conomy.middleware
i2conomy.session
compojure.core
hiccup.core
hiccup.page-helpers
ring.middleware.file
ring.middleware.file-info
ring.middleware.reload
ring.middleware.stacktrace
ring.middleware.session.memory
ring.util.response
sandbar.stateful-session))
(defn view-layout [& content]
(html
(doctype :xhtml-strict)
(xhtml-tag "en"
[:head
[:meta {:http-equiv "Content-type"
:content "text/html; charset=utf-8"}]
[:title "i2conomy"]
[:link {:href "/i2conomy.css" :rel "stylesheet" :type "text/css"}]]
[:body
[:p "Account: " (session-get :account "Unknown")]
content])))
(defn view-balance-input []
(html
[:h2 "check balance"]
[:form {:method "post" :action "/balance"}
[:label "Account: "] [:input {:type "text" :name "account" :value "duck"}]
[:label "Currency: "] [:input {:type "text" :name "currency" :value "duck"}]
[:input {:type "submit" :value "check"}]]))
(defn view-balance-output [account currency amount]
(view-layout
[:h2 "balance"]
[:p "the balance for " account " is " amount currency]
[:a {:href "/"} "home"]))
(defn view-create-account-input []
(html
[:h2 "create account"]
[:form {:method "post" :action "/create-account"}
[:label "Account: "] [:input {:type "text" :name "account" :value "duck"}]
[:input {:type "submit" :value "create"}]]))
(defn view-create-account-output [account]
(view-layout
[:h2 "create account"]
[:p "account " account " created"]
[:a {:href "/"} "home"]))
(defn view-payment-input []
(html
[:h2 "make payment"]
[:form {:method "post" :action "/pay"}
[:label "From: "] [:input {:type "text" :name "from"}]
[:label "To: "] [:input {:type "text" :name "to"}] [:br]
[:label "Currency: "] [:input {:type "text" :name "currency"}]
[:label "Amount: "] [:input {:type "text" :name "amount"}] [:br]
[:label "Memo: "] [:input {:type "text" :name "memo"}]
[:input {:type "submit" :value "pay"}]]))
(defn view-payment-output [from to currency amount memo]
(view-layout
[:h2 "payment made"]
[:p "from " from " to " to " amount " amount " currency " currency " memo " memo]
[:a {:href "/"} "home"]))
(defroutes handler
(GET "/" []
(view-layout
(view-create-account-input)
(view-balance-input)
(view-payment-input)))
(POST "/balance" [account currency]
(let [balance (mint/balance account currency)]
(view-balance-output account currency balance)))
(POST "/create-account" [account]
(do
(mint/create-account account)
(session-put! :account account)
(view-create-account-output account)))
(POST "/pay" [from to currency amount memo]
(view-payment-output from to currency amount memo))
(ANY "/*" [path]
(redirect "/")))
(def production?
(= "production" (get (System/getenv) "APP_ENV")))
(def development?
(not production?))
(def app
(-> #'handler
(wrap-file "public")
(wrap-file-info)
(wrap-request-logging)
(wrap-if development? wrap-reload '[i2conomy.wallet i2conomy.middleware])
(wrap-bounce-favicon)
(wrap-exception-logging)
(wrap-if production? wrap-failsafe)
(wrap-if development? wrap-stacktrace)
; prevent wrap-reload from resetting the sessions as well
(wrap-stateful-session {:store (memory-store custom-session-atom)})))