From 7ca10ced7b48ecca3ecd645f7b6512e43d71dc81 Mon Sep 17 00:00:00 2001 From: Colin Reeder Date: Sat, 8 Aug 2020 09:59:14 -0600 Subject: Handle different actor types for lookup --- src/routes/mod.rs | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/src/routes/mod.rs b/src/routes/mod.rs index aa8678e..72268d0 100644 --- a/src/routes/mod.rs +++ b/src/routes/mod.rs @@ -720,9 +720,20 @@ async fn page_lookup( let query: LookupQuery<'_> = serde_urlencoded::from_str(req.uri().query().unwrap_or(""))?; let query = query.query; + #[derive(Deserialize)] + #[serde(rename_all = "snake_case")] + enum ActorType { + Community, + User, + #[serde(other)] + Unknown, + } + #[derive(Deserialize)] struct LookupResult { id: i64, + #[serde(rename = "type")] + kind: ActorType, } let api_res: Option, String>> = if let Some(query) = &query { @@ -755,13 +766,22 @@ async fn page_lookup( }; match api_res { - Some(Ok(items)) if !items.is_empty() => Ok(hyper::Response::builder() - .status(hyper::StatusCode::FOUND) - .header( - hyper::header::LOCATION, - format!("/communities/{}", items[0].id), - ) - .body("Redirecting…".into())?), + Some(Ok(items)) if !items.is_empty() => { + let item = &items[0]; + let dest = match item.kind { + ActorType::Community => format!("/communities/{}", item.id), + ActorType::User => format!("/users/{}", item.id), + ActorType::Unknown => { + return Err(crate::Error::InternalStr( + "Unknown actor type received from lookup".to_owned(), + )); + } + }; + Ok(hyper::Response::builder() + .status(hyper::StatusCode::FOUND) + .header(hyper::header::LOCATION, dest) + .body("Redirecting…".into())?) + } api_res => { let title = lang.tr("lookup_title", None); Ok(html_response(render::html! { -- cgit v1.2.3