use std::sync::Arc;
use parse_rust_core::ParseError;
use parse_rust_mongo::MongoAdapter;
use crate::auth::Authority;
use crate::config::ServerConfig;
use crate::request::RequestContext;
#[derive(Clone)]
pub struct AppState {
config: Arc<ServerConfig>,
storage: Arc<MongoAdapter>,
}
impl AppState {
pub fn new(config: ServerConfig, storage: MongoAdapter) -> Self {
Self {
config: Arc::new(config),
storage: Arc::new(storage),
}
}
pub fn config(&self) -> &ServerConfig {
&self.config
}
pub fn storage(&self) -> &MongoAdapter {
&self.storage
}
pub async fn ensure_indexes(&self) -> Result<(), ParseError> {
use parse_rust_storage::StorageAdapter;
self.storage
.ensure_index("_User", &["username"], None, true, false)
.await?;
self.storage
.ensure_index("_User", &["email"], None, true, false)
.await?;
self.storage
.ensure_index(
"_User",
&["username"],
Some("case_insensitive_username"),
false,
true,
)
.await?;
self.storage
.ensure_index(
"_User",
&["email"],
Some("case_insensitive_email"),
false,
true,
)
.await?;
if self.config.create_index_role_name {
self.storage
.ensure_index("_Role", &["name"], None, true, false)
.await?;
}
Ok(())
}
pub async fn request_context(
&self,
authority: &Authority,
) -> Result<RequestContext, ParseError> {
crate::request::resolve(&self.storage, &self.config, authority).await
}
}
impl axum::extract::FromRef<AppState> for Arc<ServerConfig> {
fn from_ref(state: &AppState) -> Self {
state.config.clone()
}
}