First v1.1.1 commit. Adds the KV store the design notes commit to: `(app_id, collection, key)` identity with JSONB value and a per-app index. Trait lives in `picloud-shared` so the executor-core Rhai bridge (next commit), the Postgres impl, and tests all depend on the same surface without coupling crates. The `Services` bundle grows from empty to three fields: `kv`, `dead_letters` (NoopDeadLetterService stub — replaced by the Postgres impl in commit 8), and `events` (NoopEventEmitter until the outbox emitter lands with the dispatcher). Tests use `Services::default()` for an all-noop bundle. New capabilities `AppKvRead` / `AppKvWrite` join the Capability enum. They map onto the existing seven-value `Scope` (script:read / script:write) — the scope vocabulary stays locked per the `docs/versioning.md` commitment. Script-as-gate semantics in `KvServiceImpl`: capability check runs when `cx.principal.is_some()`, skipped when None (public HTTP). Cross-app isolation is enforced independently by deriving every row's `app_id` from `cx.app_id` rather than a script-passed argument. In-memory `KvRepo` impl + unit tests cover the round-trips, the cross-app isolation property, empty-collection rejection, script-as-gate behaviour for both anonymous and authed contexts, and cursor-style pagination. Postgres impl exists; integration testing waits for a real DB harness (see HANDBACK). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
78 lines
2.8 KiB
Rust
78 lines
2.8 KiB
Rust
//! Control plane: script storage, scheduling, configuration.
|
|
//!
|
|
//! Single-writer to Postgres. The orchestrator may *read* scripts from
|
|
//! the same DB for now; once we add caching and per-node ingress, the
|
|
//! manager will publish change events.
|
|
|
|
pub mod admin_session_repo;
|
|
pub mod admin_user_repo;
|
|
pub mod admin_users_api;
|
|
pub mod api;
|
|
pub mod api_key_repo;
|
|
pub mod api_keys_api;
|
|
pub mod app_bootstrap;
|
|
pub mod app_domain_repo;
|
|
pub mod app_members_api;
|
|
pub mod app_members_repo;
|
|
pub mod app_repo;
|
|
pub mod apps_api;
|
|
pub mod auth;
|
|
pub mod auth_api;
|
|
pub mod auth_bootstrap;
|
|
pub mod auth_middleware;
|
|
pub mod authz;
|
|
pub mod kv_repo;
|
|
pub mod kv_service;
|
|
pub mod log_sink;
|
|
pub mod migrations;
|
|
pub mod repo;
|
|
pub mod route_admin;
|
|
pub mod route_repo;
|
|
pub mod sandbox;
|
|
pub mod scheduler;
|
|
|
|
pub use admin_session_repo::{
|
|
AdminSessionLookup, AdminSessionRepository, AdminSessionRepositoryError,
|
|
PostgresAdminSessionRepository,
|
|
};
|
|
pub use admin_user_repo::{
|
|
AdminUserCredentials, AdminUserRepository, AdminUserRepositoryError, AdminUserRow,
|
|
PostgresAdminUserRepository,
|
|
};
|
|
pub use admin_users_api::{admins_router, AdminsState};
|
|
pub use api::{admin_router, AdminState};
|
|
pub use api_key_repo::{
|
|
ApiKeyRepository, ApiKeyRepositoryError, ApiKeyRow, ApiKeyVerification, NewApiKey,
|
|
PostgresApiKeyRepository,
|
|
};
|
|
pub use api_keys_api::{api_keys_router, ApiKeysState};
|
|
pub use app_bootstrap::{seed_hello_world_if_fresh, HelloWorldOutcome};
|
|
pub use app_domain_repo::{AppDomainRepository, NewAppDomain, PostgresAppDomainRepository};
|
|
pub use app_members_api::{app_members_router, AppMembersApiError, AppMembersState};
|
|
pub use app_members_repo::{
|
|
AppMembersRepository, AppMembersRepositoryError, AppMembershipDetail, AppMembershipRow,
|
|
PostgresAppMembersRepository,
|
|
};
|
|
pub use app_repo::{resolve_app, AppLookup, AppRepository, PostgresAppRepository};
|
|
pub use apps_api::{apps_router, AppsState};
|
|
pub use auth_api::auth_router;
|
|
pub use auth_bootstrap::{
|
|
bootstrap_first_admin, bootstrap_first_admin_with, BootstrapEnv, BootstrapError,
|
|
};
|
|
#[allow(deprecated)]
|
|
pub use auth_middleware::{
|
|
attach_principal_if_present, require_admin, require_authenticated, AuthState, AuthedAdmin,
|
|
API_KEY_PREFIX, API_KEY_PREFIX_LEN, SESSION_COOKIE,
|
|
};
|
|
pub use authz::{can, require, AuthzDenied, AuthzError, AuthzRepo, Capability, Decision};
|
|
pub use kv_repo::{KvRepo, KvRepoError, PostgresKvRepo};
|
|
pub use kv_service::KvServiceImpl;
|
|
pub use log_sink::PostgresExecutionLogSink;
|
|
pub use repo::{
|
|
ExecutionLogRepository, NewScript, PostgresExecutionLogRepository, PostgresScriptRepository,
|
|
RepoResolver, ScriptPatch, ScriptRepository, ScriptRepositoryError,
|
|
};
|
|
pub use route_admin::{compile_routes, route_admin_router, RouteAdminState};
|
|
pub use route_repo::{NewRoute, PostgresRouteRepository, RouteRepository};
|
|
pub use sandbox::{CeilingError, SandboxCeiling};
|