diff --git a/src/admin.rs b/src/admin.rs new file mode 100644 index 0000000..2b82622 --- /dev/null +++ b/src/admin.rs @@ -0,0 +1,61 @@ +use diesel::{insert_into, prelude::*, PgConnection}; +use rocket::serde::json::Json; +use uuid::Uuid; + +use crate::{ + auth::pass::hash_password, + db, + errors::{RbError, RbResult}, + guards::Admin, + schema::users::dsl as users, + RbDbConn, +}; + +#[get("/users")] +pub async fn get_users(_admin: Admin, conn: RbDbConn) -> RbResult>> +{ + Ok(Json(conn.run(|c| db::users::all(c)).await?)) +} + +#[post("/users", data = "")] +pub async fn create_user(_admin: Admin, conn: RbDbConn, user: Json) -> RbResult<()> +{ + Ok(conn + .run(move |c| db::users::create(c, &user.into_inner())) + .await?) +} + +#[get("/users/")] +pub async fn get_user_info( + _admin: Admin, + conn: RbDbConn, + user_id_str: &str, +) -> RbResult> +{ + let user_id = Uuid::parse_str(user_id_str).map_err(|_| RbError::UMUnknownUser)?; + + match conn.run(move |c| db::users::find(c, user_id)).await { + Some(user) => Ok(Json(user)), + None => Err(RbError::UMUnknownUser), + } +} + +pub fn create_admin_user(conn: &PgConnection, username: &str, password: &str) -> RbResult +{ + let pass_hashed = hash_password(password)?; + let new_user = db::NewUser { + username: username.to_string(), + password: pass_hashed, + admin: true, + }; + + insert_into(users::users) + .values(&new_user) + .on_conflict(users::username) + .do_update() + .set(&new_user) + .execute(conn) + .map_err(|_| RbError::Custom("Couldn't create admin."))?; + + Ok(true) +} diff --git a/src/auth/mod.rs b/src/auth/mod.rs index f239f9f..b4cbf0f 100644 --- a/src/auth/mod.rs +++ b/src/auth/mod.rs @@ -5,7 +5,7 @@ use self::{ jwt::{generate_jwt_token, JWTResponse}, pass::verify_user, }; -use crate::{guards::User, RbDbConn, RbResult}; +use crate::{errors::RbResult, guards::User, RbDbConn}; pub mod jwt; pub mod pass; diff --git a/src/auth/pass.rs b/src/auth/pass.rs index b67bf11..c8d5b96 100644 --- a/src/auth/pass.rs +++ b/src/auth/pass.rs @@ -4,9 +4,8 @@ use rand::{thread_rng, Rng}; use crate::{ db::users::{NewUser, User}, - errors::RbError, + errors::{RbError, RbResult}, schema::users::dsl as users, - RbResult, }; pub fn verify_user(conn: &PgConnection, username: &str, password: &str) -> RbResult @@ -39,23 +38,3 @@ pub fn hash_password(password: &str) -> RbResult argon2::hash_encoded(password.as_bytes(), &salt, &config) .map_err(|_| RbError::Custom("Couldn't hash password.")) } - -pub fn create_admin_user(conn: &PgConnection, username: &str, password: &str) -> RbResult -{ - let pass_hashed = hash_password(password)?; - let new_user = NewUser { - username: username.to_string(), - password: pass_hashed, - admin: true, - }; - - insert_into(users::users) - .values(&new_user) - .on_conflict(users::username) - .do_update() - .set(&new_user) - .execute(conn) - .map_err(|_| RbError::Custom("Couldn't create admin."))?; - - Ok(true) -} diff --git a/src/main.rs b/src/main.rs index fc15246..400c0e8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,13 +11,11 @@ extern crate diesel; use rocket::{fairing::AdHoc, Build, Rocket}; use rocket_sync_db_pools::database; -pub use crate::errors::{RbError, RbResult}; - +mod admin; pub mod auth; pub mod db; pub mod errors; pub mod guards; -mod routes; pub(crate) mod schema; // Any import defaults are defined here @@ -54,7 +52,7 @@ async fn create_admin_user(rocket: Rocket) -> Result, Rocke .await .expect("database connection"); conn.run(move |c| { - auth::pass::create_admin_user(c, &admin_user, &admin_password) + admin::create_admin_user(c, &admin_user, &admin_password) .expect("failed to create admin user") }) .await; @@ -76,5 +74,8 @@ fn rocket() -> _ "/api/auth", routes![auth::already_logged_in, auth::login, auth::refresh_token,], ) - .mount("/api/admin", routes::admin::routes()) + .mount( + "/api/admin", + routes![admin::get_users, admin::create_user, admin::get_user_info], + ) } diff --git a/src/routes/admin.rs b/src/routes/admin.rs deleted file mode 100644 index 741f4dd..0000000 --- a/src/routes/admin.rs +++ /dev/null @@ -1,40 +0,0 @@ -use rocket::serde::json::Json; -use uuid::Uuid; - -use crate::{ - db, - errors::{RbError, RbResult}, - guards::Admin, - RbDbConn, -}; - -pub fn routes() -> Vec -{ - routes![get_users, get_user_info, create_user] -} - -#[get("/users")] -async fn get_users(_admin: Admin, conn: RbDbConn) -> RbResult>> -{ - Ok(Json(conn.run(|c| db::users::all(c)).await?)) -} - -#[post("/users", data = "")] -async fn create_user(_admin: Admin, conn: RbDbConn, user: Json) -> RbResult<()> -{ - Ok(conn - .run(move |c| db::users::create(c, &user.into_inner())) - .await?) -} - -#[get("/users/")] -async fn get_user_info(_admin: Admin, conn: RbDbConn, user_id_str: &str) - -> RbResult> -{ - let user_id = Uuid::parse_str(user_id_str).map_err(|_| RbError::UMUnknownUser)?; - - match conn.run(move |c| db::users::find(c, user_id)).await { - Some(user) => Ok(Json(user)), - None => Err(RbError::UMUnknownUser), - } -} diff --git a/src/routes/mod.rs b/src/routes/mod.rs deleted file mode 100644 index 92918b0..0000000 --- a/src/routes/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod admin;