(import-macros {:compile-html HTML} :macros) (local templates (require :templates)) (local lib (require :lib)) (local shop (require :shop)) (fn text->html [text] (assert (= (type text) "string")) (var result "") (var from 1) (var to (text:find "\n%s*\n%s*" from)) (while to (set result (.. result "

" (text:sub from (- to 1)) "

\n")) (set from (+ to 2)) (set to (text:find "\n%s*\n%s*" from))) (.. result "

" (text:sub from) "

")) (fn find-product [db name] (. (_G.must (luna.db.query-assoc db "SELECT products.name, products.title, products.short_description AS \"short-description\", products.description, products.price_per AS \"price-per\", products.type, products.region, products.stock, products.volume, products.packaging, products.published, products.year, products.image1, products.image2, products.image3, products.image4, products.image5 FROM products WHERE products.name = ?" [name])) 1)) (fn content [product basket agreed-to-cookies? authenticated?] (local redirect-url (.. "/shop/" product.name)) (local images []) (for [i 1 5] (table.insert images (. product (.. "image" i)))) [(HTML [:aside {} (templates.header "/shop" authenticated?) (if (< 0 (# basket)) (templates.basket basket redirect-url) "") (templates.address-block) (templates.conditions-block) (templates.contact-block)]) (HTML [:div {:class "content"} (if (not agreed-to-cookies?) (templates.cookies-agreement) "") [:div {:class "back"} [:a {:href "/shop"} "⟵ Обратно к списку"]] [:div {:class "product-page-layout"} [:section {} [:h2 {:class "product-page-title" :id "content"} product.title] (if authenticated? (HTML [:div {:class "mb-1" :style "margin-top: -0.5rem;"} [:a {:href (.. "/shop/" product.name "/edit")} "% Редактировать"]]) "") (templates.product-overview product "mb-0-5") (templates.add-to-basket-form product basket "mb-1-5" redirect-url) [:div {:class "mb-1"} product.short-description] (let [link (.. "/static/files/" product.image1)] (HTML [:a {:href link :target "_blank"} [:img {:class "product-page-img-mobile mb-1" :src (.. link "-thumbnail.jpg")}]])) (if (not (lib.empty? product.description)) (HTML [:div {:class "product-page-delimiter mb-1"} "***"]) "") (if (not (lib.empty? product.description)) (HTML [:div {} [:NO-ESCAPE (text->html product.description)]]) "")] [:div {:class "product-page-imgs"} (table.concat (icollect [idx image (ipairs images)] (let [link (.. "/static/files/" image) video? (lib.ends-with? (_G.must (luna.utf8.lower image)) ".webm")] (HTML [:a {:href link :target "_blank"} (if video? (HTML [:video {:class "product-page-img" :autoplay true :loop true :muted true} [:source {:src (.. "/static/files/" image) :type "video/webm"}]]) (HTML [:img {:class "product-page-img" :src (.. link "-thumbnail.jpg")}]))]))))]]])]) (fn render [request db authenticated?] (let [agreed-to-cookies? request.cookies.agreed-to-cookies product (find-product db request.params._product) order-id request.cookies.order basket (if order-id (shop.basket db order-id) [])] (if (and product (or product.published authenticated?)) (values 200 {} (templates.base (content product basket agreed-to-cookies? authenticated?) product.title (.. "Купить " product.title " в Омске: " product.short-description))) (values 404 {} "not found")))) {: render}