(in-package :fwoar.blog) (defclass blog-route () ((%blog :initarg :blog :reader blog))) (defclass index-route (blog-route) ()) (defclass post-route (blog-route) ((%post :initarg :post :reader post))) (defmethod araneus:controller ((route index-route) action &key) (posts (blog route))) (defclass save-action () ((%post-type :initarg :post-type :reader post-type) (%post-initargs :initarg :post-initargs :reader post-initargs))) (defmethod araneus:controller ((route post-route) (action (eql :view)) &key) (post route)) (defmethod araneus:controller ((route post-route) (action (eql :new)) &key) nil) (defmethod araneus:controller ((route post-route) (action save-action) &key) (let ((blog (blog route))) (car (push (apply #'make-instance (post-type action) (post-initargs action)) (posts blog))))) (defun setup-routes (app blog) (araneus:defroutes app (("/" :method :GET) (lambda (_) (declare (ignore _)) (let ((route (make-instance 'index-route :blog blog))) (araneus:run-route route :get)))) (("/p/:post" :method :GET) (lambda (params) (format t "~¶ms: ~s~%" params) (let* ((post-name (cdr (assoc :post params))) (post (find-post post-name blog)) (route (make-instance 'post-route :post post)) (action (if post :view :new))) (araneus:run-route route action)))) (("/micro" :method :POST) (lambda (params) (let* ((route (make-instance 'post-route :blog blog)) (content (babel:octets-to-string (lack.request:request-content ningle:*request*)))) (araneus:run-route route (make-instance 'save-action :post-type 'micropost :post-initargs (list :content (cdr (assoc "content" params :test 'equal))))))))))