aboutsummaryrefslogtreecommitdiff
path: root/module/server.scm
blob: 063f6fc7c165f50c24d220420308d0190d115b35 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
(define-module (server)
  #:use-module (util))

(use-modules* (web (server request response uri))
              (output (html))
              (ice-9 (match control rdelim curried-definitions))
              (srfi (srfi-1 srfi-19)))

(define month-names
  '(jan feb mar apr may jun jul aug sep oct nov dec))

(define month-numbers
  (map cons month-names (iota 12 1)))

(define (query->alist str)
  (map (lambda (s) (let* (((k . v) (string-split s #\=)))
                (cons (string->symbol (string-downcase k)) v)))
       (filter (negate string-null?) (string-split str #\&))))


(define ((serve-file continuation) path-list)
  (continuation
   '((content-type text/css))
   ;; TODO document root somewhere around here
   (call-with-input-file (string-append "./" (string-join path-list "/"))
     read-string)))

;;; TODO "/static/*"
(define (make-handler calendars events)
  (lambda (request request-body)
    (format (current-error-port) "[~a] ~a~%"
            (date->string (current-date) "~3")
            request)
    (call/ec
     (lambda (ret)
       (let* ((uri (request-uri request)))
         (match uri
           (($ (@@ (web uri) <uri>) scheme userinfo host port path query fragment)
            (let* ((path-parts (string-split path #\/)))
              ;; This is actually quite ugly
              (and=> (member "static" path-parts) (serve-file ret))

              (let* ((query (query->alist (or query "")))
                     (m (and=> (assoc-ref query 'm)
                               (compose (lambda (k) (assoc-ref month-numbers k)) string->symbol car))))
                (when m
                 (let* ((start (make-date 0 0 0 0 1 m 2019 0))
                        (end (make-date 0 0 0 0 1 (1+ m) 2019 0))
                        (str (with-output-to-string (lambda () (html-generate calendars events start end)))))
                   (ret `((content-type text/html)) str)))
                (ret (build-response #:code 404)
                     "404 Not Fonud"))))))))))

(define-public (server-main c e args)
  (run-server (make-handler c e)))