From 99f49f5bedbf9cdd3ccdd689da3acb4fe8ff685e Mon Sep 17 00:00:00 2001 From: Curly Bryce Date: Wed, 3 Jul 2024 17:41:46 -0600 Subject: getting of tokovec --- README.md | 11 ++++++++++- src/db.rs | 19 +++++++++++++++++-- src/main.rs | 26 ++++++++++++++++++++++---- 3 files changed, 49 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 41c8fde..de06e31 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,16 @@ - JSON `"No available UID left"` - JSON `"UID length is incorrect"` - JSON `"UID String is not valid"` -- POST `/user` +- POST `/user/get` + - Request + - JSON `{"id": "ID", "session": "SESSION_KEY"}` + - Response + - 200 Ok + - JSON `{"name": "NAME", "id": "ID", tokovec: [{"color": "COLOR", "amount": 2}, ..]}` + - 404 Not Found + - JSON `"Not Found"` + - JSON `"Not Authenticated"` +- POST `/user/login` - Request - JSON `{"id": "ID", "password": "PASSWORD", "clientid": "CLIENT_ID"}` - Response diff --git a/src/db.rs b/src/db.rs index 28b1ec7..43a9f9c 100644 --- a/src/db.rs +++ b/src/db.rs @@ -18,7 +18,7 @@ impl Config { } #[derive(Debug, Serialize, Deserialize, Clone, Copy)] -enum Color { +pub enum Color { White, Red, Blue, @@ -27,7 +27,7 @@ enum Color { } #[derive(Debug, Serialize, Deserialize, Clone)] -struct Token { +pub struct Token { color: Color, amount: usize, } @@ -130,6 +130,9 @@ impl User { pub fn hex_id(&self) -> String { self.id.to_hex() } + pub fn get_tokovec(&self) -> Vec { + self.tokovec.clone() + } } #[derive(Serialize, Deserialize)] @@ -190,6 +193,18 @@ impl DB { Err("Not Found".into()) } + pub async fn get_user_authenticated(&self, id: &str, session: &String) -> Result<&User, String> { + match self.get_user(id).await { + Ok(u) => { + if u.authenticate(session) { + Ok(u) + } else { + Err("Not Authenticated".into()) + } + }, + Err(n) => Err(n) + } + } pub async fn get_mut_user(&mut self, id: &str) -> Result<&mut User, String> { match UID::from(id.to_string()) { Ok(n) => { diff --git a/src/main.rs b/src/main.rs index c48ceda..709b5b3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,13 +11,24 @@ mod db; use db::DB; use db::User; use db::Config; +use db::Token; #[get("/")] async fn index() -> &'static str { "This is a POKO server" } - +#[derive(Serialize)] +struct AuthUserOut { + name: String, + id: String, + tokovec: Vec, +} +impl Into for User { + fn into(self) -> AuthUserOut { + AuthUserOut { name: self.get_name(), id: self.hex_id(), tokovec: self.get_tokovec() } + } +} #[derive(Serialize)] struct UserOut { name: String, @@ -28,7 +39,14 @@ impl Into for User { UserOut { name: self.get_name(), id: self.hex_id() } } } - +#[post("/get", data="", format="json")] +async fn get_user_authenticated(data: Json, db: &State>) -> (Status, Result, Json>) { + let db = db.lock().await; + match db.get_user_authenticated(&data.id, &data.session).await { + Ok(n) => (Status::Ok, Ok(Json(n.clone().into()))), + Err(n) => (Status::NotFound, Err(n.into())) + } +} #[get("/")] async fn get_user(user: &str, db: &State>) -> (Status, Result, Json>) { let db = db.lock().await; @@ -118,7 +136,7 @@ struct LoginForm { password: String, clientid: String, } -#[post("/", data="", format="json")] +#[post("/login", data="", format="json", rank=2)] async fn login(data: Json, db: &State>) -> (Status, Json) { let mut db = db.lock().await; match db.login(&data.id, &data.password, &data.clientid).await { @@ -170,6 +188,6 @@ async fn delete(data: Json, db: &State>) -> (Status, Resul fn rocket() -> _ { rocket::build().manage(Mutex::new(DB::load(Config::new()))) .mount("/", routes![index]) - .mount("/user", routes![login, get_users_by_name, get_user, new_user, get_all_users, logout, logout_all, get_sessions, delete]) + .mount("/user", routes![login, get_users_by_name, get_user_authenticated, get_user, new_user, get_all_users, logout, logout_all, get_sessions, delete]) .mount("/transfer", routes![]) } \ No newline at end of file -- cgit v1.2.3