1use crate::{
2 auth::RequestExt as _, github::Release, AppState, LayoutData, Request, RequestExt as _,
3};
4use comrak::ComrakOptions;
5use serde::Serialize;
6use std::sync::Arc;
7use tide::http::mime;
8
9pub fn add_routes(releases: &mut tide::Server<Arc<AppState>>) {
10 releases.at("/releases").get(get_releases);
11}
12
13async fn get_releases(mut request: Request) -> tide::Result {
14 #[derive(Serialize)]
15 struct ReleasesData {
16 #[serde(flatten)]
17 layout: Arc<LayoutData>,
18 releases: Option<Vec<Release>>,
19 }
20
21 let mut data = ReleasesData {
22 layout: request.layout_data().await?,
23 releases: None,
24 };
25
26 if let Some(user) = request.current_user().await? {
27 if user.is_insider {
28 data.releases = Some(
29 request
30 .state()
31 .repo_client
32 .releases()
33 .await?
34 .into_iter()
35 .filter_map(|mut release| {
36 if release.draft {
37 None
38 } else {
39 let mut options = ComrakOptions::default();
40 options.render.unsafe_ = true; // Allow raw HTML in the markup. We control these release notes anyway.
41 release.body = comrak::markdown_to_html(&release.body, &options);
42 Some(release)
43 }
44 })
45 .collect(),
46 );
47 }
48 }
49
50 Ok(tide::Response::builder(200)
51 .body(request.state().render_template("releases.hbs", &data)?)
52 .content_type(mime::HTML)
53 .build())
54}