(import-macros {:compile-html HTML} :macros) (local templates (require :templates)) (local {: product-form} (require :pages.shop.add)) (local forms (require :forms)) (local shop (require :shop)) (local lib (require :lib)) (fn find-product [db name] (. (_G.must (luna.db.query-assoc db "SELECT products.published, products.name, products.title, products.position, products.short_description, products.recommendations, products.year, products.season, products.region, products.stock, products.type, products.packaging, products.description, products.price_per, products.stock, products.volume, products.vendor, products.vendor_article, products.vendor_description, products.vendor_price_per, products.vendor_product_link, products.image1, products.image2, products.image3, products.image4, products.image5 FROM products WHERE products.name = ?" [name])) 1)) (fn update-product [tx form data where] (let [sql-and-args (forms.form-update-sql-statement "products" form data {} where)] (if sql-and-args (_G.must (luna.db.exec-tx tx (table.unpack sql-and-args))) (error "empty data for insert SQL-statement")))) (fn content [form data errors authenticated?] [(HTML [:aside {} (templates.header "/shop" authenticated?)]) (HTML [:div {:class "content"} [:div {:class "back"} [:a {:href (.. "/shop/" data.name)} "⟵ Обратно к товару"]] [:h2 {} "Редактировать товар"] (forms.render-form form data errors)])]) (fn render [request db authenticated?] (if (not authenticated?) (values 302 {:Location "/shop"} "") (if request.form (let [data (forms.html-form->data product-form request.form db) errors (forms.validate product-form data) has-errors? (not (lib.empty-table? errors))] (if has-errors? (values 400 {} (templates.base (content product-form data errors authenticated?))) (do (lib.with-tx db (fn [tx] (update-product tx product-form data {:name request.params._product}) (shop.update-search-index tx))) (values 302 {:Location (.. "/shop/" data.name)} "")))) (values 200 {} (templates.base (content product-form (find-product db request.params._product) {} authenticated?)))))) {: render }