(import-macros {:compile-html HTML} :macros) (local lib (require :lib)) (local templates (require :templates)) (fn content-template [db basket basket-total] [(HTML [:div {:class "side"} (templates.header "/shop/order")]) (HTML [:div {:class "content"} (if (< 0 (# basket)) [:section {} [:h2 {} "Состав заказа"] [:div {} (table.unpack (icollect [_ item (ipairs basket)] (templates.basket-item item "/shop/order")))] [:div {} "~~~"] [:div {:class "basket-total"} (.. "Итого: " basket-total "₽")]] "") [:section {} [:h2 {} "Данные для связи"] [:form {:class "form" :method "POST"} [:div {:class "form-row"} [:label {:for "name"} "Имя"] [:input {:type "text" :id "name" :name "name" :required "required"}]] [:div {:class "form-row"} [:label {:for "contact"} "Телеграм или Email для связи"] [:input {:type "text" :id "contact" :name "contact" :required "required"}]] [:div {:class "form-row"} [:input {:type "checkbox" :id "everything-is-correct" :name "everything-is-correct" :required "required"}] [:label {:for "everything-is-correct"} "Данные заказа верны"]] [:div {:class "form-row"} [:input {:type "checkbox" :id "agree-to-conditions" :name "agree-to-conditions" :required "required"}] [:label {:for "agree-to-conditions"} "Согласен с условиями"]] [:button {:type "submit"} "Оформить заказ"]]]])]) (fn place-order [db order-id form] (_G.must (luna.db.exec db "UPDATE orders SET placement_time = ?, first_name = ?, contact = ?" [(lib.now) form.name form.contact]))) (fn render [request db] (let [order-id (lib.order-id request) basket (if order-id (lib.basket db order-id) []) basket-total (accumulate [sum 0 _ v (ipairs basket)] (+ sum (* v.quantity v.price-per)))] (if (= request.method "POST") (do (place-order db order-id (lib.parse-values request.body)) (values 302 {:Location "/shop/success"} "")) (if (< 0 (# basket)) (values 200 {} (templates.base (content-template db basket basket-total))) (values 302 {:Location "/shop"} ""))))) {: render}