architect_sdk/state.rs
1//! Shared application state for all routes. Model is reloadable after package install.
2
3use crate::authrs::AuthrsClient;
4use crate::config::ResolvedModel;
5use crate::db::{pool::Pool, Dialect};
6use crate::events::DecisionHubClient;
7use crate::storage::StorageProvider;
8use crate::tenant::TenantRegistry;
9use std::collections::HashMap;
10use std::sync::{Arc, RwLock};
11
12#[derive(Clone)]
13pub struct AppState {
14 /// Default/central pool (from DATABASE_URL).
15 pub pool: Pool,
16 /// Default/active model (used for /api/v1/:path_segment). Reloaded after package install.
17 pub model: Arc<RwLock<ResolvedModel>>,
18 /// Resolved model per package_id. For database tenants, key is "package_id:tenant_id".
19 pub package_models: Arc<RwLock<HashMap<String, ResolvedModel>>>,
20 /// Pools for database-strategy tenants, keyed by tenant_id.
21 pub tenant_pools: Arc<RwLock<HashMap<String, Pool>>>,
22 /// Tenant registry (strategy + config per tenant), loaded from central DB at startup.
23 pub tenant_registry: Arc<TenantRegistry>,
24 /// Optional blob storage provider for asset columns.
25 pub storage: Option<Arc<dyn StorageProvider>>,
26 /// Optional decision-hub client. None when DECISION_HUB_URL is not set.
27 pub event_client: Option<Arc<DecisionHubClient>>,
28 /// Optional authrs permission-check client. None when AUTHRS_URL or SERVICE_NAME is not set.
29 pub authrs_client: Option<Arc<AuthrsClient>>,
30 /// Active database dialect (set at startup via `db::active_dialect()`).
31 pub dialect: Arc<dyn Dialect>,
32 /// Per-tenant extensible-field registry cache (read-through, TTL-bounded, evicted on write).
33 /// Construct with `Default::default()`.
34 pub extensible_cache: crate::extensible_fields::RegistryCache,
35}