;;;; routes.lisp -- http routes for dnd (in-package :dnd) (lzb:provision-app () :title "Dungeons & Deadlines" :version "0.1.0" :content-type "text/html") (defparameter +session-cookie-name+ "dnd-session") (defendpoint* :get "/a-hero-is-born" () () (a-hero-is-born)) (defendpoint* :post "/a-hero-is-born" () () (with-plist ((name :name)) (lzb:request-body) (birth-from-the-goddess-loins name) (setf (lzb:response-header :location) "/tavern-door" (lzb:response-code) "303"))) (defendpoint* :get "/tavern-door" () () (doorkeeper)) (defendpoint* :post "/tavern-door" () () (with-plist ((name :name)) (lzb:request-body) (a:if-let ((hero (hero-known-as name))) (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")))) (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)))