From 95ee090275e0164f67c675f750cfa654dd5c54c4 Mon Sep 17 00:00:00 2001 From: Felix Ableitner Date: Wed, 15 Jan 2025 10:44:46 +0100 Subject: [PATCH] Move files into subfolders --- src/backend/api/article.rs | 3 +- src/backend/api/instance.rs | 2 +- src/backend/api/mod.rs | 2 +- src/backend/api/user.rs | 2 +- src/backend/config.rs | 2 +- src/backend/database/article.rs | 2 +- src/backend/database/conflict.rs | 3 +- src/backend/database/edit.rs | 2 +- src/backend/database/instance.rs | 2 +- src/backend/database/mod.rs | 2 +- src/backend/database/user.rs | 3 +- src/backend/federation/activities/accept.rs | 8 +- .../federation/activities/create_article.rs | 8 +- src/backend/federation/activities/follow.rs | 4 +- src/backend/federation/activities/mod.rs | 2 +- src/backend/federation/activities/reject.rs | 8 +- .../activities/update_local_article.rs | 8 +- .../activities/update_remote_article.rs | 8 +- src/backend/federation/objects/article.rs | 2 +- .../federation/objects/articles_collection.rs | 2 +- src/backend/federation/objects/edit.rs | 2 +- .../federation/objects/edits_collection.rs | 2 +- src/backend/federation/objects/instance.rs | 2 +- .../federation/objects/instance_collection.rs | 2 +- src/backend/federation/objects/user.rs | 2 +- src/backend/federation/routes.rs | 2 +- src/backend/mod.rs | 100 +++--------------- src/backend/{ => server}/assets.rs | 2 +- src/backend/{ => server}/middleware.rs | 3 +- src/backend/server/mod.rs | 88 +++++++++++++++ src/backend/{ => server}/nodeinfo.rs | 6 +- src/backend/{ => utils}/error.rs | 0 src/backend/{utils.rs => utils/mod.rs} | 12 ++- src/backend/{ => utils}/scheduled_tasks.rs | 2 +- src/main.rs | 2 +- 35 files changed, 167 insertions(+), 135 deletions(-) rename src/backend/{ => server}/assets.rs (97%) rename src/backend/{ => server}/middleware.rs (97%) create mode 100644 src/backend/server/mod.rs rename src/backend/{ => server}/nodeinfo.rs (96%) rename src/backend/{ => utils}/error.rs (100%) rename src/backend/{utils.rs => utils/mod.rs} (91%) rename src/backend/{ => utils}/scheduled_tasks.rs (93%) diff --git a/src/backend/api/article.rs b/src/backend/api/article.rs index 10362da..ef36383 100644 --- a/src/backend/api/article.rs +++ b/src/backend/api/article.rs @@ -7,9 +7,8 @@ use crate::{ edit::DbEditForm, IbisData, }, - error::MyResult, federation::activities::{create_article::CreateArticle, submit_article_update}, - utils::generate_article_version, + utils::{error::MyResult, generate_article_version}, }, common::{ utils::{extract_domain, http_protocol_str}, diff --git a/src/backend/api/instance.rs b/src/backend/api/instance.rs index ef2b860..7d2a91a 100644 --- a/src/backend/api/instance.rs +++ b/src/backend/api/instance.rs @@ -1,5 +1,5 @@ use crate::{ - backend::{database::IbisData, error::MyResult, federation::activities::follow::Follow}, + backend::{database::IbisData, federation::activities::follow::Follow, utils::error::MyResult}, common::{ DbInstance, FollowInstance, diff --git a/src/backend/api/mod.rs b/src/backend/api/mod.rs index 2b17e12..4789fbd 100644 --- a/src/backend/api/mod.rs +++ b/src/backend/api/mod.rs @@ -16,7 +16,7 @@ use crate::{ user::{get_user, login_user, logout_user, register_user}, }, database::IbisData, - error::MyResult, + utils::error::MyResult, }, common::{DbEdit, EditView, GetEditList, LocalUserView, SiteView}, }; diff --git a/src/backend/api/user.rs b/src/backend/api/user.rs index 36312f9..b9a19d7 100644 --- a/src/backend/api/user.rs +++ b/src/backend/api/user.rs @@ -2,7 +2,7 @@ use super::{check_is_admin, empty_to_none}; use crate::{ backend::{ database::{conflict::DbConflict, read_jwt_secret, IbisData}, - error::MyResult, + utils::error::MyResult, }, common::{ DbArticle, diff --git a/src/backend/config.rs b/src/backend/config.rs index 2dd62f4..e5c2a64 100644 --- a/src/backend/config.rs +++ b/src/backend/config.rs @@ -1,4 +1,4 @@ -use crate::{backend::error::MyResult, common::Options}; +use crate::{backend::utils::error::MyResult, common::Options}; use config::Config; use doku::Document; use serde::Deserialize; diff --git a/src/backend/database/article.rs b/src/backend/database/article.rs index 47fae02..8af70f0 100644 --- a/src/backend/database/article.rs +++ b/src/backend/database/article.rs @@ -4,8 +4,8 @@ use crate::{ schema::{article, edit, instance}, IbisData, }, - error::MyResult, federation::objects::edits_collection::DbEditCollection, + utils::error::MyResult, }, common::{ newtypes::{ArticleId, InstanceId}, diff --git a/src/backend/database/conflict.rs b/src/backend/database/conflict.rs index c8e33db..5364d08 100644 --- a/src/backend/database/conflict.rs +++ b/src/backend/database/conflict.rs @@ -1,9 +1,8 @@ use crate::{ backend::{ database::{schema::conflict, IbisData}, - error::MyResult, federation::activities::submit_article_update, - utils::generate_article_version, + utils::{error::MyResult, generate_article_version}, }, common::{ newtypes::{ArticleId, ConflictId, PersonId}, diff --git a/src/backend/database/edit.rs b/src/backend/database/edit.rs index fff34e5..db3c711 100644 --- a/src/backend/database/edit.rs +++ b/src/backend/database/edit.rs @@ -1,7 +1,7 @@ use crate::{ backend::{ database::schema::{article, edit, person}, - error::MyResult, + utils::error::MyResult, IbisData, }, common::{ diff --git a/src/backend/database/instance.rs b/src/backend/database/instance.rs index be1d31f..a3c16ae 100644 --- a/src/backend/database/instance.rs +++ b/src/backend/database/instance.rs @@ -4,11 +4,11 @@ use crate::{ schema::{instance, instance_follow}, IbisData, }, - error::MyResult, federation::objects::{ articles_collection::DbArticleCollection, instance_collection::DbInstanceCollection, }, + utils::error::MyResult, }, common::{newtypes::InstanceId, DbInstance, DbPerson, InstanceView}, }; diff --git a/src/backend/database/mod.rs b/src/backend/database/mod.rs index 0bb9074..0bac711 100644 --- a/src/backend/database/mod.rs +++ b/src/backend/database/mod.rs @@ -1,4 +1,4 @@ -use crate::backend::{config::IbisConfig, database::schema::jwt_secret, error::MyResult}; +use crate::backend::{config::IbisConfig, database::schema::jwt_secret, utils::error::MyResult}; use diesel::{ r2d2::{ConnectionManager, Pool}, PgConnection, diff --git a/src/backend/database/user.rs b/src/backend/database/user.rs index dd175e1..0b88237 100644 --- a/src/backend/database/user.rs +++ b/src/backend/database/user.rs @@ -4,8 +4,7 @@ use crate::{ schema::{instance, instance_follow, local_user, person}, IbisData, }, - error::MyResult, - utils::generate_keypair, + utils::{error::MyResult, generate_keypair}, }, common::{ newtypes::PersonId, diff --git a/src/backend/federation/activities/accept.rs b/src/backend/federation/activities/accept.rs index 12d53a8..ceff950 100644 --- a/src/backend/federation/activities/accept.rs +++ b/src/backend/federation/activities/accept.rs @@ -1,9 +1,11 @@ use crate::{ backend::{ database::IbisData, - error::MyResult, federation::{activities::follow::Follow, send_activity}, - utils::generate_activity_id, + utils::{ + error::{Error, MyResult}, + generate_activity_id, + }, }, common::DbInstance, }; @@ -54,7 +56,7 @@ impl Accept { #[async_trait::async_trait] impl ActivityHandler for Accept { type DataType = IbisData; - type Error = crate::backend::error::Error; + type Error = Error; fn id(&self) -> &Url { &self.id diff --git a/src/backend/federation/activities/create_article.rs b/src/backend/federation/activities/create_article.rs index f3c3327..1ccfc11 100644 --- a/src/backend/federation/activities/create_article.rs +++ b/src/backend/federation/activities/create_article.rs @@ -1,9 +1,11 @@ use crate::{ backend::{ database::IbisData, - error::MyResult, federation::objects::article::ApubArticle, - utils::generate_activity_id, + utils::{ + error::{Error, MyResult}, + generate_activity_id, + }, }, common::{DbArticle, DbInstance}, }; @@ -51,7 +53,7 @@ impl CreateArticle { #[async_trait::async_trait] impl ActivityHandler for CreateArticle { type DataType = IbisData; - type Error = crate::backend::error::Error; + type Error = Error; fn id(&self) -> &Url { &self.id diff --git a/src/backend/federation/activities/follow.rs b/src/backend/federation/activities/follow.rs index d64d909..e312918 100644 --- a/src/backend/federation/activities/follow.rs +++ b/src/backend/federation/activities/follow.rs @@ -1,9 +1,9 @@ use crate::{ backend::{ database::IbisData, - error::MyResult, federation::{activities::accept::Accept, send_activity}, generate_activity_id, + utils::error::{Error, MyResult}, }, common::{DbInstance, DbPerson}, }; @@ -44,7 +44,7 @@ impl Follow { #[async_trait::async_trait] impl ActivityHandler for Follow { type DataType = IbisData; - type Error = crate::backend::error::Error; + type Error = Error; fn id(&self) -> &Url { &self.id diff --git a/src/backend/federation/activities/mod.rs b/src/backend/federation/activities/mod.rs index b6c5ee4..aa7118a 100644 --- a/src/backend/federation/activities/mod.rs +++ b/src/backend/federation/activities/mod.rs @@ -1,11 +1,11 @@ use crate::{ backend::{ database::{edit::DbEditForm, IbisData}, - error::Error, federation::activities::{ update_local_article::UpdateLocalArticle, update_remote_article::UpdateRemoteArticle, }, + utils::error::Error, }, common::{ newtypes::{EditId, PersonId}, diff --git a/src/backend/federation/activities/reject.rs b/src/backend/federation/activities/reject.rs index fc46029..f24fbae 100644 --- a/src/backend/federation/activities/reject.rs +++ b/src/backend/federation/activities/reject.rs @@ -4,9 +4,11 @@ use crate::{ conflict::{DbConflict, DbConflictForm}, IbisData, }, - error::MyResult, federation::{objects::edit::ApubEdit, send_activity}, - utils::generate_activity_id, + utils::{ + error::{Error, MyResult}, + generate_activity_id, + }, }, common::{DbInstance, EditVersion}, }; @@ -61,7 +63,7 @@ impl RejectEdit { #[async_trait::async_trait] impl ActivityHandler for RejectEdit { type DataType = IbisData; - type Error = crate::backend::error::Error; + type Error = Error; fn id(&self) -> &Url { &self.id diff --git a/src/backend/federation/activities/update_local_article.rs b/src/backend/federation/activities/update_local_article.rs index 95b4432..874605c 100644 --- a/src/backend/federation/activities/update_local_article.rs +++ b/src/backend/federation/activities/update_local_article.rs @@ -1,9 +1,11 @@ use crate::{ backend::{ database::IbisData, - error::MyResult, federation::objects::article::ApubArticle, - utils::generate_activity_id, + utils::{ + error::{Error, MyResult}, + generate_activity_id, + }, }, common::{DbArticle, DbInstance}, }; @@ -58,7 +60,7 @@ impl UpdateLocalArticle { #[async_trait::async_trait] impl ActivityHandler for UpdateLocalArticle { type DataType = IbisData; - type Error = crate::backend::error::Error; + type Error = Error; fn id(&self) -> &Url { &self.id diff --git a/src/backend/federation/activities/update_remote_article.rs b/src/backend/federation/activities/update_remote_article.rs index c73802a..f18db28 100644 --- a/src/backend/federation/activities/update_remote_article.rs +++ b/src/backend/federation/activities/update_remote_article.rs @@ -1,13 +1,15 @@ use crate::{ backend::{ database::IbisData, - error::MyResult, federation::{ activities::{reject::RejectEdit, update_local_article::UpdateLocalArticle}, objects::edit::ApubEdit, send_activity, }, - utils::generate_activity_id, + utils::{ + error::{Error, MyResult}, + generate_activity_id, + }, }, common::{validation::can_edit_article, DbArticle, DbEdit, DbInstance}, }; @@ -64,7 +66,7 @@ impl UpdateRemoteArticle { #[async_trait::async_trait] impl ActivityHandler for UpdateRemoteArticle { type DataType = IbisData; - type Error = crate::backend::error::Error; + type Error = Error; fn id(&self) -> &Url { &self.id diff --git a/src/backend/federation/objects/article.rs b/src/backend/federation/objects/article.rs index 51d52a2..f9e6f30 100644 --- a/src/backend/federation/objects/article.rs +++ b/src/backend/federation/objects/article.rs @@ -1,8 +1,8 @@ use crate::{ backend::{ database::{article::DbArticleForm, IbisData}, - error::Error, federation::objects::edits_collection::DbEditCollection, + utils::error::Error, }, common::{DbArticle, DbInstance, EditVersion}, }; diff --git a/src/backend/federation/objects/articles_collection.rs b/src/backend/federation/objects/articles_collection.rs index e1fa63a..016cad3 100644 --- a/src/backend/federation/objects/articles_collection.rs +++ b/src/backend/federation/objects/articles_collection.rs @@ -1,8 +1,8 @@ use crate::{ backend::{ database::IbisData, - error::{Error, MyResult}, federation::objects::article::ApubArticle, + utils::error::{Error, MyResult}, }, common::{utils::http_protocol_str, DbArticle}, }; diff --git a/src/backend/federation/objects/edit.rs b/src/backend/federation/objects/edit.rs index a8405f2..6c8a64d 100644 --- a/src/backend/federation/objects/edit.rs +++ b/src/backend/federation/objects/edit.rs @@ -1,7 +1,7 @@ use crate::{ backend::{ database::{edit::DbEditForm, IbisData}, - error::Error, + utils::error::Error, }, common::{DbArticle, DbEdit, DbPerson, EditVersion}, }; diff --git a/src/backend/federation/objects/edits_collection.rs b/src/backend/federation/objects/edits_collection.rs index 7140535..3e3a96c 100644 --- a/src/backend/federation/objects/edits_collection.rs +++ b/src/backend/federation/objects/edits_collection.rs @@ -1,5 +1,5 @@ use crate::{ - backend::{database::IbisData, error::Error, federation::objects::edit::ApubEdit}, + backend::{database::IbisData, federation::objects::edit::ApubEdit, utils::error::Error}, common::{DbArticle, DbEdit}, }; use activitypub_federation::{ diff --git a/src/backend/federation/objects/instance.rs b/src/backend/federation/objects/instance.rs index 52744c8..a9fbdf5 100644 --- a/src/backend/federation/objects/instance.rs +++ b/src/backend/federation/objects/instance.rs @@ -2,8 +2,8 @@ use super::instance_collection::DbInstanceCollection; use crate::{ backend::{ database::{instance::DbInstanceForm, IbisData}, - error::{Error, MyResult}, federation::{objects::articles_collection::DbArticleCollection, send_activity}, + utils::error::{Error, MyResult}, }, common::{utils::extract_domain, DbInstance}, }; diff --git a/src/backend/federation/objects/instance_collection.rs b/src/backend/federation/objects/instance_collection.rs index d91a1f7..70cc651 100644 --- a/src/backend/federation/objects/instance_collection.rs +++ b/src/backend/federation/objects/instance_collection.rs @@ -2,7 +2,7 @@ use super::instance::ApubInstance; use crate::{ backend::{ database::IbisData, - error::{Error, MyResult}, + utils::error::{Error, MyResult}, }, common::{utils::http_protocol_str, DbInstance}, }; diff --git a/src/backend/federation/objects/user.rs b/src/backend/federation/objects/user.rs index c535515..c53ea08 100644 --- a/src/backend/federation/objects/user.rs +++ b/src/backend/federation/objects/user.rs @@ -1,7 +1,7 @@ use crate::{ backend::{ database::{user::DbPersonForm, IbisData}, - error::Error, + utils::error::Error, }, common::DbPerson, }; diff --git a/src/backend/federation/routes.rs b/src/backend/federation/routes.rs index 2fca4cc..0f85ecd 100644 --- a/src/backend/federation/routes.rs +++ b/src/backend/federation/routes.rs @@ -2,7 +2,6 @@ use super::objects::instance_collection::{DbInstanceCollection, InstanceCollecti use crate::{ backend::{ database::IbisData, - error::{Error, MyResult}, federation::{ activities::{ accept::Accept, @@ -20,6 +19,7 @@ use crate::{ user::ApubUser, }, }, + utils::error::{Error, MyResult}, }, common::{DbArticle, DbInstance, DbPerson}, }; diff --git a/src/backend/mod.rs b/src/backend/mod.rs index ed0d844..1b65ed3 100644 --- a/src/backend/mod.rs +++ b/src/backend/mod.rs @@ -2,38 +2,25 @@ use crate::{ backend::{ config::IbisConfig, database::{article::DbArticleForm, instance::DbInstanceForm, IbisData}, - error::{Error, MyResult}, - federation::{activities::submit_article_update, routes::federation_routes, VerifyUrlData}, - utils::generate_activity_id, + federation::{activities::submit_article_update, VerifyUrlData}, + utils::{ + error::{Error, MyResult}, + generate_activity_id, + }, }, common::{ utils::http_protocol_str, - Auth, DbArticle, DbInstance, DbPerson, EditVersion, MAIN_PAGE_NAME, }, - frontend::app::{shell, App}, }; use activitypub_federation::{ - config::{Data, FederationConfig, FederationMiddleware}, + config::{Data, FederationConfig}, fetch::object_id::ObjectId, }; -use api::api_routes; -use assets::file_and_error_handler; -use axum::{ - body::Body, - extract::State, - http::Request, - middleware::from_fn_with_state, - response::{IntoResponse, Response}, - routing::get, - Extension, - Router, - ServiceExt, -}; use chrono::Utc; use diesel::{ r2d2::{ConnectionManager, Pool}, @@ -44,26 +31,18 @@ use federation::objects::{ articles_collection::local_articles_url, instance_collection::linked_instances_url, }; -use leptos::prelude::*; -use leptos_axum::{generate_route_list, LeptosRoutes}; use log::info; -use middleware::{auth_middleware, federation_routes_middleware, FEDERATION_ROUTES_PREFIX}; -use std::{net::SocketAddr, sync::Arc, thread}; -use tokio::{net::TcpListener, sync::oneshot}; -use tower_http::{compression::CompressionLayer, cors::CorsLayer}; -use tower_layer::Layer; -use utils::generate_keypair; +use server::start_server; +use std::{net::SocketAddr, thread}; +use tokio::sync::oneshot; +use utils::{generate_keypair, scheduled_tasks}; pub mod api; -mod assets; pub mod config; pub mod database; -pub mod error; pub mod federation; -mod middleware; -mod nodeinfo; -mod scheduled_tasks; -mod utils; +mod server; +pub mod utils; const MIGRATIONS: EmbeddedMigrations = embed_migrations!("migrations"); @@ -85,14 +64,14 @@ pub async fn start( let data = FederationConfig::builder() .domain(ibis_data.config.federation.domain.clone()) .url_verifier(Box::new(VerifyUrlData(ibis_data.config.clone()))) - .app_data(ibis_data.clone()) + .app_data(ibis_data) .http_fetch_limit(1000) .debug(cfg!(debug_assertions)) .build() .await?; - // Create local instance if it doesnt exist yet if DbInstance::read_local_instance(&data).is_err() { + info!("Running setup for new instance"); setup(&data.to_request_data()).await?; } @@ -101,60 +80,11 @@ pub async fn start( scheduled_tasks::start(db_pool); }); - let leptos_options = get_config_from_str(include_str!("../../Cargo.toml"))?; - let mut addr = leptos_options.site_addr; - if let Some(override_hostname) = override_hostname { - addr = override_hostname; - } - let routes = generate_route_list(App); - - let config = data.clone(); - let arc_data = Arc::new(ibis_data); - let app = Router::new() - .leptos_routes_with_handler(routes, get(leptos_routes_handler)) - .fallback(file_and_error_handler) - .with_state(leptos_options) - .nest(FEDERATION_ROUTES_PREFIX, federation_routes()) - .nest("/api/v1", api_routes()) - .nest("", nodeinfo::config()) - .layer(FederationMiddleware::new(config)) - .layer(CorsLayer::permissive()) - .layer(CompressionLayer::new()) - .route_layer(from_fn_with_state(arc_data.clone(), auth_middleware)); - - // Rewrite federation routes - // https://docs.rs/axum/0.7.4/axum/middleware/index.html#rewriting-request-uri-in-middleware - let middleware = axum::middleware::from_fn(federation_routes_middleware); - let app_with_middleware = middleware.layer(app); - - info!("Listening on {}", &addr); - let listener = TcpListener::bind(&addr).await?; - if let Some(notify_start) = notify_start { - notify_start.send(()).expect("send oneshot"); - } - axum::serve(listener, app_with_middleware.into_make_service()).await?; + start_server(data, override_hostname, notify_start).await?; Ok(()) } -/// Make auth token available in hydrate mode -async fn leptos_routes_handler( - auth: Option>, - State(leptos_options): State, - request: Request, -) -> Response { - let handler = leptos_axum::render_app_async_with_context( - move || { - if let Some(auth) = &auth { - provide_context(auth.0.clone()); - } - }, - move || shell(leptos_options.clone()), - ); - - handler(request).await.into_response() -} - const MAIN_PAGE_DEFAULT_TEXT: &str = "Welcome to Ibis, the federated Wikipedia alternative! This main page can only be edited by the admin. Use it as an introduction for new users, \ diff --git a/src/backend/assets.rs b/src/backend/server/assets.rs similarity index 97% rename from src/backend/assets.rs rename to src/backend/server/assets.rs index 437c428..35bc1c8 100644 --- a/src/backend/assets.rs +++ b/src/backend/server/assets.rs @@ -1,4 +1,4 @@ -use super::error::MyResult; +use crate::backend::utils::error::MyResult; use anyhow::anyhow; use axum::{ body::Body, diff --git a/src/backend/middleware.rs b/src/backend/server/middleware.rs similarity index 97% rename from src/backend/middleware.rs rename to src/backend/server/middleware.rs index 6d0b4f9..dff0605 100644 --- a/src/backend/middleware.rs +++ b/src/backend/server/middleware.rs @@ -1,6 +1,5 @@ -use super::api::user::validate; use crate::{ - backend::database::IbisData, + backend::{api::user::validate, database::IbisData}, common::{Auth, AUTH_COOKIE}, }; use axum::{body::Body, extract::State, http::Request, middleware::Next, response::Response}; diff --git a/src/backend/server/mod.rs b/src/backend/server/mod.rs new file mode 100644 index 0000000..d448c5b --- /dev/null +++ b/src/backend/server/mod.rs @@ -0,0 +1,88 @@ +use super::{database::IbisData, utils::error::MyResult}; +use crate::{ + backend::{api::api_routes, federation::routes::federation_routes}, + common::Auth, + frontend::app::{shell, App}, +}; +use activitypub_federation::config::{FederationConfig, FederationMiddleware}; +use assets::file_and_error_handler; +use axum::{ + body::Body, + extract::State, + http::Request, + middleware::from_fn_with_state, + response::{IntoResponse, Response}, + routing::get, + Extension, + Router, + ServiceExt, +}; +use leptos::prelude::*; +use leptos_axum::{generate_route_list, LeptosRoutes}; +use log::info; +use middleware::{auth_middleware, federation_routes_middleware, FEDERATION_ROUTES_PREFIX}; +use std::{net::SocketAddr, ops::Deref, sync::Arc}; +use tokio::{net::TcpListener, sync::oneshot}; +use tower_http::{compression::CompressionLayer, cors::CorsLayer}; +use tower_layer::Layer; + +mod assets; +mod middleware; +mod nodeinfo; + +pub(super) async fn start_server( + data: FederationConfig, + override_hostname: Option, + notify_start: Option>, +) -> MyResult<()> { + let leptos_options = get_config_from_str(include_str!("../../../Cargo.toml"))?; + let mut addr = leptos_options.site_addr; + if let Some(override_hostname) = override_hostname { + addr = override_hostname; + } + let routes = generate_route_list(App); + + let arc_data = Arc::new(data.deref().clone()); + let app = Router::new() + .leptos_routes_with_handler(routes, get(leptos_routes_handler)) + .fallback(file_and_error_handler) + .with_state(leptos_options) + .nest(FEDERATION_ROUTES_PREFIX, federation_routes()) + .nest("/api/v1", api_routes()) + .nest("", nodeinfo::config()) + .layer(FederationMiddleware::new(data)) + .layer(CorsLayer::permissive()) + .layer(CompressionLayer::new()) + .route_layer(from_fn_with_state(arc_data, auth_middleware)); + + // Rewrite federation routes + // https://docs.rs/axum/0.7.4/axum/middleware/index.html#rewriting-request-uri-in-middleware + let middleware = axum::middleware::from_fn(federation_routes_middleware); + let app_with_middleware = middleware.layer(app); + + info!("Listening on {}", &addr); + let listener = TcpListener::bind(&addr).await?; + if let Some(notify_start) = notify_start { + notify_start.send(()).expect("send oneshot"); + } + axum::serve(listener, app_with_middleware.into_make_service()).await?; + Ok(()) +} + +/// Make auth token available in hydrate mode +async fn leptos_routes_handler( + auth: Option>, + State(leptos_options): State, + request: Request, +) -> Response { + let handler = leptos_axum::render_app_async_with_context( + move || { + if let Some(auth) = &auth { + provide_context(auth.0.clone()); + } + }, + move || shell(leptos_options.clone()), + ); + + handler(request).await.into_response() +} diff --git a/src/backend/nodeinfo.rs b/src/backend/server/nodeinfo.rs similarity index 96% rename from src/backend/nodeinfo.rs rename to src/backend/server/nodeinfo.rs index 6396047..6dd212e 100644 --- a/src/backend/nodeinfo.rs +++ b/src/backend/server/nodeinfo.rs @@ -1,6 +1,8 @@ -use super::database::instance_stats::InstanceStats; use crate::{ - backend::{database::IbisData, error::MyResult}, + backend::{ + database::{instance_stats::InstanceStats, IbisData}, + utils::error::MyResult, + }, common::utils::http_protocol_str, }; use activitypub_federation::config::Data; diff --git a/src/backend/error.rs b/src/backend/utils/error.rs similarity index 100% rename from src/backend/error.rs rename to src/backend/utils/error.rs diff --git a/src/backend/utils.rs b/src/backend/utils/mod.rs similarity index 91% rename from src/backend/utils.rs rename to src/backend/utils/mod.rs index 5cca78a..ddc1e4a 100644 --- a/src/backend/utils.rs +++ b/src/backend/utils/mod.rs @@ -1,5 +1,5 @@ use crate::{ - backend::{database::IbisData, error::MyResult}, + backend::{database::IbisData, utils::error::MyResult}, common::{utils, DbEdit, EditVersion}, }; use activitypub_federation::{ @@ -12,7 +12,10 @@ use rand::{distributions::Alphanumeric, thread_rng, Rng}; use std::sync::LazyLock; use url::{ParseError, Url}; -pub fn generate_activity_id(data: &Data) -> Result { +pub mod error; +pub(super) mod scheduled_tasks; + +pub(super) fn generate_activity_id(data: &Data) -> Result { let domain = &data.config.federation.domain; let id: String = thread_rng() .sample_iter(&Alphanumeric) @@ -32,7 +35,10 @@ pub fn generate_activity_id(data: &Data) -> Result { /// /// TODO: testing /// TODO: should cache all these generated versions -pub fn generate_article_version(edits: &Vec, version: &EditVersion) -> MyResult { +pub(super) fn generate_article_version( + edits: &Vec, + version: &EditVersion, +) -> MyResult { let mut generated = String::new(); if version == &EditVersion::default() { return Ok(generated); diff --git a/src/backend/scheduled_tasks.rs b/src/backend/utils/scheduled_tasks.rs similarity index 93% rename from src/backend/scheduled_tasks.rs rename to src/backend/utils/scheduled_tasks.rs index 0a734af..a1ac749 100644 --- a/src/backend/scheduled_tasks.rs +++ b/src/backend/utils/scheduled_tasks.rs @@ -1,4 +1,4 @@ -use super::{database::DbPool, error::MyResult}; +use crate::backend::{database::DbPool, utils::error::MyResult}; use clokwerk::{Scheduler, TimeUnits}; use diesel::{sql_query, RunQueryDsl}; use log::{error, info}; diff --git a/src/main.rs b/src/main.rs index cf8baf5..bd4c161 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,6 @@ #[cfg(feature = "ssr")] #[tokio::main] -pub async fn main() -> ibis::backend::error::MyResult<()> { +pub async fn main() -> ibis::backend::utils::error::MyResult<()> { use ibis::backend::config::IbisConfig; use log::LevelFilter;