#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.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) "edit") #:method "get" edit-measurement] [("ferti" "measurements" "update") #:method "post" update-measurement] [("ferti" "measurements" (integer-arg) "destroy") #:method "get" destroy-measurement] ;; Crops [("ferti" "crops" "new") #:method "get" new-crop] [("ferti" "crops" "create") #:method "post" create-crop] [("ferti" "crops" (integer-arg)) #:method "get" show-crop] [("ferti" "crops" (integer-arg) "edit") #:method "get" edit-crop] [("ferti" "crops" "update") #:method "post" update-crop] [("ferti" "crops" (integer-arg) "destroy") #:method "get" destroy-crop] ;; 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] ;; Crop requirements [("ferti" "crop-requirements" "new") #:method "get" new-requirement] [("ferti" "crop-requirements" "create") #:method "post" create-requirement] [("ferti" "crop-requirements" (integer-arg)) #:method "get" show-requirement] [("ferti" "crop-requirements" (integer-arg) "edit") #:method "get" edit-requirement] [("ferti" "crop-requirements" "update") #:method "post" update-requirement] [("ferti" "crop-requirements" (integer-arg) "destroy") #:method "get" destroy-requirement] ;; 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 new-measurement (formlet-process (measurements-formlet) req)) (if (get-nutrient-measurement #:date (nutrient-measurement-date new-measurement)) (update-nutrient-measurement! new-measurement) (create-nutrient-measurement! new-measurement)) (redirect-to "/ferti/measurements-and-rotations")) (define (show-measurement _ id) (define nm (get-nutrient-measurement #:id id)) (render-page (show-measurement-page nm))) (define (edit-measurement _ id) (define nm (get-nutrient-measurement #:id id)) (render-page (edit-measurement-page nm))) (define (update-measurement req) (define edited-nutrient-measurement (formlet-process (measurements-formlet) req)) (update-nutrient-measurement! edited-nutrient-measurement) (redirect-to "/ferti/measurements-and-rotations")) (define (destroy-measurement _ id) (delete-nutrient-measurement! id) (redirect-to "/ferti/measurements-and-rotations")) ;; Crops (define (new-crop _) (render-page (new-crop-page))) (define (create-crop req) (define new-crop (formlet-process (crop-formlet) req)) (if (get-crop #:name (crop-name new-crop)) (update-crop! new-crop) (create-crop! new-crop)) (redirect-to "/ferti/crop-requirements")) (define (show-crop _ id) (define crop (get-crop #:id id)) (render-page (show-crop-page crop))) (define (edit-crop _ id) (define crop (get-crop #:id id)) (render-page (edit-crop-page crop))) (define (update-crop req) (define edited-crop (formlet-process (crop-formlet) req)) (update-crop! edited-crop) (redirect-to "/ferti/crop-requirements")) (define (destroy-crop _ id) (delete-crop! id) (redirect-to "/ferti/crop-requirements")) ;; 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 (formlet-process (fertilizer-formlet) req)) (create-fertilizer-product! new-fertilizer) (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")) ;; Crop requirements (define (new-requirement _) (render-page (new-crop-requirement-page))) (define (create-requirement req) (define new-requirement (formlet-process (crop-requirements-formlet) req)) (if (get-crop-requirement #:profile (crop-requirement-profile new-requirement)) (update-crop-requirement! new-requirement) (create-crop-requirement! new-requirement)) (redirect-to "/ferti/crop-requirements")) (define (show-requirement _ id) (define cr (get-crop-requirement #:id id)) (render-page (show-crop-requirement-page cr))) (define (edit-requirement _ id) (define cr (get-crop-requirement #:id id)) (render-page (edit-crop-requirement-page cr))) (define (update-requirement req) (define edited-nutrient-requirement (formlet-process (crop-requirements-formlet) req)) (update-crop-requirement! edited-nutrient-requirement) (redirect-to "/ferti/crop-requirements")) (define (destroy-requirement _ id) (delete-crop-requirement! id) (redirect-to "/ferti/crop-requirements")) ;; Fallback (define (fallback _) (render-page (fallback-page 404)))