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