pooly 0.2.1

A protobuf to Postgres adapter + connection pooling middleware.
Documentation
use std::sync::Arc;

use ring::rand::SystemRandom;
use sled::Db;

use crate::data::dao::TypedDao;
use crate::data::db::DbService;
use crate::services::auth::access::AccessControlService;
use crate::services::auth::connection_ids::{LiteralConnectionIdAccessEntryService, WildcardPatternConnectionIdAccessEntryService};
use crate::services::auth::jwt::JwtAuthService;
use crate::services::clock::Clock;
use crate::services::connections::config::ConnectionConfigService;
use crate::services::connections::ConnectionService;
use crate::services::initialize::InitializationService;
use crate::services::queries::QueryService;
use crate::services::secrets::{LocalSecretsService, SecretServiceFactory};
use crate::services::secrets::random::VecGenerator;
use crate::services::secrets::shares::MasterKeySharesService;
use crate::services::updatable::{CacheBackedService, UpdatableService};

pub mod data;
pub mod resources;
pub mod middleware;
pub mod models;
pub mod services;


pub struct AppContext {

    pub access_control_service: Arc<AccessControlService>,
    pub auth_service: Arc<JwtAuthService>,
    pub connection_config_service: Arc<ConnectionConfigService>,
    pub initialization_service: Arc<InitializationService>,
    pub literal_ids_service: Arc<LiteralConnectionIdAccessEntryService>,
    pub secrets_service: Arc<LocalSecretsService>,
    pub shares_service: Arc<MasterKeySharesService>,
    pub query_service: Arc<QueryService>,
    pub pattern_ids_service: Arc<WildcardPatternConnectionIdAccessEntryService>,
    pub vec_generator: Arc<VecGenerator>

}

impl AppContext {

    pub fn new() -> Self {
        Self::with_db(DbService::create())
    }

    fn with_db(db: Arc<Db>) -> Self {
        let vec_generator =
            Arc::new(
                VecGenerator::new(
                    Arc::new(SystemRandom::new())));

        let shares_service = Arc::new(MasterKeySharesService::new());

        let secrets_service: Arc<LocalSecretsService> =
            Arc::new(
                SecretServiceFactory::create(
                    shares_service.clone(), vec_generator.clone()));

        let connection_config_service =
            Arc::new(
                ConnectionConfigService::new(
                    db.clone(), secrets_service.clone()).unwrap()
            );

        let literal_ids_service =
            Arc::new(
                LiteralConnectionIdAccessEntryService::new(
                    db.clone(), secrets_service.clone()).unwrap()
            );

        let pattern_ids_service =
            Arc::new(
                WildcardPatternConnectionIdAccessEntryService::new(
                    db.clone(), secrets_service.clone()).unwrap()
            );

        let access_control_service =
            Arc::new(
                AccessControlService::new(
                    literal_ids_service.clone(),
                    pattern_ids_service.clone())
            );

        let query_service =
            Arc::new(QueryService::new(
                access_control_service.clone(),
                ConnectionService::new(
                    connection_config_service.clone())));

        let auth_service = Arc::new(
            JwtAuthService::new(
                Clock::new(), db.clone(), secrets_service.clone())
                .unwrap()
        );

        let initialization_service = Arc::new(
            InitializationService::new(
                auth_service.clone(),
                shares_service.clone(),
                secrets_service.clone())
        );

        AppContext {
            auth_service,
            access_control_service,
            connection_config_service,
            initialization_service,
            literal_ids_service,
            secrets_service,
            shares_service,
            query_service,
            pattern_ids_service,
            vec_generator
        }
    }
}

pub mod test_context {
    use crate::{AppContext, DbService};

    pub fn with_namespace(namespace: &str) -> AppContext {
        AppContext::with_db(DbService::with_namespace(namespace))
    }

    pub fn clear(namespace: &str) -> Result<(), ()> {
        DbService::clear(namespace)
    }

}