#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" "models/fertilizer-product.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] [("fertilizer" "new") #:method "get" new-fertilizer] [("fertilizer" "create") #:method "post" create-fertilizer] [("") #: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 #"" (ferti-page ferti-recipe latest-measurement-hash latest-target-hash latest-measurements))) (define (index _) (define user (get-current-user)) (response/xexpr #:preamble #"" (index-page user))) ;; Nutrient measurements (define (new-measurement _) (response/xexpr #:preamble #"" (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 #"" (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")) ;; Fertilizer products (define (new-fertilizer _) (response/xexpr #:preamble #"" (new-fertilizer-page))) (define (create-fertilizer req) (define-values (canonical-name nutrient-values brand-name) (formlet-process (fertilizer-formlet) req)) (create-fertilizer-product! canonical-name nutrient-values brand-name) (redirect-to "/ferti")) ;; Fallback (define (fallback _) (response/xexpr #:preamble #"" (fallback-page 404))) (define secured-dispatch (wrap-basic-auth app-dispatch))