more code cleanup to include standard functions in session

also now using local font awesome 4.7.0
This commit is contained in:
Jaromil 2018-10-14 21:36:03 +02:00
parent 30fb7ae1a2
commit 965e277948
6 changed files with 104 additions and 100 deletions

File diff suppressed because one or more lines are too long

View File

@ -24,6 +24,7 @@
</div>
</form>
</div>
<p class="subtitle has-text-grey">...or <a href="/login">login with an existing account</a></p>
</div>
</div>
</div>

View File

@ -2,7 +2,7 @@
<meta charset="utf-8" />
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible" />
<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" />
<script src="/static/js/codemirror.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/json-html.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" />
</head>

View File

@ -76,43 +76,43 @@
;; else
(s/render [:body (s/resource s/login)]))
(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
(POST "/dockerfile" request
(->> (fn [req conf acct]
(s/render acct
[:body
(views/dockerfile-upload req conf acct)
(s/upload req conf acct views/add-job)
(views/dashboard acct)]))
(auth-wrap request)))
(POST "/remove" request
(->> (fn [req conf acct]
(s/render acct [:body
(views/remove-job req conf acct)
(views/dashboard acct)]))
(views/remove-job req conf acct)
(views/dashboard acct)]))
(auth-wrap request)))
(POST "/start" request
(->> (fn [req conf acct]
(s/render acct [:body
(views/start-job req conf acct)
(views/dashboard acct)]))
(views/start-job req conf acct)
(views/dashboard acct)]))
(auth-wrap request)))
(POST "/view" request
(->> (fn [req conf acct]
(s/render acct [:body
(views/view-job req conf acct)
(views/dashboard acct)]))
(views/view-job req conf acct)
(views/dashboard acct)]))
(auth-wrap request)))
(GET "/error" request
(->> (fn [req conf acct]
(s/render acct [:body
(s/notify "Generic Error Page" "is-error")
(views/dashboard acct)]))
(s/notify "Generic Error Page" "is-error")
(views/dashboard acct)]))
(auth-wrap request)))
;; JUST-AUTH ROUTES
@ -129,54 +129,25 @@
:auth logged}}]
(conj session
(s/render logged [:body (views/dashboard logged)])))
;; (s/render
;; logged
;; [:div
;; [:h1 "Logged in: " username]
;; views/welcome-menu])))
(f/when-failed [e]
(s/render [:body (s/notify
(str "Login failed: " (f/message e)) "is-error")]))))
(s/render
[:body
(s/error "Login failed" e)]))))
(GET "/logout" request
(conj {:session {:config config}}
(s/render [:body
[:h1 {:class "title"} "Logged out."]])))
[:h1 {:class "title"} "Logged out."]])))
(GET "/signup" request (s/render-template s/signup))
(POST "/signup" request
(f/attempt-all
[name (s/param request :name)
email (s/param request :email)
password (s/param request :password)
repeat-password (s/param request :repeat-password)
activation {:activation-uri
(get-in request [:headers "host"])}]
(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 " &lt;" email "&gt;")]
[: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")]))))
(s/adduser request
(fn [name email]
(s/render
[:body
(s/notify (str "Account created: "
name " &lt;" email "&gt;") "is-success")
[:h1 {:class "title"} "Check email for activation."]]))))
(GET "/activate/:email/:activation-id"
[email activation-id :as request]
@ -184,28 +155,26 @@
(str "http://"
(get-in request [:headers "host"])
"/activate/" email "/" activation-id)]
(s/render
[:body
(f/if-let-failed?
[act (auth/activate-account
@ring/auth email
{:activation-link activation-uri})]
(s/notify
[:span
[:h1 {:class "title"} "Failure activating account"]
[:h2 {:class "subtitle"} (f/message act)]
[:p (str "Email: " email " activation-id: " activation-id)]] "is-error")
[:span
(s/notify (str "Account activated: " email) "is-success")
(profile/create email)]
)])))
(f/attempt-all
[act (auth/activate-account
@ring/auth email
{:activation-link activation-uri})]
(s/render
[:body
(s/notify "Account succesfully activated" "is-success")
(views/dashboard)])
(f/when-failed [e]
(s/render
[:body
(s/error "Failure activating account" e)])))))
;; -- end of JUST-AUTH
(POST "/" request
;; generic endpoint for canceled operations
(s/render (s/check-account request)
(s/notify
(s/param request :message) "is-error")))
(s/notify
(s/param request :message) "is-error")))
(route/resources "/")
(route/not-found (s/render [:body (s/notify "Page Not Found" "is-error")]))

View File

@ -1,6 +1,7 @@
(ns toaster.session
(:refer-clojure :exclude [get])
(:require
[clojure.java.io :as io]
[toaster.config :as conf]
[taoensso.timbre :as log]
[failjure.core :as f]
@ -115,3 +116,58 @@
(resource footer))}))
(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)]))))

View File

@ -18,8 +18,7 @@
(ns toaster.views
(:require
[clojure.java.io :as io]
[clojure.string :as str]
[clojure.string :as str :refer [replace]]
[clojure.contrib.humanize :as humanize :refer [datetime]]
;; [clojure.data.json :as json :refer [read-str]]
[toaster.bulma :as web :refer [button render-yaml]]
@ -60,33 +59,13 @@
(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
[tempfile (s/param request [:file :tempfile])
filename (s/param request [:file :filename])
params (log/spy (:params request))]
(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))
))))
[newjob (job/add path config account)]
(s/notify "New toaster job succesfully added" "is-success")
;; else when job/add is not-ok
(f/when-failed [e]
(s/error "Upload file error" e))))
(s/error "Error adding job" e))))
(defn dashboard
([account] (dashboard {} {} account))