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}