#lang racket (provide production-dispatch fapg-url) (require web-server/dispatch web-server/http web-server/formlets "authentication.rkt" "views.rkt" "formlets.rkt" "models/user.rkt" "models/nutrient-measurement.rkt" "models/crop-requirement.rkt" "models/crop-rotation.rkt" "models/fertilizer-product.rkt" "services/nnls.rkt") (define (production-dispatch) (make-auth-dispatch fapg-dispatch)) (define-values (fapg-dispatch fapg-url) (dispatch-rules [("index") #:method "get" index] ;; Ferti [("ferti" "index") #:method "get" ferti-index] [("ferti" "measurements-and-rotations") #:method "get" ferti-measurements-and-rotations] [("ferti" "recipes" (string-arg)) #:method "get" ferti-recipe] [("ferti" "fertilizers") #:method "get" ferti-fertilizers] [("ferti" "crop-requirements") #:method "get" ferti-crop-requirements] ;; Nutrient measurements [("ferti" "measurements" "new") #:method "get" new-measurement] [("ferti" "measurements" "create") #:method "post" create-measurement] [("ferti" "measurements" (integer-arg)) #:method "get" show-measurement] [("ferti" "measurements" (integer-arg) "destroy") #:method "get" destroy-measurement] ;; Crop rotations [("ferti" "rotations" "new") #:method "get" new-rotation] [("ferti" "rotations" "new" (string-arg)) #:method "get" new-rotation-for-date] [("ferti" "rotations" "create") #:method "post" create-rotation] [("ferti" "rotations" (integer-arg)) #:method "get" show-rotation] [("ferti" "rotations" (integer-arg) "destroy") #:method "get" destroy-rotation] ;; Fertilizer products [("ferti" "fertilizers" "new") #:method "get" new-fertilizer] [("ferti" "fertilizers" "create") #:method "post" create-fertilizer] [("ferti" "fertilizers" (integer-arg)) #:method "get" show-fertilizer] [("ferti" "fertilizers" (integer-arg) "edit") #:method "get" edit-fertilizer] [("ferti" "fertilizers" "update") #:method "post" update-fertilizer] [("ferti" "fertilizers" (integer-arg) "destroy") #:method "get" destroy-fertilizer] ;; Default [("") #:method "get" index] [else fallback])) (define (render-page xexpr) (response/xexpr #:preamble #"" xexpr)) ;; Index (define (index _) (define user (get-current-user)) (render-page (index-page user))) ;; Ferti (define (ferti-index _) (render-page (ferti-index-page))) (define (ferti-measurements-and-rotations _) (define measurements (get-nutrient-measurements)) (define rotations (get-crop-rotations)) (render-page (ferti-measurements-and-rotations-page measurements rotations))) (define (ferti-recipe _ date-string) (define ferti-recipe (find-ferti-recipe date-string)) (render-page (ferti-recipe-page date-string ferti-recipe))) (define (ferti-fertilizers _) (render-page (ferti-fertilizers-page (get-fertilizer-products)))) (define (ferti-crop-requirements _) (render-page (ferti-crop-requirements-page (get-crop-requirements)))) ;; Nutrient measurements (define (new-measurement _) (render-page (new-measurement-page))) (define (create-measurement req) (define-values (measurement-date nutrient-values) (formlet-process (measurements-formlet) req)) (create-nutrient-measurement! measurement-date nutrient-values) (redirect-to "/ferti/measurements-and-rotations")) (define (show-measurement _ id) (define nm (get-nutrient-measurement #:id id)) (render-page (show-measurement-page nm))) (define (destroy-measurement _ id) (delete-nutrient-measurement! id) (redirect-to "/ferti/measurements-and-rotations")) ;; Crop rotations (define (new-rotation _) (render-page (new-rotation-page))) (define (new-rotation-for-date _ date-string) (render-page (new-rotation-page #:date date-string))) (define (create-rotation req) (define-values (rotation-date req-proportions) (formlet-process (rotation-formlet) req)) (create-crop-rotation! rotation-date req-proportions) (redirect-to "/ferti/measurements-and-rotations")) (define (show-rotation _ id) (define cr (get-crop-rotation #:id id)) (render-page (show-rotation-page cr))) (define (destroy-rotation _ id) (delete-crop-rotation! id) (redirect-to "/ferti/measurements-and-rotations")) ;; Fertilizer products (define (new-fertilizer _) (render-page (new-fertilizer-page))) (define (create-fertilizer req) (define new-fertilizer-product (formlet-process (fertilizer-formlet) req)) (create-fertilizer-product! new-fertilizer-product) (redirect-to "/ferti/fertilizers")) (define (show-fertilizer _ id) (define fp (get-fertilizer-product #:id id)) (render-page (show-fertilizer-page fp))) (define (edit-fertilizer _ id) (define fp (get-fertilizer-product #:id id)) (render-page (edit-fertilizer-page fp))) (define (update-fertilizer req) (define edited-fertilizer-product (formlet-process (fertilizer-formlet) req)) (update-fertilizer-product! edited-fertilizer-product) (redirect-to "/ferti/fertilizers")) (define (destroy-fertilizer _ id) (delete-fertilizer-product! id) (redirect-to "/ferti/fertilizers")) ;; Fallback (define (fallback _) (render-page (fallback-page 404)))