From 0edd01b5538c10703f4b32751b5189bc8ac504d3 Mon Sep 17 00:00:00 2001 From: Ekaitz Zarraga Date: Thu, 28 Sep 2023 00:53:04 +0200 Subject: First commit --- neocities/api.scm | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 neocities/api.scm (limited to 'neocities/api.scm') diff --git a/neocities/api.scm b/neocities/api.scm new file mode 100644 index 0000000..9a7de10 --- /dev/null +++ b/neocities/api.scm @@ -0,0 +1,98 @@ +(define-module (neocities api) + #:use-module (neocities requests) + #:use-module (rnrs base) + #:use-module (srfi srfi-9) + #:export ( + make-neocities-api + make-neocities-auth-basic + make-neocities-auth-api-key + neocities-delete + neocities-info + neocities-list + neocities-key + neocities-upload +)) + +(define-record-type + (make-neocities-auth-api-key key) + neocities-auth-api-key? + (key neocities-auth-api-key)) + +(define-record-type + (make-neocities-auth-basic username password) + neocities-auth-basic? + (username neocities-auth-basic-username) + (password neocities-auth-basic-password)) + +(define (encode-auth auth) + (cond + ((neocities-auth-api-key? auth) + (encode-bearer-auth-header (neocities-auth-api-key auth))) + ((neocities-auth-basic? auth) + (encode-basic-auth-header + (neocities-auth-basic-username auth) + (neocities-auth-basic-password auth))) + (else + (throw 'neocities "Authentication scheme not supported")))) + +(define-record-type + (make-neocities-api hostname auth) + neocities-api? + (hostname neocities-api-hostname) + (auth neocities-api-auth neocities-api-auth-set!)) + + + +(define* (neocities-delete api files) + (when (not (list? files)) + (throw 'neocities "files to delete must be a list")) + + (let ((url (neocities-url "delete" + #:hostname (neocities-api-hostname api) + #:querystring `(("files" . ,files))))) + (neocities-request + 'POST + url + #:auth (encode-auth (neocities-api-auth api))))) + + +(define* (neocities-list api #:optional path) + (let ((url (neocities-url "list" + #:hostname (neocities-api-hostname api) + #:querystring (if path `(("path" ,path)) '())))) + (neocities-request + 'GET + url + #:auth (encode-auth (neocities-api-auth api))))) + +(define* (neocities-info api #:optional sitename) + ;; It can be unauthenticated, but this is only the authenticated version + (let ((url (neocities-url "info" + #:hostname (neocities-api-hostname api) + #:querystring (if sitename + `(("sitename" ,sitename)) + '())))) + (neocities-request + 'GET + url + #:auth (encode-auth (neocities-api-auth api))))) + +(define* (neocities-key api) + (let ((url (neocities-url "key" + #:hostname (neocities-api-hostname api)))) + (neocities-request + 'GET + url + #:auth (encode-auth (neocities-api-auth api))))) + +(define* (neocities-upload api files) + "files is an alist with the filename and destination" + (let ((url (neocities-url "upload" + #:hostname (neocities-api-hostname api)))) + (let-values (((boundary body) (encode-multipart-body files))) + (neocities-request + 'POST + url + #:content-type (string-append "multipart/form-data; boundary=" boundary) + #:body body + #:auth (encode-auth (neocities-api-auth api)))))) -- cgit v1.2.3