diff --git a/crates/collab/src/admin.rs b/crates/collab/src/admin.rs deleted file mode 100644 index 62e518ee6e14db6e25fd0b06284126a638968ffb..0000000000000000000000000000000000000000 --- a/crates/collab/src/admin.rs +++ /dev/null @@ -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>) { - 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, - users: Vec, - signups: Vec, -} - -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::
().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()) -} diff --git a/crates/collab/src/careers.rs b/crates/collab/src/careers.rs deleted file mode 100644 index bedb35f745e7d0d6763d349202d092644b2fc6f4..0000000000000000000000000000000000000000 --- a/crates/collab/src/careers.rs +++ /dev/null @@ -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>) { - 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()) -} diff --git a/crates/collab/src/community.rs b/crates/collab/src/community.rs deleted file mode 100644 index 306cd30de53bc2803fdc7fc63ac3494a8d972de3..0000000000000000000000000000000000000000 --- a/crates/collab/src/community.rs +++ /dev/null @@ -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>) { - 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()) -} diff --git a/crates/collab/src/home.rs b/crates/collab/src/home.rs deleted file mode 100644 index bddeadc35203e5f258cc7de70fad699d649d27c9..0000000000000000000000000000000000000000 --- a/crates/collab/src/home.rs +++ /dev/null @@ -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>) { - 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()) -} diff --git a/crates/collab/src/main.rs b/crates/collab/src/main.rs index 97de59f36bdc51c734e516ac80ac16d4384d29ca..b505b95a8e4dcec189c9e8cd8f5f02eb118f8cab 100644 --- a/crates/collab/src/main.rs +++ b/crates/collab/src/main.rs @@ -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(); diff --git a/crates/collab/src/team.rs b/crates/collab/src/team.rs deleted file mode 100644 index d04e6db668f04ba4f3782aec8f0d5fd82594336d..0000000000000000000000000000000000000000 --- a/crates/collab/src/team.rs +++ /dev/null @@ -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>) { - 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()) -}