Compare commits

..

4 commits

Author SHA1 Message Date
fa0c60d475
Add access to helper 2025-05-17 17:14:58 +09:00
cb7062028e
re-export hsx, jingle, jonathan in helper 2025-05-17 17:13:38 +09:00
d508d9ec70
Add json api handler 2025-05-17 16:37:45 +09:00
f9dbc124b3
Define *timeout* 2025-05-17 11:22:03 +09:00
15 changed files with 27 additions and 80 deletions

View file

@ -2,6 +2,5 @@ WEBSITE_ENV=
WEBSITE_URL= WEBSITE_URL=
MICROCMS_SERVICE_DOMAIN= MICROCMS_SERVICE_DOMAIN=
MICROCMS_API_KEY= MICROCMS_API_KEY=
MICROCMS_WEBHOOK_KEY=
CLOUDFLARE_ZONE_ID= CLOUDFLARE_ZONE_ID=
CLOUDFLARE_API_KEY= CLOUDFLARE_API_KEY=

1
qlfile
View file

@ -11,4 +11,3 @@ ql local-time
ql function-cache ql function-cache
ql jonathan ql jonathan
ql access ql access
ql flexi-streams

View file

@ -54,7 +54,3 @@
(:class qlot/source/ql:source-ql (:class qlot/source/ql:source-ql
:initargs (:%version :latest) :initargs (:%version :latest)
:version "ql-2024-10-12")) :version "ql-2024-10-12"))
("flexi-streams" .
(:class qlot/source/ql:source-ql
:initargs (:%version :latest)
:version "ql-2024-10-12"))

View file

