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
12 changed files with 65 additions and 39 deletions

2
qlfile
View file

@ -9,3 +9,5 @@ ql clack-errors
git microcms https://github.com/skyizwhite/microcms-lisp-sdk
ql local-time
ql function-cache
ql jonathan
ql access

View file

@ -46,3 +46,11 @@
(:class qlot/source/ql:source-ql
:initargs (:%version :latest)
:version "ql-2023-10-21"))
("jonathan" .
(:class qlot/source/ql:source-ql
:initargs (:%version :latest)
:version "ql-2020-09-25"))
("access" .
(:class qlot/source/ql:source-ql
:initargs (:%version :latest)
:version "ql-2024-10-12"))

View file

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

View file

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

15
src/helper.lisp Normal file
View file

@ -0,0 +1,15 @@
(uiop:define-package #:website/helper
(:use #:cl)
(:use-reexport #:hsx
#:jingle
#:jonathan
#:access)
(:export #:api-p))
(in-package #:website/helper)
(defun starts-with-p (prefix string)
(let ((pos (search prefix string :start1 0 :end1 (length prefix) :start2 0)))
(and pos (= pos 0))))
(defun api-p ()
(starts-with-p "/api/" (request-uri *request*)))

View file

@ -24,12 +24,14 @@
(defcached (,name :timeout ,timeout) (&key query)
(,origin :query query)))))
(defparameter *timeout* 60)
(define-object-client about)
(memorize get-about 60)
(memorize get-about *timeout*)
(define-object-client work)
(memorize get-work 60)
(memorize get-work *timeout*)
(define-list-client blog)
(memorize get-blog-list 60)
(memorize get-blog-detail 60)
(memorize get-blog-list *timeout*)
(memorize get-blog-detail *timeout*)

View file

@ -1,7 +1,6 @@
(defpackage #:website/renderer
(:use #:cl
#:hsx
#:jingle)
#:website/helper)
(:import-from #:hsx/element
#:element)
(:import-from #:website/components/metadata
@ -13,17 +12,21 @@
(in-package #:website/renderer)
(defmethod jingle:process-response :around ((app jingle:app) result)
(set-response-header :content-type "text/html; charset=utf-8")
(when (eq (request-method *request*) :get)
(set-response-header :cache-control "public, max-age=60"))
(call-next-method app
(render-to-string
(hsx (html :lang "ja"
(head
(~metadata :metadata (context :metadata))
(~scripts))
(body
:hx-ext "head-support, response-targets, preload"
:hx-boost "true" :hx-swap "transition:true"
:hx-target-404 "body" :hx-target-5* "body"
(~layout result)))))))
(cond ((api-p)
(set-response-header :content-type "application/json; charset=utf-8")
(call-next-method app (to-json result)))
(t
(set-response-header :content-type "text/html; charset=utf-8")
(call-next-method app
(render-to-string
(hsx (html :lang "ja"
(head
(~metadata :metadata (context :metadata))
(~scripts))
(body
:hx-ext "head-support, response-targets, preload"
:hx-boost "true" :hx-swap "transition:true"
:hx-target-404 "body" :hx-target-5* "body"
(~layout result)))))))))

View file

@ -1,7 +1,6 @@
(defpackage #:website/routes/about
(:use #:cl
#:hsx
#:jingle)
#:website/helper)
(:import-from #:website/lib/cms
#:get-about)
(:import-from #:website/lib/time
@ -25,7 +24,7 @@
(div :class "flex justify-center"
(figure :class "flex flex-col items-center"
(img
:src (getf (getf about :avatar) :url)
:src (accesses about :avatar :url)
:alt "avatar" :class "size-40 rounded-xl shadow-sm avatar")
(figcaption (getf about :avatar-caption))))
(raw! (getf about :content))

View file

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

View file

@ -1,6 +1,6 @@
(defpackage #:website/routes/index
(:use #:cl
#:hsx)
#:website/helper)
(:import-from #:website/lib/cms
#:get-about)
(:export #:handle-get
@ -30,7 +30,7 @@
(hsx
(div :class "flex flex-col items-center justify-center h-full"
(img
:src (getf (getf about :avatar) :url)
:src (accesses about :avatar :url)
:alt "avatar" :class "size-40 rounded-xl shadow-sm avatar")
(div :class "flex flex-col items-center gap-2 py-6"
(h1 :class "font-bold text-2xl text-center"

View file

@ -1,7 +1,6 @@
(defpackage #:website/routes/not-found
(:use #:cl
#:hsx
#:jingle)
#:website/helper)
(:export #:handle-not-found))
(in-package #:website/routes/not-found)
@ -12,9 +11,11 @@
(defun handle-not-found ()
(setf (context :metadata) *metadata*)
(hsx
(div :class "flex flex-col h-full items-center justify-center gap-y-6"
(h1 :class "font-bold text-2xl"
"404 Not Found")
(a :href "/" :class "text-lg text-pink-500 hover:underline"
"Back to TOP"))))
(if (api-p)
'(:|message| "404 Not Found")
(hsx
(div :class "flex flex-col h-full items-center justify-center gap-y-6"
(h1 :class "font-bold text-2xl"
"404 Not Found")
(a :href "/" :class "text-lg text-pink-500 hover:underline"
"Back to TOP")))))

View file

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