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,)>,