diff options
author | Grant Shoshin Shangreaux <shoshin@cicadas.surf> | 2023-01-21 09:08:08 -0600 |
---|---|---|
committer | Grant Shoshin Shangreaux <shoshin@cicadas.surf> | 2023-01-21 09:08:08 -0600 |
commit | 25c1854c8306d4550c0ced886cbd36cb43099129 (patch) | |
tree | 0aa35ba8bb8997b178a5ab10ea7924a688dbcb75 | |
parent | aee7f487f97c10c15b6c7b48156cc95db19d9137 (diff) |
Add: initial draft of doorkeeper session management
-rw-r--r-- | pages.lisp | 19 | ||||
-rw-r--r-- | routes.lisp | 34 | ||||
-rw-r--r-- | transactions.lisp | 13 |
3 files changed, 40 insertions, 26 deletions
@@ -8,12 +8,12 @@ (:title ,title)) (:body ,@body)))) -(defun a-hero-is-born () - (with-page (:title "A Hero Is Born!") +(defun godess-shrine () + (with-page (:title "A Sacred Shrine") (:header - (:h1 "A Hero Is Materializing From the Void...")) - (:form :method "POST" :action "/a-hero-is-born" - (:label :for "NAME" "Thy Hero's Appelation") + (:h1 "Pray and become a hero...")) + (:form :method "POST" :action "/godess-shrine" + (:label :for "NAME" "Enter the epithet thy hero shall be called:") (:input :name "NAME") (:button :type "submit")))) @@ -21,10 +21,13 @@ (with-page (:title "Tavern Door") (:h1 "Wot's yer name 'ero?") (:form :method "POST" :action "/tavern-door" - (:label :for "NAME" "Thy Hero's Appelation") + (:label :for "NAME" "Thy Hero's Appelation:") (:input :name "NAME") - (:button :type "submit")))) + (:button :type "submit")) + (:h2 "Eh? Ye need to birth a new hero?") + (:a :href "/godess-shrine" "Follow me..."))) (defun tavern (hero) (with-page (:title "A Bustling Tavern") - (:h1 "Aye! Welcome " (hero-name hero)))) + (:h1 "Aye! Welcome " (hero-name hero)) + ())) diff --git a/routes.lisp b/routes.lisp index b1d4ff7..b0b81ac 100644 --- a/routes.lisp +++ b/routes.lisp @@ -9,14 +9,22 @@ (defparameter +session-cookie-name+ "dnd-session") -(defendpoint* :get "/a-hero-is-born" () () - (a-hero-is-born)) +(defun redirect-to (location) + (setf (lzb:response-header :location) location + (lzb:response-code) "303")) -(defendpoint* :post "/a-hero-is-born" () () +(defmacro with-session (&body body) + `(a:if-let ((sesh (session-with-id (lzb:request-cookie +session-cookie-name+)))) + ,@body + (redirect-to "/tavern-door"))) + +(defendpoint* :get "/godess-shrine" () () + (godess-shrine)) + +(defendpoint* :post "/godess-shrine" () () (with-plist ((name :name)) (lzb:request-body) (birth-from-the-goddess-loins name) - (setf (lzb:response-header :location) "/tavern-door" - (lzb:response-code) "303"))) + (redirect-to "/tavern-door"))) (defendpoint* :get "/tavern-door" () () (doorkeeper)) @@ -27,18 +35,8 @@ (a:when-let ((sesh (new-sesh hero))) (lzb:set-response-cookie +session-cookie-name+ (session-id sesh) :path "/" :domain "localhost") - (setf (lzb:response-header :location) "/tavern" - (lzb:response-code) "303")) - (setf (lzb:response-header :location) "/tavern-door" - (lzb:response-code) "303")))) + (redirect-to "/tavern")) + (redirect-to "/tavern-door")))) (defendpoint* :get "/tavern" () () - (let ((hero (session-hero (session-with-id (lzb:request-cookie +session-cookie-name+))))) - (tavern hero))) - -(defun birth-from-the-goddess-loins (name) - (db:with-transaction () - (make-instance 'hero :name name))) - -(defun new-sesh (hero) - (db:with-transaction () (make-instance 'session :hero hero))) + (with-session (tavern (session-hero sesh)))) diff --git a/transactions.lisp b/transactions.lisp new file mode 100644 index 0000000..6a50fc1 --- /dev/null +++ b/transactions.lisp @@ -0,0 +1,13 @@ +;;;; transactions.lisp -- data store transactions for dnd + +(in-package :dnd) + +(defun birth-from-the-goddess-loins (name) + (db:with-transaction () + (make-instance 'hero :name name))) + +(defun new-sesh (hero) + (db:with-transaction () (make-instance 'session :hero hero))) + +(defun destroy-sesh (session) + (db:delete-object session)) |