aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Tom Willemse2013-08-18 16:19:54 +0200
committerGravatar Tom Willemse2013-08-18 16:19:54 +0200
commit6e5b291257e5ff34e00d7b7424c33fd67427934e (patch)
treef3f25ab1d5f71f2c2f66063f0310e030235885b5
parent612e219becbd08f7126d73f8144158db3ba01cfa (diff)
downloadscrumli-6e5b291257e5ff34e00d7b7424c33fd67427934e.tar.gz
scrumli-6e5b291257e5ff34e00d7b7424c33fd67427934e.zip
Separate route from function definitions
-rw-r--r--scrumli.lisp387
1 files changed, 199 insertions, 188 deletions
diff --git a/scrumli.lisp b/scrumli.lisp
index c718b5f..18fce1e 100644
--- a/scrumli.lisp
+++ b/scrumli.lisp
@@ -70,194 +70,205 @@
(defun make-tpl-parameters (&rest args)
(append (list :prefix (script-name *request*)) args))
-(setf (route *app* "/")
- (lambda (params)
- (declare (ignore params))
- (if (logged-in-p)
- (scrumli-templates:main
- (make-tpl-parameters
- :title (page-title "Backlog")
- :csss (list *scrumli-bootstrap-css-location*
- *scrumli-font-awesome-css-location*
- (concatenate 'string (script-name *request*) "static/css/scrumli.css"))
- :jss (list *scrumli-jquery-js-location*
- *scrumli-bootstrap-js-location*
- *scrumli-react-js-location*
- *scrumli-jsxtransformer-js-location*
- (concatenate 'string (script-name *request*) "js/bridge.js"))
- :username (gethash :username (getf (env *request*) :clack.session))
- :usermd5 (md5-hash (gethash :username (getf (env *request*) :clack.session)))
- :ulogout (concatenate 'string (script-name *request*) "logout")
- :umainjs (concatenate 'string (script-name *request*) "static/js/main.js")))
- (redirect *response*
- (concatenate 'string (script-name *request*)
- "login")))))
-
-(setf (route *app* "/login")
- (lambda (params)
- (declare (ignore params))
- (if (not (logged-in-p))
- (scrumli-templates:login
- (make-tpl-parameters
- :title (page-title "Login")
- :csss (list *scrumli-bootstrap-css-location*
- *scrumli-font-awesome-css-location*)
- :jss (list *scrumli-bootstrap-js-location*
- "https://login.persona.org/include.js"
- (concatenate 'string (script-name *request*)
- "js/bridge.js")
- (concatenate 'string (script-name *request*)
- "static/js/login.js"))))
- (redirect *response* (if (equal (script-name *request*) "")
- "/" (script-name *request*))))))
-
-(setf (route *app* "/login" :method :post)
- (lambda (params)
- (let ((result (verify-credentials
- *scrumli-host* (getf params :|assertion|))))
- (if (equal (cdr (assoc :status result)) "okay")
- (progn
- (setf (gethash :username
- (getf (env *request*) :clack.session))
- (cdr (assoc :email result)))
- (redirect *response*
- (if (equal (script-name *request*) "")
- "/" (script-name *request*))))
- '(403)))))
-
-(setf (route *app* "/logout")
- (lambda (params)
- (declare (ignore params))
- (if (logged-in-p)
- (setf (gethash :username
- (getf (env *request*) :clack.session)) nil))
- (redirect *response* (concatenate 'string (script-name *request*)
- "login"))))
-
-(setf (route *app* "/stories")
- (lambda (params)
- (declare (ignore params))
- (if (logged-in-p)
- (list 200 '(:content-type "text/json")
- (encode-json-to-string (get-all-stories)))
- '(403))))
-
-(setf (route *app* "/stories/mine")
- (lambda (params)
- (declare (ignore params))
- (if (logged-in-p)
- (list 200 '(:content-type "text/json")
- (encode-json-to-string
- (get-stories-for
- (gethash :username (getf (env *request*) :clack.session)))))
- '(403))))
-
-(setf (route *app* "/stories/new" :method :post)
- (lambda (params)
- (if (logged-in-p)
- (let ((role (getf params :|role|))
- (necessity (getf params :|necessity|))
- (headline (getf params :|headline|))
- (content (getf params :|content|)))
- (post-story role necessity headline content
- (gethash :username (getf (env *request*) :clack.session)))
- (list 200 '(:content-type "text/json")
- (encode-json-to-string '((status . "ok")))))
- '(403))))
-
-(setf (route *app* "/stories/tasks/new" :method :post)
- (lambda (params)
- (if (logged-in-p)
- (let ((story-id (getf params :|storyId|))
- (description (getf params :|description|)))
- (post-task story-id description
- (gethash :username (getf (env *request*) :clack.session)))
- (list 200 '(:content-type "text/json")
- (encode-json-to-string '((status . "ok")))))
- '(403))))
-
-(setf (route *app* "/stories/state" :method :post)
- (lambda (params)
- (if (logged-in-p)
- (let* ((id (getf params :|id|))
- (current-state (story-get-state 'story id))
- (next (ecase (intern current-state :scrumli)
- (todo "DOING")
- (doing "DONE")
- (done "TODO"))))
- (story-set-state 'story id next)
- (list 200 '(:content-type "text/json")
- (encode-json-to-string `((status . "ok")
- (state . ,next)))))
- '(403))))
-
-(setf (route *app* "/tasks/state" :method :post)
- (lambda (params)
- (if (logged-in-p)
- (let* ((id (getf params :|id|))
- (current-state (story-get-state 'task id))
- (next (ecase (intern current-state :scrumli)
- (todo "DOING")
- (doing "DONE")
- (done "TODO"))))
- (story-set-state 'task id next)
- (list 200 '(:content-type "text/json")
- (encode-json-to-string `((status . "ok")
- (state . ,next)))))
- '(403))))
-
-(setf (route *app* "/stories/:dir" :method :post)
- (lambda (params)
- (if (logged-in-p)
- (let ((id (getf params :|id|))
- (dir (getf params :dir)))
- (story-change-priority
- 'story id (intern (string-upcase dir) :keyword))
- (list 200 '(:content-type "text/json")
- (encode-json-to-string '((status . "ok")))))
- '(403))))
-
-(setf (route *app* "/tasks/:dir" :method :post)
- (lambda (params)
- (if (logged-in-p)
- (let ((id (getf params :|id|)))
- (story-change-priority
- 'task id (intern (string-upcase (getf params :dir)) :keyword))
- (list 200 '(:content-type "text/json")
- (encode-json-to-string '((status . "ok")))))
- '(403))))
-
-(setf (route *app* "/stories/:id")
- (lambda (params)
- (if (logged-in-p)
- (list 200 '(:content-type "text/json")
- (encode-json-to-string (get-story (getf params :id))))
- '(403))))
-
-(setf (route *app* "/story/assignee" :method :post)
- (lambda (params)
- (if (logged-in-p)
- (progn
- (set-assignee 'story (getf params :|id|) (getf params :|assignee|))
- (list 200 '(:content-type "text/json")
- (encode-json-to-string '((status . "ok")))))
- '(403))))
-
-(setf (route *app* "/task/assignee" :method :post)
- (lambda (params)
- (if (logged-in-p)
- (progn
- (set-assignee 'task (getf params :|id|) (getf params :|assignee|))
- (list 200 '(:content-type "text/json")
- (encode-json-to-string '((status . "ok")))))
- '(403))))
-
-(setf (route *app* "/js/bridge.js")
- (lambda (params)
- (declare (ignore params))
- (list 200 '(:content-type "text/javascript")
- (ps (var base-url (lisp (if (equal (script-name *request*) "")
- "/" (script-name *request*))))))))
+(defun story-list-page (params)
+ (declare (ignore params))
+ (if (logged-in-p)
+ (scrumli-templates:main
+ (make-tpl-parameters
+ :title (page-title "Backlog")
+ :csss (list *scrumli-bootstrap-css-location*
+ *scrumli-font-awesome-css-location*
+ (concatenate 'string (script-name *request*)
+ "static/css/scrumli.css"))
+ :jss (list *scrumli-jquery-js-location*
+ *scrumli-bootstrap-js-location*
+ *scrumli-react-js-location*
+ *scrumli-jsxtransformer-js-location*
+ (concatenate 'string (script-name *request*)
+ "js/bridge.js"))
+ :username (gethash :username (getf (env *request*)
+ :clack.session))
+ :usermd5 (md5-hash (gethash :username (getf (env *request*)
+ :clack.session)))
+ :ulogout (concatenate 'string (script-name *request*) "logout")
+ :umainjs (concatenate 'string (script-name *request*)
+ "static/js/main.js")))
+ (redirect *response*
+ (concatenate 'string (script-name *request*)
+ "login"))))
+
+(defun login-page (params)
+ (declare (ignore params))
+ (if (not (logged-in-p))
+ (scrumli-templates:login
+ (make-tpl-parameters
+ :title (page-title "Login")
+ :csss (list *scrumli-bootstrap-css-location*
+ *scrumli-font-awesome-css-location*)
+ :jss (list *scrumli-bootstrap-js-location*
+ "https://login.persona.org/include.js"
+ (concatenate 'string (script-name *request*)
+ "js/bridge.js")
+ (concatenate 'string (script-name *request*)
+ "static/js/login.js"))))
+ (redirect *response* (if (equal (script-name *request*) "")
+ "/" (script-name *request*)))))
+
+(defun login-page/post (params)
+ (let ((result (verify-credentials
+ *scrumli-host* (getf params :|assertion|))))
+ (if (equal (cdr (assoc :status result)) "okay")
+ (progn
+ (setf (gethash :username
+ (getf (env *request*) :clack.session))
+ (cdr (assoc :email result)))
+ (redirect *response*
+ (if (equal (script-name *request*) "")
+ "/" (script-name *request*))))
+ '(403))))
+
+(defun logout (params)
+ (declare (ignore params))
+ (if (logged-in-p)
+ (setf (gethash :username
+ (getf (env *request*) :clack.session)) nil))
+ (redirect *response* (concatenate 'string (script-name *request*)
+ "login")))
+
+(defun stories-json (params)
+ (declare (ignore params))
+ (if (logged-in-p)
+ (list 200 '(:content-type "text/json")
+ (encode-json-to-string (get-all-stories)))
+ '(403)))
+
+(defun user-stories-json (params)
+ (declare (ignore params))
+ (if (logged-in-p)
+ (list 200 '(:content-type "text/json")
+ (encode-json-to-string
+ (get-stories-for
+ (gethash
+ :username (getf (env *request*) :clack.session)))))
+ '(403)))
+
+(defun add-story-json/post (params)
+ (if (logged-in-p)
+ (let ((role (getf params :|role|))
+ (necessity (getf params :|necessity|))
+ (headline (getf params :|headline|))
+ (content (getf params :|content|)))
+ (post-story
+ role necessity headline content
+ (gethash :username (getf (env *request*) :clack.session)))
+ (list 200 '(:content-type "text/json")
+ (encode-json-to-string '((status . "ok")))))
+ '(403)))
+
+(defun add-task-json/post (params)
+ (if (logged-in-p)
+ (let ((story-id (getf params :|storyId|))
+ (description (getf params :|description|)))
+ (post-task
+ story-id description
+ (gethash :username (getf (env *request*) :clack.session)))
+ (list 200 '(:content-type "text/json")
+ (encode-json-to-string '((status . "ok")))))
+ '(403)))
+
+(defun story-set-state-json/post (params)
+ (if (logged-in-p)
+ (let* ((id (getf params :|id|))
+ (current-state (story-get-state 'story id))
+ (next (ecase (intern current-state :scrumli)
+ (todo "DOING")
+ (doing "DONE")
+ (done "TODO"))))
+ (story-set-state 'story id next)
+ (list 200 '(:content-type "text/json")
+ (encode-json-to-string `((status . "ok")
+ (state . ,next)))))
+ '(403)))
+
+(defun task-set-state-json/post (params)
+ (if (logged-in-p)
+ (let* ((id (getf params :|id|))
+ (current-state (story-get-state 'task id))
+ (next (ecase (intern current-state :scrumli)
+ (todo "DOING")
+ (doing "DONE")
+ (done "TODO"))))
+ (story-set-state 'task id next)
+ (list 200 '(:content-type "text/json")
+ (encode-json-to-string `((status . "ok")
+ (state . ,next)))))
+ '(403)))
+
+(defun story-move-json/post (params)
+ (if (logged-in-p)
+ (let ((id (getf params :|id|))
+ (dir (getf params :dir)))
+ (story-change-priority
+ 'story id (intern (string-upcase dir) :keyword))
+ (list 200 '(:content-type "text/json")
+ (encode-json-to-string '((status . "ok")))))
+ '(403)))
+
+(defun task-move-json/post (params)
+ (if (logged-in-p)
+ (let ((id (getf params :|id|)))
+ (story-change-priority
+ 'task id (intern (string-upcase (getf params :dir)) :keyword))
+ (list 200 '(:content-type "text/json")
+ (encode-json-to-string '((status . "ok")))))
+ '(403)))
+
+(defun story-json (params)
+ (if (logged-in-p)
+ (list 200 '(:content-type "text/json")
+ (encode-json-to-string (get-story (getf params :id))))
+ '(403)))
+
+(defun story-set-assignee/post (params)
+ (if (logged-in-p)
+ (progn
+ (set-assignee 'story (getf params :|id|)
+ (getf params :|assignee|))
+ (list 200 '(:content-type "text/json")
+ (encode-json-to-string '((status . "ok")))))
+ '(403)))
+
+(defun task-set-assignee/post (params)
+ (if (logged-in-p)
+ (progn
+ (set-assignee 'task (getf params :|id|)
+ (getf params :|assignee|))
+ (list 200 '(:content-type "text/json")
+ (encode-json-to-string '((status . "ok")))))
+ '(403)))
+
+(defun lisp->js-bridge (params)
+ (declare (ignore params))
+ (list 200 '(:content-type "text/javascript")
+ (ps (var base-url (lisp (if (equal (script-name *request*) "")
+ "/" (script-name *request*)))))))
+
+(setf (route *app* "/") #'story-list-page)
+(setf (route *app* "/login") #'login-page)
+(setf (route *app* "/login" :method :post) #'login-page/post)
+(setf (route *app* "/logout") #'logout)
+(setf (route *app* "/stories") #'stories-json)
+(setf (route *app* "/stories/mine") #'user-stories-json)
+(setf (route *app* "/stories/new" :method :post) #'add-story-json/post)
+(setf (route *app* "/stories/tasks/new" :method :post) #'add-task-json/post)
+(setf (route *app* "/stories/state" :method :post) #'story-set-state-json/post)
+(setf (route *app* "/tasks/state" :method :post) #'task-set-state-json/post)
+(setf (route *app* "/stories/:dir" :method :post) #'story-move-json/post)
+(setf (route *app* "/tasks/:dir" :method :post) #'task-move-json/post)
+(setf (route *app* "/stories/:id") #'story-json)
+(setf (route *app* "/story/assignee" :method :post) #'story-set-assignee/post)
+(setf (route *app* "/task/assignee" :method :post) #'task-set-assignee/post)
+(setf (route *app* "/js/bridge.js") #'lisp->js-bridge)
(defun get-app ()
(builder