diff options
author | Colin Reeder <colin@vpzom.click> | 2020-07-25 18:43:44 -0600 |
---|---|---|
committer | Colin Reeder <colin@vpzom.click> | 2020-07-25 18:43:44 -0600 |
commit | c818c3a5456fca7f7903cb37922e4fc7a57a3884 (patch) | |
tree | 10b6d6fbad9f5cc39e9de2dc21550ba0d0f8a2a0 /src/routes/posts.rs | |
parent | 47838d5381cf79e15889240f0f02ec246a1a4a86 (diff) |
List post likes
Diffstat (limited to 'src/routes/posts.rs')
-rw-r--r-- | src/routes/posts.rs | 79 |
1 files changed, 77 insertions, 2 deletions
diff --git a/src/routes/posts.rs b/src/routes/posts.rs index feaf0da..86a3134 100644 --- a/src/routes/posts.rs +++ b/src/routes/posts.rs @@ -3,7 +3,7 @@ use super::{ res_to_error, }; use crate::components::{Comment, CommunityLink, Content, HTPage, TimeAgo, UserLink}; -use crate::resp_types::RespPostInfo; +use crate::resp_types::{JustUser, RespList, RespPostInfo}; use crate::util::author_is_me; use std::sync::Arc; @@ -50,7 +50,9 @@ async fn page_post( <HTPage base_data={&base_data} lang={&lang} title={title}> <h1>{title}</h1> <p> - <em>{post.score.to_string()}{" points"}</em> + <a href={format!("/posts/{}/likes", post_id)}> + <em>{lang.tr("score", Some(&fluent::fluent_args!["score" => post.score]))}</em> + </a> {" "} { if base_data.login.is_some() { @@ -234,6 +236,75 @@ async fn handler_post_like( .body("Successfully liked.".into())?) } +async fn page_post_likes( + params: (i64,), + ctx: Arc<crate::RouteContext>, + req: hyper::Request<hyper::Body>, +) -> Result<hyper::Response<hyper::Body>, crate::Error> { + let (post_id,) = params; + + let lang = crate::get_lang_for_req(&req); + let cookies = get_cookie_map_for_req(&req)?; + + let base_data = + fetch_base_data(&ctx.backend_host, &ctx.http_client, req.headers(), &cookies).await?; + + let api_res = res_to_error( + ctx.http_client + .request(for_client( + hyper::Request::get(format!( + "{}/api/unstable/posts/{}/likes", + ctx.backend_host, post_id, + )) + .body(Default::default())?, + req.headers(), + &cookies, + )?) + .await?, + ) + .await?; + let api_res = hyper::body::to_bytes(api_res.into_body()).await?; + let api_res: RespList<JustUser> = serde_json::from_slice(&api_res)?; + + Ok(html_response(render::html! { + <HTPage base_data={&base_data} lang={&lang} title={&lang.tr("likes", None)}> + { + if api_res.items.is_empty() { + Some(render::rsx! { <p>{lang.tr("post_likes_nothing", None)}</p> }) + } else { + None + } + } + { + if api_res.items.is_empty() { + None + } else { + Some(render::rsx! { + <> + <p>{lang.tr("liked_by", None)}</p> + <ul> + { + api_res.items.iter().map(|like| { + render::rsx! { <li><UserLink user={Some(&like.user)} /></li> } + }) + .collect::<Vec<_>>() + } + { + if api_res.next_page.is_some() { + Some(render::rsx! { <li>{lang.tr("and_more", None)}</li> }) + } else { + None + } + } + </ul> + </> + }) + } + } + </HTPage> + })) +} + async fn handler_post_unlike( params: (i64,), ctx: Arc<crate::RouteContext>, @@ -318,6 +389,10 @@ pub fn route_posts() -> crate::RouteNode<()> { crate::RouteNode::new().with_handler_async("POST", handler_post_like), ) .with_child( + "likes", + crate::RouteNode::new().with_handler_async("GET", page_post_likes), + ) + .with_child( "unlike", crate::RouteNode::new().with_handler_async("POST", handler_post_unlike), ) |