move to api

This commit is contained in:
JMARyA 2024-04-04 07:41:13 +02:00
parent c012683af1
commit 9da4ef072c
Signed by: jmarya
GPG key ID: 901B2ADDF27C2263
6 changed files with 14 additions and 35 deletions

View file

@ -0,0 +1,70 @@
use actix_web::{get, post, HttpRequest, Responder};
use maud::html;
use crate::item;
#[derive(serde::Serialize, serde::Deserialize)]
struct AddinventoryForm {
variant: String,
origin: String,
price: f64,
}
#[post("/item/{item_id}/inventory/add")]
pub async fn add_item_inventory_page_post(
r: HttpRequest,
f: actix_web::web::Form<AddinventoryForm>,
) -> impl Responder {
let id = r.match_info().query("item_id");
let itemdb: &actix_web::web::Data<item::ItemDB> = r.app_data().unwrap();
let item = itemdb.get_item(id).unwrap();
let rec_id = item.add_inventory(&f.variant, &f.origin, f.price).await;
// todo : generate receipts
web_base::redirect(&format!("/receipt/{}", rec_id))
}
#[get("/item/{item_id}/inventory/add")]
pub async fn add_item_inventory_page(r: HttpRequest) -> impl Responder {
let id = r.match_info().query("item_id");
let itemdb: &actix_web::web::Data<item::ItemDB> = r.app_data().unwrap();
let item = itemdb.get_item(id).unwrap();
let item_variants = item.get_variants().await;
// todo : get previous origins
let item_origins = item.get_origins().await;
let content = html!(
div class="bg-white p-8 rounded shadow-md max-w-md grid items-center justify-center m-auto mt-5" {
h1 class="text-2xl font-bold mb-4" { "Add Item inventory" };
form action=(format!("/item/{}/inventory/add", id)) method="post" {
div {
label class="text-sm font-medium text-gray-600 mr-3" for="variant" { "Variant:" };
select class="mt-1 p-2 border border-gray-300 rounded focus:outline-none focus:border-blue-500" id="variant" name="variant" {
@for variant in item_variants {
option value=(variant) { (variant) };
};
};
};
br;
label class="text-sm font-medium text-gray-600" for="origin" { "Origin:" };
input class="mt-1 p-2 border border-gray-300 rounded focus:outline-none focus:border-blue-500" type="text" name="origin" list="origin_options" placeholder="Origin";
datalist id="origin_options" {
@for origin in item_origins {
option value=(origin);
}
};
br;
label class="text-sm font-medium text-gray-600" for="price" { "Price: "};
input class="mt-1 p-2 border border-gray-300 rounded focus:outline-none focus:border-blue-500" type="number" step="0.01" name="price" placeholder="0.00";
br;
input class="hover:cursor-pointer bg-blue-500 text-white rounded px-4 py-2 mt-5" type="submit" name="submit" value="Add";
};
};
).into_string();
web_base::build_site(&r, "Add Item inventory", &content)
}

50
src/routes/item/mod.rs Normal file
View file

@ -0,0 +1,50 @@
use actix_web::{get, HttpRequest, Responder};
use maud::html;
pub mod inventory_page;
pub mod variant_pages;
use crate::item;
#[get("/item/{item_id}")]
pub async fn item_page(r: HttpRequest) -> impl Responder {
let id = r.match_info().query("item_id");
println!("{}", id);
let itemdb: &actix_web::web::Data<item::ItemDB> = r.app_data().unwrap();
let item = itemdb.get_item(id).unwrap();
let content =
html!(
div class="bg-gray-100 min-h-screen min-w-screen items-center justify-center py-5" {
div class="w-screen px-5" {
div {
p class="mb-2 font-bold text-2xl" { (format!("Item : {}", item.item.name)) };
p class="font-bold" { (format!("Category: {}", item.item.category))};
};
div class="mt-5" {
// (button("Add Variant", &format!("/item/{}/variant/add", item.item.name)))
// (button("Add inventory", &format!("/item/{}/inventory/add", item.item.name)));
};
};
div class="mt-5 px-5" {
h1 class="text-2xl font-bold mb-4" { "Variants" };
@for variant in item.get_variants().await {
p class="mb-2" { (variant) };
}
@for q in item.get_inventory_entries().await {
div class="p-2" {
p { (format!("Variant {}", q.variant_name))};
p { (format!("Origin {}", q.origin))};
p { (format!("Price {}", q.price))};
};
}
};
};
)
.into_string();
web_base::build_site(&r, "Item", &content)
}

View file

@ -0,0 +1,43 @@
use actix_web::{get, post, HttpRequest, Responder};
use maud::html;
use crate::item;
#[derive(serde::Serialize, serde::Deserialize)]
struct AddVariantForm {
variant_name: String,
}
#[post("/item/{item_id}/variant/add")]
pub async fn add_item_variant_page_post(
r: HttpRequest,
f: actix_web::web::Form<AddVariantForm>,
) -> impl Responder {
let id = r.match_info().query("item_id");
let itemdb: &actix_web::web::Data<item::ItemDB> = r.app_data().unwrap();
let item = itemdb.get_item(id).unwrap();
item.add_variant(&f.variant_name).await;
web_base::redirect(&format!("/item/{}", id))
}
#[get("/item/{item_id}/variant/add")]
pub async fn add_item_variant_page(r: HttpRequest) -> impl Responder {
let id = r.match_info().query("item_id");
let itemdb: &actix_web::web::Data<item::ItemDB> = r.app_data().unwrap();
let item = itemdb.get_item(id).unwrap();
let content = html!(
div class="bg-white p-8 rounded shadow-md max-w-md grid items-center justify-center m-auto mt-5" {
h1 class="text-2xl font-bold mb-4" { "Add Variant for " (item.item.name) };
form action=(format!("/item/{}/variant/add", id)) method="post" {
input class="mt-1 p-2 border border-gray-300 rounded focus:outline-none focus:border-blue-500" type="text" name="variant_name" placeholder="Name" { };
input class="ml-5 hover:cursor-pointer bg-blue-500 text-white rounded px-4 py-2 mt-5" type="submit" name="submit" value="Add";
};
};
).into_string();
web_base::build_site(&r, "Add Item Variant", &content)
}