(use-modules (model) (views) (safsaf) (safsaf handler-wrappers csrf) (safsaf handler-wrappers exceptions) (safsaf handler-wrappers logging) (safsaf handler-wrappers security-headers) (safsaf handler-wrappers sessions) (safsaf response-helpers) (safsaf router)) (unless (file-exists? "static/style.css") (format (current-error-port) "error: run this from the examples/blog-site/ directory~%") (exit 1)) ;; Create a shared database thread pool. (let* ((db-pool (make-db "/tmp/blog-site.db")) ;; Session manager — in production, use a proper secret. (session-manager (make-session-config "change-me-in-production" #:cookie-name "blog-session")) (all-routes (wrap-routes (list (make-blog-component db-pool session-manager) (route-group '("static") (route 'GET '(. path) (make-static-handler "./static" #:cache-control '((max-age . 3600))))) (route '* '* (lambda (request body-port) (not-found-response)))) (make-exceptions-handler-wrapper #:dev? #t) logging-handler-wrapper security-headers-handler-wrapper (make-session-handler-wrapper session-manager) csrf-handler-wrapper)) (port 8082)) (format #t "Listening on http://localhost:~a~%" port) (force-output) (run-safsaf all-routes #:port port))