#lang racket
(require net/url net/uri-codec json)
(define (read-api-key
(file (build-path (find-system-path 'home-dir) ".google-api-key")))
(match
(file->string file #:mode 'text)
((regexp "^\\s*(.*?)\\s*(?:[\r\n]*)$" (list _ k)) k)
(else (error 'read-api-key "Bad format for ~a" file))))
(define api-key (make-parameter (read-api-key)))
(provide api-key)
(provide urlshortener.url.list)
(define (urlshortener.url.list
#:projection
(projection 'NONE)
#:start-token
(start-token 'NONE)
#:fields
(fields 'NONE)
#:key
(key 'NONE)
#:alt
(alt 'NONE)
#:oauth_token
(oauth_token 'NONE)
#:prettyPrint
(prettyPrint 'NONE)
#:quotaUser
(quotaUser 'NONE)
#:userIp
(userIp 'NONE))
(define base-uri "https://www.googleapis.com/urlshortener/v1/")
(define res-path "url/history")
(define _qpstr
(alist->form-urlencoded
(filter-map
(lambda (k v)
(cond ((eq? v 'NONE) #f) (else (cons (string->symbol k) v))))
(list
"projection"
"start-token"
"fields"
"key"
"alt"
"oauth_token"
"prettyPrint"
"quotaUser"
"userIp")
(list
projection
start-token
fields
key
alt
oauth_token
prettyPrint
quotaUser
userIp))))
(define qpstr
(cond ((equal? _qpstr "") "") (else (string-append "?" _qpstr))))
(define url (string->url (string-append base-uri res-path qpstr)))
(define h (list "Content-Type: application/json"))
(define body
(jsexpr->bytes
(for/hasheq
((k (list)) (v (list)) #:when (not (eq? v 'NONE)))
(values (string->symbol k) v))))
(define in (get-pure-port url h))
(define js (bytes->jsexpr (port->bytes in)))
(close-input-port in)
js)
(provide urlshortener.url.get)
(define (urlshortener.url.get
shortUrl
#:projection
(projection 'NONE)
#:fields
(fields 'NONE)
#:key
(key 'NONE)
#:alt
(alt 'NONE)
#:oauth_token
(oauth_token 'NONE)
#:prettyPrint
(prettyPrint 'NONE)
#:quotaUser
(quotaUser 'NONE)
#:userIp
(userIp 'NONE))
(define base-uri "https://www.googleapis.com/urlshortener/v1/")
(define res-path "url")
(define _qpstr
(alist->form-urlencoded
(filter-map
(lambda (k v)
(cond ((eq? v 'NONE) #f) (else (cons (string->symbol k) v))))
(list
"shortUrl"
"projection"
"fields"
"key"
"alt"
"oauth_token"
"prettyPrint"
"quotaUser"
"userIp")
(list
shortUrl
projection
fields
key
alt
oauth_token
prettyPrint
quotaUser
userIp))))
(define qpstr
(cond ((equal? _qpstr "") "") (else (string-append "?" _qpstr))))
(define url (string->url (string-append base-uri res-path qpstr)))
(define h (list "Content-Type: application/json"))
(define body
(jsexpr->bytes
(for/hasheq
((k (list)) (v (list)) #:when (not (eq? v 'NONE)))
(values (string->symbol k) v))))
(define in (get-pure-port url h))
(define js (bytes->jsexpr (port->bytes in)))
(close-input-port in)
js)
(provide urlshortener.url.insert)
(define (urlshortener.url.insert
#:id
(id 'NONE)
#:longUrl
(longUrl 'NONE)
#:kind
(kind 'NONE)
#:status
(status 'NONE)
#:analytics
(analytics 'NONE)
#:created
(created 'NONE)
#:fields
(fields 'NONE)
#:key
(key 'NONE)
#:alt
(alt 'NONE)
#:oauth_token
(oauth_token 'NONE)
#:prettyPrint
(prettyPrint 'NONE)
#:quotaUser
(quotaUser 'NONE)
#:userIp
(userIp 'NONE))
(define base-uri "https://www.googleapis.com/urlshortener/v1/")
(define res-path "url")
(define _qpstr
(alist->form-urlencoded
(filter-map
(lambda (k v)
(cond ((eq? v 'NONE) #f) (else (cons (string->symbol k) v))))
(list
"fields"
"key"
"alt"
"oauth_token"
"prettyPrint"
"quotaUser"
"userIp")
(list fields key alt oauth_token prettyPrint quotaUser userIp))))
(define qpstr
(cond ((equal? _qpstr "") "") (else (string-append "?" _qpstr))))
(define url (string->url (string-append base-uri res-path qpstr)))
(define h (list "Content-Type: application/json"))
(define body
(jsexpr->bytes
(for/hasheq
((k (list "id" "longUrl" "kind" "status" "analytics" "created"))
(v (list id longUrl kind status analytics created))
#:when
(not (eq? v 'NONE)))
(values (string->symbol k) v))))
(define in (post-pure-port url body h))
(define js (bytes->jsexpr (port->bytes in)))
(close-input-port in)
js)