Skip to main content

tuwunel_api/client/admin/users/
lookup_threepid.rs

1use axum::extract::State;
2use synapse_admin_api::users::lookup_threepid::v1 as lookup_threepid;
3use tuwunel_core::{Err, Result, err};
4use tuwunel_service::threepid::canonicalize_email;
5
6use crate::{Ruma, client::admin::require_admin};
7
8/// # `GET /_synapse/admin/v1/threepid/{medium}/users/{address}`
9///
10/// Only the `email` medium is backed by a binding store; any other medium has
11/// no associated user.
12pub(crate) async fn admin_lookup_threepid_route(
13	State(services): State<crate::State>,
14	body: Ruma<lookup_threepid::Request>,
15) -> Result<lookup_threepid::Response> {
16	require_admin(&services, body.sender_user()).await?;
17
18	if !body.medium.eq_ignore_ascii_case("email") {
19		return Err!(Request(NotFound("User not found")));
20	}
21
22	let email = canonicalize_email(&body.address)
23		.map_err(|_| err!(Request(NotFound("User not found"))))?;
24
25	let user_id = services
26		.threepid
27		.user_id_for_email(&email)
28		.await?
29		.ok_or_else(|| err!(Request(NotFound("User not found"))))?;
30
31	Ok(lookup_threepid::Response::new(user_id))
32}