add min + expiry
This commit is contained in:
parent
0e174dc06e
commit
e1618b40ef
7 changed files with 88 additions and 17 deletions
12
Cargo.lock
generated
12
Cargo.lock
generated
|
@ -1242,7 +1242,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "mongod"
|
name = "mongod"
|
||||||
version = "0.2.1"
|
version = "0.2.1"
|
||||||
source = "git+https://git.hydrar.de/jmarya/mongod#9b56a434e7fe32ba2157d0b9f725a43c74a3971a"
|
source = "git+https://git.hydrar.de/jmarya/mongod#9784c3cac65e5a1305e4f0e4ec769316eacced3c"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"chrono",
|
"chrono",
|
||||||
"futures",
|
"futures",
|
||||||
|
@ -1258,7 +1258,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "mongod_derive"
|
name = "mongod_derive"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://git.hydrar.de/jmarya/mongod#9b56a434e7fe32ba2157d0b9f725a43c74a3971a"
|
source = "git+https://git.hydrar.de/jmarya/mongod#9784c3cac65e5a1305e4f0e4ec769316eacced3c"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"case",
|
"case",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
|
@ -1369,9 +1369,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "object"
|
name = "object"
|
||||||
version = "0.36.3"
|
version = "0.36.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "27b64972346851a39438c60b341ebc01bba47464ae329e55cf343eb93964efd9"
|
checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"memchr",
|
"memchr",
|
||||||
]
|
]
|
||||||
|
@ -2252,9 +2252,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tokio"
|
name = "tokio"
|
||||||
version = "1.39.3"
|
version = "1.40.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9babc99b9923bfa4804bd74722ff02c0381021eafa4db9949217e3be8e84fff5"
|
checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"backtrace",
|
"backtrace",
|
||||||
"bytes",
|
"bytes",
|
||||||
|
|
|
@ -26,6 +26,16 @@
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"title": "Variant Name",
|
"title": "Variant Name",
|
||||||
"description": "The name of the Variant"
|
"description": "The name of the Variant"
|
||||||
|
},
|
||||||
|
"min": {
|
||||||
|
"type": "number",
|
||||||
|
"title": "Minimum inventory",
|
||||||
|
"description": "The minimum amount of inventory for an Item. Thre actual inventory amount should always be higher than that."
|
||||||
|
},
|
||||||
|
"expiry": {
|
||||||
|
"type": "number",
|
||||||
|
"title": "Expiry days",
|
||||||
|
"description": "Number of days until this item variant is considered expired."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -121,7 +121,8 @@ impl Item {
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
json!({
|
json!({
|
||||||
"item": self.name,
|
"uuid": self._id,
|
||||||
|
"name": self.name,
|
||||||
"category": self.category,
|
"category": self.category,
|
||||||
"variants": variants
|
"variants": variants
|
||||||
})
|
})
|
||||||
|
|
|
@ -5,6 +5,7 @@ mod supply;
|
||||||
pub use demand::*;
|
pub use demand::*;
|
||||||
pub use error::*;
|
pub use error::*;
|
||||||
use mongod::Model;
|
use mongod::Model;
|
||||||
|
use mongod::ToAPI;
|
||||||
pub use supply::*;
|
pub use supply::*;
|
||||||
|
|
||||||
use rocket::get;
|
use rocket::get;
|
||||||
|
@ -53,7 +54,7 @@ pub async fn transaction_route(transaction: &str) -> FallibleApiResponse {
|
||||||
let t = Transaction::get(transaction)
|
let t = Transaction::get(transaction)
|
||||||
.await
|
.await
|
||||||
.ok_or_else(|| api_error("No transaction with this UUID"))?;
|
.ok_or_else(|| api_error("No transaction with this UUID"))?;
|
||||||
Ok(t.api_json())
|
Ok(t.api().await)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns unique values for a field
|
/// Returns unique values for a field
|
||||||
|
|
|
@ -74,10 +74,7 @@ pub async fn inventory_route(
|
||||||
|
|
||||||
let transactions = variant.inventory().await;
|
let transactions = variant.inventory().await;
|
||||||
|
|
||||||
Ok(json!(transactions
|
Ok(json!(mongod::vec_to_api(&transactions).await))
|
||||||
.into_iter()
|
|
||||||
.map(|x| x.api_json())
|
|
||||||
.collect::<Vec<_>>()))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns statistics for the Item Variant
|
/// Returns statistics for the Item Variant
|
||||||
|
|
|
@ -6,6 +6,8 @@ use mongodb::bson::doc;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use serde_json::json;
|
use serde_json::json;
|
||||||
|
|
||||||
|
use crate::item::Item;
|
||||||
|
|
||||||
/// A Transaction of an Item Variant
|
/// A Transaction of an Item Variant
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize, Model, Referencable)]
|
#[derive(Debug, Clone, Serialize, Deserialize, Model, Referencable)]
|
||||||
pub struct Transaction {
|
pub struct Transaction {
|
||||||
|
@ -64,7 +66,33 @@ impl Transaction {
|
||||||
.ok().unwrap();
|
.ok().unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn api_json(&self) -> serde_json::Value {
|
pub async fn is_expired(&self) -> bool {
|
||||||
|
let current_time = chrono::Utc::now().timestamp();
|
||||||
|
|
||||||
|
if let Some(expiry) = Item::get(&self.item)
|
||||||
|
.await
|
||||||
|
.unwrap()
|
||||||
|
.variant(&self.variant)
|
||||||
|
.unwrap()
|
||||||
|
.expiry
|
||||||
|
{
|
||||||
|
let date_added = self.timestamp;
|
||||||
|
|
||||||
|
let expiration_ts = expiry * 24 * 60 * 60;
|
||||||
|
|
||||||
|
if (date_added + expiration_ts) < current_time {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl mongod::ToAPI for Transaction {
|
||||||
|
async fn api(&self) -> serde_json::Value {
|
||||||
json!({
|
json!({
|
||||||
"uuid": self._id,
|
"uuid": self._id,
|
||||||
"item": self.item,
|
"item": self.item,
|
||||||
|
@ -72,7 +100,8 @@ impl Transaction {
|
||||||
"price": self.price,
|
"price": self.price,
|
||||||
"origin": self.origin,
|
"origin": self.origin,
|
||||||
"timestamp": self.timestamp,
|
"timestamp": self.timestamp,
|
||||||
"consumed": self.consumed
|
"consumed": self.consumed,
|
||||||
|
"expired": self.is_expired().await
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,6 +43,10 @@ pub struct Variant {
|
||||||
pub variant: String,
|
pub variant: String,
|
||||||
/// Variant Name
|
/// Variant Name
|
||||||
pub name: String,
|
pub name: String,
|
||||||
|
/// Minimum amount
|
||||||
|
pub min: Option<i64>,
|
||||||
|
/// Days until expiry
|
||||||
|
pub expiry: Option<i64>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Variant {
|
impl Variant {
|
||||||
|
@ -59,6 +63,16 @@ impl Variant {
|
||||||
.as_str()
|
.as_str()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.to_string(),
|
.to_string(),
|
||||||
|
min: json
|
||||||
|
.as_mapping()
|
||||||
|
.unwrap()
|
||||||
|
.get("min")
|
||||||
|
.map(|x| x.as_i64().unwrap()),
|
||||||
|
expiry: json
|
||||||
|
.as_mapping()
|
||||||
|
.unwrap()
|
||||||
|
.get("expiry")
|
||||||
|
.map(|x| x.as_i64().unwrap()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,7 +99,7 @@ impl Variant {
|
||||||
let filter = doc! {
|
let filter = doc! {
|
||||||
"item": &self.item,
|
"item": &self.item,
|
||||||
"variant": &self.variant,
|
"variant": &self.variant,
|
||||||
"consumed": { "$exists": false }
|
"consumed": { "$not": { "$type": "object" } }
|
||||||
};
|
};
|
||||||
|
|
||||||
Transaction::find(filter, None, None).await.unwrap()
|
Transaction::find(filter, None, None).await.unwrap()
|
||||||
|
@ -95,7 +109,7 @@ impl Variant {
|
||||||
let filter = doc! {
|
let filter = doc! {
|
||||||
"item": &self.item,
|
"item": &self.item,
|
||||||
"variant": &self.variant,
|
"variant": &self.variant,
|
||||||
"consumed": { "$exists": true }
|
"consumed": { "$type": "object" }
|
||||||
};
|
};
|
||||||
|
|
||||||
let result = Transaction::find_partial(filter, json!({}), None, None)
|
let result = Transaction::find_partial(filter, json!({}), None, None)
|
||||||
|
@ -184,6 +198,23 @@ impl Variant {
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn price_history_by_origin(&self, origin: &str) -> Vec<Price> {
|
||||||
|
Transaction::find(
|
||||||
|
doc! {
|
||||||
|
"item": &self.item,
|
||||||
|
"variant": &self.variant,
|
||||||
|
"origin": origin
|
||||||
|
},
|
||||||
|
None,
|
||||||
|
Some(sort_by_timestamp()),
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
.unwrap()
|
||||||
|
.into_iter()
|
||||||
|
.map(|x| x.price)
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn get_latest_price(&self, origin: Option<String>) -> Price {
|
pub async fn get_latest_price(&self, origin: Option<String>) -> Price {
|
||||||
let mut filter = doc! {
|
let mut filter = doc! {
|
||||||
"item": &self.item,
|
"item": &self.item,
|
||||||
|
@ -219,7 +250,9 @@ impl Variant {
|
||||||
json!({
|
json!({
|
||||||
"item": self.item,
|
"item": self.item,
|
||||||
"variant": self.variant,
|
"variant": self.variant,
|
||||||
"name": self.name
|
"name": self.name,
|
||||||
|
"min": self.min,
|
||||||
|
"expiry": self.expiry
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue