name VARCHAR(128) NOT NULL UNIQUE
);
+CREATE TABLE IF NOT EXISTS categories (
+ id SERIAL PRIMARY KEY,
+ name VARCHAR(128) NOT NULL UNIQUE
+);
+
+CREATE TABLE IF NOT EXISTS products_categories (
+ product_id INTEGER REFERENCES products (id),
+ category_id INTEGER REFERENCES categories (id),
+ PRIMARY KEY (product_id, category_id)
+);
+
CREATE TABLE IF NOT EXISTS payment_methods (
id SERIAL PRIMARY KEY,
name VARCHAR(128) NOT NULL UNIQUE
CREATE ROLE payments_tracker LOGIN;
GRANT SELECT
- ON TABLE shops, products, payment_methods, currencies, purchases
+ ON shops, products, categories, products_categories, payment_methods,
+ currencies, purchases
TO payments_tracker;
GRANT INSERT
- ON TABLE shops, products, payment_methods, currencies, purchases
+ ON shops, products, categories, products_categories, payment_methods,
+ currencies, purchases
TO payments_tracker;
GRANT UPDATE
- ON TABLE shops, products, payment_methods, currencies, purchases
+ ON shops, products, categories, products_categories, payment_methods,
+ currencies, purchases
TO payments_tracker;
GRANT USAGE, SELECT
- ON SEQUENCE shops_id_seq, products_id_seq, payment_methods_id_seq, currencies_id_seq , purchases_id_seq
+ ON SEQUENCE shops_id_seq, products_id_seq, categories_id_seq,
+ payment_methods_id_seq, currencies_id_seq , purchases_id_seq
TO payments_tracker;
/* Execute for the current database. */
IF EXISTS (SELECT * FROM pg_user WHERE usename = 'payments_tracker')
THEN
REVOKE SELECT
- ON TABLE shops, products, payment_methods, currencies, purchases
+ ON shops, products, categories, products_catagories, payment_methods,
+ currencies, purchases
FROM payments_tracker;
REVOKE INSERT
- ON TABLE shops, products, payment_methods, currencies, purchases
+ ON shops, products, categories, products_catagories, payment_methods,
+ currencies, purchases
FROM payments_tracker;
REVOKE UPDATE
- ON TABLE shops, products, payment_methods, currencies, purchases
+ ON shops, products, categories, products_catagories, payment_methods,
+ currencies, purchases
FROM payments_tracker;
REVOKE USAGE, SELECT
- ON SEQUENCE shops_id_seq, products_id_seq, payment_methods_id_seq, currencies_id_seq, purchases_id_seq
+ ON SEQUENCE shops_id_seq, products_id_seq, categories_id_seq,
+ payment_methods_id_seq, currencies_id_seq , purchases_id_seq
FROM payments_tracker;
EXECUTE
- FORMAT('REVOKE CONNECT
+ FORMAT('REVOKE CONNECT
ON DATABASE %I
FROM payments_tracker;', current_database());
DROP TABLE IF EXISTS purchases;
DROP TABLE IF EXISTS shops;
+DROP TABLE IF EXISTS products_categories;
+DROP TABLE IF EXISTS categories;
DROP TABLE IF EXISTS products;
DROP TABLE IF EXISTS payment_methods;
DROP TABLE IF EXISTS currencies;
shop=$(get_query_param "shop")
shop_id=$(insert_into "shops" "${shop}")
+category=$(get_query_param "category")
+category_id=$(insert_into "categories" "${category}")
+
product=$(get_query_param "product")
product_id=$(insert_into "products" "${product}")
discount="FALSE"
fi
+query_db "\
+INSERT INTO products_categories (product_id, category_id)
+VALUES (${product_id}, ${category_id})
+ON CONFLICT DO NOTHING" > /dev/null
+
purchase_id=$(query_db "\
WITH new_purchase_id AS (
INSERT INTO purchases (
</style>
</head>
<body>
-Recorded new purchase (id=${purchase_id}) of ${product} \
+Associated ${product} (id=${product_id}) with category ${category} \
+(id=${category_id}). Recorded new purchase (id=${purchase_id}) of ${product} \
(id=${product_id}) on ${purchase_date} in ${shop} (id=${shop_id}). Payed \
${price} ${currency} (id=${currency_id}) with ${payment_method} \
(id=${payment_method_id}) (discount=${discount}).
$(query_db "SELECT name FROM shops" | as_options)
</datalist>
+ <input list='categories' id='category' name='category'
+ placeholder='Category' required />
+ <datalist id='categories'>
+ $(query_db "SELECT name FROM categories" | as_options)
+ </datalist>
+
<input list='products' id='product' name='product' placeholder='Product'
required />
<datalist id='products'>