summaryrefslogtreecommitdiff
path: root/pages/shop/cart
diff options
context:
space:
mode:
Diffstat (limited to 'pages/shop/cart')
-rw-r--r--pages/shop/cart/add.fnl38
-rw-r--r--pages/shop/cart/remove.fnl23
2 files changed, 61 insertions, 0 deletions
diff --git a/pages/shop/cart/add.fnl b/pages/shop/cart/add.fnl
new file mode 100644
index 0000000..36e3e41
--- /dev/null
+++ b/pages/shop/cart/add.fnl
@@ -0,0 +1,38 @@
+(local lib (require :lib))
+
+(fn create-order [db]
+ (let [id (_G.must (luna.crypto.random-string 64))]
+ (_G.must
+ (luna.db.exec
+ db "INSERT INTO orders (id, creation_time) VALUES (?, ?)"
+ [id (lib.now)]))
+ id))
+
+(fn create-order-line [db order-id name quantity]
+ (_G.must
+ (luna.db.exec
+ db
+ "INSERT INTO order_lines (order_id, product_name, quantity) VALUES (?, ?, ?)"
+ [order-id name quantity])))
+
+(fn render [request db]
+ (if (= request.method "POST")
+ (do
+ (var order-id (lib.order-id request))
+ (var headers
+ (if (not order-id)
+ (do
+ (set order-id (create-order db))
+ {:Set-Cookie (.. "order= " order-id "; HttpOnly; SameSite=strict"
+ (if luna.debug? "" "; Secure"))})
+ {}))
+
+ (if (and order-id request.body)
+ (let [body-values (lib.parse-values request.body)]
+ (create-order-line db order-id body-values.name body-values.quantity)
+ (tset headers :Location "/shop")
+ (values 302 headers ""))
+ (values 400 {} "bad body")))
+ (values 404 {} "not found")))
+
+{: render}
diff --git a/pages/shop/cart/remove.fnl b/pages/shop/cart/remove.fnl
new file mode 100644
index 0000000..d5e3531
--- /dev/null
+++ b/pages/shop/cart/remove.fnl
@@ -0,0 +1,23 @@
+(local lib (require :lib))
+
+(fn render [request db]
+ (if (= request.method "POST")
+ (let [order-id (lib.order-id request)]
+ (if (and order-id request.body)
+ (do
+ (local body-values (lib.parse-values request.body))
+ (_G.must
+ (luna.db.exec
+ db
+ "DELETE FROM order_lines WHERE id = ? AND order_id = ?"
+ [body-values.id order-id]))
+ (values
+ 302
+ {:Location (_G.must
+ (luna.http.decode-url
+ (or body-values.redirect-url "/shop")))}
+ ""))
+ (values 400 {} "bad body")))
+ (values 404 {} "not found")))
+
+{: render}