diff options
Diffstat (limited to 'src/server/routes')
-rw-r--r-- | src/server/routes/users.rs | 6 | ||||
-rw-r--r-- | src/server/routes/users/get_user.rs | 57 |
2 files changed, 63 insertions, 0 deletions
diff --git a/src/server/routes/users.rs b/src/server/routes/users.rs new file mode 100644 index 0000000..ad09c8e --- /dev/null +++ b/src/server/routes/users.rs @@ -0,0 +1,6 @@ +pub mod get_user; +use axum::{Router, routing::get}; + +pub fn users_router() -> Router { + Router::new().route("/users/{usernme}", get(get_user::http_get_user)) +} diff --git a/src/server/routes/users/get_user.rs b/src/server/routes/users/get_user.rs new file mode 100644 index 0000000..8020923 --- /dev/null +++ b/src/server/routes/users/get_user.rs @@ -0,0 +1,57 @@ +use activitypub_federation::{ + axum::json::FederationJson, config::Data, protocol::context::WithContext, traits::Object, +}; +use axum::{debug_handler, extract::Path, http::StatusCode, response::IntoResponse}; + +use crate::{error::AppError, state::AppHandle}; + +#[debug_handler] +pub async fn http_get_user( + Path(name): Path<String>, + data: Data<AppHandle>, +) -> Result<impl IntoResponse, AppError> { + let read = data.users.read().await; + if let Some(a) = read + .iter() + .find(|value| value.username.eq(&name)) + .map(ToOwned::to_owned) + { + let json_user = a.into_json(&data).await?; + Ok(( + StatusCode::OK, + FederationJson(WithContext::new_default(json_user)), + ) + .into_response()) + } else { + Ok((StatusCode::NOT_FOUND, "").into_response()) + } +} + +#[cfg(test)] +mod tests { + use axum::{ + body::Body, + http::{Request, StatusCode}, + }; + use tower::ServiceExt; + + use crate::{server, state::AppState}; + + #[tokio::test] + async fn get_user() { + let state = AppState::new().await.unwrap(); + let app = server::router(state); + + let response = app + .oneshot( + Request::builder() + .uri("/users/sellershut") + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + + assert_eq!(response.status(), StatusCode::OK); + } +} |