(in-package :web-apps)
(defun get-product (n)
;; Query the DB.
(list n (format nil "Product nb ~a" n) 9.99))
(defun products (&optional (n 5))
(loop for i from 0 below n
collect (get-product i)))
(defvar *server* nil
"Server instance (Hunchentoot acceptor).")
(defparameter *port* 8899 "The application port.")
(defun render (template &rest args)
(apply
#'djula:render-template*
(djula:compile-string template)
nil
args))
(defparameter *template-root* "
Lisp web app
")
(defparameter *template-product* "
{{ product }}
{% if debug %}
debug info!
{% endif %}
")
(easy-routes:defroute root ("/") ()
(render *template-root* :products (products)))
(easy-routes:defroute product-route ("/product/:n")
(&get debug &path (n 'integer))
(render *template-product* :product (get-product n) :debug debug))
(defroute root ("/" :method :get) ()
(render-products))
(defun start-server (&key (port *port*))
(format t "~&Starting the web server on port ~a~&" port)
(force-output)
(setf *server* (make-instance 'easy-routes:easy-routes-acceptor
:port port))
(hunchentoot:start *server*))
(defun stop-server (&optional (server *server*))
(hunchentoot:stop server))