diff --git a/apps/frontend/src/pages/admin/user_email.vue b/apps/frontend/src/pages/admin/user_email.vue new file mode 100644 index 000000000..40b5e1886 --- /dev/null +++ b/apps/frontend/src/pages/admin/user_email.vue @@ -0,0 +1,61 @@ + + diff --git a/apps/labrinth/.sqlx/query-68619337ef34b588af21a40e5a60b54ce3a1dad45fb50bbc24a3ea34d2506578.json b/apps/labrinth/.sqlx/query-68619337ef34b588af21a40e5a60b54ce3a1dad45fb50bbc24a3ea34d2506578.json new file mode 100644 index 000000000..f24e4b06f --- /dev/null +++ b/apps/labrinth/.sqlx/query-68619337ef34b588af21a40e5a60b54ce3a1dad45fb50bbc24a3ea34d2506578.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT id FROM users\n WHERE LOWER(email) = LOWER($1)\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false + ] + }, + "hash": "68619337ef34b588af21a40e5a60b54ce3a1dad45fb50bbc24a3ea34d2506578" +} diff --git a/apps/labrinth/src/routes/v3/users.rs b/apps/labrinth/src/routes/v3/users.rs index 92422920c..a0f4111ac 100644 --- a/apps/labrinth/src/routes/v3/users.rs +++ b/apps/labrinth/src/routes/v3/users.rs @@ -28,6 +28,7 @@ use crate::{ pub fn config(cfg: &mut web::ServiceConfig) { cfg.route("user", web::get().to(user_auth_get)); cfg.route("users", web::get().to(users_get)); + cfg.route("user_email", web::get().to(admin_user_email)); cfg.service( web::scope("user") @@ -44,6 +45,62 @@ pub fn config(cfg: &mut web::ServiceConfig) { ); } +#[derive(Deserialize)] +pub struct UserEmailQuery { + pub email: String, +} + +pub async fn admin_user_email( + req: HttpRequest, + pool: web::Data, + redis: web::Data, + session_queue: web::Data, + email: web::Query, +) -> Result { + let user = get_user_from_headers( + &req, + &**pool, + &redis, + &session_queue, + Some(&[Scopes::SESSION_ACCESS]), + ) + .await + .map(|x| x.1)?; + + if !user.role.is_admin() { + return Err(ApiError::CustomAuthentication( + "You do not have permission to get a user from their email!" + .to_string(), + )); + } + + let user_id = sqlx::query!( + " + SELECT id FROM users + WHERE LOWER(email) = LOWER($1) + ", + email.email + ) + .fetch_optional(&**pool) + .await? + .map(|x| x.id) + .ok_or_else(|| { + ApiError::InvalidInput( + "The email provided is not associated with a user!".to_string(), + ) + })?; + + let user = + User::get_id(crate::database::models::UserId(user_id), &**pool, &redis) + .await?; + + if let Some(user) = user { + Ok(HttpResponse::Ok().json(user)) + } else { + Err(ApiError::NotFound) + } +} + pub async fn projects_list( req: HttpRequest, info: web::Path<(String,)>,