summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorColin Reeder <colin@vpzom.click>2020-08-08 09:59:14 -0600
committerColin Reeder <colin@vpzom.click>2020-08-08 09:59:14 -0600
commit7ca10ced7b48ecca3ecd645f7b6512e43d71dc81 (patch)
treeaedb1e2994fa734e0483b6549214718d960e8d3e
parent50e529d60bf6f60a41eaa51d9005abbe9da80adf (diff)
Handle different actor types for lookup
-rw-r--r--src/routes/mod.rs34
1 files 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
@@ -721,8 +721,19 @@ async fn page_lookup(
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<Result<Vec<LookupResult>, 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! {