diff --git a/api/src/lib.rs b/api/src/lib.rs index 419c01e..1b233e4 100644 --- a/api/src/lib.rs +++ b/api/src/lib.rs @@ -42,3 +42,9 @@ pub struct CreateHouseholdResponse { pub struct AddToHouseholdRequest { pub user: Uuid, } + +#[derive(Serialize, Deserialize)] +pub struct UserInfo { + pub name: String, + pub id: Uuid, +} diff --git a/src/routes/mod.rs b/src/routes/mod.rs index 2db83c8..661e9d8 100644 --- a/src/routes/mod.rs +++ b/src/routes/mod.rs @@ -1,9 +1,9 @@ use std::sync::Arc; -use api::{LoginRequest, LoginResponse}; +use api::{LoginRequest, LoginResponse, UserInfo}; use axum::{ async_trait, - extract::{FromRef, FromRequestParts, State}, + extract::{FromRef, FromRequestParts, Path, State}, headers::{authorization::Bearer, Authorization}, http::{ header::{AUTHORIZATION, CONTENT_TYPE}, @@ -138,6 +138,24 @@ async fn login( Ok(Json(LoginResponse { token })) } +async fn get_user_id( + _: AuthenticatedUser, + State(state): State, + Path(name): Path, +) -> Result, StatusCode>, RouteError> { + let Some(user) = User::find() + .filter(user::Column::Name.eq(name)) + .one(&state.db) + .await? else { + return Ok(Err(StatusCode::NOT_FOUND)) + }; + + Ok(Ok(Json(UserInfo { + name: user.name, + id: user.id, + }))) +} + pub(crate) fn router(api_allowed: Option) -> Router { let origin: AllowOrigin = match api_allowed { Some(n) => n.into(), @@ -151,6 +169,10 @@ pub(crate) fn router(api_allowed: Option) -> Router { let mk_service = |m: Vec| cors_base.clone().allow_methods(m); Router::new() + .route( + "/search/user/:name", + get(get_user_id).layer(mk_service(vec![Method::GET])), + ) .route("/login", post(login).layer(mk_service(vec![Method::POST]))) .route( "/household",