@ -1,7 +1,6 @@
(defpackage #:website/components/header (defpackage #:website/components/header
(:use #:cl (:use #:cl
#:hsx #:website/helper)
#:jingle)
(:export #:~header)) (:export #:~header))
(in-package #:website/components/header) (in-package #:website/components/header)

View file

@ -1,7 +1,6 @@
(defpackage #:website/components/metadata (defpackage #:website/components/metadata
(:use #:cl (:use #:cl
#:hsx #:website/helper)
#:jingle)
(:import-from #:website/lib/env (:import-from #:website/lib/env
#:website-url) #:website-url)
(:export #:~metadata)) (:export #:~metadata))

View file

@ -1,26 +1,15 @@
(uiop:define-package #:website/helper (uiop:define-package #:website/helper
(:use #:cl (:use #:cl)
#:jingle) (:use-reexport #:hsx
(:import-from #:flexi-streams #:jingle
#:make-flexi-stream) #:jonathan
(:import-from #:jonathan #:access)
#:parse) (:export #:api-p))
(:export #:api-request-p
#:get-request-body-plist))
(in-package #:website/helper) (in-package #:website/helper)
(defun starts-with-p (prefix string) (defun starts-with-p (prefix string)
(let ((pos (search prefix string :start1 0 :end1 (length prefix) :start2 0))) (let ((pos (search prefix string :start1 0 :end1 (length prefix) :start2 0)))
(and pos (= pos 0)))) (and pos (= pos 0))))
(defun api-request-p () (defun api-p ()
(starts-with-p "/api/" (request-uri *request*))) (starts-with-p "/api/" (request-uri *request*)))
(defun get-request-body-plist ()
(parse
(let ((text-stream (make-flexi-stream (request-raw-body *request*)
:external-format :utf-8)))
(with-output-to-string (out)
(loop :for char := (read-char text-stream nil)
:while char
:do (write-char char out))))))

View file

@ -17,19 +17,21 @@
(setf microcms:*service-domain* (microcms-service-domain)) (setf microcms:*service-domain* (microcms-service-domain))
(setf microcms:*api-key* (microcms-api-key)) (setf microcms:*api-key* (microcms-api-key))
(defmacro memorize (name) (defmacro memorize (name timeout)
(let ((origin (gensym))) (let ((origin (gensym)))
`(progn `(progn
(setf (fdefinition ',origin) (fdefinition ',name)) (setf (fdefinition ',origin) (fdefinition ',name))
(defcached ,name (&key query) (defcached (,name :timeout ,timeout) (&key query)
(,origin :query query))))) (,origin :query query)))))
(defparameter *timeout* 60)
(define-object-client about) (define-object-client about)
(memorize get-about) (memorize get-about *timeout*)
(define-object-client work) (define-object-client work)
(memorize get-work) (memorize get-work *timeout*)
(define-list-client blog) (define-list-client blog)
(memorize get-blog-list) (memorize get-blog-list *timeout*)
(memorize get-blog-detail) (memorize get-blog-detail *timeout*)

View file

@ -18,4 +18,3 @@
(env-var website-url "WEBSITE_URL") (env-var website-url "WEBSITE_URL")
(env-var microcms-service-domain "MICROCMS_SERVICE_DOMAIN") (env-var microcms-service-domain "MICROCMS_SERVICE_DOMAIN")
(env-var microcms-api-key "MICROCMS_API_KEY") (env-var microcms-api-key "MICROCMS_API_KEY")
(env-var microcms-webhook-key "MICROCMS_WEBHOOK_KEY")

View file

@ -1,11 +1,8 @@
(defpackage #:website/renderer (defpackage #:website/renderer
(:use #:cl (:use #:cl
#:hsx #:website/helper)
#:jingle) (:import-from #:hsx/element
(:import-from #:jonathan #:element)
#:to-json)
(:import-from #:website/helper
#:api-request-p)
(:import-from #:website/components/metadata (:import-from #:website/components/metadata
#:~metadata) #:~metadata)
(:import-from #:website/components/scripts (:import-from #:website/components/scripts
@ -17,7 +14,7 @@
(defmethod jingle:process-response :around ((app jingle:app) result) (defmethod jingle:process-response :around ((app jingle:app) result)
(when (eq (request-method *request*) :get) (when (eq (request-method *request*) :get)
(set-response-header :cache-control "public, max-age=60")) (set-response-header :cache-control "public, max-age=60"))
(cond ((api-request-p) (cond ((api-p)
(set-response-header :content-type "application/json; charset=utf-8") (set-response-header :content-type "application/json; charset=utf-8")
(call-next-method app (to-json result))) (call-next-method app (to-json result)))
(t (t

View file

@ -1,8 +1,6 @@
(defpackage #:website/routes/about (defpackage #:website/routes/about
(:use #:cl (:use #:cl
#:hsx #:website/helper)
#:jingle
#:access)
(:import-from #:website/lib/cms (:import-from #:website/lib/cms
#:get-about) #:get-about)
(:import-from #:website/lib/time (:import-from #:website/lib/time

View file

@ -1,24 +0,0 @@
(defpackage #:website/routes/api/revalidate
(:use #:cl
#:jingle)
(:import-from #:function-cache
#:clear-cache)
(:import-from #:website/lib/env
#:microcms-webhook-key)
(:import-from #:website/helper
#:get-request-body-plist)
(:import-from #:website/lib/cms
#:get-about)
(:export #:handle-post))
(in-package #:website/routes/api/revalidate)
(defun handle-post (params)
(declare (ignore params))
(unless (string= (car (get-request-header "X-MICROCMS-WEBHOOK-KEY"))
(microcms-webhook-key))
(set-response-status :unauthorized)
(return-from handle-post '(:|message| "Invalid token")))
(let* ((body (get-request-body-plist))
(api (getf body :|api|)))
(cond ((string= api "about") (clear-cache 'get-about)))
'(:|message| "ok")))

View file

@ -1,7 +1,6 @@
(defpackage #:website/routes/blog (defpackage #:website/routes/blog
(:use #:cl (:use #:cl
#:hsx #:website/helper)
#:jingle)
(:export #:handle-get)) (:export #:handle-get))
(in-package #:website/routes/blog) (in-package #:website/routes/blog)

View file

@ -1,7 +1,6 @@
(defpackage #:website/routes/index (defpackage #:website/routes/index
(:use #:cl (:use #:cl
#:hsx #:website/helper)
#:access)
(:import-from #:website/lib/cms (:import-from #:website/lib/cms
#:get-about) #:get-about)
(:export #:handle-get (:export #:handle-get

View file

@ -1,9 +1,6 @@
(defpackage #:website/routes/not-found (defpackage #:website/routes/not-found
(:use #:cl (:use #:cl
#:hsx #:website/helper)
#:jingle)
(:import-from #:website/helper
#:api-request-p)
(:export #:handle-not-found)) (:export #:handle-not-found))
(in-package #:website/routes/not-found) (in-package #:website/routes/not-found)
@ -14,7 +11,7 @@
(defun handle-not-found () (defun handle-not-found ()
(setf (context :metadata) *metadata*) (setf (context :metadata) *metadata*)
(if (api-request-p) (if (api-p)
'(:|message| "404 Not Found") '(:|message| "404 Not Found")
(hsx (hsx
(div :class "flex flex-col h-full items-center justify-center gap-y-6" (div :class "flex flex-col h-full items-center justify-center gap-y-6"

View file

@ -1,7 +1,6 @@
(defpackage #:website/routes/work (defpackage #:website/routes/work
(:use #:cl (:use #:cl
#:hsx #:website/helper)
#:jingle)
(:import-from #:website/lib/cms (:import-from #:website/lib/cms
#:get-work) #:get-work)
(:import-from #:website/lib/time (:import-from #:website/lib/time