aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/db.rs44
-rw-r--r--src/main.rs11
-rw-r--r--src/uid.rs5
3 files changed, 48 insertions, 12 deletions
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<Vec<User>, 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<Mutex<DB>>) -> (Status, Result
Err(n) => (Status::NotFound, Err(n.into()))
}
}
-#[get("/all")]
+#[get("/list")]
async fn get_all_users(db: &State<Mutex<DB>>) -> (Status, Result<Json<Vec<UserOut>>, Json<String>>) {
let db = db.lock().await;
match db.get_all_users().await {
@@ -183,9 +183,12 @@ struct TransferForm {
amount: usize,
}
#[post("/out", data="<data>", format="json")]
-async fn transfer_out(data: Json<TransferForm>, db: &State<Mutex<DB>>) -> (Status, Result<(), String>) {
- println!("{:?}", data);
- (Status::Ok, Ok(()))
+async fn transfer_out(data: Json<TransferForm>, db: &State<Mutex<DB>>) -> (Status, Result<(), Json<String>>) {
+ 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<E>(self, v: &str) -> Result<Self::Value, E>
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<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de> {
- println!("TEST2");
deserializer.deserialize_str(UIDVisitor)
}
}