use std::sync::Arc;
use parse_rust_mongo::MongoAdapter;
use parse_rust_rest::AclScope;
use crate::config::ServerConfig;
use crate::sessions::SessionStore;
#[derive(Clone)]
pub struct AppState {
config: Arc<ServerConfig>,
storage: Arc<MongoAdapter>,
sessions: Arc<SessionStore>,
}
impl AppState {
pub fn new(config: ServerConfig, storage: MongoAdapter) -> Self {
Self {
config: Arc::new(config),
storage: Arc::new(storage),
sessions: Arc::new(SessionStore::default()),
}
}
pub fn config(&self) -> &ServerConfig {
&self.config
}
pub fn storage(&self) -> &MongoAdapter {
&self.storage
}
pub fn sessions(&self) -> &SessionStore {
&self.sessions
}
pub async fn ensure_indexes(&self) -> Result<(), parse_rust_core::ParseError> {
use parse_rust_storage::StorageAdapter;
self.storage
.ensure_unique_index("_User", &["username"], None)
.await?;
self.storage
.ensure_unique_index("_User", &["email"], None)
.await?;
Ok(())
}
pub fn scope_for_session(&self, token: &str) -> Result<AclScope, parse_rust_core::ParseError> {
match self.sessions.user_for(token) {
Some(object_id) => Ok(AclScope::User { object_id }),
None => Err(parse_rust_core::ParseError::new(
parse_rust_core::ErrorCode::InvalidSessionToken,
"Invalid session token",
)),
}
}
}
impl axum::extract::FromRef<AppState> for Arc<ServerConfig> {
fn from_ref(state: &AppState) -> Self {
state.config.clone()
}
}