Add API to fetch a user by username
This commit is contained in:
parent
97627cefd1
commit
9e2f83f562
15
src/api.rs
15
src/api.rs
|
@ -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))
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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))
|
||||
|
|
Loading…
Reference in a new issue