home.rs

 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}