(import-macros {:compile-html <>} :macros) (local templates (require :templates)) (local dicts (require :dicts)) (local lib (require :lib)) (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.description, products.price_per AS \"price-per\", products.type, products.stock, products.published, products.image1, products.image2, products.image3, products.image4, products.image5 FROM products WHERE products.name = ?" [name])) 1)) (fn content [product authenticated?] (local images []) (for [i 1 5] (table.insert images (. product (.. "image" i)))) [(<> [:div {:class "side"} (templates.header "/shop" authenticated?)]) (<> [:div {:class "content"} [:div {:class "mb-1"} [:a {:href "/shop"} "⟵ Обратно к списку"]] (let [link (.. "/static/files/" product.image1)] (<> [:a {:href link :target "_blank"} [:img {:class "product-page-img-mobile mb-1-5" :src (.. link "-thumbnail.jpg")}]])) [:div {:class "product-page-layout"} [:div {} [:h2 {:class "product-page-title mb-1"} product.title] [:section {:class "mb-2"} (if authenticated? (<> [:div {:class "mb-0-5"} [:a {:href (.. "/shop/" product.name "/edit")} "✎ Редактировать"]]) "") [:div {:class "mb-0-5" :style "font-style: italic;"} (or (dicts.label dicts.tea-type product.type) product.type) ", " [:strong {} (* 50 product.price-per) "₽ за 50 грамм "] (.. "(" product.price-per "₽ за 1 грамм)")]] [:div {:class "mb-2"} "~~~"] [:NO-ESCAPE (text->html product.description)]] [:div {:class "product-page-imgs"} (table.concat (icollect [idx image (ipairs images)] (let [link (.. "/static/files/" image)] (<> [:a {:href link :target "_blank"} [:img {:class "product-page-img" :src (.. link "-thumbnail.jpg")}]]))))]]])]) (fn render [request db authenticated?] (let [product (find-product db request.params._product)] (if (and product (or product.published authenticated?)) (values 200 {} (templates.base (content product authenticated?))) (values 404 {} "not found")))) {: render}