Add API to fetch a user by username

This commit is contained in:
Yash Karandikar 2022-02-09 13:14:15 -06:00
parent 97627cefd1
commit 9e2f83f562
3 changed files with 50 additions and 2 deletions

View file

@ -1,5 +1,5 @@
use crate::{
database::{Issue, PartialIssue, PartialUser},
database::{Issue, PartialIssue, PartialUser, User},
EXECONN,
};
use rocket::serde::json::Json;
@ -51,3 +51,16 @@ pub async fn register(user_input: Json<PartialUser>) -> io::Result<()> {
Ok(())
}
#[get("/api/user/by_username/<username>")]
pub async fn get_user_by_username(username: String) -> Option<Json<User>> {
let x = EXECONN
.lock()
.await
.as_ref()?
.get_user_by_username(username)
.await
.unwrap_or_default();
Some(Json(x))
}

View file

@ -16,6 +16,9 @@ enum Task {
// channel(id), username, hashed password
CreateUser(oneshot::Sender<Option<i64>>, String, String),
// channel(user), username
GetUserByUsername(oneshot::Sender<Option<User>>, String),
}
pub struct DbExecutor {
@ -52,6 +55,13 @@ pub struct PartialUser {
pub password_hash: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct User {
pub id: i32,
pub username: String,
pub password_hash: String,
}
macro_rules! executor_wrapper {
($name:ident, $task:expr, $ret:ty, $($arg:ident: $ty:ty),*) => {
pub async fn $name(&self, $($arg: $ty),*) -> $ret {
@ -89,6 +99,12 @@ impl ExecutorConnection {
username: String,
password_hash: String
);
executor_wrapper!(
get_user_by_username,
Task::GetUserByUsername,
Option<User>,
username: String
);
}
impl DbExecutor {
@ -158,6 +174,24 @@ impl DbExecutor {
.unwrap();
tx.send(id).unwrap();
}
Task::GetUserByUsername(tx, username) => {
let user = self
.db
.query_row(
"select * from users where username=?",
params![username],
|r| {
Ok(User {
id: r.get(0).unwrap(),
username: r.get(1).unwrap(),
password_hash: r.get(2).unwrap(),
})
},
)
.optional()
.unwrap();
tx.send(user).unwrap();
}
}
}
}

View file

@ -62,7 +62,8 @@ async fn main() {
api::all_issues,
api::get_issue,
api::add_issue,
api::register
api::register,
api::get_user_by_username
],
)
.mount("/", FileServer::from("app/dist").rank(1))