summaryrefslogtreecommitdiff
path: root/neocities/api.scm
diff options
context:
space:
mode:
authorEkaitz Zarraga <ekaitz@elenq.tech>2023-09-28 00:53:04 +0200
committerEkaitz Zarraga <ekaitz@elenq.tech>2023-09-28 19:59:02 +0200
commit0edd01b5538c10703f4b32751b5189bc8ac504d3 (patch)
tree1b63328b0ec0cef6c138bffe6b635cbf0b5f85d5 /neocities/api.scm
First commit
Diffstat (limited to 'neocities/api.scm')
-rw-r--r--neocities/api.scm98
1 files changed, 98 insertions, 0 deletions
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 <neocities-auth-api-key>
+ (make-neocities-auth-api-key key)
+ neocities-auth-api-key?
+ (key neocities-auth-api-key))
+
+(define-record-type <neocities-auth-basic>
+ (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 <neocities-api>
+ (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))))))