1use crate::{AppState, Request, RequestExt as _};
2use serde::Deserialize;
3use std::sync::Arc;
4use tide::{http::mime, log, Server};
5
6pub fn add_routes(app: &mut Server<Arc<AppState>>) {
7 app.at("/").get(get_home);
8 app.at("/signups").post(post_signup);
9 app.at("/releases/:tag_name/:name").get(get_release_asset);
10}
11
12async fn get_home(mut request: Request) -> tide::Result {
13 let data = request.layout_data().await?;
14 Ok(tide::Response::builder(200)
15 .body(request.state().render_template("home.hbs", &data)?)
16 .content_type(mime::HTML)
17 .build())
18}
19
20async fn post_signup(mut request: Request) -> tide::Result {
21 #[derive(Debug, Deserialize)]
22 struct Form {
23 github_login: String,
24 email_address: String,
25 about: String,
26 #[serde(default)]
27 wants_releases: bool,
28 #[serde(default)]
29 wants_updates: bool,
30 #[serde(default)]
31 wants_community: bool,
32 }
33
34 let mut form: Form = request.body_form().await?;
35 form.github_login = form
36 .github_login
37 .strip_prefix("@")
38 .map(str::to_string)
39 .unwrap_or(form.github_login);
40
41 log::info!("Signup submitted: {:?}", form);
42
43 // Save signup in the database
44 request
45 .db()
46 .create_signup(
47 &form.github_login,
48 &form.email_address,
49 &form.about,
50 form.wants_releases,
51 form.wants_updates,
52 form.wants_community,
53 )
54 .await?;
55
56 let layout_data = request.layout_data().await?;
57 Ok(tide::Response::builder(200)
58 .body(
59 request
60 .state()
61 .render_template("signup.hbs", &layout_data)?,
62 )
63 .content_type(mime::HTML)
64 .build())
65}
66
67async fn get_release_asset(request: Request) -> tide::Result {
68 let body = request
69 .state()
70 .repo_client
71 .release_asset(request.param("tag_name")?, request.param("name")?)
72 .await?;
73
74 Ok(tide::Response::builder(200)
75 .header("Cache-Control", "no-transform")
76 .content_type(mime::BYTE_STREAM)
77 .body(body)
78 .build())
79}