home.rs

 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}