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