This commit is contained in:
JMARyA 2024-05-02 16:13:31 +02:00
parent d913772f3b
commit 6d43193959
Signed by: jmarya
GPG key ID: 901B2ADDF27C2263
7 changed files with 382 additions and 323 deletions

648
Cargo.lock generated

File diff suppressed because it is too large Load diff

View file

@ -10,7 +10,7 @@ env_logger = "0.10.1"
futures = "0.3.30"
log = "0.4.20"
maud = "0.25.0"
mdq = { git = "https://git.hydrar.de/mdtools/mdq", version = "0.1.0" }
mdq = { git = "https://git.hydrar.de/mdtools/mdq", version = "0.3.0" }
mongodb = "2.8.0"
serde = { version = "1.0.195", features = ["derive"] }
serde_json = "1.0.111"

View file

@ -8,6 +8,8 @@ services:
- mongodb
volumes:
- ./itemdb:/itemdb
environment:
- "DB_URI=mongodb://user:pass@mongodb:27017"
mongodb:
image: mongo:latest

View file

@ -4,6 +4,7 @@ use futures::TryStreamExt;
use mongodb::{bson::doc, Collection};
// todo : api key auth
// todo : oid identifiers
// case: itemset
// items describe generic top level structure
@ -189,23 +190,37 @@ impl Item {
ret
}
pub fn variant(&self, variant: &str) -> Option<Variant> {
pub async fn variant(&self, variant: &str) -> Option<Variant> {
// todo : check if avail
let variants: Collection<mongodb::bson::Document> =
self.db.database("cdb").collection("variants");
let res = variants
.find_one(
doc! {
"item": self.item.name.clone(),
"variant": variant
},
None,
)
.await
.unwrap()?;
Some(Variant {
item: self.item.name.clone(),
variant: variant.to_string(),
})
}
pub async fn add_variant(&self, name: &str) {
pub async fn add_variant(&self, name: &str, amount: usize) {
let variants: Collection<mongodb::bson::Document> =
self.db.database("cdb").collection("variants");
variants
.insert_one(
mongodb::bson::doc! {
"oid": format!("{}-{}", self.item.name.clone(), name.clone()),
"oid": format!("{}-{}", self.item.name.clone(), name),
"item": self.item.name.clone(),
"variant": name
"variant": name,
"amount": amount as i64
},
None,
)
@ -413,6 +428,7 @@ impl ItemDB {
))
}
/// Get all items
pub fn items(&self) -> Vec<String> {
let mut ret = vec![];
for item in &self.index.documents {

View file

@ -39,6 +39,7 @@ async fn main() -> std::io::Result<()> {
.service(routes::item::supply_route)
.service(routes::item::item_variants_page)
.service(routes::item::get_items_route)
.service(routes::item::add_variant_route)
})
.bind(("0.0.0.0".to_string(), 8080))?
.run()

View file

@ -3,6 +3,7 @@ use actix_web::{get, HttpRequest, HttpResponse, Responder};
use serde::Deserialize;
use crate::item;
use crate::routes::bad_req;
macro_rules! get_itemdb {
($req:expr) => {{
@ -31,6 +32,7 @@ pub async fn supply_route(
.get_item(&form.item)
.ok_or_else(|| actix_web::error::ErrorBadRequest("The item does not exist"))?
.variant(&form.variant)
.await
.ok_or_else(|| actix_web::error::ErrorBadRequest("The variant does not exist"))?;
let transaction_id = variant
.supply(
@ -49,13 +51,33 @@ pub async fn get_items_route(r: HttpRequest) -> impl Responder {
actix_web::HttpResponse::Ok().json(serde_json::json!({"items": items}))
}
#[derive(Deserialize, Debug)]
pub struct AddVariantForm {
pub variant: String,
pub amount: usize,
}
#[post("/item/{item_id}/variant")]
pub async fn add_variant_route(
r: HttpRequest,
f: actix_web::web::Form<AddVariantForm>,
) -> actix_web::Result<impl Responder> {
let id = r.match_info().query("item_id");
let itemdb = get_itemdb!(r);
let item = itemdb
.get_item(id)
.ok_or_else(|| bad_req("The item does not exist"))?;
item.add_variant(&f.variant, f.amount);
Ok(HttpResponse::Ok())
}
#[get("/item/{item_id}/variants")]
pub async fn item_variants_page(r: HttpRequest) -> actix_web::Result<impl Responder> {
let id = r.match_info().query("item_id");
let itemdb = get_itemdb!(r);
let item = itemdb
.get_item(id)
.ok_or_else(|| actix_web::error::ErrorBadRequest("The item does not exist"))?;
.ok_or_else(|| bad_req("The item does not exist"))?;
let variants = item.get_variants().await;
Ok(HttpResponse::Ok().json(serde_json::json!({

View file

@ -1 +1,5 @@
pub mod item;
pub fn bad_req(msg: &'static str) -> actix_web::Error {
actix_web::error::ErrorBadRequest(msg)
}