From 3a05396afb41bd1da81bde19c3eea495a4d8ab75 Mon Sep 17 00:00:00 2001 From: glyph Date: Wed, 23 Mar 2022 11:41:47 +0200 Subject: [PATCH] mount blobstore and add theme support for all routes --- peach-web/src/main.rs | 34 ++++- peach-web/src/router.rs | 291 +++++++++++++--------------------------- 2 files changed, 123 insertions(+), 202 deletions(-) diff --git a/peach-web/src/main.rs b/peach-web/src/main.rs index f5cb47b..ce85fbf 100644 --- a/peach-web/src/main.rs +++ b/peach-web/src/main.rs @@ -32,7 +32,7 @@ use log::info; // crate-local dependencies use config::Config; -use utils::theme::Theme; +use utils::{sbot, theme::Theme}; pub type BoxError = Box; @@ -50,6 +50,7 @@ pub struct RocketConfig { } */ +/// The path of the application configuration parameters. static CONFIG_PATH: &str = "./config"; lazy_static! { @@ -116,12 +117,35 @@ fn main() { // static file server // matches on assets in the `static` directory - let response = rouille::match_assets(request, "static"); - if response.is_success() { - return response; + let static_response = rouille::match_assets(request, "static"); + if static_response.is_success() { + return static_response; + } + + // set the `.ssb-go` path in order to mount the blob fileserver + let ssb_path = sbot::get_go_ssb_path().expect("define ssb-go dir path"); + let blobstore = format!("{}/blobs/sha256", ssb_path); + + // blobstore file server + // removes the /blob url prefix and serves blobs from blobstore + // matches on assets in the `static` directory + if let Some(request) = request.remove_prefix("/blob") { + return rouille::match_assets(&request, &blobstore); } - // TODO: mount the blobstore fileserver (see old code in src/router.rs) router::mount_peachpub_routes(request) }); } + +// TODO: write a test for each route +// look at `init_test_rocket()` from old code +// https://docs.rs/rouille/latest/rouille/struct.Request.html#method.fake_http +/* +#[cfg(test)] +mod tests { + #[test] + fn it_works() { + assert_eq!(2 + 2, 4); + } +} +*/ diff --git a/peach-web/src/router.rs b/peach-web/src/router.rs index 2809698..3237431 100644 --- a/peach-web/src/router.rs +++ b/peach-web/src/router.rs @@ -1,6 +1,9 @@ use rouille::{router, Request, Response}; -use crate::{routes, utils::flash::FlashResponse}; +use crate::{routes, templates, utils::flash::FlashResponse}; + +// TODO: add mount_peachcloud_routes() +// https://github.com/tomaka/rouille/issues/232#issuecomment-919225104 /// Define the PeachPub router. /// @@ -52,10 +55,95 @@ pub fn mount_peachpub_routes(request: &Request) -> Response { Response::html(routes::guide::build_template()) }, + (GET) (/scuttlebutt/blocks) => { + Response::html(routes::scuttlebutt::blocks::build_template()) + }, + + (GET) (/scuttlebutt/follows) => { + Response::html(routes::scuttlebutt::follows::build_template()) + }, + + (GET) (/scuttlebutt/friends) => { + Response::html(routes::scuttlebutt::friends::build_template()) + }, + + (GET) (/scuttlebutt/invites) => { + Response::html(routes::scuttlebutt::invites::build_template(request)) + .reset_flash() + }, + + (POST) (/scuttlebutt/invites) => { + routes::scuttlebutt::invites::handle_form(request) + }, + + (GET) (/scuttlebutt/peers) => { + Response::html(routes::scuttlebutt::peers::build_template()) + }, + + (GET) (/scuttlebutt/private) => { + Response::html(routes::scuttlebutt::private::build_template(request, None)) + }, + + (POST) (/scuttlebutt/private) => { + routes::scuttlebutt::private::handle_form(request) + }, + + (GET) (/scuttlebutt/private/{ssb_id: String}) => { + Response::html(routes::scuttlebutt::private::build_template(request, Some(ssb_id))) + }, + + (GET) (/scuttlebutt/profile) => { + Response::html(routes::scuttlebutt::profile::build_template(request, None)) + .reset_flash() + }, + + (GET) (/scuttlebutt/profile/update) => { + Response::html(routes::scuttlebutt::profile_update::build_template(request)) + .reset_flash() + }, + + (POST) (/scuttlebutt/profile/update) => { + routes::scuttlebutt::profile_update::handle_form(request) + }, + + (GET) (/scuttlebutt/profile/{ssb_id: String}) => { + Response::html(routes::scuttlebutt::profile::build_template(request, Some(ssb_id))) + }, + + (POST) (/scuttlebutt/publish) => { + routes::scuttlebutt::publish::handle_form(request) + }, + + (GET) (/scuttlebutt/search) => { + Response::html(routes::scuttlebutt::search::build_template(request)) + .reset_flash() + }, + + (POST) (/scuttlebutt/search) => { + routes::scuttlebutt::search::handle_form(request) + }, + (GET) (/settings) => { Response::html(routes::settings::menu::build_template()) }, + (GET) (/settings/admin) => { + Response::html(routes::settings::admin::menu::build_template()) + }, + + (POST) (/settings/admin/add) => { + routes::settings::admin::add::handle_form(request) + }, + + (GET) (/settings/admin/configure) => { + Response::html(routes::settings::admin::configure::build_template(request)) + .reset_flash() + }, + + (POST) (/settings/admin/delete) => { + routes::settings::admin::delete::handle_form(request) + }, + (GET) (/settings/scuttlebutt) => { Response::html(routes::settings::scuttlebutt::menu::build_template(request)) .reset_flash() @@ -86,207 +174,16 @@ pub fn mount_peachpub_routes(request: &Request) -> Response { routes::settings::scuttlebutt::configure::handle_form(request, true) }, - (GET) (/settings/admin) => { - Response::html(routes::settings::admin::menu::build_template()) - }, - - (POST) (/settings/admin/add) => { - routes::settings::admin::add::handle_form(request) - }, - - (GET) (/settings/admin/configure) => { - Response::html(routes::settings::admin::configure::build_template(request)) - .reset_flash() - }, - - (POST) (/settings/admin/delete) => { - routes::settings::admin::delete::handle_form(request) - }, - - (GET) (/scuttlebutt/blocks) => { - Response::html(routes::scuttlebutt::blocks::build_template()) - }, - - (GET) (/scuttlebutt/follows) => { - Response::html(routes::scuttlebutt::follows::build_template()) - }, - - (GET) (/scuttlebutt/friends) => { - Response::html(routes::scuttlebutt::friends::build_template()) - }, - - (GET) (/scuttlebutt/invites) => { - Response::html(routes::scuttlebutt::invites::build_template(request)) - .reset_flash() - }, - - (POST) (/scuttlebutt/invites) => { - routes::scuttlebutt::invites::handle_form(request) - }, - - (GET) (/scuttlebutt/peers) => { - Response::html(routes::scuttlebutt::peers::build_template()) - }, - - (GET) (/scuttlebutt/profile) => { - Response::html(routes::scuttlebutt::profile::build_template(request, None)) - }, - - (GET) (/scuttlebutt/profile/update) => { - Response::html(routes::scuttlebutt::profile_update::build_template(request)) - }, - - (POST) (/scuttlebutt/profile/update) => { - routes::scuttlebutt::profile_update::handle_form(request) - }, - - (GET) (/scuttlebutt/profile/{ssb_id: String}) => { - Response::html(routes::scuttlebutt::profile::build_template(request, Some(ssb_id))) - }, - - (GET) (/scuttlebutt/search) => { - Response::html(routes::scuttlebutt::search::build_template(request)) - .reset_flash() - }, - - (POST) (/scuttlebutt/search) => { - routes::scuttlebutt::search::handle_form(request) + (GET) (/settings/theme/{theme: String}) => { + routes::settings::theme::set_theme(theme) }, (GET) (/status/scuttlebutt) => { Response::html(routes::status::scuttlebutt::build_template()) }, - // The code block is called if none of the other blocks matches the request. - // We return an empty response with a 404 status code. - _ => Response::empty_404() + // render the not_found template and set a 404 status code if none of + // the other blocks matches the request + _ => Response::html(templates::not_found::build_template()).with_status_code(404) ) } - -/* -use rocket::{catchers, fs::FileServer, routes, Build, Rocket}; -use rocket_dyn_templates::Template; - -use crate::{ - routes::{ - authentication::*, - catchers::*, - index::*, - scuttlebutt::*, - settings::{admin::*, dns::*, menu::*, network::*, scuttlebutt::*, theme::*}, - status::{device::*, network::*, scuttlebutt::*}, - }, - utils, -}; - -/// Create a Rocket instance and mount PeachPub routes, fileserver and -/// catchers. This gives us everything we need to run PeachPub and excludes -/// settings and status routes related to networking and the device (memory, -/// hard disk, CPU etc.). -pub fn mount_peachpub_routes(rocket: Rocket) -> Rocket { - // set the `.ssb-go` path in order to mount the blob fileserver - let ssb_path = utils::get_go_ssb_path().expect("define ssb-go dir path"); - let blobstore = format!("{}/blobs/sha256", ssb_path); - - rocket - .mount( - "/", - routes![ - guide, - home, - login, - login_post, - logout, - settings_menu, - set_theme, - ], - ) - .mount( - "/settings/admin", - routes![ - admin_menu, - configure_admin, - add_admin_post, - delete_admin_post, - change_password, - change_password_post, - reset_password, - reset_password_post, - forgot_password_page, - send_password_reset_post, - ], - ) - .mount( - "/settings/scuttlebutt", - routes![ - ssb_settings_menu, - configure_sbot, - configure_sbot_default, - configure_sbot_post, - restart_sbot, - start_sbot, - stop_sbot - ], - ) - .mount( - "/scuttlebutt", - routes![ - invites, - create_invite, - peers, - search, - search_post, - friends, - follows, - blocks, - profile, - update_profile, - update_profile_post, - private, - private_post, - follow, - unfollow, - block, - unblock, - publish, - ], - ) - .mount("/status", routes![scuttlebutt_status]) - .mount("/", FileServer::from("static")) - .mount("/blob", FileServer::from(blobstore).rank(-1)) - .register("/", catchers![not_found, internal_error, forbidden]) - .attach(Template::fairing()) -} - -/// Create a Rocket instance with PeachPub routes, fileserver and catchers by -/// calling `mount_peachpub_routes()` and then mount all additional routes -/// required to run a complete PeachCloud build. -pub fn mount_peachcloud_routes(rocket: Rocket) -> Rocket { - mount_peachpub_routes(rocket) - .mount("/", routes![reboot_cmd, shutdown_cmd, power_menu,]) - .mount( - "/settings/network", - routes![ - add_credentials, - connect_wifi, - configure_dns, - configure_dns_post, - disconnect_wifi, - deploy_ap, - deploy_client, - forget_wifi, - network_home, - add_ssid, - add_wifi, - network_detail, - wifi_list, - wifi_password, - wifi_set_password, - wifi_usage, - wifi_usage_alerts, - wifi_usage_reset, - ], - ) - .mount("/status", routes![device_status, network_status]) -} -*/