use std::{ops::Deref, sync::Arc}; use activitypub_federation::config::FederationConfig; use stack_up::{Configuration, Environment, Services}; use crate::{cnfg::LocalConfig, entity::user::User, error::AppError}; #[derive(Clone)] pub struct AppHandle(Arc); impl Deref for AppHandle { type Target = Arc; fn deref(&self) -> &Self::Target { &self.0 } } pub struct AppState { pub services: Services, pub environment: Environment, } impl AppState { pub async fn create( services: Services, configuration: &Configuration, ) -> Result, AppError> { let warden_config: LocalConfig = serde_json::from_value(configuration.misc.clone())?; let user = User::new( &warden_config.instance_name, &warden_config.hostname, &services, configuration.application.env, ) .await?; let config = FederationConfig::builder() .domain(&warden_config.hostname) .signed_fetch_actor(&user) .app_data(AppHandle(Arc::new(Self { services, environment: configuration.application.env, }))) // .url_verifier(Box::new(MyUrlVerifier())) // TODO: could change this to env variable? .debug(configuration.application.env == Environment::Development) .build() .await?; Ok(config) } }