aboutsummaryrefslogtreecommitdiffstats
path: root/src/server/state
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/state')
-rw-r--r--src/server/state/database.rs2
-rw-r--r--src/server/state/federation.rs65
-rw-r--r--src/server/state/mod.rs17
3 files changed, 75 insertions, 9 deletions
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<PgPool> {
+pub async fn connect(opts: &DatabaseOptions) -> Result<PgPool> {
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<FederationConfig<AppState>> {
+ 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<dyn SellershutDriver>,
#[cfg(feature = "oauth-discord")]
oauth_discord: OauthClient,
}
impl AppState {
- pub async fn new(config: &Config) -> anyhow::Result<Self> {
- let database = database::connect(&config.database).await?;
-
+ pub async fn new(config: &Config, driver: impl SellershutDriver) -> anyhow::Result<Self> {
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<OauthClient> {
+fn discord_client(disc: &DiscordOauth, redirect: &Url) -> anyhow::Result<OauthClient> {
let discord_opts = ClientOptions::builder()
.client_id(disc.client_id.to_owned())
.redirect_url(redirect.to_string())