From f7390b520cc2d3b9da36272116c62f4067fa9c09 Mon Sep 17 00:00:00 2001
From: paku <paku@skyizwhite.dev>
Date: Fri, 12 Apr 2024 16:32:26 +0900
Subject: [PATCH] Add public-files middleware

---
 hp.asd              |  2 +-
 src/app.lisp        |  6 ++----
 src/middleware.lisp | 21 +++++++++++++++++++++
 3 files changed, 24 insertions(+), 5 deletions(-)
 create mode 100644 src/middleware.lisp

diff --git a/hp.asd b/hp.asd
index 6099a5d..4b5d019 100644
--- a/hp.asd
+++ b/hp.asd
@@ -7,4 +7,4 @@
   :depends-on ("hp/app")
   :in-order-to ((test-op (test-op "hp-tests"))))
 
-(register-system-packages "lack-middleware-accesslog" '(:lack.middleware.accesslog))
+(register-system-packages "lack-middleware-static" '(:lack.middleware.static))
diff --git a/src/app.lisp b/src/app.lisp
index a46a420..c0b1eb6 100644
--- a/src/app.lisp
+++ b/src/app.lisp
@@ -6,8 +6,7 @@
   (:local-nicknames (#:pi #:piccolo))
   (:local-nicknames (#:view #:hp/view))
   (:local-nicknames (#:cmp #:hp/components/**/*))
-  (:import-from #:lack.middleware.accesslog
-                #:*lack-middleware-accesslog*)
+  (:local-nicknames (#:mw #:hp/middleware))
   (:export #:start
            #:stop
            #:update))
@@ -24,8 +23,7 @@
 
 (defun update ()
   (jg:clear-middlewares *app*)
-  (jg:install-middleware *app* *lack-middleware-accesslog*)
-  (jg:static-path *app* "/public/" "public/")
+  (jg:install-middleware *app* mw:*public-files*)
   (fbr:assign-routes *app*
                      :system "hp"
                      :directory "src/routes"))
diff --git a/src/middleware.lisp b/src/middleware.lisp
new file mode 100644
index 0000000..918041d
--- /dev/null
+++ b/src/middleware.lisp
@@ -0,0 +1,21 @@
+(defpackage #:hp/middleware
+  (:use #:cl)
+  (:local-nicknames (#:jg #:jingle))
+  (:import-from #:lack.middleware.static
+                #:*lack-middleware-static*)
+  (:export #:*public-files*))
+(in-package #:hp/middleware)
+
+(defun exist-public-file-p (path)
+  (let ((pathname (probe-file (concatenate 'string "public" path))))
+    (and pathname (pathname-name pathname))))
+
+(defparameter *public-files*
+  (lambda (app)
+    (funcall *lack-middleware-static*
+             app
+             :path (lambda (path)
+                     (if (exist-public-file-p path) 
+                         path
+                         nil))
+             :root (asdf:system-relative-pathname :hp "public/"))))