Detailed changes
@@ -1,117 +0,0 @@
-use crate::{auth::RequestExt as _, db, AppState, LayoutData, Request, RequestExt as _};
-use async_trait::async_trait;
-use serde::{Deserialize, Serialize};
-use std::sync::Arc;
-use surf::http::mime;
-
-#[async_trait]
-pub trait RequestExt {
- async fn require_admin(&self) -> tide::Result<()>;
-}
-
-#[async_trait]
-impl RequestExt for Request {
- async fn require_admin(&self) -> tide::Result<()> {
- let current_user = self
- .current_user()
- .await?
- .ok_or_else(|| tide::Error::from_str(401, "not logged in"))?;
-
- if current_user.is_admin {
- Ok(())
- } else {
- Err(tide::Error::from_str(
- 403,
- "authenticated user is not an admin",
- ))
- }
- }
-}
-
-pub fn add_routes(app: &mut tide::Server<Arc<AppState>>) {
- app.at("/admin").get(get_admin_page);
- app.at("/admin/users").post(post_user);
- app.at("/admin/users/:id").put(put_user);
- app.at("/admin/users/:id/delete").post(delete_user);
- app.at("/admin/signups/:id/delete").post(delete_signup);
-}
-
-#[derive(Serialize)]
-struct AdminData {
- #[serde(flatten)]
- layout: Arc<LayoutData>,
- users: Vec<db::User>,
- signups: Vec<db::Signup>,
-}
-
-async fn get_admin_page(mut request: Request) -> tide::Result {
- request.require_admin().await?;
-
- let data = AdminData {
- layout: request.layout_data().await?,
- users: request.db().get_all_users().await?,
- signups: request.db().get_all_signups().await?,
- };
-
- Ok(tide::Response::builder(200)
- .body(request.state().render_template("admin.hbs", &data)?)
- .content_type(mime::HTML)
- .build())
-}
-
-async fn post_user(mut request: Request) -> tide::Result {
- request.require_admin().await?;
-
- #[derive(Deserialize)]
- struct Form {
- github_login: String,
- #[serde(default)]
- admin: bool,
- }
-
- let form = request.body_form::<Form>().await?;
- let github_login = form
- .github_login
- .strip_prefix("@")
- .unwrap_or(&form.github_login);
-
- if !github_login.is_empty() {
- request.db().create_user(github_login, form.admin).await?;
- }
-
- Ok(tide::Redirect::new("/admin").into())
-}
-
-async fn put_user(mut request: Request) -> tide::Result {
- request.require_admin().await?;
-
- let user_id = request.param("id")?.parse()?;
-
- #[derive(Deserialize)]
- struct Body {
- admin: bool,
- }
-
- let body: Body = request.body_json().await?;
-
- request
- .db()
- .set_user_is_admin(db::UserId(user_id), body.admin)
- .await?;
-
- Ok(tide::Response::builder(200).build())
-}
-
-async fn delete_user(request: Request) -> tide::Result {
- request.require_admin().await?;
- let user_id = db::UserId(request.param("id")?.parse()?);
- request.db().destroy_user(user_id).await?;
- Ok(tide::Redirect::new("/admin").into())
-}
-
-async fn delete_signup(request: Request) -> tide::Result {
- request.require_admin().await?;
- let signup_id = db::SignupId(request.param("id")?.parse()?);
- request.db().destroy_signup(signup_id).await?;
- Ok(tide::Redirect::new("/admin").into())
-}
@@ -1,15 +0,0 @@
-use crate::{AppState, Request, RequestExt};
-use std::sync::Arc;
-use tide::http::mime;
-
-pub fn add_routes(app: &mut tide::Server<Arc<AppState>>) {
- app.at("/careers").get(get_careers);
-}
-
-async fn get_careers(mut request: Request) -> tide::Result {
- let data = request.layout_data().await?;
- Ok(tide::Response::builder(200)
- .body(request.state().render_template("careers.hbs", &data)?)
- .content_type(mime::HTML)
- .build())
-}
@@ -1,15 +0,0 @@
-use crate::{AppState, Request, RequestExt};
-use std::sync::Arc;
-use tide::http::mime;
-
-pub fn add_routes(community: &mut tide::Server<Arc<AppState>>) {
- community.at("/community").get(get_community);
-}
-
-async fn get_community(mut request: Request) -> tide::Result {
- let data = request.layout_data().await?;
- Ok(tide::Response::builder(200)
- .body(request.state().render_template("community.hbs", &data)?)
- .content_type(mime::HTML)
- .build())
-}
@@ -1,80 +0,0 @@
-use crate::{AppState, Request, RequestExt as _};
-use log::as_serde;
-use serde::{Deserialize, Serialize};
-use std::sync::Arc;
-use tide::{http::mime, Server};
-
-pub fn add_routes(app: &mut Server<Arc<AppState>>) {
- app.at("/").get(get_home);
- app.at("/signups").post(post_signup);
- app.at("/releases/:tag_name/:name").get(get_release_asset);
-}
-
-async fn get_home(mut request: Request) -> tide::Result {
- let data = request.layout_data().await?;
- Ok(tide::Response::builder(200)
- .body(request.state().render_template("home.hbs", &data)?)
- .content_type(mime::HTML)
- .build())
-}
-
-async fn post_signup(mut request: Request) -> tide::Result {
- #[derive(Debug, Deserialize, Serialize)]
- struct Form {
- github_login: String,
- email_address: String,
- about: String,
- #[serde(default)]
- wants_releases: bool,
- #[serde(default)]
- wants_updates: bool,
- #[serde(default)]
- wants_community: bool,
- }
-
- let mut form: Form = request.body_form().await?;
- form.github_login = form
- .github_login
- .strip_prefix("@")
- .map(str::to_string)
- .unwrap_or(form.github_login);
-
- log::info!(form = as_serde!(form); "signup submitted");
-
- // Save signup in the database
- request
- .db()
- .create_signup(
- &form.github_login,
- &form.email_address,
- &form.about,
- form.wants_releases,
- form.wants_updates,
- form.wants_community,
- )
- .await?;
-
- let layout_data = request.layout_data().await?;
- Ok(tide::Response::builder(200)
- .body(
- request
- .state()
- .render_template("signup.hbs", &layout_data)?,
- )
- .content_type(mime::HTML)
- .build())
-}
-
-async fn get_release_asset(request: Request) -> tide::Result {
- let body = request
- .state()
- .repo_client
- .release_asset(request.param("tag_name")?, request.param("name")?)
- .await?;
-
- Ok(tide::Response::builder(200)
- .header("Cache-Control", "no-transform")
- .content_type(mime::BYTE_STREAM)
- .body(body)
- .build())
-}
@@ -1,18 +1,12 @@
-mod admin;
mod api;
mod assets;
mod auth;
-mod careers;
-mod community;
mod db;
mod env;
mod errors;
mod expiring;
mod github;
-mod home;
-mod releases;
mod rpc;
-mod team;
use self::errors::TideResultExt as _;
use ::rpc::Peer;
@@ -181,12 +175,6 @@ pub async fn run_server(
);
web.with(errors::Middleware);
api::add_routes(&mut web);
- home::add_routes(&mut web);
- team::add_routes(&mut web);
- careers::add_routes(&mut web);
- releases::add_routes(&mut web);
- community::add_routes(&mut web);
- admin::add_routes(&mut web);
auth::add_routes(&mut web);
let mut assets = tide::new();
@@ -1,15 +0,0 @@
-use crate::{AppState, Request, RequestExt};
-use std::sync::Arc;
-use tide::http::mime;
-
-pub fn add_routes(app: &mut tide::Server<Arc<AppState>>) {
- app.at("/team").get(get_team);
-}
-
-async fn get_team(mut request: Request) -> tide::Result {
- let data = request.layout_data().await?;
- Ok(tide::Response::builder(200)
- .body(request.state().render_template("team.hbs", &data)?)
- .content_type(mime::HTML)
- .build())
-}