From 6d45fb2f70df697211f130dc174b7b588b26fe58 Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Tue, 15 Jul 2025 10:35:27 -0700 Subject: [PATCH] Generic ParameterInput, createAccount xrpc parsing --- entryway/src/main.rs | 49 ++++++++++++++++++++++++++++++++------------ router/src/xrpc.rs | 43 +++++++++++++++++++------------------- 2 files changed, 58 insertions(+), 34 deletions(-) diff --git a/entryway/src/main.rs b/entryway/src/main.rs index d8d89a0..d91e7bf 100644 --- a/entryway/src/main.rs +++ b/entryway/src/main.rs @@ -1,15 +1,28 @@ use router::{ Router, - Endpoint, xrpc::{ - QueryInput, + XrpcEndpoint, ProcedureInput, Response, error, }, }; +use serde::Deserialize; use atproto::types::Nsid; use http::status::StatusCode; +use tracing::{ + event, + instrument, + Level, +}; +use std::fmt::Debug; + +struct Config { + entryway_url: String, + entryway_did: String, + entryway_plc_rotation_key: String, + entryway_jwt_key_256_hex: String, +} #[tokio::main] async fn main() { @@ -17,17 +30,27 @@ async fn main() { let _ = tracing::subscriber::set_global_default(subscriber); let mut router = Router::new(); - // let get_nsid = Nsid::new(String::from("me.woach.get")).expect("me.woach.get is a valid nsid"); - // let post_nsid = Nsid::new(String::from("me.woach.post")).expect("me.woach.post is a valid nsid"); - // router = router.add_endpoint(Endpoint::new_xrpc_query(get_nsid, test)); - // router = router.add_endpoint(Endpoint::new_xrpc_procedure(post_nsid, test2)); + let create_account_nsid: Nsid = "com.atproto.server.createAccount".parse::().expect("valid nsid"); + router = router.add_endpoint(XrpcEndpoint::new_procedure(create_account_nsid, create_account)); router.serve().await; } -// async fn test(_data: QueryInput) -> Response { -// error(StatusCode::OK, "error", "message") -// } -// -// async fn test2(_data: ProcedureInput) -> Response { -// error(StatusCode::OK, "error", "message") -// } +#[derive(Deserialize, Debug)] +struct CreateAccountInput { + email: Option, + handle: String, + did: Option, + invite_code: Option, + verification_code: Option, + verification_phone: Option, + password: Option, + recovery_key: Option, + plc_op: Option, +} + +#[instrument] +async fn create_account(data: ProcedureInput) -> Response { + event!(Level::INFO, "In create_account"); + + error(StatusCode::OK, "error", "message") +} diff --git a/router/src/xrpc.rs b/router/src/xrpc.rs index fc5ad3f..0ed8c36 100644 --- a/router/src/xrpc.rs +++ b/router/src/xrpc.rs @@ -53,7 +53,7 @@ pub fn response(code: StatusCode, message: &str) -> Response { } pub struct QueryInput { - parameters: HashMap, + pub parameters: HashMap, } impl FromRequestParts for QueryInput where @@ -70,12 +70,16 @@ where } } } -pub struct ProcedureInput { - parameters: HashMap, - input: Json, + +#[derive(Debug)] +pub struct ProcedureInput { + pub parameters: HashMap, + pub input: J, } -impl FromRequest for ProcedureInput + +impl FromRequest for ProcedureInput where + J: for<'de> serde::Deserialize<'de> + Send + 'static, Bytes: FromRequest, S: Send + Sync, { @@ -83,17 +87,13 @@ where async fn from_request(req: Request, state: &S) -> Result { - let query_params: Result>, QueryRejection> = Query::try_from_uri(req.uri()); - let parameters = match query_params { - Ok(p) => p.0, - Err(e) => return Err(error(StatusCode::BAD_REQUEST, "Bad Parameters", &e.body_text())), - }; + let parameters: HashMap = Query::try_from_uri(req.uri()) + .map(|p| p.0) + .map_err(|e| error(StatusCode::BAD_REQUEST, "Bad Paramters", &e.body_text()))?; - let json_value = Json::::from_request(req, state).await; - let input: Json = match json_value { - Ok(v) => v, - Err(e) => return Err(error(StatusCode::BAD_REQUEST, "Bad Parameters", &e.body_text())), - }; + let input: J = Json::::from_request(req, state).await + .map(|Json(v)| v) + .map_err(|e| error(StatusCode::BAD_REQUEST, "Bad Parameters", &e.body_text()))?; Ok(ProcedureInput { parameters, input }) } @@ -113,12 +113,12 @@ where Box::pin((self)(input)) } } -impl XrpcHandler for F +impl XrpcHandler> for F where - F: Fn(ProcedureInput) -> Fut + Send + Sync + 'static, + F: Fn(ProcedureInput) -> Fut + Send + Sync + 'static, Fut: Future + Send + 'static, { - fn call(&self, input: ProcedureInput) + fn call(&self, input: ProcedureInput) -> Pin+ Send>> { Box::pin((self)(input)) } @@ -140,14 +140,15 @@ impl XrpcEndpoint { } } - pub fn new_procedure

(nsid: Nsid, procedure: P) -> Self + pub fn new_procedure(nsid: Nsid, procedure: P) -> Self where - P: XrpcHandler + Clone + P: XrpcHandler> + Clone, + J: for<'de> serde::Deserialize<'de> + Send + 'static, { XrpcEndpoint { path: Path::Nsid(nsid), resolver: post(async move | req: Request | -> Response { - match ProcedureInput::from_request(req, &()).await { + match ProcedureInput::::from_request(req, &()).await { Ok(pi) => procedure.call(pi).await, Err(e) => e }