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>
|
||||
</form>
|
||||
</div>
|
||||
<p class="subtitle has-text-grey">...or <a href="/login">login with an existing account</a></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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 " <" 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")]))))
|
||||
(s/adduser request
|
||||
(fn [name email]
|
||||
(s/render
|
||||
[:body
|
||||
(s/notify (str "Account created: "
|
||||
name " <" email ">") "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")]))
|
||||
|
|
|
@ -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)]))))
|
||||
|
|
|
@ -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))
|
||||
|
|
Loading…
Reference in New Issue