diff --git a/src/main.lisp b/src/main.lisp index 6ab8019..f5a5b53 100644 --- a/src/main.lisp +++ b/src/main.lisp @@ -26,50 +26,22 @@ (defparameter *api-key* nil) (defparameter *service-domain* nil) -(defun %get-list (endpoint &optional query) - (%request :get endpoint "" query)) - -(defun %get-list-detail (endpoint id &optional (query nil)) - (%request :get endpoint id query)) - -(defun %create (endpoint content &optional query) - (let ((id (getf content :|id|)) - (pure-content (remove-from-plist content :|id|))) - (if id - (%put endpoint id pure-content) - (%post endpoint pure-content query)))) - -(defun %put (endpoint id content &optional query) - (%request :put endpoint id query content)) - -(defun %post (endpoint content &optional query) - (%request :post endpoint "" query content)) - -(defun %update (endpoint id content) - (%request :patch endpoint id nil content)) - -(defun %delete (endpoint id) - (%request :delete endpoint id)) - -(defun %get-object (endpoint) - (%request :get endpoint)) - -(defun %request (method endpoint &optional (path "") (query nil) (body nil)) +(defun %request (method endpoint &optional (path "") (query nil) (content nil)) (let* ((url (%build-uri endpoint path query)) (headers `(("X-MICROCMS-API-KEY" . ,*api-key*) ("Content-Type" . "application/json")))) (format t "API request url: ~a~%" url) (handler-case - (multiple-value-bind (resp-body status resp-headers) + (multiple-value-bind (res-body status resp-headers) (request url :method method :headers headers - :content (and body (to-json body)) + :content (and content (to-json content)) :force-binary nil) (format t "API response status: ~a~%" status) - (when (and (stringp resp-body) + (when (and (stringp res-body) (search "application/json" (gethash "content-type" resp-headers))) - (parse resp-body))) + (parse res-body))) (http-request-failed () '(:|error| "API request failed"))))) @@ -89,22 +61,27 @@ (let ((str-endpoint (string-downcase (string endpoint)))) `(progn (defun ,(symbolicate 'get- endpoint '-list) (&optional query) - (%get-list ,str-endpoint query)) + (%request :get ,str-endpoint nil query)) (defun ,(symbolicate 'get- endpoint '-list-detail) (id &optional query) - (%get-list-detail ,str-endpoint id query)) + (%request :get ,str-endpoint id query)) (defun ,(symbolicate 'create- endpoint) (content &optional query) - (%create ,str-endpoint content query)) + (let ((id (getf content :|id|))) + (%request (if id :put :post) + ,str-endpoint + id + query + (remove-from-plist content :|id|)))) (defun ,(symbolicate 'update- endpoint) (id content) - (%update ,str-endpoint id content)) + (%request :patch ,str-endpoint id nil content)) (defun ,(symbolicate 'delete- endpoint) (id) - (%delete ,str-endpoint id)) + (%request :delete ,str-endpoint id)) nil))) (defmacro define-object-client (endpoint) (let ((str-endpoint (string-downcase (string endpoint)))) `(progn (defun ,(symbolicate 'get- endpoint '-object) () - (%get-object ,str-endpoint)) + (%request :get ,str-endpoint)) (defun ,(symbolicate 'update- endpoint) (content) - (%update ,str-endpoint nil content)) + (%request :patch ,str-endpoint nil nil content)) nil)))