From 2a047f1f85247212b889cc537c3898f7f1c4075a Mon Sep 17 00:00:00 2001 From: MechaCat02 Date: Tue, 2 Jun 2026 19:55:51 +0200 Subject: [PATCH] feat(v1.1.2-docs): wire DocsServiceImpl into picloud binary build_app constructs PostgresDocsRepo + DocsServiceImpl alongside the existing KV wiring, sharing the same OutboxEventEmitter so KV and docs mutations both fan out through the same dispatcher. The docs handle joins the Services bundle so executor-core sees it on every per-call sdk::register_all. Co-Authored-By: Claude Opus 4.7 (1M context) --- crates/picloud/src/lib.rs | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) 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.