diff --git a/src/bin/web.rs b/src/bin/web.rs index d821be8..cdae509 100644 --- a/src/bin/web.rs +++ b/src/bin/web.rs @@ -272,6 +272,35 @@ pub struct RestockEntryLegacy { best_before_date: i64, } +#[derive(Type, Deserialize, Serialize)] +pub struct ProductMetadata { + product_size: u32, + product_size_is_weight: bool, + container_size: u32, + calories: u32, + carbohydrates: u32, + fats: u32, + proteins: u32, + deposit: u32, + container_deposit: u32, +} + +impl Default for ProductMetadata { + fn default() -> Self { + Self { + product_size: 0, + product_size_is_weight: true, + container_size: 0, + calories: 0, + carbohydrates: 0, + fats: 0, + proteins: 0, + deposit: 0, + container_deposit: 0, + } + } +} + #[derive(Type, Deserialize, Serialize)] pub struct RestockEntry { timestamp: i64, @@ -436,6 +465,8 @@ trait ShopDB { async fn get_product_category(&self, ean: u64) -> zbus::Result; async fn get_product_deprecated(&self, ean: u64) -> zbus::Result; async fn product_deprecate(&self, ean: u64, deprecated: bool) -> zbus::Result<()>; + async fn product_metadata_get(&self, ean: u64) -> zbus::Result; + async fn product_metadata_set(&self, ean: u64, metadata: ProductMetadata) -> zbus::Result<()>; async fn get_restocks(&self, ean: u64, descending: bool) -> zbus::Result>; async fn bestbeforelist(&self) -> zbus::Result>; async fn get_supplier_list(&self) -> zbus::Result>; @@ -593,6 +624,18 @@ async fn product_deprecate(ean: u64, deprecated: bool) -> zbus::Result<()> { proxy.product_deprecate(ean, deprecated).await } +async fn product_metadata_get(ean: u64) -> zbus::Result { + let connection = Connection::system().await?; + let proxy = ShopDBProxy::new(&connection).await?; + proxy.product_metadata_get(ean).await +} + +async fn product_metadata_set(ean: u64, metadata: ProductMetadata) -> zbus::Result<()> { + let connection = Connection::system().await?; + let proxy = ShopDBProxy::new(&connection).await?; + proxy.product_metadata_set(ean, metadata).await +} + async fn restock(user: i32, product: u64, amount: u32, price: u32, supplier: i32, best_before_date: i64) -> zbus::Result<()> { let connection = Connection::system().await?; let proxy = ShopDBProxy::new(&connection).await?; @@ -1049,6 +1092,7 @@ async fn product_details(cookies: &CookieJar<'_>, ean: u64) -> Result, ean: u64) -> Result/deprecate/")] @@ -1187,6 +1231,28 @@ async fn web_product_alias_add(cookies: &CookieJar<'_>, ean: u64, alias: u64) -> Ok(Json(alias)) } +#[post("/products//metadata-set", format = "application/json", data = "")] +async fn web_product_metadata_set(cookies: &CookieJar<'_>, ean: u64, metadata: Json) -> Result, Forbidden> { + let session = match get_session(cookies).await { + Err(error) => { return Err(Forbidden(error.to_string())); }, + Ok(session) => session, + }; + + if !session.superuser && !session.auth_products { + return Err(Forbidden("Missing Permission".to_string())); + } + + let metadata = metadata.into_inner(); + + match product_metadata_set(ean, metadata).await { + Err(error) => { return Err(Forbidden(error.to_string())); }, // TODO + Ok(_) => {}, + }; + + Ok(Json(())) +} + + #[get("/aliases")] async fn aliases(cookies: &CookieJar<'_>) -> Result { let session = get_session(cookies).await?; @@ -1807,7 +1873,7 @@ fn rocket() -> _ { rocket::custom(figment) .register("/", catchers![not_found]) .mount("/static", rocket::fs::FileServer::from(staticpath)) - .mount("/", routes![login, logout, index, products, product_new, product_details, product_details_json, web_product_deprecate, web_product_add_prices, web_product_restock, web_product_alias_add, product_bestbefore, product_inventory, product_inventory_apply, aliases, suppliers, web_suppliers_new, cashbox, cashbox_state, cashbox_history_json, cashbox_update, cashbox_details, users, user_info, user_sound_theme_set, user_password_set, user_toggle_auth, user_invoice, user_invoice_full, user_stats, user_import, user_import_upload, user_import_apply, user_import_pgp, user_import_pgp_upload]) + .mount("/", routes![login, logout, index, products, product_new, product_details, product_details_json, web_product_deprecate, web_product_add_prices, web_product_restock, web_product_alias_add, web_product_metadata_set, product_bestbefore, product_inventory, product_inventory_apply, aliases, suppliers, web_suppliers_new, cashbox, cashbox_state, cashbox_history_json, cashbox_update, cashbox_details, users, user_info, user_sound_theme_set, user_password_set, user_toggle_auth, user_invoice, user_invoice_full, user_stats, user_import, user_import_upload, user_import_apply, user_import_pgp, user_import_pgp_upload]) .attach(Template::custom(|engines| { engines.tera.register_filter("cent2euro", cent2euro); engines.tera.register_filter("gendericon", gendericon); diff --git a/templates/products/details.html.tera b/templates/products/details.html.tera index 5e4ef57..8eeb0dd 100644 --- a/templates/products/details.html.tera +++ b/templates/products/details.html.tera @@ -61,6 +61,21 @@ {% endif %}
+

Metadata

+
+ + + + + + + + + + +
Product Size (e.g. 330ml, 100g)
Container Size (e.g. 20 bottles)
Calories (kcal)
(for product size)
Carbohydrates (g)
(for product size)
Fats (g)
(for product size)
Proteins (g)
(for product size)
Deposit (€)
Container Deposit (€)
+
+

Restock

@@ -188,6 +203,38 @@ } } + var submit_metadata = function() { + var product_size = parseInt($("#product_size").val()); + var product_size_is_weight = parseInt($("#product_size_is_weight").val()) == 1; + var container_size = parseInt($("#container_size").val()); + var calories = parseInt($("#calories").val()); + var carbohydrates = parseInt($("#carbohydrates").val()); + var fats = parseInt($("#fats").val()); + var proteins = parseInt($("#proteins").val()); + var deposit = euro2cent($("#deposit").val()); + var container_deposit = euro2cent($("#container_deposit").val()); + + var requestdata = { + product_size: product_size, + product_size_is_weight: product_size_is_weight, + container_size: container_size, + calories: calories, + carbohydrates: carbohydrates, + fats: fats, + proteins: proteins, + deposit: deposit, + container_deposit: container_deposit, + }; + + console.log("request: " + requestdata) + + var req = $.postJSON( + "/products/{{ ean }}/metadata-set", + requestdata, + function( data ) { } + ); + } + {% if session.auth_products %} $(function () { $('#addalias').popover({ @@ -204,6 +251,7 @@ $('#addalias').on('click', function (e) { submit_add_alias(); }); $('#addprices').on('click', function (e) { submit_add_prices(); }); $('#restock').on('click', function (e) { submit_restock(); }); + $('#updatemetadata').on('click', function (e) { submit_metadata(); }); $('#deprecatedbutton').on('click', function (e) { var state = $('#deprecatedbutton').html() === "Active";