From 6e5b291257e5ff34e00d7b7424c33fd67427934e Mon Sep 17 00:00:00 2001 From: Tom Willemse Date: Sun, 18 Aug 2013 16:19:54 +0200 Subject: [PATCH] Separate route from function definitions --- scrumli.lisp | 357 ++++++++++++++++++++++++++------------------------- 1 file changed, 184 insertions(+), 173 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"))))) +(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")))) -(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*)))))) +(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*))))) -(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))))) +(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)))) -(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")))) +(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"))) -(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)))) +(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))) -(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)))) +(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))) -(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)))) +(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))) -(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)))) +(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))) -(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)))) +(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))) -(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)))) +(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))) -(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)))) +(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))) -(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)))) +(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))) -(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)))) +(defun story-json (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)))) +(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))) -(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)))) +(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))) -(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 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