From 11ba5c3d7e039c3c092e45fdd55c0c6a9e144842 Mon Sep 17 00:00:00 2001 From: Curly Bryce Date: Wed, 3 Jul 2024 19:50:40 -0600 Subject: transfers --- README.md | 14 ++++++++++++-- TODO | 1 - src/db.rs | 44 ++++++++++++++++++++++++++++++++++++++++---- src/main.rs | 11 +++++++---- src/uid.rs | 5 +---- 5 files changed, 60 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index de06e31..abb254b 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ - JSON `[{"name": "NAME", "id": "ID"}, ...]` - 400 Not Found - JSON `"Not Found"` -- GET `/user/all` +- GET `/user/list` - Same as GET `/user/by_name/` - POST `/user/register` - Request @@ -77,4 +77,14 @@ - 200 Ok - JSON `"Deleted"` - 401 Unauthorized - - JSON `"Not Authenticated"` \ No newline at end of file + - JSON `"Not Authenticated"` +- POST `/transfer/out` + - Request + - JSON `{"id": "ID", "session": "SESSION_KEY", "to": "ID", "color": "COLOR", "amount": 0}` + - ID and SESSION_KEY are from the from account + - TO_ID is the account the tokens are going to + - amount may be 0 + - Response + - 200 Ok + - 500 Internal Server Error + - JSON `"Could not complete transaction"` \ No newline at end of file diff --git a/TODO b/TODO index 2ee5694..af593f0 100644 --- a/TODO +++ b/TODO @@ -1,5 +1,4 @@ Need to make a proper http status code thingy -Transfers Token Values Token Stock Prices (Values) Config \ No newline at end of file diff --git a/src/db.rs b/src/db.rs index a6ca7b0..85e259b 100644 --- a/src/db.rs +++ b/src/db.rs @@ -17,7 +17,7 @@ impl Config { } } -#[derive(Debug, Serialize, Deserialize, Clone, Copy)] +#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq)] pub enum Color { White, Red, @@ -186,7 +186,7 @@ impl DB { } } - Err("Not Found".into()) + Err("User Not Found".into()) } pub async fn get_user_authenticated(&self, id: UID, session: &String) -> Result<&User, String> { @@ -208,7 +208,7 @@ impl DB { } } - Err("Not Found".into()) + Err("User Not Found".into()) } pub async fn get_user_by_name(&self, name: &str) -> Result, String> { @@ -220,7 +220,7 @@ impl DB { } if vec.len() == 0 { - Err("Not Found".into()) + Err("User(s) Not Found".into()) } else { return Ok(vec) } @@ -303,4 +303,40 @@ impl DB { let _ = self.save().await; r } + + pub async fn transfer(&mut self, from: UID, to: UID, session: &String, color: Color, amount: usize) -> Result<(), String> { + let mut subtracted = false; + + let from = self.get_mut_user(from).await?; + // If authenticated + if from.authenticate(session) { + for v in from.tokovec.iter_mut() { + // Get the token of the right color + if v.color == color { + // If amount is greater or equal to amount being sent + // and if the amount does not overflow past 0 + if v.amount >= amount && v.amount.checked_sub(amount) != None { + // Remove from account + v.amount -= amount; + subtracted = true; + } + } + } + } + + let to = self.get_mut_user(to).await?; + if subtracted { + for v in to.tokovec.iter_mut() { + if v.color == color { + v.amount += amount + } + } + + let _ = self.save().await; + Ok(()) + } else { + Err("Could not complete transaction".into()) + } + + } } diff --git a/src/main.rs b/src/main.rs index aad989f..62ae685 100644 --- a/src/main.rs +++ b/src/main.rs @@ -60,7 +60,7 @@ async fn get_users_by_name(user: &str, db: &State>) -> (Status, Result Err(n) => (Status::NotFound, Err(n.into())) } } -#[get("/all")] +#[get("/list")] async fn get_all_users(db: &State>) -> (Status, Result>, Json>) { let db = db.lock().await; match db.get_all_users().await { @@ -183,9 +183,12 @@ struct TransferForm { amount: usize, } #[post("/out", data="", format="json")] -async fn transfer_out(data: Json, db: &State>) -> (Status, Result<(), String>) { - println!("{:?}", data); - (Status::Ok, Ok(())) +async fn transfer_out(data: Json, db: &State>) -> (Status, Result<(), Json>) { + let mut db = db.lock().await; + match db.transfer(data.id, data.to, &data.session, data.color, data.amount).await { + Ok(n) => (Status::Ok, Ok(n.into())), + Err(n) => (Status::InternalServerError, Err(n.into())) + } } #[launch] diff --git a/src/uid.rs b/src/uid.rs index 6a748cd..6361638 100644 --- a/src/uid.rs +++ b/src/uid.rs @@ -1,6 +1,6 @@ use base16ct::lower; use rocket::request::FromParam; -use serde::{de::{IntoDeserializer, Visitor}, ser::SerializeTupleStruct, Deserialize, Deserializer, Serialize}; +use serde::{de::{IntoDeserializer, Visitor}, Deserialize, Deserializer, Serialize}; #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct UID(u8, u8); @@ -16,7 +16,6 @@ impl<'de> Visitor<'de> for UIDVisitor { fn visit_str(self, v: &str) -> Result where E: serde::de::Error, { - println!("TEST"); if v.is_ascii() { if v.len() == 4 { match hex::decode(v) { @@ -24,7 +23,6 @@ impl<'de> Visitor<'de> for UIDVisitor { Err(_) => panic!() } } else { - println!("NOT"); panic!() } } else { @@ -36,7 +34,6 @@ impl<'de> Deserialize<'de> for UID { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de> { - println!("TEST2"); deserializer.deserialize_str(UIDVisitor) } } -- cgit v1.2.3