From e06094f23ca861ea5ae4864d11fa8ce8b7d7aa2c Mon Sep 17 00:00:00 2001 From: rtkay123 Date: Mon, 2 Feb 2026 13:05:49 +0200 Subject: feat: oauth route --- src/server/state/database.rs | 2 +- src/server/state/federation.rs | 65 ++++++++++++++++++++++++++++++++++++++++++ src/server/state/mod.rs | 17 +++++------ 3 files changed, 75 insertions(+), 9 deletions(-) create mode 100644 src/server/state/federation.rs (limited to 'src/server/state') diff --git a/src/server/state/database.rs b/src/server/state/database.rs index f8fd332..156de0f 100644 --- a/src/server/state/database.rs +++ b/src/server/state/database.rs @@ -4,7 +4,7 @@ use tracing::{debug, trace}; use crate::config::DatabaseOptions; -pub(super) async fn connect(opts: &DatabaseOptions) -> Result { +pub async fn connect(opts: &DatabaseOptions) -> Result { trace!(host = ?opts.url.host(), "connecting to database"); let pg = PgPoolOptions::new() .max_connections(opts.pool_size) diff --git a/src/server/state/federation.rs b/src/server/state/federation.rs new file mode 100644 index 0000000..083741c --- /dev/null +++ b/src/server/state/federation.rs @@ -0,0 +1,65 @@ +use activitypub_federation::config::FederationConfig; +use url::Url; + +use crate::{ + config::{Config, Environment}, + server::state::AppState, +}; + +pub async fn add_federation( + state: AppState, + config: &Config, +) -> anyhow::Result> { + let url = match config.server.environment { + Environment::Dev => { + format!("http://{}", config.server.domain) + } + Environment::Prod => { + format!("https://{}", config.server.domain) + } + }; + let mut url = Url::parse(&url)?; + + if Environment::Dev == config.server.environment { + let _ = url.set_port(Some(config.server.port)); + } + + let mut ap_id = url.clone(); + + { + let mut ps = ap_id.path_segments_mut().expect("path segments in url"); + ps.push("users"); + ps.push(&config.server.system_name); + } + + // let user = if let Some(user) = state.users_service.get_by_ap_id(ap_id.as_str()).await? { + // user + // } else { + // let mut inbox = ap_id.clone(); + // { + // let mut ps = inbox.path_segments_mut().expect("path segments in url"); + // ps.push("inbox"); + // } + // state + // .users_service + // .create_user( + // &ap_id, + // &config.server.system_name, + // PersonType::Service, + // &inbox, + // true, + // ) + // .await? + // }; + // + // let user = User::from(user); + + let config = FederationConfig::builder() + .domain(url.domain().expect("system domain")) + //.signed_fetch_actor(&user) + .app_data(state) + .build() + .await?; + + Ok(config) +} diff --git a/src/server/state/mod.rs b/src/server/state/mod.rs index 0726689..f5f731e 100644 --- a/src/server/state/mod.rs +++ b/src/server/state/mod.rs @@ -1,33 +1,34 @@ pub mod database; +pub mod federation; + +use std::sync::Arc; use sellershut_auth::{ClientOptions, OauthClient}; -use sqlx::PgPool; #[cfg(feature = "oauth-discord")] use url::Url; -use crate::config::Config; #[cfg(feature = "oauth-discord")] use crate::config::DiscordOauth; +use crate::{config::Config, server::driver::SellershutDriver}; +#[derive(Clone)] pub struct AppState { - database: PgPool, + driver: Arc, #[cfg(feature = "oauth-discord")] oauth_discord: OauthClient, } impl AppState { - pub async fn new(config: &Config) -> anyhow::Result { - let database = database::connect(&config.database).await?; - + pub async fn new(config: &Config, driver: impl SellershutDriver) -> anyhow::Result { Ok(Self { - database, + driver: Arc::new(driver), oauth_discord: discord_client(&config.oauth.discord, &config.oauth.oauth_redirect_url)?, }) } } #[cfg(feature = "oauth-discord")] -fn discord_client(disc: &DiscordOauth, redirect: &Url)->anyhow::Result { +fn discord_client(disc: &DiscordOauth, redirect: &Url) -> anyhow::Result { let discord_opts = ClientOptions::builder() .client_id(disc.client_id.to_owned()) .redirect_url(redirect.to_string()) -- cgit v1.2.3