more code cleanup to include standard functions in session
also now using local font awesome 4.7.0
This commit is contained in:
parent
30fb7ae1a2
commit
965e277948
File diff suppressed because one or more lines are too long
|
@ -24,6 +24,7 @@
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
<p class="subtitle has-text-grey">...or <a href="/login">login with an existing account</a></p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible" />
|
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible" />
|
||||||
<meta content="width=device-width, initial-scale=1" name="viewport" />
|
<meta content="width=device-width, initial-scale=1" name="viewport" />
|
||||||
<title>toaster.do</title>
|
<title>toaster.do :: rapid integration for decentralized services, from embedded to the cloud</title>
|
||||||
<link href="https://fonts.googleapis.com/css?family=Ubuntu" rel="stylesheet" />
|
<link href="https://fonts.googleapis.com/css?family=Ubuntu" rel="stylesheet" />
|
||||||
<script src="/static/js/codemirror.js" type="text/javascript"></script>
|
<script src="/static/js/codemirror.js" type="text/javascript"></script>
|
||||||
<script src="/static/js/codemirror-simple.js" type="text/javascript"></script>
|
<script src="/static/js/codemirror-simple.js" type="text/javascript"></script>
|
||||||
|
@ -10,6 +10,6 @@
|
||||||
<link href="/static/css/bulma.min.css" rel="stylesheet" type="text/css" />
|
<link href="/static/css/bulma.min.css" rel="stylesheet" type="text/css" />
|
||||||
<link href="/static/css/json-html.css" rel="stylesheet" type="text/css" />
|
<link href="/static/css/json-html.css" rel="stylesheet" type="text/css" />
|
||||||
<link href="/static/css/codemirror.css" rel="stylesheet" type="text/css" />
|
<link href="/static/css/codemirror.css" rel="stylesheet" type="text/css" />
|
||||||
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" type="text/css" />
|
<link href="/static/css/font-awesome.min.css" rel="stylesheet" type="text/css" />
|
||||||
<link href="/static/css/toaster.css" rel="stylesheet" type="text/css" />
|
<link href="/static/css/toaster.css" rel="stylesheet" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
|
|
|
@ -76,43 +76,43 @@
|
||||||
;; else
|
;; else
|
||||||
(s/render [:body (s/resource s/login)]))
|
(s/render [:body (s/resource s/login)]))
|
||||||
(f/when-failed[e]
|
(f/when-failed[e]
|
||||||
(s/render [:body (s/notify (f/message e) "is-error")]))))
|
(s/render [:body (s/error "backend missing" e)]))))
|
||||||
|
|
||||||
;; NEW ROUTES HERE
|
;; NEW ROUTES HERE
|
||||||
(POST "/dockerfile" request
|
(POST "/dockerfile" request
|
||||||
(->> (fn [req conf acct]
|
(->> (fn [req conf acct]
|
||||||
(s/render acct
|
(s/render acct
|
||||||
[:body
|
[:body
|
||||||
(views/dockerfile-upload req conf acct)
|
(s/upload req conf acct views/add-job)
|
||||||
(views/dashboard acct)]))
|
(views/dashboard acct)]))
|
||||||
(auth-wrap request)))
|
(auth-wrap request)))
|
||||||
|
|
||||||
(POST "/remove" request
|
(POST "/remove" request
|
||||||
(->> (fn [req conf acct]
|
(->> (fn [req conf acct]
|
||||||
(s/render acct [:body
|
(s/render acct [:body
|
||||||
(views/remove-job req conf acct)
|
(views/remove-job req conf acct)
|
||||||
(views/dashboard acct)]))
|
(views/dashboard acct)]))
|
||||||
(auth-wrap request)))
|
(auth-wrap request)))
|
||||||
|
|
||||||
(POST "/start" request
|
(POST "/start" request
|
||||||
(->> (fn [req conf acct]
|
(->> (fn [req conf acct]
|
||||||
(s/render acct [:body
|
(s/render acct [:body
|
||||||
(views/start-job req conf acct)
|
(views/start-job req conf acct)
|
||||||
(views/dashboard acct)]))
|
(views/dashboard acct)]))
|
||||||
(auth-wrap request)))
|
(auth-wrap request)))
|
||||||
|
|
||||||
(POST "/view" request
|
(POST "/view" request
|
||||||
(->> (fn [req conf acct]
|
(->> (fn [req conf acct]
|
||||||
(s/render acct [:body
|
(s/render acct [:body
|
||||||
(views/view-job req conf acct)
|
(views/view-job req conf acct)
|
||||||
(views/dashboard acct)]))
|
(views/dashboard acct)]))
|
||||||
(auth-wrap request)))
|
(auth-wrap request)))
|
||||||
|
|
||||||
(GET "/error" request
|
(GET "/error" request
|
||||||
(->> (fn [req conf acct]
|
(->> (fn [req conf acct]
|
||||||
(s/render acct [:body
|
(s/render acct [:body
|
||||||
(s/notify "Generic Error Page" "is-error")
|
(s/notify "Generic Error Page" "is-error")
|
||||||
(views/dashboard acct)]))
|
(views/dashboard acct)]))
|
||||||
(auth-wrap request)))
|
(auth-wrap request)))
|
||||||
|
|
||||||
;; JUST-AUTH ROUTES
|
;; JUST-AUTH ROUTES
|
||||||
|
@ -129,54 +129,25 @@
|
||||||
:auth logged}}]
|
:auth logged}}]
|
||||||
(conj session
|
(conj session
|
||||||
(s/render logged [:body (views/dashboard logged)])))
|
(s/render logged [:body (views/dashboard logged)])))
|
||||||
;; (s/render
|
|
||||||
;; logged
|
|
||||||
;; [:div
|
|
||||||
;; [:h1 "Logged in: " username]
|
|
||||||
;; views/welcome-menu])))
|
|
||||||
(f/when-failed [e]
|
(f/when-failed [e]
|
||||||
(s/render [:body (s/notify
|
(s/render
|
||||||
(str "Login failed: " (f/message e)) "is-error")]))))
|
[:body
|
||||||
|
(s/error "Login failed" e)]))))
|
||||||
|
|
||||||
(GET "/logout" request
|
(GET "/logout" request
|
||||||
(conj {:session {:config config}}
|
(conj {:session {:config config}}
|
||||||
(s/render [:body
|
(s/render [:body
|
||||||
[:h1 {:class "title"} "Logged out."]])))
|
[:h1 {:class "title"} "Logged out."]])))
|
||||||
|
|
||||||
(GET "/signup" request (s/render-template s/signup))
|
(GET "/signup" request (s/render-template s/signup))
|
||||||
(POST "/signup" request
|
(POST "/signup" request
|
||||||
(f/attempt-all
|
(s/adduser request
|
||||||
[name (s/param request :name)
|
(fn [name email]
|
||||||
email (s/param request :email)
|
(s/render
|
||||||
password (s/param request :password)
|
[:body
|
||||||
repeat-password (s/param request :repeat-password)
|
(s/notify (str "Account created: "
|
||||||
activation {:activation-uri
|
name " <" email ">") "is-success")
|
||||||
(get-in request [:headers "host"])}]
|
[:h1 {:class "title"} "Check email for activation."]]))))
|
||||||
(s/render
|
|
||||||
(if (= password repeat-password)
|
|
||||||
(f/try*
|
|
||||||
(f/if-let-ok?
|
|
||||||
[signup (auth/sign-up @ring/auth
|
|
||||||
name
|
|
||||||
email
|
|
||||||
password
|
|
||||||
activation
|
|
||||||
[])]
|
|
||||||
[:body
|
|
||||||
[:h2 (str "Account created: "
|
|
||||||
name " <" email ">")]
|
|
||||||
[:h3 "Account pending activation."]]
|
|
||||||
[:body
|
|
||||||
(s/notify
|
|
||||||
(str "Failure creating account: "
|
|
||||||
(f/message signup)) "is-error")
|
|
||||||
(s/resource s/signup)]))
|
|
||||||
[:body (s/notify
|
|
||||||
"Repeat password didnt match" "is-error")]))
|
|
||||||
(f/when-failed [e]
|
|
||||||
(s/render
|
|
||||||
[:body (s/notify
|
|
||||||
(str "Sign-up failure: " (f/message e)) "is-error")]))))
|
|
||||||
|
|
||||||
(GET "/activate/:email/:activation-id"
|
(GET "/activate/:email/:activation-id"
|
||||||
[email activation-id :as request]
|
[email activation-id :as request]
|
||||||
|
@ -184,28 +155,26 @@
|
||||||
(str "http://"
|
(str "http://"
|
||||||
(get-in request [:headers "host"])
|
(get-in request [:headers "host"])
|
||||||
"/activate/" email "/" activation-id)]
|
"/activate/" email "/" activation-id)]
|
||||||
(s/render
|
(f/attempt-all
|
||||||
[:body
|
[act (auth/activate-account
|
||||||
(f/if-let-failed?
|
@ring/auth email
|
||||||
[act (auth/activate-account
|
{:activation-link activation-uri})]
|
||||||
@ring/auth email
|
(s/render
|
||||||
{:activation-link activation-uri})]
|
[:body
|
||||||
(s/notify
|
(s/notify "Account succesfully activated" "is-success")
|
||||||
[:span
|
(views/dashboard)])
|
||||||
[:h1 {:class "title"} "Failure activating account"]
|
(f/when-failed [e]
|
||||||
[:h2 {:class "subtitle"} (f/message act)]
|
(s/render
|
||||||
[:p (str "Email: " email " activation-id: " activation-id)]] "is-error")
|
[:body
|
||||||
[:span
|
(s/error "Failure activating account" e)])))))
|
||||||
(s/notify (str "Account activated: " email) "is-success")
|
|
||||||
(profile/create email)]
|
|
||||||
)])))
|
|
||||||
;; -- end of JUST-AUTH
|
;; -- end of JUST-AUTH
|
||||||
|
|
||||||
(POST "/" request
|
(POST "/" request
|
||||||
;; generic endpoint for canceled operations
|
;; generic endpoint for canceled operations
|
||||||
(s/render (s/check-account request)
|
(s/render (s/check-account request)
|
||||||
(s/notify
|
(s/notify
|
||||||
(s/param request :message) "is-error")))
|
(s/param request :message) "is-error")))
|
||||||
|
|
||||||
(route/resources "/")
|
(route/resources "/")
|
||||||
(route/not-found (s/render [:body (s/notify "Page Not Found" "is-error")]))
|
(route/not-found (s/render [:body (s/notify "Page Not Found" "is-error")]))
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
(ns toaster.session
|
(ns toaster.session
|
||||||
(:refer-clojure :exclude [get])
|
(:refer-clojure :exclude [get])
|
||||||
(:require
|
(:require
|
||||||
|
[clojure.java.io :as io]
|
||||||
[toaster.config :as conf]
|
[toaster.config :as conf]
|
||||||
[taoensso.timbre :as log]
|
[taoensso.timbre :as log]
|
||||||
[failjure.core :as f]
|
[failjure.core :as f]
|
||||||
|
@ -115,3 +116,58 @@
|
||||||
(resource footer))}))
|
(resource footer))}))
|
||||||
|
|
||||||
(defn render-error [err] (->> "is-danger" (notify err) render))
|
(defn render-error [err] (->> "is-danger" (notify err) render))
|
||||||
|
|
||||||
|
(defn fail [msg err] (f/fail (str msg " :: " (f/message err))))
|
||||||
|
|
||||||
|
(defn upload
|
||||||
|
"manages the upload of a file and calls a function with its path.
|
||||||
|
(callback) is called with 3 args: path, config and account"
|
||||||
|
[request config account callback]
|
||||||
|
(f/attempt-all
|
||||||
|
[tempfile (param request [:file :tempfile])
|
||||||
|
filename (param request [:file :filename])
|
||||||
|
filesize (param request [:file :size])]
|
||||||
|
(if (> filesize 64000)
|
||||||
|
;; TODO: put filesize limit in config
|
||||||
|
(f/fail "file too big to upload (64KB limit)")
|
||||||
|
;; else
|
||||||
|
(let [file (io/copy tempfile (io/file "/tmp" filename))
|
||||||
|
path (str "/tmp/" filename)]
|
||||||
|
(io/delete-file tempfile)
|
||||||
|
(if (not (.exists (io/file path)))
|
||||||
|
(f/fail (str "uploaded file not found: " filename))
|
||||||
|
;; file is now in 'tmp' var
|
||||||
|
(callback path config account))))
|
||||||
|
(f/when-failed [e]
|
||||||
|
(error "Upload file error" e))))
|
||||||
|
|
||||||
|
(defn adduser
|
||||||
|
"manages the creation of a user (pending activation) and calls a fun callback.
|
||||||
|
(fun) takes 2 args: the name and email of the user."
|
||||||
|
[request fun]
|
||||||
|
(f/attempt-all
|
||||||
|
[name (param request :name)
|
||||||
|
email (param request :email)
|
||||||
|
password (param request :password)
|
||||||
|
repeat-password (param request :repeat-password)
|
||||||
|
activation {:activation-uri
|
||||||
|
(get-in request [:headers "host"])}]
|
||||||
|
|
||||||
|
(if (not= password repeat-password)
|
||||||
|
(f/fail "repeated password did not match")
|
||||||
|
(f/try*
|
||||||
|
(f/attempt-all
|
||||||
|
[signup (auth/sign-up @ring/auth
|
||||||
|
name
|
||||||
|
email
|
||||||
|
password
|
||||||
|
activation
|
||||||
|
[])]
|
||||||
|
(fun name email)
|
||||||
|
(f/when-failed [e]
|
||||||
|
(fail (str "failure creating account '"email"'") e)))))
|
||||||
|
(f/when-failed [e]
|
||||||
|
(render
|
||||||
|
[:body
|
||||||
|
(error "Sign-up failure" e)
|
||||||
|
(resource signup)]))))
|
||||||
|
|
|
@ -18,8 +18,7 @@
|
||||||
|
|
||||||
(ns toaster.views
|
(ns toaster.views
|
||||||
(:require
|
(:require
|
||||||
[clojure.java.io :as io]
|
[clojure.string :as str :refer [replace]]
|
||||||
[clojure.string :as str]
|
|
||||||
[clojure.contrib.humanize :as humanize :refer [datetime]]
|
[clojure.contrib.humanize :as humanize :refer [datetime]]
|
||||||
;; [clojure.data.json :as json :refer [read-str]]
|
;; [clojure.data.json :as json :refer [read-str]]
|
||||||
[toaster.bulma :as web :refer [button render-yaml]]
|
[toaster.bulma :as web :refer [button render-yaml]]
|
||||||
|
@ -60,33 +59,13 @@
|
||||||
(web/button "/remove" "\uD83D\uDDD1" (hf/hidden-field "jobid" jobid))]]]
|
(web/button "/remove" "\uD83D\uDDD1" (hf/hidden-field "jobid" jobid))]]]
|
||||||
))]]])
|
))]]])
|
||||||
|
|
||||||
(defn dockerfile-upload [request config account]
|
(defn add-job [path config account]
|
||||||
(f/attempt-all
|
(f/attempt-all
|
||||||
[tempfile (s/param request [:file :tempfile])
|
[newjob (job/add path config account)]
|
||||||
filename (s/param request [:file :filename])
|
(s/notify "New toaster job succesfully added" "is-success")
|
||||||
params (log/spy (:params request))]
|
;; else when job/add is not-ok
|
||||||
(if (> (s/param request [:file :size]) 64000)
|
|
||||||
;; TODO: put filesize limit in config
|
|
||||||
(s/error "File too big in upload (64KB limit)")
|
|
||||||
;; else
|
|
||||||
(let [file (io/copy tempfile (io/file "/tmp" filename))
|
|
||||||
path (str "/tmp/" filename)]
|
|
||||||
(io/delete-file tempfile)
|
|
||||||
(if (not (.exists (io/file path)))
|
|
||||||
(s/error (str "Uploaded file not found: " filename))
|
|
||||||
;; file is now in 'tmp' var
|
|
||||||
(f/attempt-all
|
|
||||||
[newjob (job/add path config account)]
|
|
||||||
[:div {:class "container"}
|
|
||||||
[:h1 {:class "title"} "Job uploaded and added"]
|
|
||||||
[:p "Log messages:"]
|
|
||||||
(web/render-yaml newjob)]
|
|
||||||
;; else when job/add is not-ok
|
|
||||||
(f/when-failed [e]
|
|
||||||
(s/error "Error adding job" e))
|
|
||||||
))))
|
|
||||||
(f/when-failed [e]
|
(f/when-failed [e]
|
||||||
(s/error "Upload file error" e))))
|
(s/error "Error adding job" e))))
|
||||||
|
|
||||||
(defn dashboard
|
(defn dashboard
|
||||||
([account] (dashboard {} {} account))
|
([account] (dashboard {} {} account))
|
||||||
|
|
Loading…
Reference in New Issue