releases.rs

 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}