diff --git a/crates/picloud/src/lib.rs b/crates/picloud/src/lib.rs index 4629ea1..8bce40f 100644 --- a/crates/picloud/src/lib.rs +++ b/crates/picloud/src/lib.rs @@ -16,14 +16,14 @@ use picloud_manager_core::{ AdminPrincipalResolver, AdminSessionRepository, AdminState, AdminUserRepository, AdminsState, ApiKeyRepository, ApiKeysState, AppDomainRepository, AppMembersRepository, AppMembersState, AppRepository, AppsState, AuthState, AuthzRepo, DeadLetterRepo, DeadLettersState, Dispatcher, - KvServiceImpl, OutboxEventEmitter, OutboxRepo, PostgresAbandonedRepo, + DocsServiceImpl, KvServiceImpl, OutboxEventEmitter, OutboxRepo, PostgresAbandonedRepo, PostgresAdminSessionRepository, PostgresAdminUserRepository, PostgresApiKeyRepository, PostgresAppDomainRepository, PostgresAppMembersRepository, PostgresAppRepository, - PostgresDeadLetterRepo, PostgresDeadLetterService, PostgresExecutionLogRepository, - PostgresExecutionLogSink, PostgresKvRepo, PostgresOutboxRepo, PostgresRouteRepository, - PostgresScriptRepository, PostgresTriggerRepo, PrincipalResolver, RepoResolver, - RouteAdminState, RouteRepository, SandboxCeiling, ScriptRepository, TriggerConfig, TriggerRepo, - TriggersState, + PostgresDeadLetterRepo, PostgresDeadLetterService, PostgresDocsRepo, + PostgresExecutionLogRepository, PostgresExecutionLogSink, PostgresKvRepo, PostgresOutboxRepo, + PostgresRouteRepository, PostgresScriptRepository, PostgresTriggerRepo, PrincipalResolver, + RepoResolver, RouteAdminState, RouteRepository, SandboxCeiling, ScriptRepository, + TriggerConfig, TriggerRepo, TriggersState, }; use picloud_orchestrator_core::routing::{AppDomainTable, RouteTable}; use picloud_orchestrator_core::{ @@ -31,8 +31,9 @@ use picloud_orchestrator_core::{ LocalExecutorClient, }; use picloud_shared::{ - DeadLetterService, ExecutionLogSink, InboxResolver, KvService, OutboxWriter, ScriptValidator, - ServiceEventEmitter, Services, API_VERSION, PRODUCT_VERSION, SDK_VERSION, WIRE_VERSION, + DeadLetterService, DocsService, ExecutionLogSink, InboxResolver, KvService, OutboxWriter, + ScriptValidator, ServiceEventEmitter, Services, API_VERSION, PRODUCT_VERSION, SDK_VERSION, + WIRE_VERSION, }; use sqlx::postgres::PgPoolOptions; use sqlx::PgPool; @@ -119,22 +120,29 @@ pub async fn build_app(pool: PgPool, auth: AuthDeps) -> anyhow::Result { let abandoned_repo: Arc = Arc::new(PostgresAbandonedRepo::new(pool.clone())); let trigger_config = TriggerConfig::from_env(); - // SDK services bundle. v1.1.1 ships the KV store + the - // outbox-backed event emitter + the dead-letter service (replay / - // resolve). - let kv_repo = Arc::new(PostgresKvRepo::new(pool)); + // SDK services bundle. v1.1.1 added KV + dead-letter; v1.1.2 adds + // the docs store. All four bound services share the + // outbox-backed event emitter so KV and docs mutations both fan + // out through the same dispatcher. + let kv_repo = Arc::new(PostgresKvRepo::new(pool.clone())); + let docs_repo = Arc::new(PostgresDocsRepo::new(pool)); let events: Arc = Arc::new(OutboxEventEmitter::new( trigger_repo.clone(), outbox_repo.clone(), )); let kv: Arc = Arc::new(KvServiceImpl::new(kv_repo, authz.clone(), events.clone())); + let docs: Arc = Arc::new(DocsServiceImpl::new( + docs_repo, + authz.clone(), + events.clone(), + )); let dl_service: Arc = Arc::new(PostgresDeadLetterService::new( dl_repo.clone(), outbox_repo.clone(), authz.clone(), )); - let services = Services::new(kv, dl_service.clone(), events); + let services = Services::new(kv, docs, dl_service.clone(), events); let engine = Arc::new(Engine::new(Limits::default(), services)); // Compile the routes table once at startup; admin writes refresh it.