This commit is contained in:
Akira Tempaku 2025-04-19 14:25:01 +09:00
parent 9ef6e78400
commit 405c43da14
Signed by: paku
GPG key ID: 5B4E8402BCC50607

View file

@ -11,7 +11,8 @@
#:parse) #:parse)
(:import-from #:dexador (:import-from #:dexador
#:request #:request
#:http-request-failed) #:http-request-failed
#:response-status)
(:import-from #:quri (:import-from #:quri
#:make-uri #:make-uri
#:render-uri) #:render-uri)
@ -26,30 +27,31 @@
(defparameter *api-key* nil) (defparameter *api-key* nil)
(defparameter *service-domain* nil) (defparameter *service-domain* nil)
(defun %request (method endpoint &optional (path "") (query nil) (content nil)) (defun %request (method endpoint &key path query content)
(let* ((url (%build-uri endpoint path query)) (or *service-domain* (error "microcms:*service-domain* is not configured."))
(headers `(("X-MICROCMS-API-KEY" . ,*api-key*) (or *api-key* (error "microcms:*api-key* is not configured."))
("Content-Type" . "application/json")))) (let* ((url (%build-uri endpoint :path path :query query))
(format t "API request url: ~a~%" url) (req-headers `(("X-MICROCMS-API-KEY" . ,*api-key*)
("Content-Type" . "application/json"))))
(handler-case (handler-case
(multiple-value-bind (res-body status resp-headers) (multiple-value-bind (res-body status res-headers)
(request url (request url
:method method :method method
:headers headers :headers req-headers
:content (and content (to-json content)) :content (and content (to-json content))
:force-binary nil) :force-binary nil)
(format t "API response status: ~a~%" status) (format t "microCMS status: ~D~%" status)
(when (and (stringp res-body) (when (and (stringp res-body)
(search "application/json" (gethash "content-type" resp-headers))) (search "application/json" (gethash "content-type" res-headers)))
(parse res-body))) (parse res-body)))
(http-request-failed () (http-request-failed (e)
'(:|error| "API request failed"))))) (format *error-output* "microCMS status: ~D~%" (response-status e))))))
(defun %build-uri (endpoint &optional (path "") (query nil)) (defun %build-uri (endpoint &key path query)
(let ((uri (make-uri (let ((uri (make-uri
:scheme "https" :scheme "https"
:host (format nil "~A.microcms.io" *service-domain*) :host (format nil "~A.microcms.io" *service-domain*)
:path (format nil "/api/v1/~A/~A" endpoint path) :path (format nil "/api/v1/~A~@[/~A~]" endpoint path)
:query (%build-query query)))) :query (%build-query query))))
(render-uri uri))) (render-uri uri)))
@ -60,28 +62,28 @@
(defmacro define-list-client (endpoint) (defmacro define-list-client (endpoint)
(let ((str-endpoint (string-downcase (string endpoint)))) (let ((str-endpoint (string-downcase (string endpoint))))
`(progn `(progn
(defun ,(symbolicate 'get- endpoint '-list) (&optional query) (defun ,(symbolicate 'get- endpoint '-list) (&key query)
(%request :get ,str-endpoint nil query)) (%request :get ,str-endpoint :query query))
(defun ,(symbolicate 'get- endpoint '-list-detail) (id &optional query) (defun ,(symbolicate 'get- endpoint '-list-detail) (id &key query)
(%request :get ,str-endpoint id query)) (%request :get ,str-endpoint :path id :query query))
(defun ,(symbolicate 'create- endpoint) (content &optional query) (defun ,(symbolicate 'create- endpoint) (content &key query)
(let ((id (getf content :|id|))) (let ((id (getf content :|id|)))
(%request (if id :put :post) (%request (if id :put :post)
,str-endpoint ,str-endpoint
id :path id
query :query query
(remove-from-plist content :|id|)))) :content (remove-from-plist content :|id|))))
(defun ,(symbolicate 'update- endpoint) (id content) (defun ,(symbolicate 'update- endpoint) (id content)
(%request :patch ,str-endpoint id nil content)) (%request :patch ,str-endpoint :path id :content content))
(defun ,(symbolicate 'delete- endpoint) (id) (defun ,(symbolicate 'delete- endpoint) (id)
(%request :delete ,str-endpoint id)) (%request :delete ,str-endpoint :path id))
nil))) nil)))
(defmacro define-object-client (endpoint) (defmacro define-object-client (endpoint)
(let ((str-endpoint (string-downcase (string endpoint)))) (let ((str-endpoint (string-downcase (string endpoint))))
`(progn `(progn
(defun ,(symbolicate 'get- endpoint '-object) () (defun ,(symbolicate 'get- endpoint '-object) (&key query)
(%request :get ,str-endpoint)) (%request :get ,str-endpoint :query query))
(defun ,(symbolicate 'update- endpoint) (content) (defun ,(symbolicate 'update- endpoint) (content)
(%request :patch ,str-endpoint nil nil content)) (%request :patch ,str-endpoint :content content))
nil))) nil)))