blob: c022c3c8c920a0dd8aa2ecad485f8c14419e25ba (
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
#lang racket
(provide secured-dispatch)
(require web-server/dispatch
web-server/http
web-server/formlets
web-server/http/basic-auth
"views.rkt"
"formlets.rkt"
"models/user.rkt"
"models/nutrient-measurement.rkt"
"models/nutrient-target.rkt"
"services/nnls.rkt")
(define (wrap-basic-auth handler)
(lambda (req)
(match (request->basic-credentials req)
[(cons user pass)
;; credentials found → continue to dispatcher
(handler req)]
[else
;; no credentials → trigger auth challenge
(response
401 #"Unauthorized" (current-seconds) TEXT/HTML-MIME-TYPE
(list
(make-basic-auth-header "Ferti Private Area"))
void)])))
(define-values (app-dispatch _)
(dispatch-rules [("ferti") #:method "get" ferti]
[("measurement" "new") #:method "get" new-measurement]
[("measurement" "create") #:method "post" create-measurement]
[("measurement" "destroy") #:method "post" destroy-measurement]
[("target" "new") #:method "get" new-target]
[("target" "create") #:method "post" create-target]
[("") #:method "get" index]
[else fallback]))
(define (ferti _)
(define ferti-recipe (find-ferti-recipe))
(define latest-measurement-hash (get-latest-nutrient-measurement-hash))
(define latest-target-hash (get-latest-nutrient-target-hash))
(define latest-measurements (take (get-nutrient-measurements) 10))
(response/xexpr
#:preamble #"<!DOCTYPE html>"
(ferti-page ferti-recipe latest-measurement-hash latest-target-hash latest-measurements)))
(define (index _)
(define user (get-current-user))
(response/xexpr #:preamble #"<!DOCTYPE html>" (index-page user)))
;; Nutrient measurements
(define (new-measurement _)
(response/xexpr #:preamble #"<!DOCTYPE html>" (new-measurement-page)))
(define (create-measurement req)
(define-values (measured-on nutrient-values) (formlet-process (measurements-formlet) req))
(create-nutrient-measurement! measured-on nutrient-values)
(redirect-to "/ferti"))
(define (destroy-measurement req)
(delete-nutrient-measurement! req)
(redirect-to "/"))
;; Nutrient targets
(define (new-target _)
(response/xexpr #:preamble #"<!DOCTYPE html>" (new-target-page)))
(define (create-target req)
(define-values (effective-on nutrient-values) (formlet-process (targets-formlet) req))
(create-nutrient-target! effective-on nutrient-values)
(redirect-to "/ferti"))
(define (fallback _)
(response/xexpr #:preamble #"<!DOCTYPE html>" (fallback-page 404)))
(define secured-dispatch (wrap-basic-auth app-dispatch))
|