aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCurly Bryce <curlybryce@protonmail.com>2024-07-03 19:50:40 -0600
committerCurly Bryce <curlybryce@protonmail.com>2024-07-03 19:50:40 -0600
commit11ba5c3d7e039c3c092e45fdd55c0c6a9e144842 (patch)
tree0b9b2c737ca7791c33d2d0e5968341b3ba5bee20
parentc06632d0dfdb19e047ae1175a46b926e6772650f (diff)
downloadpoko_server-11ba5c3d7e039c3c092e45fdd55c0c6a9e144842.tar.gz
poko_server-11ba5c3d7e039c3c092e45fdd55c0c6a9e144842.tar.bz2
poko_server-11ba5c3d7e039c3c092e45fdd55c0c6a9e144842.zip
transfers
-rw-r--r--README.md14
-rw-r--r--TODO1
-rw-r--r--src/db.rs44
-rw-r--r--src/main.rs11
-rw-r--r--src/uid.rs5
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<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)
}
}