summaryrefslogtreecommitdiff
path: root/pages/shop/_product/edit.fnl
blob: 3e4f2f067e32aa778dd49bdbb027e6ad03b1e834 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
(import-macros {:compile-html HTML} :macros)
(local templates (require :templates))
(local {: product-form} (require :pages.shop.add))
(local forms (require :forms))
(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-form 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})))
            (values 302 {:Location (.. "/shop/" data.name)} ""))))
      (values 200 {}
        (templates.base
          (content product-form (find-product db request.params._product) {}
                   authenticated?))))))

{: render }