From f93e4d91eb34ea3ed0f676454fdbc2b32d54b7ae Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Mon, 3 Aug 2026 10:10:01 +0000 Subject: [PATCH 1/2] feat: sync shared pgpm modules with constructive-db main Mirrors constructive-db main's pgpm-modules/ sources into the published copies (constructive-io/constructive-db#2684, #2689, #2690, #2701, #2703). Versions are untouched; publishing stays a manual step. - New @pgpm/errors module: jwt-claims now requires it (jwt_private.current_database_id raises DATABASE_CLAIM_REQUIRED through errors.raise_error instead of returning NULL), so the workspace was no longer self-contained without it. - jwt-claims: the current_* claim readers become LANGUAGE sql over pg_input_is_valid() instead of plpgsql EXCEPTION blocks, which opened a subtransaction on every call. - metaschema-modules: new pages_module; catalog_module gains the four sites_web_config/sites_error_pages/sites_app_links/sites_deep_links table id + name pairs and their FKs; FK-covering indexes added across the module tables. - metaschema-schema: new view/table/field/unique-constraint/foreign-key behavior tables; FK-covering indexes; database.schema_hash comment becomes '@behavior -*'. - app-scope, database-jobs, object-tree, achievements, base32, inflection, verify: source and test drift. - Fixed a stale revert in metaschema-schema field/table (dropped field_table_id_idx, which deploy no longer creates, so the full revert cycle failed), and the function-resolution catalog_module seed inserts, which omitted the four new NOT NULL DEFAULT uuid_nil() table id columns and tripped their FKs. - metaschema-modules snapshots refreshed for pages_module. - sql/--.sql + bundle artifacts regenerated for the changed modules. --- README.md | 1 + .../__tests__/achievements.test.ts | 8 +- .../app_scope/procedures/routing_tables.sql | 8 +- .../sql/pgpm-app-scope--0.34.0.bundle.tar.gz | Bin 10134 -> 10078 bytes .../app-scope/sql/pgpm-app-scope--0.34.0.sql | 8 +- .../base32/__tests__/base32.decode.test.ts | 14 +- .../base32/__tests__/base32.encode.test.ts | 2 +- .../schemas/app_jobs/procedures/add_job.sql | 6 +- .../pgpm-database-jobs--0.34.0.bundle.tar.gz | Bin 21402 -> 21424 bytes .../sql/pgpm-database-jobs--0.34.0.sql | 6 +- packages/errors/Makefile | 6 + packages/errors/README.md | 29 + .../schemas/errors/procedures/raise_error.sql | 31 + .../errors/deploy/schemas/errors/schema.sql | 14 + packages/errors/errors.control | 7 + packages/errors/package.json | 33 + packages/errors/pgpm.plan | 6 + .../schemas/errors/procedures/raise_error.sql | 7 + .../errors/revert/schemas/errors/schema.sql | 7 + .../errors/sql/errors--0.34.0.bundle.tar.gz | Bin 0 -> 2033 bytes packages/errors/sql/errors--0.34.0.sql | 24 + .../schemas/errors/procedures/raise_error.sql | 18 + .../errors/verify/schemas/errors/schema.sql | 14 + .../__tests__/catalog-fastpath.test.ts | 6 +- .../__tests__/resolution.test.ts | 6 +- .../inflection/__tests__/inflection.test.ts | 2 +- packages/jwt-claims/__tests__/jwt.test.ts | 21 + .../jwt_private/procedures/current_api_id.sql | 29 +- .../procedures/current_database_id.sql | 34 +- .../procedures/current_graph_execution_id.sql | 29 +- .../procedures/current_ip_address.sql | 28 +- .../procedures/current_principal_id.sql | 28 +- .../procedures/current_role_type.sql | 13 +- .../procedures/current_user_agent.sql | 26 +- .../jwt_public/procedures/current_user_id.sql | 29 +- packages/jwt-claims/package.json | 1 + packages/jwt-claims/pgpm-jwt-claims.control | 2 +- .../sql/pgpm-jwt-claims--0.34.0.bundle.tar.gz | Bin 7809 -> 8128 bytes .../sql/pgpm-jwt-claims--0.34.0.sql | 172 +-- .../__snapshots__/modules.test.ts.snap | 10 +- .../__tests__/modules.test.ts | 48 +- .../tables/agent_module/table.sql | 13 +- .../tables/api_surface_module/table.sql | 16 +- .../tables/app_module/table.sql | 9 +- .../tables/billing_module/table.sql | 10 +- .../tables/billing_provider_module/table.sql | 11 +- .../tables/blueprint/table.sql | 1 - .../tables/blueprint_template/table.sql | 1 - .../tables/catalog_module/table.sql | 40 + .../tables/compute_log_module/table.sql | 5 +- .../config_secrets_user_module/table.sql | 2 + .../connected_accounts_module/table.sql | 4 + .../tables/crypto_addresses_module/table.sql | 4 + .../tables/crypto_auth_module/table.sql | 5 + .../tables/database_settings_module/table.sql | 9 +- .../tables/db_preset_module/table.sql | 6 +- .../tables/db_usage_module/table.sql | 7 +- .../tables/denormalized_table_field/table.sql | 4 + .../tables/devices_module/table.sql | 6 +- .../tables/domain_module/table.sql | 11 +- .../tables/emails_module/table.sql | 4 + .../tables/events_module/table.sql | 11 + .../function_deployment_module/table.sql | 9 +- .../function_invocation_module/table.sql | 8 +- .../tables/function_module/table.sql | 16 +- .../tables/graph_execution_module/table.sql | 9 +- .../tables/graph_module/table.sql | 6 +- .../tables/hierarchy_module/table.sql | 8 +- .../tables/http_route_module/table.sql | 10 +- .../tables/i18n_module/table.sql | 4 +- .../identity_providers_module/table.sql | 2 +- .../tables/inference_log_module/table.sql | 5 +- .../tables/infra_config_module/table.sql | 3 +- .../tables/infra_secrets_module/table.sql | 3 +- .../integration_providers_module/table.sql | 2 +- .../tables/internal_secrets_module/table.sql | 3 +- .../tables/invites_module/table.sql | 9 +- .../tables/limits_module/table.sql | 16 + .../tables/membership_types_module/table.sql | 2 + .../tables/memberships_module/table.sql | 16 +- .../tables/merkle_store_module/table.sql | 6 +- .../tables/namespace_module/table.sql | 7 +- .../tables/notifications_module/table.sql | 33 +- .../tables/pages_module/table.sql | 62 + .../tables/permissions_module/table.sql | 6 + .../tables/phone_numbers_module/table.sql | 4 + .../tables/plans_module/table.sql | 9 +- .../tables/principal_auth_module/table.sql | 16 +- .../tables/profiles_module/table.sql | 12 +- .../tables/rate_limit_meters_module/table.sql | 8 +- .../tables/rate_limits_module/table.sql | 7 +- .../tables/realtime_module/table.sql | 1 - .../tables/resource_module/table.sql | 14 +- .../tables/rls_module/table.sql | 15 +- .../tables/route_module/table.sql | 18 +- .../tables/secure_table_provision/table.sql | 1 + .../tables/sessions_module/table.sql | 5 + .../tables/site_surface_module/table.sql | 50 +- .../tables/storage_log_module/table.sql | 5 +- .../tables/storage_module/table.sql | 9 +- .../tables/transfer_log_module/table.sql | 5 +- .../tables/user_auth_module/table.sql | 19 +- .../tables/user_credentials_module/table.sql | 1 - .../tables/user_settings_module/table.sql | 4 +- .../tables/user_state_module/table.sql | 2 + .../tables/users_module/table.sql | 3 + .../tables/webauthn_auth_module/table.sql | 7 + .../webauthn_credentials_module/table.sql | 4 + .../tables/webhook_module/table.sql | 12 +- packages/metaschema-modules/pgpm.plan | 1 + .../tables/pages_module/table.sql | 7 + .../metaschema-modules--0.34.0.bundle.tar.gz | Bin 71146 -> 79155 bytes .../sql/metaschema-modules--0.34.0.sql | 1019 +++++++++++++++-- .../tables/pages_module/table.sql | 10 + .../tables/check_constraint/table.sql | 1 - .../tables/composite_type/table.sql | 1 - .../tables/database/table.sql | 3 +- .../tables/default_privilege/table.sql | 1 - .../tables/derives/table.sql | 1 - .../tables/domain_type/table.sql | 1 - .../tables/embedding_chunks/table.sql | 2 + .../metaschema_public/tables/enum/table.sql | 1 - .../tables/exclusion_constraint/table.sql | 1 - .../metaschema_public/tables/field/table.sql | 1 - .../tables/field_behavior/table.sql | 52 + .../tables/foreign_key_constraint/table.sql | 2 +- .../foreign_key_constraint_behavior/table.sql | 52 + .../tables/function/table.sql | 1 - .../metaschema_public/tables/index/table.sql | 1 - .../tables/partition/table.sql | 1 + .../metaschema_public/tables/policy/table.sql | 1 - .../tables/primary_key_constraint/table.sql | 1 - .../metaschema_public/tables/schema/table.sql | 4 +- .../tables/spatial_relation/table.sql | 1 - .../metaschema_public/tables/table/table.sql | 2 +- .../tables/table_behavior/table.sql | 52 + .../tables/trigger/table.sql | 1 - .../tables/trigger_function/table.sql | 2 - .../tables/unique_constraint/table.sql | 1 - .../unique_constraint_behavior/table.sql | 52 + .../metaschema_public/tables/view/table.sql | 1 - .../tables/view_behavior/table.sql | 52 + .../tables/view_grant/table.sql | 1 - .../tables/view_rule/table.sql | 1 - .../tables/view_table/table.sql | 1 - packages/metaschema-schema/pgpm.plan | 5 + .../metaschema_public/tables/field/table.sql | 1 - .../tables/field_behavior/table.sql | 7 + .../foreign_key_constraint_behavior/table.sql | 7 + .../tables/table_behavior/table.sql | 7 + .../unique_constraint_behavior/table.sql | 7 + .../tables/view_behavior/table.sql | 7 + .../metaschema-schema--0.34.0.bundle.tar.gz | Bin 25894 -> 28239 bytes .../sql/metaschema-schema--0.34.0.sql | 180 ++- .../tables/field_behavior/table.sql | 15 + .../foreign_key_constraint_behavior/table.sql | 15 + .../tables/table_behavior/table.sql | 15 + .../unique_constraint_behavior/table.sql | 15 + .../tables/view_behavior/table.sql | 15 + .../__tests__/objects/flow-graph.test.ts | 3 +- .../__tests__/objects/tailwind-vdom.test.ts | 3 +- .../__tests__/objects/time-travel.test.ts | 3 +- packages/verify/__tests__/ext-verify.test.ts | 2 +- pnpm-lock.yaml | 9 + 164 files changed, 2392 insertions(+), 644 deletions(-) create mode 100644 packages/errors/Makefile create mode 100644 packages/errors/README.md create mode 100644 packages/errors/deploy/schemas/errors/procedures/raise_error.sql create mode 100644 packages/errors/deploy/schemas/errors/schema.sql create mode 100644 packages/errors/errors.control create mode 100644 packages/errors/package.json create mode 100644 packages/errors/pgpm.plan create mode 100644 packages/errors/revert/schemas/errors/procedures/raise_error.sql create mode 100644 packages/errors/revert/schemas/errors/schema.sql create mode 100644 packages/errors/sql/errors--0.34.0.bundle.tar.gz create mode 100644 packages/errors/sql/errors--0.34.0.sql create mode 100644 packages/errors/verify/schemas/errors/procedures/raise_error.sql create mode 100644 packages/errors/verify/schemas/errors/schema.sql create mode 100644 packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/pages_module/table.sql create mode 100644 packages/metaschema-modules/revert/schemas/metaschema_modules_public/tables/pages_module/table.sql create mode 100644 packages/metaschema-modules/verify/schemas/metaschema_modules_public/tables/pages_module/table.sql create mode 100644 packages/metaschema-schema/deploy/schemas/metaschema_public/tables/field_behavior/table.sql create mode 100644 packages/metaschema-schema/deploy/schemas/metaschema_public/tables/foreign_key_constraint_behavior/table.sql create mode 100644 packages/metaschema-schema/deploy/schemas/metaschema_public/tables/table_behavior/table.sql create mode 100644 packages/metaschema-schema/deploy/schemas/metaschema_public/tables/unique_constraint_behavior/table.sql create mode 100644 packages/metaschema-schema/deploy/schemas/metaschema_public/tables/view_behavior/table.sql create mode 100644 packages/metaschema-schema/revert/schemas/metaschema_public/tables/field_behavior/table.sql create mode 100644 packages/metaschema-schema/revert/schemas/metaschema_public/tables/foreign_key_constraint_behavior/table.sql create mode 100644 packages/metaschema-schema/revert/schemas/metaschema_public/tables/table_behavior/table.sql create mode 100644 packages/metaschema-schema/revert/schemas/metaschema_public/tables/unique_constraint_behavior/table.sql create mode 100644 packages/metaschema-schema/revert/schemas/metaschema_public/tables/view_behavior/table.sql create mode 100644 packages/metaschema-schema/verify/schemas/metaschema_public/tables/field_behavior/table.sql create mode 100644 packages/metaschema-schema/verify/schemas/metaschema_public/tables/foreign_key_constraint_behavior/table.sql create mode 100644 packages/metaschema-schema/verify/schemas/metaschema_public/tables/table_behavior/table.sql create mode 100644 packages/metaschema-schema/verify/schemas/metaschema_public/tables/unique_constraint_behavior/table.sql create mode 100644 packages/metaschema-schema/verify/schemas/metaschema_public/tables/view_behavior/table.sql diff --git a/README.md b/README.md index 08a623c19..15523b337 100644 --- a/README.md +++ b/README.md @@ -137,6 +137,7 @@ Each module includes its own README with detailed documentation. See individual - [`@pgpm/encrypted-secrets-table`](https://www.npmjs.com/package/@pgpm/encrypted-secrets-table) - Table-based encrypted secrets ### Utilities +- [`@pgpm/errors`](https://www.npmjs.com/package/@pgpm/errors) - Canonical structured error raising (`errors.raise_error`) - [`@pgpm/utils`](https://www.npmjs.com/package/@pgpm/utils) - General utility functions - [`@pgpm/verify`](https://www.npmjs.com/package/@pgpm/verify) - Verification utilities (used by other modules) - [`@pgpm/inflection`](https://www.npmjs.com/package/@pgpm/inflection) - String inflection utilities diff --git a/packages/achievements/__tests__/achievements.test.ts b/packages/achievements/__tests__/achievements.test.ts index 6bc1b904f..73cefefb6 100644 --- a/packages/achievements/__tests__/achievements.test.ts +++ b/packages/achievements/__tests__/achievements.test.ts @@ -59,7 +59,7 @@ afterEach(async () => { }); it('newbie', async () => { - const steps = [ + const steps = [ 'agree_to_terms', 'accept_cookies', 'accept_privacy', @@ -98,7 +98,7 @@ it('newbie', async () => { }); it('advanced', async () => { - const steps = [ + const steps = [ 'agree_to_terms', 'accept_cookies', 'accept_privacy', @@ -139,7 +139,7 @@ it('advanced', async () => { }); it('advanced part II', async () => { - const partII = [['apply_for_verifier'], ['create_action', 2]]; + const partII = [['apply_for_verifier'], ['create_action', 2]]; for (const [name, required_count = 1] of partII) { await pg.any( @@ -190,7 +190,7 @@ it('advanced part II', async () => { }); it('advanced part III', async () => { - const partIII = [ + const partIII = [ ['apply_for_verifier'], ['approved_for_verifier'], ['create_action', 2] diff --git a/packages/app-scope/deploy/schemas/app_scope/procedures/routing_tables.sql b/packages/app-scope/deploy/schemas/app_scope/procedures/routing_tables.sql index ec21e8708..70cfb4527 100644 --- a/packages/app-scope/deploy/schemas/app_scope/procedures/routing_tables.sql +++ b/packages/app-scope/deploy/schemas/app_scope/procedures/routing_tables.sql @@ -40,8 +40,6 @@ CREATE FUNCTION app_scope.routing_tables( apis_table text, api_schemas_schema text, api_schemas_table text, - api_modules_schema text, - api_modules_table text, api_settings_schema text, api_settings_table text, cors_settings_schema text, @@ -77,7 +75,7 @@ BEGIN RAISE EXCEPTION 'ROUTING_TABLES_SCOPE_REQUIRED: scope is required (no default scope)'; END IF; - SELECT am.apis_table_id, am.api_schemas_table_id, am.api_modules_table_id, + SELECT am.apis_table_id, am.api_schemas_table_id, am.api_settings_table_id, am.cors_settings_table_id INTO api_surface FROM app_scope.frames( @@ -93,20 +91,16 @@ BEGIN IF FOUND AND api_surface.apis_table_id IS NOT NULL AND api_surface.apis_table_id <> uuid_nil() THEN SELECT apis_s.schema_name, apis_t.name, api_schemas_s.schema_name, api_schemas_t.name, - api_modules_s.schema_name, api_modules_t.name, api_settings_s.schema_name, api_settings_t.name, cors_settings_s.schema_name, cors_settings_t.name INTO apis_schema, apis_table, api_schemas_schema, api_schemas_table, - api_modules_schema, api_modules_table, api_settings_schema, api_settings_table, cors_settings_schema, cors_settings_table FROM metaschema_public.table apis_t JOIN metaschema_public.schema apis_s ON apis_s.id = apis_t.schema_id JOIN metaschema_public.table api_schemas_t ON api_schemas_t.id = api_surface.api_schemas_table_id JOIN metaschema_public.schema api_schemas_s ON api_schemas_s.id = api_schemas_t.schema_id - JOIN metaschema_public.table api_modules_t ON api_modules_t.id = api_surface.api_modules_table_id - JOIN metaschema_public.schema api_modules_s ON api_modules_s.id = api_modules_t.schema_id JOIN metaschema_public.table api_settings_t ON api_settings_t.id = api_surface.api_settings_table_id JOIN metaschema_public.schema api_settings_s ON api_settings_s.id = api_settings_t.schema_id JOIN metaschema_public.table cors_settings_t ON cors_settings_t.id = api_surface.cors_settings_table_id diff --git a/packages/app-scope/sql/pgpm-app-scope--0.34.0.bundle.tar.gz b/packages/app-scope/sql/pgpm-app-scope--0.34.0.bundle.tar.gz index 555d2285944a549da316efa20d07beb5f8427bf9..3e61140f2900d50ae790c1d944400872c9ce6eff 100644 GIT binary patch delta 9512 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 KNhm02sQ&>39h1iZ delta 9569 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 WW*#ly?n1xb(R!jVU?89%A^sPz uuid_nil() THEN SELECT apis_s.schema_name, apis_t.name, api_schemas_s.schema_name, api_schemas_t.name, - api_modules_s.schema_name, api_modules_t.name, api_settings_s.schema_name, api_settings_t.name, cors_settings_s.schema_name, cors_settings_t.name INTO apis_schema, apis_table, api_schemas_schema, api_schemas_table, - api_modules_schema, api_modules_table, api_settings_schema, api_settings_table, cors_settings_schema, cors_settings_table FROM metaschema_public.table apis_t JOIN metaschema_public.schema apis_s ON apis_s.id = apis_t.schema_id JOIN metaschema_public.table api_schemas_t ON api_schemas_t.id = api_surface.api_schemas_table_id JOIN metaschema_public.schema api_schemas_s ON api_schemas_s.id = api_schemas_t.schema_id - JOIN metaschema_public.table api_modules_t ON api_modules_t.id = api_surface.api_modules_table_id - JOIN metaschema_public.schema api_modules_s ON api_modules_s.id = api_modules_t.schema_id JOIN metaschema_public.table api_settings_t ON api_settings_t.id = api_surface.api_settings_table_id JOIN metaschema_public.schema api_settings_s ON api_settings_s.id = api_settings_t.schema_id JOIN metaschema_public.table cors_settings_t ON cors_settings_t.id = api_surface.cors_settings_table_id diff --git a/packages/base32/__tests__/base32.decode.test.ts b/packages/base32/__tests__/base32.decode.test.ts index 13d30b244..879b6c0f4 100644 --- a/packages/base32/__tests__/base32.decode.test.ts +++ b/packages/base32/__tests__/base32.decode.test.ts @@ -14,7 +14,7 @@ afterAll(async () => { it('base32_to_decimal', async () => { - const { base32_to_decimal } = await pg.one( + const { base32_to_decimal } = await pg.one( `SELECT base32.base32_to_decimal($1::text) AS base32_to_decimal`, ['INQXI==='] ); @@ -22,7 +22,7 @@ it('base32_to_decimal', async () => { }); it('decimal_to_chunks', async () => { - const { decimal_to_chunks } = await pg.one( + const { decimal_to_chunks } = await pg.one( `SELECT base32.decimal_to_chunks($1::text[]) AS decimal_to_chunks`, [['8', '13', '16', '23', '8', '=', '=', '=']] ); @@ -39,7 +39,7 @@ it('decimal_to_chunks', async () => { }); it('decode', async () => { - const { decode } = await pg.one( + const { decode } = await pg.one( `SELECT base32.decode($1::text) AS decode`, ['INQXI'] ); @@ -47,7 +47,7 @@ it('decode', async () => { }); it('zero_fill', async () => { - const { zero_fill } = await pg.one( + const { zero_fill } = await pg.one( `SELECT base32.zero_fill($1::int, $2::int) AS zero_fill`, [300, 2] ); @@ -55,7 +55,7 @@ it('zero_fill', async () => { }); it('zero_fill (-)', async () => { - const { zero_fill } = await pg.one( + const { zero_fill } = await pg.one( `SELECT base32.zero_fill($1::int, $2::int) AS zero_fill`, [-300, 2] ); @@ -63,7 +63,7 @@ it('zero_fill (-)', async () => { }); it('zero_fill (0)', async () => { - const { zero_fill } = await pg.one( + const { zero_fill } = await pg.one( `SELECT base32.zero_fill($1::int, $2::int) AS zero_fill`, [-300, 0] ); @@ -73,7 +73,7 @@ it('zero_fill (0)', async () => { cases( 'base32.decode cases', async (opts: { name: string; result: string }) => { - const { decode } = await pg.one( + const { decode } = await pg.one( `SELECT base32.decode($1::text) AS decode`, [opts.name] ); diff --git a/packages/base32/__tests__/base32.encode.test.ts b/packages/base32/__tests__/base32.encode.test.ts index c807f5356..25a928b5c 100644 --- a/packages/base32/__tests__/base32.encode.test.ts +++ b/packages/base32/__tests__/base32.encode.test.ts @@ -118,7 +118,7 @@ it('to_base32', async () => { cases( 'base32.encode', async (opts: { name: string; result: string }) => { - const { encode } = await pg.one( + const { encode } = await pg.one( `SELECT base32.encode($1::text) AS encode`, [opts.name] ); diff --git a/packages/database-jobs/deploy/schemas/app_jobs/procedures/add_job.sql b/packages/database-jobs/deploy/schemas/app_jobs/procedures/add_job.sql index 31f21741a..dbcc6a875 100644 --- a/packages/database-jobs/deploy/schemas/app_jobs/procedures/add_job.sql +++ b/packages/database-jobs/deploy/schemas/app_jobs/procedures/add_job.sql @@ -32,9 +32,9 @@ DECLARE BEGIN -- db_id defaults to the session's database claim; only callers that act on -- behalf of a different database (e.g. platform-owned births) pass it - -- explicitly. Every job is owned by exactly one database — a claim-less - -- session with no explicit db_id fails the jobs.database_id NOT NULL - -- constraint rather than producing an unattributable job. + -- explicitly. Every job is owned by exactly one database, so a claim-less + -- session with no explicit db_id is rejected by the default expression rather + -- than producing an unattributable job. v_database_id := db_id; v_actor_id := jwt_public.current_user_id(); diff --git a/packages/database-jobs/sql/pgpm-database-jobs--0.34.0.bundle.tar.gz b/packages/database-jobs/sql/pgpm-database-jobs--0.34.0.bundle.tar.gz index 8c1758ef23177507c22e7a105313700eb874cdd5..64020075864e67f276305c8690ff1075c2d3df90 100644 GIT binary patch delta 5138 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 A9{>OV delta 5116 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", + "contributors": [ + "Constructive " + ], + "keywords": [ + "postgresql", + "pgpm", + "errors" + ], + "publishConfig": { + "access": "public" + }, + "scripts": { + "bundle": "pgpm package", + "test": "jest", + "test:watch": "jest --watch" + }, + "devDependencies": { + "pgpm": "^5" + }, + "repository": { + "type": "git", + "url": "https://github.com/constructive-io/pgpm-modules" + }, + "homepage": "https://github.com/constructive-io/pgpm-modules", + "bugs": { + "url": "https://github.com/constructive-io/pgpm-modules/issues" + } +} diff --git a/packages/errors/pgpm.plan b/packages/errors/pgpm.plan new file mode 100644 index 000000000..ef46c15fb --- /dev/null +++ b/packages/errors/pgpm.plan @@ -0,0 +1,6 @@ +%syntax-version=1.0.0 +%project=errors +%uri=errors + +schemas/errors/schema 2026-07-22T00:00:00Z devin # add schemas/errors/schema +schemas/errors/procedures/raise_error [schemas/errors/schema] 2026-07-22T00:00:00Z devin # add schemas/errors/procedures/raise_error diff --git a/packages/errors/revert/schemas/errors/procedures/raise_error.sql b/packages/errors/revert/schemas/errors/procedures/raise_error.sql new file mode 100644 index 000000000..8c16ff41f --- /dev/null +++ b/packages/errors/revert/schemas/errors/procedures/raise_error.sql @@ -0,0 +1,7 @@ +-- Revert schemas/errors/procedures/raise_error from pg + +BEGIN; + +DROP FUNCTION errors.raise_error(text, jsonb, text); + +COMMIT; diff --git a/packages/errors/revert/schemas/errors/schema.sql b/packages/errors/revert/schemas/errors/schema.sql new file mode 100644 index 000000000..bf5cf1eb6 --- /dev/null +++ b/packages/errors/revert/schemas/errors/schema.sql @@ -0,0 +1,7 @@ +-- Revert schemas/errors/schema from pg + +BEGIN; + +DROP SCHEMA errors; + +COMMIT; diff --git a/packages/errors/sql/errors--0.34.0.bundle.tar.gz b/packages/errors/sql/errors--0.34.0.bundle.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..094f7c16f549c104ab54c73cb9bcce714e993163 GIT binary patch literal 2033 zcmV$56ck zv`m^WWcd>FB2I1V7+SQ|S#hjfU`4<@PxE3;RXNHM^)GRGT`_;m=Go$P@mQrfZnj)Y zJI6t~wADGRp=!*M^!+H;n75AMx0(phD%3SDWbt@)%H!2*qv<|7%TtAVnPc%dmvMnt zHN92ueziU*p07M?Deh>WDHc)XYQmWE0%}}GdA>3M3AihXF9IdpKoDuD>kAH>-G^&>rcLnSGSy>1$Nw$;!-`eYDKu&CAU0bP^b0 zewXkrV^czo>)$^><4tVgFZJU`mCkKk#;NVe_^~#oMH&CaIF8jFL*q$fUrTEtVPP%L4OT z(rtpRYNps!#)owQtgG+~b)qpttI?`>rR3E%CrRIL!d}zf#8y{I8(!y@Q@pKisMYPl zY0cZ6ZcwI>&8y6Q8lIgGpH%+_y`@<<*PWopdjD~kN%BO0b_MmNah=E!g89M= z91?h(GcRJoP&5&b2zQ0+8!8z}sUpFMa3xV(OG$Qke1myx_9R)u+v)MknzzT})ZX`Z z1P2EVVP*mPlSw$9!eR9vU=m)0gDNM^C)3HAxFJ(`HXc2PY<^YMRFO%A@XJr(I0Rc{ z>jK{tb|rXJJ&roiZVYN#kWR4xo0fp@;-YLnnb~l73I_+Zh2zo1#nb-aZ+nAJeIgxC zQ0aRlppnZ0su(IE7!t>D;y9XdFQAMV?l}fI(mMZu<$oLv{B$n@jt*${eO6cyamk z;(YM0RXOZ0@-3CS<7|9Gd=W8+2+A~%xa7=pf`A#WjrNuDd`YDgu8=5&rat*iuRY<@*aG$w@q(_cV~ZZ_}{9V??DNh?%wUfdcYm;10LJu+3mvZB)%QL znD-#O!TdeQEK6b~D;&}Ai|cfmXfR7_F@f?rPnYv+D6iuJinP|Kk{E4SK#mII8-&zi zJ;>vt0tX#fNOc`s?B*zSJ#mX`nc;CQ3-COg)G2uaD%A+L>oAfz*2E{Uz@m_I>=sH| zTY-i3nQss?_&v?v#CCqvXgm$4{qqZe6ZlYzcc8{8@5&CSL>2{n1UM|O@xEa-ypgJ0 zYYNBX!RWNI?M3x@v}Id?3u(((t&GlNjRnNEIl5CfpUK}ZCe!{jTqzsN-`8fqjZBtU zK$*)MOkiotbg8aU!=X)~!2AaDZV_vQ*p`@QX;NRuQ3uei(#8+@=X;I+c7ysH~_?Qk8< z)!WLY>Vq}fbd2_gkL}~*npW?srLR_&)!R24H<#;%On>5zYpWK}!B-C<9Kc0?cy?J?+o061 z!3ho#f(R+N^fh&r@Qjus@VJA9nuvQUa6FH4=BPkQNgS?~W6*IJBIg0YZ;g!hw6Fb0 z>2t}q3iK+e>MT0?nh+@+XwR6)joctIfoBZ*5qCW=(t+zECmOZ%B#j86zA*wFt$juV z?MB+y-2K*2YEOv%XlS*5Un8vQSjg7YpGW7zySU3%v)uNoLOg-2m*we(w-#!kS#KXW zt5$z_dMjP+*z)mH3}=>B-OimmcmE$EI_)4~5tl-78n`rageJ<3G+_aEByo8_s33xB z&sUBcDXzJx%ENdOb%}63hv=9e1=27Yp%$JeBBMNXe1?p2;YA`+UO*^U9#Sr(8*rnD zi%e?YW3F_C^Yw`CbG32Xl)s`Qe@#2y(Tu~ { (database_id, schema_id, functions_table_id, domains_table_id, apis_table_id, sites_table_id, namespaces_table_id, resources_table_id, resource_definitions_table_id, - resource_installations_table_id, apps_table_id, buckets_table_id, scope) - VALUES ($1, $2, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, 'app')`, + resource_installations_table_id, apps_table_id, buckets_table_id, + sites_web_config_table_id, sites_error_pages_table_id, + sites_app_links_table_id, sites_deep_links_table_id, scope) + VALUES ($1, $2, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, 'app')`, [TENANT_DB, catSchema.id, catTable.id] ); diff --git a/packages/function-resolution/__tests__/resolution.test.ts b/packages/function-resolution/__tests__/resolution.test.ts index 499e6ebf5..ca2beb3e1 100644 --- a/packages/function-resolution/__tests__/resolution.test.ts +++ b/packages/function-resolution/__tests__/resolution.test.ts @@ -152,8 +152,10 @@ describe('function-resolution end-to-end (format-based, no AST)', () => { (database_id, schema_id, functions_table_id, domains_table_id, apis_table_id, sites_table_id, namespaces_table_id, resources_table_id, resource_definitions_table_id, - resource_installations_table_id, apps_table_id, buckets_table_id, scope) - VALUES ($1, $2, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, 'app')`, + resource_installations_table_id, apps_table_id, buckets_table_id, + sites_web_config_table_id, sites_error_pages_table_id, + sites_app_links_table_id, sites_deep_links_table_id, scope) + VALUES ($1, $2, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, 'app')`, [TENANT_DB, catSchema.id, catTable.id] ); }); diff --git a/packages/inflection/__tests__/inflection.test.ts b/packages/inflection/__tests__/inflection.test.ts index 88a88df3a..5ca1ac25c 100644 --- a/packages/inflection/__tests__/inflection.test.ts +++ b/packages/inflection/__tests__/inflection.test.ts @@ -1,5 +1,5 @@ -import cases from 'jest-in-case'; import { getConnections, PgTestClient } from 'pgsql-test'; +import cases from 'jest-in-case'; let pg: PgTestClient; let teardown: () => Promise; diff --git a/packages/jwt-claims/__tests__/jwt.test.ts b/packages/jwt-claims/__tests__/jwt.test.ts index 6e3ed656a..ee5da7149 100644 --- a/packages/jwt-claims/__tests__/jwt.test.ts +++ b/packages/jwt-claims/__tests__/jwt.test.ts @@ -52,3 +52,24 @@ it('get values', async () => { expect({ database_id }).toMatchSnapshot(); expect({ user_id }).toMatchSnapshot(); }); + +it('current_database_id returns the claim when it is set', async () => { + await pg.any(`BEGIN`); + await pg.any(`SELECT set_config('jwt.claims.database_id', $1, true)`, [ + jwt.database_id + ]); + const { database_id } = await pg.one( + `select jwt_private.current_database_id() as database_id` + ); + await pg.any(`ROLLBACK`); + + expect(database_id).toEqual(jwt.database_id); +}); + +it('current_database_id raises DATABASE_CLAIM_REQUIRED when the claim is absent', async () => { + await pg.any(`BEGIN`); + await expect( + pg.one(`select jwt_private.current_database_id()`) + ).rejects.toThrow('DATABASE_CLAIM_REQUIRED'); + await pg.any(`ROLLBACK`); +}); diff --git a/packages/jwt-claims/deploy/schemas/jwt_private/procedures/current_api_id.sql b/packages/jwt-claims/deploy/schemas/jwt_private/procedures/current_api_id.sql index a60f9412a..5f426bd7b 100644 --- a/packages/jwt-claims/deploy/schemas/jwt_private/procedures/current_api_id.sql +++ b/packages/jwt-claims/deploy/schemas/jwt_private/procedures/current_api_id.sql @@ -5,30 +5,17 @@ BEGIN; --- Returns the current API UUID from the JWT claims --- Used for API invocation provenance checks in RLS policies --- Returns NULL if the claim is not set or invalid +-- Returns NULL if the claim is not set, empty, or not a valid UUID +-- pg_input_is_valid() validates without raising, so no EXCEPTION block is +-- needed: an exception handler would open a subtransaction on every call CREATE FUNCTION jwt_private.current_api_id() RETURNS uuid AS $$ -DECLARE - v_identifier_id uuid; -BEGIN - IF current_setting('jwt.claims.api_id', TRUE) - IS NOT NULL THEN - BEGIN - v_identifier_id = current_setting('jwt.claims.api_id', TRUE)::uuid; - EXCEPTION - WHEN OTHERS THEN - RAISE NOTICE 'Invalid UUID value'; - RETURN NULL; - END; - RETURN v_identifier_id; - ELSE - RETURN NULL; - END IF; -END; + SELECT CASE + WHEN pg_input_is_valid(current_setting('jwt.claims.api_id', TRUE), 'uuid') + THEN current_setting('jwt.claims.api_id', TRUE)::uuid + END; $$ -LANGUAGE 'plpgsql' STABLE; +LANGUAGE 'sql' STABLE LEAKPROOF; COMMIT; diff --git a/packages/jwt-claims/deploy/schemas/jwt_private/procedures/current_database_id.sql b/packages/jwt-claims/deploy/schemas/jwt_private/procedures/current_database_id.sql index 3bd2dad96..1c6e22d9a 100644 --- a/packages/jwt-claims/deploy/schemas/jwt_private/procedures/current_database_id.sql +++ b/packages/jwt-claims/deploy/schemas/jwt_private/procedures/current_database_id.sql @@ -7,26 +7,32 @@ BEGIN; -- Returns the current database UUID from the JWT claims -- Used for multi-tenant database isolation --- Returns NULL if the claim is not set or invalid +-- +-- The claim is set at every session boundary (API, worker, provisioning, +-- platform deploy/seed), so a missing or malformed claim is never a +-- legitimate state: it means a scoped write is about to run unattributed. +-- Fails loudly instead of returning NULL, so the omission surfaces at the +-- statement that needed the identity rather than as a NULL that travels. +-- +-- pg_input_is_valid() validates without raising, so no EXCEPTION block is +-- needed: an exception handler would open a subtransaction on every call CREATE FUNCTION jwt_private.current_database_id() RETURNS uuid AS $$ DECLARE - v_identifier_id uuid; + database_id uuid; BEGIN - IF current_setting('jwt.claims.database_id', TRUE) - IS NOT NULL THEN - BEGIN - v_identifier_id = current_setting('jwt.claims.database_id', TRUE)::uuid; - EXCEPTION - WHEN OTHERS THEN - RAISE NOTICE 'Invalid UUID value'; - RETURN NULL; - END; - RETURN v_identifier_id; - ELSE - RETURN NULL; + IF pg_input_is_valid(current_setting('jwt.claims.database_id', TRUE), 'uuid') THEN + database_id = current_setting('jwt.claims.database_id', TRUE)::uuid; END IF; + IF database_id IS NULL THEN + PERFORM errors.raise_error( + 'DATABASE_CLAIM_REQUIRED', + jsonb_build_object('claim', 'jwt.claims.database_id'), + 'internal' + ); + END IF; + RETURN database_id; END; $$ LANGUAGE 'plpgsql' STABLE; diff --git a/packages/jwt-claims/deploy/schemas/jwt_private/procedures/current_graph_execution_id.sql b/packages/jwt-claims/deploy/schemas/jwt_private/procedures/current_graph_execution_id.sql index e88c4ce7c..87f2c59d9 100644 --- a/packages/jwt-claims/deploy/schemas/jwt_private/procedures/current_graph_execution_id.sql +++ b/packages/jwt-claims/deploy/schemas/jwt_private/procedures/current_graph_execution_id.sql @@ -5,30 +5,17 @@ BEGIN; --- Returns the current graph execution UUID from the JWT claims --- Used for graph invocation provenance checks in RLS policies --- Returns NULL if the claim is not set or invalid +-- Returns NULL if the claim is not set, empty, or not a valid UUID +-- pg_input_is_valid() validates without raising, so no EXCEPTION block is +-- needed: an exception handler would open a subtransaction on every call CREATE FUNCTION jwt_private.current_graph_execution_id() RETURNS uuid AS $$ -DECLARE - v_identifier_id uuid; -BEGIN - IF current_setting('jwt.claims.graph_execution_id', TRUE) - IS NOT NULL THEN - BEGIN - v_identifier_id = current_setting('jwt.claims.graph_execution_id', TRUE)::uuid; - EXCEPTION - WHEN OTHERS THEN - RAISE NOTICE 'Invalid UUID value'; - RETURN NULL; - END; - RETURN v_identifier_id; - ELSE - RETURN NULL; - END IF; -END; + SELECT CASE + WHEN pg_input_is_valid(current_setting('jwt.claims.graph_execution_id', TRUE), 'uuid') + THEN current_setting('jwt.claims.graph_execution_id', TRUE)::uuid + END; $$ -LANGUAGE 'plpgsql' STABLE; +LANGUAGE 'sql' STABLE LEAKPROOF; COMMIT; diff --git a/packages/jwt-claims/deploy/schemas/jwt_public/procedures/current_ip_address.sql b/packages/jwt-claims/deploy/schemas/jwt_public/procedures/current_ip_address.sql index 1c2b9d24c..b5f93f106 100644 --- a/packages/jwt-claims/deploy/schemas/jwt_public/procedures/current_ip_address.sql +++ b/packages/jwt-claims/deploy/schemas/jwt_public/procedures/current_ip_address.sql @@ -6,29 +6,17 @@ BEGIN; -- Returns the client's IP address from the JWT claims --- Includes error handling for invalid IP address values --- Returns NULL if the claim is not set or invalid +-- Returns NULL if the claim is not set, empty, or not a valid inet value +-- pg_input_is_valid() validates without raising, so no EXCEPTION block is +-- needed: an exception handler would open a subtransaction on every call CREATE FUNCTION jwt_public.current_ip_address() RETURNS inet AS $$ -DECLARE - v_ip_addr inet; -BEGIN - IF current_setting('jwt.claims.ip_address', TRUE) - IS NOT NULL THEN - BEGIN - v_ip_addr = trim(current_setting('jwt.claims.ip_address', TRUE))::inet; - EXCEPTION - WHEN OTHERS THEN - RAISE NOTICE 'Invalid IP'; - RETURN NULL; - END; - RETURN v_ip_addr; - ELSE - RETURN NULL; - END IF; -END; + SELECT CASE + WHEN pg_input_is_valid(trim(current_setting('jwt.claims.ip_address', TRUE)), 'inet') + THEN trim(current_setting('jwt.claims.ip_address', TRUE))::inet + END; $$ -LANGUAGE 'plpgsql' STABLE; +LANGUAGE 'sql' STABLE; COMMIT; diff --git a/packages/jwt-claims/deploy/schemas/jwt_public/procedures/current_principal_id.sql b/packages/jwt-claims/deploy/schemas/jwt_public/procedures/current_principal_id.sql index b13095ccf..ffac56624 100644 --- a/packages/jwt-claims/deploy/schemas/jwt_public/procedures/current_principal_id.sql +++ b/packages/jwt-claims/deploy/schemas/jwt_public/procedures/current_principal_id.sql @@ -6,29 +6,17 @@ BEGIN; -- Returns the current principal's UUID from the JWT claims --- Includes error handling for invalid UUID values --- Returns NULL if the claim is not set or invalid +-- Returns NULL if the claim is not set, empty, or not a valid UUID +-- pg_input_is_valid() validates without raising, so no EXCEPTION block is +-- needed: an exception handler would open a subtransaction on every call CREATE FUNCTION jwt_public.current_principal_id() RETURNS uuid AS $$ -DECLARE - v_identifier_id uuid; -BEGIN - IF current_setting('jwt.claims.principal_id', TRUE) - IS NOT NULL THEN - BEGIN - v_identifier_id = current_setting('jwt.claims.principal_id', TRUE)::uuid; - EXCEPTION - WHEN OTHERS THEN - RAISE NOTICE 'Invalid UUID value'; - RETURN NULL; - END; - RETURN v_identifier_id; - ELSE - RETURN NULL; - END IF; -END; + SELECT CASE + WHEN pg_input_is_valid(current_setting('jwt.claims.principal_id', TRUE), 'uuid') + THEN current_setting('jwt.claims.principal_id', TRUE)::uuid + END; $$ -LANGUAGE 'plpgsql' STABLE; +LANGUAGE 'sql' STABLE LEAKPROOF; COMMIT; diff --git a/packages/jwt-claims/deploy/schemas/jwt_public/procedures/current_role_type.sql b/packages/jwt-claims/deploy/schemas/jwt_public/procedures/current_role_type.sql index b009bb63f..e846ec60d 100644 --- a/packages/jwt-claims/deploy/schemas/jwt_public/procedures/current_role_type.sql +++ b/packages/jwt-claims/deploy/schemas/jwt_public/procedures/current_role_type.sql @@ -11,17 +11,8 @@ BEGIN; CREATE FUNCTION jwt_public.current_role_type() RETURNS text AS $$ -DECLARE - v_role_type text; -BEGIN - v_role_type := current_setting('jwt.claims.role_type', TRUE); - IF v_role_type IS NOT NULL AND v_role_type <> '' THEN - RETURN v_role_type; - ELSE - RETURN 'user'; - END IF; -END; + SELECT coalesce(nullif(current_setting('jwt.claims.role_type', TRUE), ''), 'user'); $$ -LANGUAGE 'plpgsql' STABLE; +LANGUAGE 'sql' STABLE LEAKPROOF; COMMIT; diff --git a/packages/jwt-claims/deploy/schemas/jwt_public/procedures/current_user_agent.sql b/packages/jwt-claims/deploy/schemas/jwt_public/procedures/current_user_agent.sql index 85919c3d8..514903621 100644 --- a/packages/jwt-claims/deploy/schemas/jwt_public/procedures/current_user_agent.sql +++ b/packages/jwt-claims/deploy/schemas/jwt_public/procedures/current_user_agent.sql @@ -1,34 +1,18 @@ -- Deploy schemas/jwt_public/procedures/current_user_agent to pg --- Retrieves the client's user agent string from JWT claims with validation +-- Retrieves the client's user agent string from JWT claims -- requires: schemas/jwt_public/schema BEGIN; -- Returns the client's user agent string from the JWT claims --- Includes error handling for invalid values --- Returns NULL if the claim is not set or invalid +-- Returns NULL if the claim is not set; the value needs no cast, so it can +-- never raise and needs no EXCEPTION block (which would open a subtransaction) CREATE FUNCTION jwt_public.current_user_agent() RETURNS text AS $$ -DECLARE - v_uagent text; -BEGIN - IF current_setting('jwt.claims.user_agent', TRUE) - IS NOT NULL THEN - BEGIN - v_uagent = current_setting('jwt.claims.user_agent', TRUE); - EXCEPTION - WHEN OTHERS THEN - RAISE NOTICE 'Invalid UserAgent'; - RETURN NULL; - END; - RETURN v_uagent; - ELSE - RETURN NULL; - END IF; -END; + SELECT current_setting('jwt.claims.user_agent', TRUE); $$ -LANGUAGE 'plpgsql' STABLE; +LANGUAGE 'sql' STABLE; COMMIT; diff --git a/packages/jwt-claims/deploy/schemas/jwt_public/procedures/current_user_id.sql b/packages/jwt-claims/deploy/schemas/jwt_public/procedures/current_user_id.sql index 3754c455a..56d166913 100644 --- a/packages/jwt-claims/deploy/schemas/jwt_public/procedures/current_user_id.sql +++ b/packages/jwt-claims/deploy/schemas/jwt_public/procedures/current_user_id.sql @@ -5,30 +5,17 @@ BEGIN; --- Returns the current user's UUID from the JWT claims --- Includes error handling for invalid UUID values --- Returns NULL if the claim is not set or invalid +-- Returns NULL if the claim is not set, empty, or not a valid UUID +-- pg_input_is_valid() validates without raising, so no EXCEPTION block is +-- needed: an exception handler would open a subtransaction on every call CREATE FUNCTION jwt_public.current_user_id() RETURNS uuid AS $$ -DECLARE - v_identifier_id uuid; -BEGIN - IF current_setting('jwt.claims.user_id', TRUE) - IS NOT NULL THEN - BEGIN - v_identifier_id = current_setting('jwt.claims.user_id', TRUE)::uuid; - EXCEPTION - WHEN OTHERS THEN - RAISE NOTICE 'Invalid UUID value'; - RETURN NULL; - END; - RETURN v_identifier_id; - ELSE - RETURN NULL; - END IF; -END; + SELECT CASE + WHEN pg_input_is_valid(current_setting('jwt.claims.user_id', TRUE), 'uuid') + THEN current_setting('jwt.claims.user_id', TRUE)::uuid + END; $$ -LANGUAGE 'plpgsql' STABLE; +LANGUAGE 'sql' STABLE LEAKPROOF; COMMIT; diff --git a/packages/jwt-claims/package.json b/packages/jwt-claims/package.json index 299dbb00c..228c6faf4 100644 --- a/packages/jwt-claims/package.json +++ b/packages/jwt-claims/package.json @@ -24,6 +24,7 @@ "pgpm": "^5" }, "dependencies": { + "@pgpm/errors": "workspace:*", "@pgpm/types": "workspace:*", "@pgpm/verify": "workspace:*" }, diff --git a/packages/jwt-claims/pgpm-jwt-claims.control b/packages/jwt-claims/pgpm-jwt-claims.control index 8a4b111f0..43943a164 100644 --- a/packages/jwt-claims/pgpm-jwt-claims.control +++ b/packages/jwt-claims/pgpm-jwt-claims.control @@ -2,7 +2,7 @@ comment = 'pgpm-jwt-claims extension' default_version = '0.34.0' module_pathname = '$libdir/pgpm-jwt-claims' -requires = 'plpgsql,pgpm-types,pgpm-verify' +requires = 'plpgsql,errors,pgpm-types,pgpm-verify' relocatable = false superuser = false diff --git a/packages/jwt-claims/sql/pgpm-jwt-claims--0.34.0.bundle.tar.gz b/packages/jwt-claims/sql/pgpm-jwt-claims--0.34.0.bundle.tar.gz index 0ea073e90802df7f44cf7d10646c52d862a56020..ca216742fef468f37547978372cc4f4bb3d1efd0 100644 GIT binary patch literal 8128 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 a{qy_h_s{R2-#`DKeEuI&>>4Eir~m+|%m3^E literal 7809 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 TeLj6Y=JWpmoX0Qz0ImQ4h+1M) diff --git a/packages/jwt-claims/sql/pgpm-jwt-claims--0.34.0.sql b/packages/jwt-claims/sql/pgpm-jwt-claims--0.34.0.sql index 10caa817f..27e115909 100644 --- a/packages/jwt-claims/sql/pgpm-jwt-claims--0.34.0.sql +++ b/packages/jwt-claims/sql/pgpm-jwt-claims--0.34.0.sql @@ -48,101 +48,37 @@ ALTER DEFAULT PRIVILEGES IN SCHEMA jwt_public GRANT EXECUTE ON FUNCTIONS TO authenticated; CREATE FUNCTION jwt_public.current_user_id() RETURNS uuid AS $EOFCODE$ -DECLARE - v_identifier_id uuid; -BEGIN - IF current_setting('jwt.claims.user_id', TRUE) - IS NOT NULL THEN - BEGIN - v_identifier_id = current_setting('jwt.claims.user_id', TRUE)::uuid; - EXCEPTION - WHEN OTHERS THEN - RAISE NOTICE 'Invalid UUID value'; - RETURN NULL; - END; - RETURN v_identifier_id; - ELSE - RETURN NULL; - END IF; -END; -$EOFCODE$ LANGUAGE plpgsql STABLE; + SELECT CASE + WHEN pg_input_is_valid(current_setting('jwt.claims.user_id', TRUE), 'uuid') + THEN current_setting('jwt.claims.user_id', TRUE)::uuid + END; +$EOFCODE$ LANGUAGE sql STABLE LEAKPROOF; CREATE FUNCTION jwt_public.current_ip_address() RETURNS inet AS $EOFCODE$ -DECLARE - v_ip_addr inet; -BEGIN - IF current_setting('jwt.claims.ip_address', TRUE) - IS NOT NULL THEN - BEGIN - v_ip_addr = trim(current_setting('jwt.claims.ip_address', TRUE))::inet; - EXCEPTION - WHEN OTHERS THEN - RAISE NOTICE 'Invalid IP'; - RETURN NULL; - END; - RETURN v_ip_addr; - ELSE - RETURN NULL; - END IF; -END; -$EOFCODE$ LANGUAGE plpgsql STABLE; + SELECT CASE + WHEN pg_input_is_valid(trim(current_setting('jwt.claims.ip_address', TRUE)), 'inet') + THEN trim(current_setting('jwt.claims.ip_address', TRUE))::inet + END; +$EOFCODE$ LANGUAGE sql STABLE; CREATE FUNCTION jwt_public.current_user_agent() RETURNS text AS $EOFCODE$ -DECLARE - v_uagent text; -BEGIN - IF current_setting('jwt.claims.user_agent', TRUE) - IS NOT NULL THEN - BEGIN - v_uagent = current_setting('jwt.claims.user_agent', TRUE); - EXCEPTION - WHEN OTHERS THEN - RAISE NOTICE 'Invalid UserAgent'; - RETURN NULL; - END; - RETURN v_uagent; - ELSE - RETURN NULL; - END IF; -END; -$EOFCODE$ LANGUAGE plpgsql STABLE; + SELECT current_setting('jwt.claims.user_agent', TRUE); +$EOFCODE$ LANGUAGE sql STABLE; CREATE FUNCTION jwt_public.current_origin() RETURNS origin AS $EOFCODE$ SELECT nullif(current_setting('jwt.claims.origin', true), '')::origin; $EOFCODE$ LANGUAGE sql STABLE; CREATE FUNCTION jwt_public.current_principal_id() RETURNS uuid AS $EOFCODE$ -DECLARE - v_identifier_id uuid; -BEGIN - IF current_setting('jwt.claims.principal_id', TRUE) - IS NOT NULL THEN - BEGIN - v_identifier_id = current_setting('jwt.claims.principal_id', TRUE)::uuid; - EXCEPTION - WHEN OTHERS THEN - RAISE NOTICE 'Invalid UUID value'; - RETURN NULL; - END; - RETURN v_identifier_id; - ELSE - RETURN NULL; - END IF; -END; -$EOFCODE$ LANGUAGE plpgsql STABLE; + SELECT CASE + WHEN pg_input_is_valid(current_setting('jwt.claims.principal_id', TRUE), 'uuid') + THEN current_setting('jwt.claims.principal_id', TRUE)::uuid + END; +$EOFCODE$ LANGUAGE sql STABLE LEAKPROOF; CREATE FUNCTION jwt_public.current_role_type() RETURNS text AS $EOFCODE$ -DECLARE - v_role_type text; -BEGIN - v_role_type := current_setting('jwt.claims.role_type', TRUE); - IF v_role_type IS NOT NULL AND v_role_type <> '' THEN - RETURN v_role_type; - ELSE - RETURN 'user'; - END IF; -END; -$EOFCODE$ LANGUAGE plpgsql STABLE; + SELECT coalesce(nullif(current_setting('jwt.claims.role_type', TRUE), ''), 'user'); +$EOFCODE$ LANGUAGE sql STABLE LEAKPROOF; CREATE SCHEMA jwt_private; @@ -153,21 +89,19 @@ ALTER DEFAULT PRIVILEGES IN SCHEMA jwt_private CREATE FUNCTION jwt_private.current_database_id() RETURNS uuid AS $EOFCODE$ DECLARE - v_identifier_id uuid; + database_id uuid; BEGIN - IF current_setting('jwt.claims.database_id', TRUE) - IS NOT NULL THEN - BEGIN - v_identifier_id = current_setting('jwt.claims.database_id', TRUE)::uuid; - EXCEPTION - WHEN OTHERS THEN - RAISE NOTICE 'Invalid UUID value'; - RETURN NULL; - END; - RETURN v_identifier_id; - ELSE - RETURN NULL; + IF pg_input_is_valid(current_setting('jwt.claims.database_id', TRUE), 'uuid') THEN + database_id = current_setting('jwt.claims.database_id', TRUE)::uuid; END IF; + IF database_id IS NULL THEN + PERFORM errors.raise_error( + 'DATABASE_CLAIM_REQUIRED', + jsonb_build_object('claim', 'jwt.claims.database_id'), + 'internal' + ); + END IF; + RETURN database_id; END; $EOFCODE$ LANGUAGE plpgsql STABLE; @@ -180,41 +114,15 @@ CREATE FUNCTION jwt_private.current_session_id() RETURNS uuid AS $EOFCODE$ $EOFCODE$ LANGUAGE sql STABLE; CREATE FUNCTION jwt_private.current_api_id() RETURNS uuid AS $EOFCODE$ -DECLARE - v_identifier_id uuid; -BEGIN - IF current_setting('jwt.claims.api_id', TRUE) - IS NOT NULL THEN - BEGIN - v_identifier_id = current_setting('jwt.claims.api_id', TRUE)::uuid; - EXCEPTION - WHEN OTHERS THEN - RAISE NOTICE 'Invalid UUID value'; - RETURN NULL; - END; - RETURN v_identifier_id; - ELSE - RETURN NULL; - END IF; -END; -$EOFCODE$ LANGUAGE plpgsql STABLE; + SELECT CASE + WHEN pg_input_is_valid(current_setting('jwt.claims.api_id', TRUE), 'uuid') + THEN current_setting('jwt.claims.api_id', TRUE)::uuid + END; +$EOFCODE$ LANGUAGE sql STABLE LEAKPROOF; CREATE FUNCTION jwt_private.current_graph_execution_id() RETURNS uuid AS $EOFCODE$ -DECLARE - v_identifier_id uuid; -BEGIN - IF current_setting('jwt.claims.graph_execution_id', TRUE) - IS NOT NULL THEN - BEGIN - v_identifier_id = current_setting('jwt.claims.graph_execution_id', TRUE)::uuid; - EXCEPTION - WHEN OTHERS THEN - RAISE NOTICE 'Invalid UUID value'; - RETURN NULL; - END; - RETURN v_identifier_id; - ELSE - RETURN NULL; - END IF; -END; -$EOFCODE$ LANGUAGE plpgsql STABLE; \ No newline at end of file + SELECT CASE + WHEN pg_input_is_valid(current_setting('jwt.claims.graph_execution_id', TRUE), 'uuid') + THEN current_setting('jwt.claims.graph_execution_id', TRUE)::uuid + END; +$EOFCODE$ LANGUAGE sql STABLE LEAKPROOF; \ No newline at end of file diff --git a/packages/metaschema-modules/__tests__/__snapshots__/modules.test.ts.snap b/packages/metaschema-modules/__tests__/__snapshots__/modules.test.ts.snap index f9dd91823..5dd7b91d2 100644 --- a/packages/metaschema-modules/__tests__/__snapshots__/modules.test.ts.snap +++ b/packages/metaschema-modules/__tests__/__snapshots__/modules.test.ts.snap @@ -43,6 +43,7 @@ exports[`db_meta_modules should have all expected module tables 1`] = ` "merkle_store_module", "namespace_module", "notifications_module", + "pages_module", "permissions_module", "phone_numbers_module", "plans_module", @@ -74,8 +75,8 @@ exports[`db_meta_modules should have all expected module tables 1`] = ` exports[`db_meta_modules should verify all module tables exist in metaschema_modules_public schema 1`] = ` { - "moduleTablesCount": 65, - "totalTables": 72, + "moduleTablesCount": 66, + "totalTables": 73, } `; @@ -142,13 +143,13 @@ exports[`db_meta_modules should verify emails_module table structure 1`] = ` exports[`db_meta_modules should verify module table structures have database_id foreign keys 1`] = ` { - "constraintCount": 65, + "constraintCount": 66, } `; exports[`db_meta_modules should verify module tables have proper foreign key relationships 1`] = ` { - "constraintCount": 459, + "constraintCount": 476, "foreignTables": [ "catalog_module", "database", @@ -162,6 +163,7 @@ exports[`db_meta_modules should verify module tables have proper foreign key rel "namespace_module", "resource_module", "schema", + "site_surface_module", "storage_module", "table", ], diff --git a/packages/metaschema-modules/__tests__/modules.test.ts b/packages/metaschema-modules/__tests__/modules.test.ts index 096284c39..115cc19a0 100644 --- a/packages/metaschema-modules/__tests__/modules.test.ts +++ b/packages/metaschema-modules/__tests__/modules.test.ts @@ -21,30 +21,30 @@ describe('db_meta_modules', () => { }); it('should have all expected module tables', async () => { - const expectedModules = [ - 'connected_accounts_module', - 'crypto_addresses_module', - 'crypto_auth_module', - 'default_ids_module', - 'emails_module', - 'infra_secrets_module', - 'infra_config_module', - 'internal_secrets_module', - 'config_secrets_user_module', - 'invites_module', - 'events_module', - 'limits_module', - 'membership_types_module', - 'memberships_module', - 'permissions_module', - 'phone_numbers_module', - 'rls_module', - 'user_state_module', - 'sessions_module', - 'user_auth_module', - 'user_credentials_module', - 'users_module' - ]; + const expectedModules = [ + 'connected_accounts_module', + 'crypto_addresses_module', + 'crypto_auth_module', + 'default_ids_module', + 'emails_module', + 'infra_secrets_module', + 'infra_config_module', + 'internal_secrets_module', + 'config_secrets_user_module', + 'invites_module', + 'events_module', + 'limits_module', + 'membership_types_module', + 'memberships_module', + 'permissions_module', + 'phone_numbers_module', + 'rls_module', + 'user_state_module', + 'sessions_module', + 'user_auth_module', + 'user_credentials_module', + 'users_module' + ]; // Query for all module tables in metaschema_modules_public schema const moduleTables = await pg.any(` diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/agent_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/agent_module/table.sql index e053fb6ca..10cd87138 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/agent_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/agent_module/table.sql @@ -95,9 +95,18 @@ CREATE TABLE metaschema_modules_public.agent_module ( CONSTRAINT agent_module_entity_table_fkey FOREIGN KEY (entity_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE ); -CREATE INDEX agent_module_database_id_idx ON metaschema_modules_public.agent_module ( database_id ); - -- Unique constraint: one agent module per database per scope per prefix. CREATE UNIQUE INDEX agent_module_unique_scope ON metaschema_modules_public.agent_module ( database_id, scope, prefix ); +CREATE INDEX agent_module_agent_table_id_idx ON metaschema_modules_public.agent_module ( agent_table_id ); +CREATE INDEX agent_module_entity_table_id_idx ON metaschema_modules_public.agent_module ( entity_table_id ); +CREATE INDEX agent_module_message_table_id_idx ON metaschema_modules_public.agent_module ( message_table_id ); +CREATE INDEX agent_module_persona_table_id_idx ON metaschema_modules_public.agent_module ( persona_table_id ); +CREATE INDEX agent_module_plan_table_id_idx ON metaschema_modules_public.agent_module ( plan_table_id ); +CREATE INDEX agent_module_prompts_table_id_idx ON metaschema_modules_public.agent_module ( prompts_table_id ); +CREATE INDEX agent_module_resource_table_id_idx ON metaschema_modules_public.agent_module ( resource_table_id ); +CREATE INDEX agent_module_task_table_id_idx ON metaschema_modules_public.agent_module ( task_table_id ); +CREATE INDEX agent_module_thread_table_id_idx ON metaschema_modules_public.agent_module ( thread_table_id ); +CREATE INDEX agent_module_private_schema_id_idx ON metaschema_modules_public.agent_module ( private_schema_id ); +CREATE INDEX agent_module_schema_id_idx ON metaschema_modules_public.agent_module ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/api_surface_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/api_surface_module/table.sql index 5b8a25b98..021ed4059 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/api_surface_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/api_surface_module/table.sql @@ -27,14 +27,12 @@ CREATE TABLE metaschema_modules_public.api_surface_module ( -- Generated table IDs (populated by the generator) apis_table_id uuid NOT NULL DEFAULT uuid_nil(), api_schemas_table_id uuid NOT NULL DEFAULT uuid_nil(), - api_modules_table_id uuid NOT NULL DEFAULT uuid_nil(), api_settings_table_id uuid NOT NULL DEFAULT uuid_nil(), cors_settings_table_id uuid NOT NULL DEFAULT uuid_nil(), -- Table names (input to the generator) apis_table_name text NOT NULL DEFAULT 'apis', api_schemas_table_name text NOT NULL DEFAULT 'api_schemas', - api_modules_table_name text NOT NULL DEFAULT 'api_modules', api_settings_table_name text NOT NULL DEFAULT 'api_settings', cors_settings_table_name text NOT NULL DEFAULT 'cors_settings', @@ -80,10 +78,6 @@ CREATE TABLE metaschema_modules_public.api_surface_module ( FOREIGN KEY (api_schemas_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, - CONSTRAINT api_module_api_modules_table_fkey - FOREIGN KEY (api_modules_table_id) - REFERENCES metaschema_public.table (id) - ON DELETE CASCADE, CONSTRAINT api_module_api_settings_table_fkey FOREIGN KEY (api_settings_table_id) REFERENCES metaschema_public.table (id) @@ -98,10 +92,14 @@ CREATE TABLE metaschema_modules_public.api_surface_module ( ON DELETE CASCADE ); -CREATE INDEX api_module_database_id_idx - ON metaschema_modules_public.api_surface_module (database_id); - CREATE UNIQUE INDEX api_module_unique_scope ON metaschema_modules_public.api_surface_module (database_id, scope); +CREATE INDEX api_surface_module_api_schemas_table_id_idx ON metaschema_modules_public.api_surface_module ( api_schemas_table_id ); +CREATE INDEX api_surface_module_api_settings_table_id_idx ON metaschema_modules_public.api_surface_module ( api_settings_table_id ); +CREATE INDEX api_surface_module_apis_table_id_idx ON metaschema_modules_public.api_surface_module ( apis_table_id ); +CREATE INDEX api_surface_module_cors_settings_table_id_idx ON metaschema_modules_public.api_surface_module ( cors_settings_table_id ); +CREATE INDEX api_surface_module_entity_table_id_idx ON metaschema_modules_public.api_surface_module ( entity_table_id ); +CREATE INDEX api_surface_module_schema_id_idx ON metaschema_modules_public.api_surface_module ( schema_id ); +CREATE INDEX api_surface_module_catalog_module_id_idx ON metaschema_modules_public.api_surface_module ( catalog_module_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/app_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/app_module/table.sql index 8b3f58c87..664f4b0f2 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/app_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/app_module/table.sql @@ -86,10 +86,13 @@ CREATE TABLE metaschema_modules_public.app_module ( ON DELETE CASCADE ); -CREATE INDEX app_module_database_id_idx - ON metaschema_modules_public.app_module (database_id); - CREATE UNIQUE INDEX app_module_unique_scope ON metaschema_modules_public.app_module (database_id, scope); +CREATE INDEX app_module_app_components_table_id_idx ON metaschema_modules_public.app_module ( app_components_table_id ); +CREATE INDEX app_module_apps_table_id_idx ON metaschema_modules_public.app_module ( apps_table_id ); +CREATE INDEX app_module_entity_table_id_idx ON metaschema_modules_public.app_module ( entity_table_id ); +CREATE INDEX app_module_private_schema_id_idx ON metaschema_modules_public.app_module ( private_schema_id ); +CREATE INDEX app_module_schema_id_idx ON metaschema_modules_public.app_module ( schema_id ); +CREATE INDEX app_module_catalog_module_id_idx ON metaschema_modules_public.app_module ( catalog_module_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/billing_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/billing_module/table.sql index ea9cd6642..fc62424ab 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/billing_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/billing_module/table.sql @@ -77,6 +77,14 @@ CREATE TABLE metaschema_modules_public.billing_module ( CONSTRAINT billing_module_database_id_unique UNIQUE (database_id) ); -CREATE INDEX billing_module_database_id_idx ON metaschema_modules_public.billing_module ( database_id ); +CREATE INDEX billing_module_balances_table_id_idx ON metaschema_modules_public.billing_module ( balances_table_id ); +CREATE INDEX billing_module_ledger_table_id_idx ON metaschema_modules_public.billing_module ( ledger_table_id ); +CREATE INDEX billing_module_meter_credits_table_id_idx ON metaschema_modules_public.billing_module ( meter_credits_table_id ); +CREATE INDEX billing_module_meter_defaults_table_id_idx ON metaschema_modules_public.billing_module ( meter_defaults_table_id ); +CREATE INDEX billing_module_meter_sources_table_id_idx ON metaschema_modules_public.billing_module ( meter_sources_table_id ); +CREATE INDEX billing_module_meters_table_id_idx ON metaschema_modules_public.billing_module ( meters_table_id ); +CREATE INDEX billing_module_plan_subscriptions_table_id_idx ON metaschema_modules_public.billing_module ( plan_subscriptions_table_id ); +CREATE INDEX billing_module_private_schema_id_idx ON metaschema_modules_public.billing_module ( private_schema_id ); +CREATE INDEX billing_module_schema_id_idx ON metaschema_modules_public.billing_module ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/billing_provider_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/billing_provider_module/table.sql index 22adc3936..4f18e53fa 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/billing_provider_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/billing_provider_module/table.sql @@ -60,6 +60,15 @@ CREATE TABLE metaschema_modules_public.billing_provider_module ( CONSTRAINT billing_provider_module_database_id_unique UNIQUE (database_id) ); -CREATE INDEX billing_provider_module_database_id_idx ON metaschema_modules_public.billing_provider_module ( database_id ); +CREATE INDEX billing_provider_module_billing_customers_table_id_idx ON metaschema_modules_public.billing_provider_module ( billing_customers_table_id ); +CREATE INDEX billing_provider_module_billing_prices_table_id_idx ON metaschema_modules_public.billing_provider_module ( billing_prices_table_id ); +CREATE INDEX billing_provider_module_billing_products_table_id_idx ON metaschema_modules_public.billing_provider_module ( billing_products_table_id ); +CREATE INDEX billing_provider_module_billing_subscriptions_table_id_idx ON metaschema_modules_public.billing_provider_module ( billing_subscriptions_table_id ); +CREATE INDEX billing_provider_module_billing_webhook_events_table_id_idx ON metaschema_modules_public.billing_provider_module ( billing_webhook_events_table_id ); +CREATE INDEX billing_provider_module_prices_table_id_idx ON metaschema_modules_public.billing_provider_module ( prices_table_id ); +CREATE INDEX billing_provider_module_products_table_id_idx ON metaschema_modules_public.billing_provider_module ( products_table_id ); +CREATE INDEX billing_provider_module_subscriptions_table_id_idx ON metaschema_modules_public.billing_provider_module ( subscriptions_table_id ); +CREATE INDEX billing_provider_module_private_schema_id_idx ON metaschema_modules_public.billing_provider_module ( private_schema_id ); +CREATE INDEX billing_provider_module_schema_id_idx ON metaschema_modules_public.billing_provider_module ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/blueprint/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/blueprint/table.sql index 7dc5a6096..0661813bb 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/blueprint/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/blueprint/table.sql @@ -82,7 +82,6 @@ COMMENT ON COLUMN metaschema_modules_public.blueprint.updated_at IS CREATE INDEX blueprint_owner_id_idx ON metaschema_modules_public.blueprint (owner_id); -CREATE INDEX blueprint_database_id_idx ON metaschema_modules_public.blueprint (database_id); CREATE INDEX blueprint_template_id_idx ON metaschema_modules_public.blueprint (template_id); CREATE INDEX blueprint_definition_hash_idx ON metaschema_modules_public.blueprint (definition_hash); diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/blueprint_template/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/blueprint_template/table.sql index d634212e8..91e6ff34e 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/blueprint_template/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/blueprint_template/table.sql @@ -127,7 +127,6 @@ COMMENT ON COLUMN metaschema_modules_public.blueprint_template.updated_at IS 'Timestamp when this template was last modified.'; -CREATE INDEX blueprint_template_owner_id_idx ON metaschema_modules_public.blueprint_template (owner_id); CREATE INDEX blueprint_template_visibility_idx ON metaschema_modules_public.blueprint_template (visibility); CREATE INDEX blueprint_template_forked_from_id_idx ON metaschema_modules_public.blueprint_template (forked_from_id); CREATE INDEX blueprint_template_categories_idx ON metaschema_modules_public.blueprint_template USING gin (categories); diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/catalog_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/catalog_module/table.sql index f89ed27df..d0f0bacfc 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/catalog_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/catalog_module/table.sql @@ -32,6 +32,10 @@ CREATE TABLE metaschema_modules_public.catalog_module ( resource_installations_table_id uuid NOT NULL DEFAULT uuid_nil(), apps_table_id uuid NOT NULL DEFAULT uuid_nil(), buckets_table_id uuid NOT NULL DEFAULT uuid_nil(), + sites_web_config_table_id uuid NOT NULL DEFAULT uuid_nil(), + sites_error_pages_table_id uuid NOT NULL DEFAULT uuid_nil(), + sites_app_links_table_id uuid NOT NULL DEFAULT uuid_nil(), + sites_deep_links_table_id uuid NOT NULL DEFAULT uuid_nil(), -- Table names (inputs to the generator; stable load-bearing contracts) domains_table_name text NOT NULL DEFAULT 'domains', @@ -44,6 +48,10 @@ CREATE TABLE metaschema_modules_public.catalog_module ( resource_installations_table_name text NOT NULL DEFAULT 'resource_installations', apps_table_name text NOT NULL DEFAULT 'apps', buckets_table_name text NOT NULL DEFAULT 'buckets', + sites_web_config_table_name text NOT NULL DEFAULT 'sites_web_config', + sites_error_pages_table_name text NOT NULL DEFAULT 'sites_error_pages', + sites_app_links_table_name text NOT NULL DEFAULT 'sites_app_links', + sites_deep_links_table_name text NOT NULL DEFAULT 'sites_deep_links', -- API routing (get-or-create: if set, schema is added to this API) api_name text, @@ -113,6 +121,22 @@ CREATE TABLE metaschema_modules_public.catalog_module ( FOREIGN KEY (buckets_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT catalog_module_sites_web_config_table_fkey + FOREIGN KEY (sites_web_config_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + CONSTRAINT catalog_module_sites_error_pages_table_fkey + FOREIGN KEY (sites_error_pages_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + CONSTRAINT catalog_module_sites_app_links_table_fkey + FOREIGN KEY (sites_app_links_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + CONSTRAINT catalog_module_sites_deep_links_table_fkey + FOREIGN KEY (sites_deep_links_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, CONSTRAINT catalog_module_entity_table_fkey FOREIGN KEY (entity_table_id) REFERENCES metaschema_public.table (id) @@ -123,5 +147,21 @@ CREATE TABLE metaschema_modules_public.catalog_module ( -- never multiply per scope or per module. CREATE UNIQUE INDEX catalog_module_unique_database ON metaschema_modules_public.catalog_module (database_id); +CREATE INDEX catalog_module_apis_table_id_idx ON metaschema_modules_public.catalog_module ( apis_table_id ); +CREATE INDEX catalog_module_apps_table_id_idx ON metaschema_modules_public.catalog_module ( apps_table_id ); +CREATE INDEX catalog_module_buckets_table_id_idx ON metaschema_modules_public.catalog_module ( buckets_table_id ); +CREATE INDEX catalog_module_sites_web_config_table_id_idx ON metaschema_modules_public.catalog_module ( sites_web_config_table_id ); +CREATE INDEX catalog_module_sites_error_pages_table_id_idx ON metaschema_modules_public.catalog_module ( sites_error_pages_table_id ); +CREATE INDEX catalog_module_sites_app_links_table_id_idx ON metaschema_modules_public.catalog_module ( sites_app_links_table_id ); +CREATE INDEX catalog_module_sites_deep_links_table_id_idx ON metaschema_modules_public.catalog_module ( sites_deep_links_table_id ); +CREATE INDEX catalog_module_domains_table_id_idx ON metaschema_modules_public.catalog_module ( domains_table_id ); +CREATE INDEX catalog_module_entity_table_id_idx ON metaschema_modules_public.catalog_module ( entity_table_id ); +CREATE INDEX catalog_module_functions_table_id_idx ON metaschema_modules_public.catalog_module ( functions_table_id ); +CREATE INDEX catalog_module_namespaces_table_id_idx ON metaschema_modules_public.catalog_module ( namespaces_table_id ); +CREATE INDEX catalog_module_resource_definitions_table_id_idx ON metaschema_modules_public.catalog_module ( resource_definitions_table_id ); +CREATE INDEX catalog_module_resource_installations_table_id_idx ON metaschema_modules_public.catalog_module ( resource_installations_table_id ); +CREATE INDEX catalog_module_resources_table_id_idx ON metaschema_modules_public.catalog_module ( resources_table_id ); +CREATE INDEX catalog_module_sites_table_id_idx ON metaschema_modules_public.catalog_module ( sites_table_id ); +CREATE INDEX catalog_module_schema_id_idx ON metaschema_modules_public.catalog_module ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/compute_log_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/compute_log_module/table.sql index f42252661..7b6d3d5b8 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/compute_log_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/compute_log_module/table.sql @@ -53,6 +53,9 @@ CREATE TABLE metaschema_modules_public.compute_log_module ( CONSTRAINT compute_log_module_database_id_scope_unique UNIQUE (database_id, scope) ); -CREATE INDEX compute_log_module_database_id_idx ON metaschema_modules_public.compute_log_module ( database_id ); +CREATE INDEX compute_log_module_compute_log_table_id_idx ON metaschema_modules_public.compute_log_module ( compute_log_table_id ); +CREATE INDEX compute_log_module_usage_summary_table_id_idx ON metaschema_modules_public.compute_log_module ( usage_summary_table_id ); +CREATE INDEX compute_log_module_private_schema_id_idx ON metaschema_modules_public.compute_log_module ( private_schema_id ); +CREATE INDEX compute_log_module_schema_id_idx ON metaschema_modules_public.compute_log_module ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/config_secrets_user_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/config_secrets_user_module/table.sql index 9dfe1f388..4fe6f5837 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/config_secrets_user_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/config_secrets_user_module/table.sql @@ -27,5 +27,7 @@ CREATE TABLE metaschema_modules_public.config_secrets_user_module ( ); CREATE UNIQUE INDEX config_secrets_user_module_database_id_idx ON metaschema_modules_public.config_secrets_user_module ( database_id ); +CREATE INDEX config_secrets_user_module_table_id_idx ON metaschema_modules_public.config_secrets_user_module ( table_id ); +CREATE INDEX config_secrets_user_module_schema_id_idx ON metaschema_modules_public.config_secrets_user_module ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/connected_accounts_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/connected_accounts_module/table.sql index 6f831d863..69b7f653f 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/connected_accounts_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/connected_accounts_module/table.sql @@ -29,5 +29,9 @@ CREATE TABLE metaschema_modules_public.connected_accounts_module ( ); CREATE INDEX connected_accounts_module_database_id_idx ON metaschema_modules_public.connected_accounts_module ( database_id ); +CREATE INDEX connected_accounts_module_owner_table_id_idx ON metaschema_modules_public.connected_accounts_module ( owner_table_id ); +CREATE INDEX connected_accounts_module_table_id_idx ON metaschema_modules_public.connected_accounts_module ( table_id ); +CREATE INDEX connected_accounts_module_private_schema_id_idx ON metaschema_modules_public.connected_accounts_module ( private_schema_id ); +CREATE INDEX connected_accounts_module_schema_id_idx ON metaschema_modules_public.connected_accounts_module ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/crypto_addresses_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/crypto_addresses_module/table.sql index 7e3747fd8..e6a7bc5c8 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/crypto_addresses_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/crypto_addresses_module/table.sql @@ -30,5 +30,9 @@ CREATE TABLE metaschema_modules_public.crypto_addresses_module ( ); CREATE INDEX crypto_addresses_module_database_id_idx ON metaschema_modules_public.crypto_addresses_module ( database_id ); +CREATE INDEX crypto_addresses_module_owner_table_id_idx ON metaschema_modules_public.crypto_addresses_module ( owner_table_id ); +CREATE INDEX crypto_addresses_module_table_id_idx ON metaschema_modules_public.crypto_addresses_module ( table_id ); +CREATE INDEX crypto_addresses_module_private_schema_id_idx ON metaschema_modules_public.crypto_addresses_module ( private_schema_id ); +CREATE INDEX crypto_addresses_module_schema_id_idx ON metaschema_modules_public.crypto_addresses_module ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/crypto_auth_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/crypto_auth_module/table.sql index 639475bd7..aa9e756b2 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/crypto_auth_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/crypto_auth_module/table.sql @@ -37,5 +37,10 @@ CREATE TABLE metaschema_modules_public.crypto_auth_module ( -- TOKENS_REMOVAL: tokens_table_fkey comment removed CREATE INDEX crypto_auth_module_database_id_idx ON metaschema_modules_public.crypto_auth_module ( database_id ); +CREATE INDEX crypto_auth_module_secrets_table_id_idx ON metaschema_modules_public.crypto_auth_module ( secrets_table_id ); +CREATE INDEX crypto_auth_module_session_credentials_table_id_idx ON metaschema_modules_public.crypto_auth_module ( session_credentials_table_id ); +CREATE INDEX crypto_auth_module_sessions_table_id_idx ON metaschema_modules_public.crypto_auth_module ( sessions_table_id ); +CREATE INDEX crypto_auth_module_users_table_id_idx ON metaschema_modules_public.crypto_auth_module ( users_table_id ); +CREATE INDEX crypto_auth_module_schema_id_idx ON metaschema_modules_public.crypto_auth_module ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/database_settings_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/database_settings_module/table.sql index a37b6a46b..ef16a177e 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/database_settings_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/database_settings_module/table.sql @@ -82,10 +82,13 @@ CREATE TABLE metaschema_modules_public.database_settings_module ( ON DELETE CASCADE ); -CREATE INDEX database_settings_module_database_id_idx - ON metaschema_modules_public.database_settings_module (database_id); - CREATE UNIQUE INDEX database_settings_module_unique_scope ON metaschema_modules_public.database_settings_module (database_id, scope); +CREATE INDEX database_settings_module_entity_table_id_idx ON metaschema_modules_public.database_settings_module ( entity_table_id ); +CREATE INDEX database_settings_module_pubkey_settings_table_id_idx ON metaschema_modules_public.database_settings_module ( pubkey_settings_table_id ); +CREATE INDEX database_settings_module_rls_settings_table_id_idx ON metaschema_modules_public.database_settings_module ( rls_settings_table_id ); +CREATE INDEX database_settings_module_database_settings_table_id_idx ON metaschema_modules_public.database_settings_module ( database_settings_table_id ); +CREATE INDEX database_settings_module_webauthn_settings_table_id_idx ON metaschema_modules_public.database_settings_module ( webauthn_settings_table_id ); +CREATE INDEX database_settings_module_schema_id_idx ON metaschema_modules_public.database_settings_module ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/db_preset_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/db_preset_module/table.sql index 36e8cb522..4c5190f04 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/db_preset_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/db_preset_module/table.sql @@ -35,6 +35,10 @@ CREATE TABLE metaschema_modules_public.db_preset_module ( CONSTRAINT db_preset_module_database_merkle_unique UNIQUE (database_id, merkle_store_module_id) ); -CREATE INDEX db_preset_module_database_id_idx ON metaschema_modules_public.db_preset_module ( database_id ); +CREATE INDEX db_preset_module_entity_table_id_idx ON metaschema_modules_public.db_preset_module ( entity_table_id ); +CREATE INDEX db_preset_module_db_presets_table_id_idx ON metaschema_modules_public.db_preset_module ( db_presets_table_id ); +CREATE INDEX db_preset_module_private_schema_id_idx ON metaschema_modules_public.db_preset_module ( private_schema_id ); +CREATE INDEX db_preset_module_public_schema_id_idx ON metaschema_modules_public.db_preset_module ( public_schema_id ); +CREATE INDEX db_preset_module_merkle_store_module_id_idx ON metaschema_modules_public.db_preset_module ( merkle_store_module_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/db_usage_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/db_usage_module/table.sql index b2d2d54d7..ebb2f173d 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/db_usage_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/db_usage_module/table.sql @@ -71,6 +71,11 @@ CREATE TABLE metaschema_modules_public.db_usage_module ( CONSTRAINT db_usage_module_database_id_scope_unique UNIQUE (database_id, scope) ); -CREATE INDEX db_usage_module_database_id_idx ON metaschema_modules_public.db_usage_module ( database_id ); +CREATE INDEX db_usage_module_query_stats_log_table_id_idx ON metaschema_modules_public.db_usage_module ( query_stats_log_table_id ); +CREATE INDEX db_usage_module_query_stats_summary_table_id_idx ON metaschema_modules_public.db_usage_module ( query_stats_summary_table_id ); +CREATE INDEX db_usage_module_table_stats_log_table_id_idx ON metaschema_modules_public.db_usage_module ( table_stats_log_table_id ); +CREATE INDEX db_usage_module_table_stats_summary_table_id_idx ON metaschema_modules_public.db_usage_module ( table_stats_summary_table_id ); +CREATE INDEX db_usage_module_private_schema_id_idx ON metaschema_modules_public.db_usage_module ( private_schema_id ); +CREATE INDEX db_usage_module_schema_id_idx ON metaschema_modules_public.db_usage_module ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/denormalized_table_field/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/denormalized_table_field/table.sql index e6ea588a1..0226d11e8 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/denormalized_table_field/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/denormalized_table_field/table.sql @@ -32,5 +32,9 @@ CREATE TABLE metaschema_modules_public.denormalized_table_field ( ); CREATE INDEX denormalized_table_field_database_id_idx ON metaschema_modules_public.denormalized_table_field ( database_id ); +CREATE INDEX denormalized_table_field_ref_table_id_idx ON metaschema_modules_public.denormalized_table_field ( ref_table_id ); +CREATE INDEX denormalized_table_field_table_id_idx ON metaschema_modules_public.denormalized_table_field ( table_id ); +CREATE INDEX denormalized_table_field_field_id_idx ON metaschema_modules_public.denormalized_table_field ( field_id ); +CREATE INDEX denormalized_table_field_ref_field_id_idx ON metaschema_modules_public.denormalized_table_field ( ref_field_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/devices_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/devices_module/table.sql index 159c4a370..99cdfd643 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/devices_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/devices_module/table.sql @@ -26,11 +26,13 @@ CREATE TABLE metaschema_modules_public.devices_module ( CONSTRAINT devices_module_database_id_uniq UNIQUE(database_id) ); -CREATE INDEX devices_module_database_id_idx ON metaschema_modules_public.devices_module ( database_id ); - COMMENT ON CONSTRAINT user_devices_table_fkey ON metaschema_modules_public.devices_module IS E'@fieldName userDevicesTableByUserDevicesTableId'; COMMENT ON CONSTRAINT device_settings_table_fkey ON metaschema_modules_public.devices_module IS E'@fieldName deviceSettingsTableByDeviceSettingsTableId'; +CREATE INDEX devices_module_device_settings_table_id_idx ON metaschema_modules_public.devices_module ( device_settings_table_id ); +CREATE INDEX devices_module_user_devices_table_id_idx ON metaschema_modules_public.devices_module ( user_devices_table_id ); +CREATE INDEX devices_module_schema_id_idx ON metaschema_modules_public.devices_module ( schema_id ); + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/domain_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/domain_module/table.sql index db0f39766..aa394198c 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/domain_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/domain_module/table.sql @@ -103,10 +103,15 @@ CREATE TABLE metaschema_modules_public.domain_module ( ON DELETE CASCADE ); -CREATE INDEX domain_module_database_id_idx - ON metaschema_modules_public.domain_module (database_id); - CREATE UNIQUE INDEX domain_module_unique_scope ON metaschema_modules_public.domain_module (database_id, scope); +CREATE INDEX domain_module_domains_table_id_idx ON metaschema_modules_public.domain_module ( domains_table_id ); +CREATE INDEX domain_module_entity_table_id_idx ON metaschema_modules_public.domain_module ( entity_table_id ); +CREATE INDEX domain_module_domain_events_table_id_idx ON metaschema_modules_public.domain_module ( domain_events_table_id ); +CREATE INDEX domain_module_managed_domains_table_id_idx ON metaschema_modules_public.domain_module ( managed_domains_table_id ); +CREATE INDEX domain_module_domain_verifications_table_id_idx ON metaschema_modules_public.domain_module ( domain_verifications_table_id ); +CREATE INDEX domain_module_private_schema_id_idx ON metaschema_modules_public.domain_module ( private_schema_id ); +CREATE INDEX domain_module_schema_id_idx ON metaschema_modules_public.domain_module ( schema_id ); +CREATE INDEX domain_module_catalog_module_id_idx ON metaschema_modules_public.domain_module ( catalog_module_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/emails_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/emails_module/table.sql index ee8312290..2bd3e6c83 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/emails_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/emails_module/table.sql @@ -29,5 +29,9 @@ CREATE TABLE metaschema_modules_public.emails_module ( ); CREATE INDEX emails_module_database_id_idx ON metaschema_modules_public.emails_module ( database_id ); +CREATE INDEX emails_module_owner_table_id_idx ON metaschema_modules_public.emails_module ( owner_table_id ); +CREATE INDEX emails_module_table_id_idx ON metaschema_modules_public.emails_module ( table_id ); +CREATE INDEX emails_module_private_schema_id_idx ON metaschema_modules_public.emails_module ( private_schema_id ); +CREATE INDEX emails_module_schema_id_idx ON metaschema_modules_public.emails_module ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/events_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/events_module/table.sql index 8c4111ad2..dabe75a0d 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/events_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/events_module/table.sql @@ -99,5 +99,16 @@ CREATE TABLE metaschema_modules_public.events_module ( ); CREATE INDEX events_module_database_id_idx ON metaschema_modules_public.events_module ( database_id ); +CREATE INDEX events_module_achievement_rewards_table_id_idx ON metaschema_modules_public.events_module ( achievement_rewards_table_id ); +CREATE INDEX events_module_actor_table_id_idx ON metaschema_modules_public.events_module ( actor_table_id ); +CREATE INDEX events_module_entity_table_id_idx ON metaschema_modules_public.events_module ( entity_table_id ); +CREATE INDEX events_module_event_aggregates_table_id_idx ON metaschema_modules_public.events_module ( event_aggregates_table_id ); +CREATE INDEX events_module_event_types_table_id_idx ON metaschema_modules_public.events_module ( event_types_table_id ); +CREATE INDEX events_module_events_table_id_idx ON metaschema_modules_public.events_module ( events_table_id ); +CREATE INDEX events_module_level_grants_table_id_idx ON metaschema_modules_public.events_module ( level_grants_table_id ); +CREATE INDEX events_module_level_requirements_table_id_idx ON metaschema_modules_public.events_module ( level_requirements_table_id ); +CREATE INDEX events_module_levels_table_id_idx ON metaschema_modules_public.events_module ( levels_table_id ); +CREATE INDEX events_module_private_schema_id_idx ON metaschema_modules_public.events_module ( private_schema_id ); +CREATE INDEX events_module_schema_id_idx ON metaschema_modules_public.events_module ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/function_deployment_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/function_deployment_module/table.sql index 5514f4b9e..108507a78 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/function_deployment_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/function_deployment_module/table.sql @@ -78,9 +78,14 @@ CREATE TABLE metaschema_modules_public.function_deployment_module ( CONSTRAINT function_deployment_module_namespace_module_fkey FOREIGN KEY (namespace_module_id) REFERENCES metaschema_modules_public.namespace_module (id) ON DELETE SET NULL ); -CREATE INDEX function_deployment_module_database_id_idx ON metaschema_modules_public.function_deployment_module ( database_id ); - -- Unique constraint: one function deployment module per database per scope (K8s infra: scopes never share). CREATE UNIQUE INDEX function_deployment_module_unique_scope ON metaschema_modules_public.function_deployment_module ( database_id, scope ); +CREATE INDEX function_deployment_module_deployments_table_id_idx ON metaschema_modules_public.function_deployment_module ( deployments_table_id ); +CREATE INDEX function_deployment_module_entity_table_id_idx ON metaschema_modules_public.function_deployment_module ( entity_table_id ); +CREATE INDEX function_deployment_module_deployment_events_table_id_idx ON metaschema_modules_public.function_deployment_module ( deployment_events_table_id ); +CREATE INDEX function_deployment_module_private_schema_id_idx ON metaschema_modules_public.function_deployment_module ( private_schema_id ); +CREATE INDEX function_deployment_module_schema_id_idx ON metaschema_modules_public.function_deployment_module ( schema_id ); +CREATE INDEX function_deployment_module_function_module_id_idx ON metaschema_modules_public.function_deployment_module ( function_module_id ); +CREATE INDEX function_deployment_module_namespace_module_id_idx ON metaschema_modules_public.function_deployment_module ( namespace_module_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/function_invocation_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/function_invocation_module/table.sql index 7aeda7705..f2cb10df8 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/function_invocation_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/function_invocation_module/table.sql @@ -67,9 +67,13 @@ CREATE TABLE metaschema_modules_public.function_invocation_module ( CONSTRAINT function_invocation_module_entity_table_fkey FOREIGN KEY (entity_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE ); -CREATE INDEX function_invocation_module_database_id_idx ON metaschema_modules_public.function_invocation_module ( database_id ); - -- Unique constraint: one function invocation module per database per scope (K8s infra: scopes never share). CREATE UNIQUE INDEX function_invocation_module_unique_scope ON metaschema_modules_public.function_invocation_module ( database_id, scope ); +CREATE INDEX function_invocation_module_attempts_table_id_idx ON metaschema_modules_public.function_invocation_module ( attempts_table_id ); +CREATE INDEX function_invocation_module_entity_table_id_idx ON metaschema_modules_public.function_invocation_module ( entity_table_id ); +CREATE INDEX function_invocation_module_invocations_table_id_idx ON metaschema_modules_public.function_invocation_module ( invocations_table_id ); +CREATE INDEX function_invocation_module_execution_logs_table_id_idx ON metaschema_modules_public.function_invocation_module ( execution_logs_table_id ); +CREATE INDEX function_invocation_module_private_schema_id_idx ON metaschema_modules_public.function_invocation_module ( private_schema_id ); +CREATE INDEX function_invocation_module_schema_id_idx ON metaschema_modules_public.function_invocation_module ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/function_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/function_module/table.sql index a37d50065..e68d45ffe 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/function_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/function_module/table.sql @@ -26,6 +26,10 @@ CREATE TABLE metaschema_modules_public.function_module ( bindings_table_id uuid NOT NULL DEFAULT uuid_nil(), schedules_table_id uuid, + -- Capability bindings table: declarative grants of typed resource + -- capabilities (buckets today) to function/graph holders per lifecycle. + capability_bindings_table_id uuid NULL, + -- Optional cron scheduling support. has_cron boolean NOT NULL DEFAULT false, @@ -74,12 +78,18 @@ CREATE TABLE metaschema_modules_public.function_module ( CONSTRAINT function_module_definitions_table_fkey FOREIGN KEY (definitions_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, CONSTRAINT function_module_bindings_table_fkey FOREIGN KEY (bindings_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, CONSTRAINT function_module_schedules_table_fkey FOREIGN KEY (schedules_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, - CONSTRAINT function_module_entity_table_fkey FOREIGN KEY (entity_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE + CONSTRAINT function_module_entity_table_fkey FOREIGN KEY (entity_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT function_module_capability_bindings_table_fkey FOREIGN KEY (capability_bindings_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE ); -CREATE INDEX function_module_database_id_idx ON metaschema_modules_public.function_module ( database_id ); - -- Unique constraint: one function module per database per scope (K8s infra: scopes never share). CREATE UNIQUE INDEX function_module_unique_scope ON metaschema_modules_public.function_module ( database_id, scope ); +CREATE INDEX function_module_bindings_table_id_idx ON metaschema_modules_public.function_module ( bindings_table_id ); +CREATE INDEX function_module_definitions_table_id_idx ON metaschema_modules_public.function_module ( definitions_table_id ); +CREATE INDEX function_module_entity_table_id_idx ON metaschema_modules_public.function_module ( entity_table_id ); +CREATE INDEX function_module_schedules_table_id_idx ON metaschema_modules_public.function_module ( schedules_table_id ); +CREATE INDEX function_module_capability_bindings_table_id_idx ON metaschema_modules_public.function_module ( capability_bindings_table_id ); +CREATE INDEX function_module_private_schema_id_idx ON metaschema_modules_public.function_module ( private_schema_id ); +CREATE INDEX function_module_schema_id_idx ON metaschema_modules_public.function_module ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/graph_execution_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/graph_execution_module/table.sql index 3c9027bb1..66677cb94 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/graph_execution_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/graph_execution_module/table.sql @@ -80,9 +80,14 @@ CREATE TABLE metaschema_modules_public.graph_execution_module ( CONSTRAINT graph_execution_module_entity_table_fkey FOREIGN KEY (entity_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE ); -CREATE INDEX graph_execution_module_database_id_idx ON metaschema_modules_public.graph_execution_module ( database_id ); - -- One execution module per (database, scope) (K8s infra: scopes never share). CREATE UNIQUE INDEX graph_execution_module_unique_scope ON metaschema_modules_public.graph_execution_module ( database_id, scope ); +CREATE INDEX graph_execution_module_entity_table_id_idx ON metaschema_modules_public.graph_execution_module ( entity_table_id ); +CREATE INDEX graph_execution_module_executions_table_id_idx ON metaschema_modules_public.graph_execution_module ( executions_table_id ); +CREATE INDEX graph_execution_module_node_states_table_id_idx ON metaschema_modules_public.graph_execution_module ( node_states_table_id ); +CREATE INDEX graph_execution_module_outputs_table_id_idx ON metaschema_modules_public.graph_execution_module ( outputs_table_id ); +CREATE INDEX graph_execution_module_private_schema_id_idx ON metaschema_modules_public.graph_execution_module ( private_schema_id ); +CREATE INDEX graph_execution_module_schema_id_idx ON metaschema_modules_public.graph_execution_module ( schema_id ); +CREATE INDEX graph_execution_module_graph_module_id_idx ON metaschema_modules_public.graph_execution_module ( graph_module_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/graph_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/graph_module/table.sql index b85902faf..85f0feefe 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/graph_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/graph_module/table.sql @@ -72,6 +72,10 @@ CREATE TABLE metaschema_modules_public.graph_module ( CONSTRAINT graph_module_database_merkle_unique UNIQUE (database_id, merkle_store_module_id) ); -CREATE INDEX graph_module_database_id_idx ON metaschema_modules_public.graph_module ( database_id ); +CREATE INDEX graph_module_entity_table_id_idx ON metaschema_modules_public.graph_module ( entity_table_id ); +CREATE INDEX graph_module_graphs_table_id_idx ON metaschema_modules_public.graph_module ( graphs_table_id ); +CREATE INDEX graph_module_private_schema_id_idx ON metaschema_modules_public.graph_module ( private_schema_id ); +CREATE INDEX graph_module_public_schema_id_idx ON metaschema_modules_public.graph_module ( public_schema_id ); +CREATE INDEX graph_module_merkle_store_module_id_idx ON metaschema_modules_public.graph_module ( merkle_store_module_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/hierarchy_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/hierarchy_module/table.sql index 0934f757e..0717be66b 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/hierarchy_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/hierarchy_module/table.sql @@ -68,6 +68,12 @@ CREATE TABLE metaschema_modules_public.hierarchy_module ( CONSTRAINT hierarchy_module_database_unique UNIQUE (database_id) ); -CREATE INDEX hierarchy_module_database_id_idx ON metaschema_modules_public.hierarchy_module ( database_id ); +CREATE INDEX hierarchy_module_chart_edge_grants_table_id_idx ON metaschema_modules_public.hierarchy_module ( chart_edge_grants_table_id ); +CREATE INDEX hierarchy_module_chart_edges_table_id_idx ON metaschema_modules_public.hierarchy_module ( chart_edges_table_id ); +CREATE INDEX hierarchy_module_entity_table_id_idx ON metaschema_modules_public.hierarchy_module ( entity_table_id ); +CREATE INDEX hierarchy_module_hierarchy_sprt_table_id_idx ON metaschema_modules_public.hierarchy_module ( hierarchy_sprt_table_id ); +CREATE INDEX hierarchy_module_users_table_id_idx ON metaschema_modules_public.hierarchy_module ( users_table_id ); +CREATE INDEX hierarchy_module_private_schema_id_idx ON metaschema_modules_public.hierarchy_module ( private_schema_id ); +CREATE INDEX hierarchy_module_schema_id_idx ON metaschema_modules_public.hierarchy_module ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/http_route_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/http_route_module/table.sql index 84921d767..d51abb19b 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/http_route_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/http_route_module/table.sql @@ -70,10 +70,14 @@ CREATE TABLE metaschema_modules_public.http_route_module ( ON DELETE CASCADE ); -CREATE INDEX http_route_module_database_id_idx - ON metaschema_modules_public.http_route_module (database_id); - CREATE UNIQUE INDEX http_route_module_unique_scope ON metaschema_modules_public.http_route_module (database_id, scope); +CREATE INDEX http_route_module_entity_table_id_idx ON metaschema_modules_public.http_route_module ( entity_table_id ); +CREATE INDEX http_route_module_http_routes_table_id_idx ON metaschema_modules_public.http_route_module ( http_routes_table_id ); +CREATE INDEX http_route_module_private_schema_id_idx ON metaschema_modules_public.http_route_module ( private_schema_id ); +CREATE INDEX http_route_module_schema_id_idx ON metaschema_modules_public.http_route_module ( schema_id ); +CREATE INDEX http_route_module_function_module_id_idx ON metaschema_modules_public.http_route_module ( function_module_id ); +CREATE INDEX http_route_module_resource_module_id_idx ON metaschema_modules_public.http_route_module ( resource_module_id ); +CREATE INDEX http_route_module_storage_module_id_idx ON metaschema_modules_public.http_route_module ( storage_module_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/i18n_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/i18n_module/table.sql index df567812f..bf5458c4d 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/i18n_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/i18n_module/table.sql @@ -25,7 +25,9 @@ CREATE TABLE metaschema_modules_public.i18n_module ( CONSTRAINT settings_table_fkey FOREIGN KEY (settings_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE ); -CREATE INDEX i18n_module_database_id_idx ON metaschema_modules_public.i18n_module ( database_id ); CREATE UNIQUE INDEX i18n_module_unique_per_db ON metaschema_modules_public.i18n_module ( database_id ); +CREATE INDEX i18n_module_settings_table_id_idx ON metaschema_modules_public.i18n_module ( settings_table_id ); +CREATE INDEX i18n_module_private_schema_id_idx ON metaschema_modules_public.i18n_module ( private_schema_id ); +CREATE INDEX i18n_module_schema_id_idx ON metaschema_modules_public.i18n_module ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/identity_providers_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/identity_providers_module/table.sql index 890c6bc1e..03ae8850f 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/identity_providers_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/identity_providers_module/table.sql @@ -51,13 +51,13 @@ CREATE TABLE metaschema_modules_public.identity_providers_module ( CONSTRAINT entity_table_fkey FOREIGN KEY (entity_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE ); -CREATE INDEX identity_providers_module_database_id_idx ON metaschema_modules_public.identity_providers_module ( database_id ); CREATE INDEX identity_providers_module_schema_id_idx ON metaschema_modules_public.identity_providers_module ( schema_id ); CREATE INDEX identity_providers_module_private_schema_id_idx ON metaschema_modules_public.identity_providers_module ( private_schema_id ); CREATE INDEX identity_providers_module_table_id_idx ON metaschema_modules_public.identity_providers_module ( table_id ); -- One install per database per scope CREATE UNIQUE INDEX identity_providers_module_unique_scope ON metaschema_modules_public.identity_providers_module ( database_id, scope ); +CREATE INDEX identity_providers_module_entity_table_id_idx ON metaschema_modules_public.identity_providers_module ( entity_table_id ); COMMENT ON TABLE metaschema_modules_public.identity_providers_module IS 'Entity-aware config row for the identity_providers_module, which provisions a per-database diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/inference_log_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/inference_log_module/table.sql index 1c2cdc16f..669da7799 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/inference_log_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/inference_log_module/table.sql @@ -53,6 +53,9 @@ CREATE TABLE metaschema_modules_public.inference_log_module ( CONSTRAINT inference_log_module_database_id_prefix_unique UNIQUE NULLS NOT DISTINCT (database_id, prefix) ); -CREATE INDEX inference_log_module_database_id_idx ON metaschema_modules_public.inference_log_module ( database_id ); +CREATE INDEX inference_log_module_inference_log_table_id_idx ON metaschema_modules_public.inference_log_module ( inference_log_table_id ); +CREATE INDEX inference_log_module_usage_summary_table_id_idx ON metaschema_modules_public.inference_log_module ( usage_summary_table_id ); +CREATE INDEX inference_log_module_private_schema_id_idx ON metaschema_modules_public.inference_log_module ( private_schema_id ); +CREATE INDEX inference_log_module_schema_id_idx ON metaschema_modules_public.inference_log_module ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/infra_config_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/infra_config_module/table.sql index 007ada81c..162925c50 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/infra_config_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/infra_config_module/table.sql @@ -55,11 +55,12 @@ CREATE TABLE metaschema_modules_public.infra_config_module ( CONSTRAINT infra_config_module_entity_table_fkey FOREIGN KEY (entity_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE ); -CREATE INDEX infra_config_module_database_id_idx ON metaschema_modules_public.infra_config_module ( database_id ); CREATE INDEX infra_config_module_schema_id_idx ON metaschema_modules_public.infra_config_module ( schema_id ); CREATE INDEX infra_config_module_config_table_id_idx ON metaschema_modules_public.infra_config_module ( config_table_id ); CREATE UNIQUE INDEX infra_config_module_unique_scope ON metaschema_modules_public.infra_config_module ( database_id, scope ); +CREATE INDEX infra_config_module_entity_table_id_idx ON metaschema_modules_public.infra_config_module ( entity_table_id ); +CREATE INDEX infra_config_module_private_schema_id_idx ON metaschema_modules_public.infra_config_module ( private_schema_id ); COMMENT ON TABLE metaschema_modules_public.infra_config_module IS 'Namespace-backed plaintext key-value config module. Requires namespace_module and emits namespace:sync_config job triggers for K8s ConfigMap synchronization.'; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/infra_secrets_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/infra_secrets_module/table.sql index f222a2fe4..0b375dd10 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/infra_secrets_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/infra_secrets_module/table.sql @@ -56,11 +56,12 @@ CREATE TABLE metaschema_modules_public.infra_secrets_module ( CONSTRAINT infra_secrets_module_entity_table_fkey FOREIGN KEY (entity_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE ); -CREATE INDEX infra_secrets_module_database_id_idx ON metaschema_modules_public.infra_secrets_module ( database_id ); CREATE INDEX infra_secrets_module_schema_id_idx ON metaschema_modules_public.infra_secrets_module ( schema_id ); CREATE INDEX infra_secrets_module_secrets_table_id_idx ON metaschema_modules_public.infra_secrets_module ( secrets_table_id ); CREATE UNIQUE INDEX infra_secrets_module_unique_scope ON metaschema_modules_public.infra_secrets_module ( database_id, scope ); +CREATE INDEX infra_secrets_module_entity_table_id_idx ON metaschema_modules_public.infra_secrets_module ( entity_table_id ); +CREATE INDEX infra_secrets_module_private_schema_id_idx ON metaschema_modules_public.infra_secrets_module ( private_schema_id ); COMMENT ON TABLE metaschema_modules_public.infra_secrets_module IS 'Namespace-backed PGP-encrypted key-value secrets module. Requires namespace_module and emits namespace:sync_secrets job triggers for K8s Secret synchronization.'; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/integration_providers_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/integration_providers_module/table.sql index 83d1a9924..5dce11e7a 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/integration_providers_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/integration_providers_module/table.sql @@ -45,13 +45,13 @@ CREATE TABLE metaschema_modules_public.integration_providers_module ( CONSTRAINT integration_providers_module_entity_table_fkey FOREIGN KEY (entity_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE ); -CREATE INDEX integration_providers_module_database_id_idx ON metaschema_modules_public.integration_providers_module ( database_id ); CREATE INDEX integration_providers_module_schema_id_idx ON metaschema_modules_public.integration_providers_module ( schema_id ); CREATE INDEX integration_providers_module_private_schema_id_idx ON metaschema_modules_public.integration_providers_module ( private_schema_id ); CREATE INDEX integration_providers_module_table_id_idx ON metaschema_modules_public.integration_providers_module ( table_id ); -- One install per database per scope (prefix distinguishes multiple instances) CREATE UNIQUE INDEX integration_providers_module_unique_scope ON metaschema_modules_public.integration_providers_module ( database_id, scope, prefix ); +CREATE INDEX integration_providers_module_entity_table_id_idx ON metaschema_modules_public.integration_providers_module ( entity_table_id ); COMMENT ON TABLE metaschema_modules_public.integration_providers_module IS 'Config row for the integration_providers_module, which provisions a per-database diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/internal_secrets_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/internal_secrets_module/table.sql index 01b6cd48f..f26c6fc7f 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/internal_secrets_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/internal_secrets_module/table.sql @@ -56,11 +56,12 @@ CREATE TABLE metaschema_modules_public.internal_secrets_module ( CONSTRAINT internal_secrets_module_entity_table_fkey FOREIGN KEY (entity_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE ); -CREATE INDEX internal_secrets_module_database_id_idx ON metaschema_modules_public.internal_secrets_module ( database_id ); CREATE INDEX internal_secrets_module_schema_id_idx ON metaschema_modules_public.internal_secrets_module ( schema_id ); CREATE INDEX internal_secrets_module_internal_secrets_table_id_idx ON metaschema_modules_public.internal_secrets_module ( internal_secrets_table_id ); CREATE UNIQUE INDEX internal_secrets_module_unique_scope ON metaschema_modules_public.internal_secrets_module ( database_id, scope ); +CREATE INDEX internal_secrets_module_entity_table_id_idx ON metaschema_modules_public.internal_secrets_module ( entity_table_id ); +CREATE INDEX internal_secrets_module_private_schema_id_idx ON metaschema_modules_public.internal_secrets_module ( private_schema_id ); COMMENT ON TABLE metaschema_modules_public.internal_secrets_module IS 'App-scoped PGP-encrypted internal secrets store. No namespace_module dependency and no K8s synchronization. Used by identity_providers_module for OAuth2 client_secret storage.'; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/invites_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/invites_module/table.sql index 49e318429..e6334bbc4 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/invites_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/invites_module/table.sql @@ -54,10 +54,15 @@ CREATE TABLE metaschema_modules_public.invites_module ( CONSTRAINT pschema_fkey FOREIGN KEY (private_schema_id) REFERENCES metaschema_public.schema (id) ON DELETE CASCADE ); -CREATE INDEX invites_module_database_id_idx ON metaschema_modules_public.invites_module ( database_id ); - -- Unique constraint: one invites module per database per scope per prefix. CREATE UNIQUE INDEX invites_module_unique_scope ON metaschema_modules_public.invites_module (database_id, scope, prefix); +CREATE INDEX invites_module_claimed_invites_table_id_idx ON metaschema_modules_public.invites_module ( claimed_invites_table_id ); +CREATE INDEX invites_module_emails_table_id_idx ON metaschema_modules_public.invites_module ( emails_table_id ); +CREATE INDEX invites_module_entity_table_id_idx ON metaschema_modules_public.invites_module ( entity_table_id ); +CREATE INDEX invites_module_invites_table_id_idx ON metaschema_modules_public.invites_module ( invites_table_id ); +CREATE INDEX invites_module_users_table_id_idx ON metaschema_modules_public.invites_module ( users_table_id ); +CREATE INDEX invites_module_private_schema_id_idx ON metaschema_modules_public.invites_module ( private_schema_id ); +CREATE INDEX invites_module_schema_id_idx ON metaschema_modules_public.invites_module ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/limits_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/limits_module/table.sql index 8a7150cfa..c8dd2326a 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/limits_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/limits_module/table.sql @@ -107,5 +107,21 @@ CREATE TABLE metaschema_modules_public.limits_module ( ); CREATE INDEX limits_module_database_id_idx ON metaschema_modules_public.limits_module ( database_id ); +CREATE INDEX limits_module_actor_table_id_idx ON metaschema_modules_public.limits_module ( actor_table_id ); +CREATE INDEX limits_module_aggregate_table_id_idx ON metaschema_modules_public.limits_module ( aggregate_table_id ); +CREATE INDEX limits_module_credit_code_items_table_id_idx ON metaschema_modules_public.limits_module ( credit_code_items_table_id ); +CREATE INDEX limits_module_credit_codes_table_id_idx ON metaschema_modules_public.limits_module ( credit_codes_table_id ); +CREATE INDEX limits_module_credit_redemptions_table_id_idx ON metaschema_modules_public.limits_module ( credit_redemptions_table_id ); +CREATE INDEX limits_module_default_table_id_idx ON metaschema_modules_public.limits_module ( default_table_id ); +CREATE INDEX limits_module_entity_table_id_idx ON metaschema_modules_public.limits_module ( entity_table_id ); +CREATE INDEX limits_module_events_table_id_idx ON metaschema_modules_public.limits_module ( events_table_id ); +CREATE INDEX limits_module_limit_caps_defaults_table_id_idx ON metaschema_modules_public.limits_module ( limit_caps_defaults_table_id ); +CREATE INDEX limits_module_limit_caps_table_id_idx ON metaschema_modules_public.limits_module ( limit_caps_table_id ); +CREATE INDEX limits_module_limit_credits_table_id_idx ON metaschema_modules_public.limits_module ( limit_credits_table_id ); +CREATE INDEX limits_module_limit_warning_state_table_id_idx ON metaschema_modules_public.limits_module ( limit_warning_state_table_id ); +CREATE INDEX limits_module_limit_warnings_table_id_idx ON metaschema_modules_public.limits_module ( limit_warnings_table_id ); +CREATE INDEX limits_module_table_id_idx ON metaschema_modules_public.limits_module ( table_id ); +CREATE INDEX limits_module_private_schema_id_idx ON metaschema_modules_public.limits_module ( private_schema_id ); +CREATE INDEX limits_module_schema_id_idx ON metaschema_modules_public.limits_module ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/membership_types_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/membership_types_module/table.sql index dc5c8a6f2..efc1dd761 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/membership_types_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/membership_types_module/table.sql @@ -21,5 +21,7 @@ CREATE TABLE metaschema_modules_public.membership_types_module ( ); CREATE INDEX membership_types_module_database_id_idx ON metaschema_modules_public.membership_types_module ( database_id ); +CREATE INDEX membership_types_module_table_id_idx ON metaschema_modules_public.membership_types_module ( table_id ); +CREATE INDEX membership_types_module_schema_id_idx ON metaschema_modules_public.membership_types_module ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/memberships_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/memberships_module/table.sql index 33d2b1f7a..edccf1ba9 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/memberships_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/memberships_module/table.sql @@ -104,6 +104,20 @@ CREATE TABLE metaschema_modules_public.memberships_module ( CONSTRAINT memberships_module_unique UNIQUE (database_id, scope, prefix) ); -CREATE INDEX memberships_module_database_id_idx ON metaschema_modules_public.memberships_module ( database_id ); +CREATE INDEX memberships_module_actor_table_id_idx ON metaschema_modules_public.memberships_module ( actor_table_id ); +CREATE INDEX memberships_module_default_limits_table_id_idx ON metaschema_modules_public.memberships_module ( default_limits_table_id ); +CREATE INDEX memberships_module_default_permissions_table_id_idx ON metaschema_modules_public.memberships_module ( default_permissions_table_id ); +CREATE INDEX memberships_module_entity_table_id_idx ON metaschema_modules_public.memberships_module ( entity_table_id ); +CREATE INDEX memberships_module_grants_table_id_idx ON metaschema_modules_public.memberships_module ( grants_table_id ); +CREATE INDEX memberships_module_limits_table_id_idx ON metaschema_modules_public.memberships_module ( limits_table_id ); +CREATE INDEX memberships_module_members_table_id_idx ON metaschema_modules_public.memberships_module ( members_table_id ); +CREATE INDEX memberships_module_membership_defaults_table_id_idx ON metaschema_modules_public.memberships_module ( membership_defaults_table_id ); +CREATE INDEX memberships_module_membership_settings_table_id_idx ON metaschema_modules_public.memberships_module ( membership_settings_table_id ); +CREATE INDEX memberships_module_memberships_table_id_idx ON metaschema_modules_public.memberships_module ( memberships_table_id ); +CREATE INDEX memberships_module_permissions_table_id_idx ON metaschema_modules_public.memberships_module ( permissions_table_id ); +CREATE INDEX memberships_module_sprt_table_id_idx ON metaschema_modules_public.memberships_module ( sprt_table_id ); +CREATE INDEX memberships_module_private_schema_id_idx ON metaschema_modules_public.memberships_module ( private_schema_id ); +CREATE INDEX memberships_module_schema_id_idx ON metaschema_modules_public.memberships_module ( schema_id ); +CREATE INDEX memberships_module_entity_table_owner_id_idx ON metaschema_modules_public.memberships_module ( entity_table_owner_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/merkle_store_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/merkle_store_module/table.sql index 57b9e32b0..d8b1ba430 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/merkle_store_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/merkle_store_module/table.sql @@ -65,7 +65,11 @@ CREATE TABLE metaschema_modules_public.merkle_store_module ( CONSTRAINT merkle_store_module_database_prefix_unique UNIQUE (database_id, prefix) ); -CREATE INDEX merkle_store_module_database_id_idx ON metaschema_modules_public.merkle_store_module ( database_id ); CREATE INDEX merkle_store_module_private_schema_id_idx ON metaschema_modules_public.merkle_store_module ( private_schema_id ); +CREATE INDEX merkle_store_module_commit_table_id_idx ON metaschema_modules_public.merkle_store_module ( commit_table_id ); +CREATE INDEX merkle_store_module_object_table_id_idx ON metaschema_modules_public.merkle_store_module ( object_table_id ); +CREATE INDEX merkle_store_module_ref_table_id_idx ON metaschema_modules_public.merkle_store_module ( ref_table_id ); +CREATE INDEX merkle_store_module_store_table_id_idx ON metaschema_modules_public.merkle_store_module ( store_table_id ); +CREATE INDEX merkle_store_module_schema_id_idx ON metaschema_modules_public.merkle_store_module ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/namespace_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/namespace_module/table.sql index 71b709087..43ca357b5 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/namespace_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/namespace_module/table.sql @@ -69,9 +69,12 @@ CREATE TABLE metaschema_modules_public.namespace_module ( CONSTRAINT namespace_module_entity_table_fkey FOREIGN KEY (entity_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE ); -CREATE INDEX namespace_module_database_id_idx ON metaschema_modules_public.namespace_module ( database_id ); - -- Unique constraint: one namespace module per database per scope (K8s infra: scopes never share). CREATE UNIQUE INDEX namespace_module_unique_scope ON metaschema_modules_public.namespace_module ( database_id, scope ); +CREATE INDEX namespace_module_entity_table_id_idx ON metaschema_modules_public.namespace_module ( entity_table_id ); +CREATE INDEX namespace_module_namespace_events_table_id_idx ON metaschema_modules_public.namespace_module ( namespace_events_table_id ); +CREATE INDEX namespace_module_namespaces_table_id_idx ON metaschema_modules_public.namespace_module ( namespaces_table_id ); +CREATE INDEX namespace_module_private_schema_id_idx ON metaschema_modules_public.namespace_module ( private_schema_id ); +CREATE INDEX namespace_module_schema_id_idx ON metaschema_modules_public.namespace_module ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/notifications_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/notifications_module/table.sql index 29a0f3c0f..ed893a398 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/notifications_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/notifications_module/table.sql @@ -68,18 +68,29 @@ CREATE TABLE metaschema_modules_public.notifications_module ( CONSTRAINT private_schema_fkey FOREIGN KEY (private_schema_id) REFERENCES metaschema_public.schema (id) ON DELETE CASCADE ); -COMMENT ON CONSTRAINT schema_fkey ON metaschema_modules_public.notifications_module IS E'@omit manyToMany'; -COMMENT ON CONSTRAINT private_schema_fkey ON metaschema_modules_public.notifications_module IS E'@omit manyToMany'; -COMMENT ON CONSTRAINT notifications_table_fkey ON metaschema_modules_public.notifications_module IS E'@fieldName notificationsTableByNotificationsTableId\n@omit manyToMany'; -COMMENT ON CONSTRAINT read_state_table_fkey ON metaschema_modules_public.notifications_module IS E'@fieldName readStateTableByReadStateTableId\n@omit manyToMany'; -COMMENT ON CONSTRAINT preferences_table_fkey ON metaschema_modules_public.notifications_module IS E'@fieldName preferencesTableByPreferencesTableId\n@omit manyToMany'; -COMMENT ON CONSTRAINT channels_table_fkey ON metaschema_modules_public.notifications_module IS E'@fieldName channelsTableByChannelsTableId\n@omit manyToMany'; -COMMENT ON CONSTRAINT delivery_log_table_fkey ON metaschema_modules_public.notifications_module IS E'@fieldName deliveryLogTableByDeliveryLogTableId\n@omit manyToMany'; +COMMENT ON CONSTRAINT schema_fkey ON metaschema_modules_public.notifications_module IS E'@behavior -manyToMany'; +COMMENT ON CONSTRAINT private_schema_fkey ON metaschema_modules_public.notifications_module IS E'@behavior -manyToMany'; +COMMENT ON CONSTRAINT notifications_table_fkey ON metaschema_modules_public.notifications_module IS E'@fieldName notificationsTableByNotificationsTableId\n@behavior -manyToMany'; +COMMENT ON CONSTRAINT read_state_table_fkey ON metaschema_modules_public.notifications_module IS E'@fieldName readStateTableByReadStateTableId\n@behavior -manyToMany'; +COMMENT ON CONSTRAINT preferences_table_fkey ON metaschema_modules_public.notifications_module IS E'@fieldName preferencesTableByPreferencesTableId\n@behavior -manyToMany'; +COMMENT ON CONSTRAINT channels_table_fkey ON metaschema_modules_public.notifications_module IS E'@fieldName channelsTableByChannelsTableId\n@behavior -manyToMany'; +COMMENT ON CONSTRAINT delivery_log_table_fkey ON metaschema_modules_public.notifications_module IS E'@fieldName deliveryLogTableByDeliveryLogTableId\n@behavior -manyToMany'; COMMENT ON CONSTRAINT suppressions_table_fkey ON metaschema_modules_public.notifications_module IS E'@fieldName suppressionsTableBySuppressionsTableId'; -COMMENT ON CONSTRAINT owner_table_fkey ON metaschema_modules_public.notifications_module IS E'@omit manyToMany'; -COMMENT ON CONSTRAINT user_settings_table_fkey ON metaschema_modules_public.notifications_module IS E'@fieldName userSettingsTableByUserSettingsTableId\n@omit manyToMany'; -COMMENT ON CONSTRAINT organization_settings_table_fkey ON metaschema_modules_public.notifications_module IS E'@fieldName organizationSettingsTableByOrganizationSettingsTableId\n@omit manyToMany'; -COMMENT ON CONSTRAINT db_fkey ON metaschema_modules_public.notifications_module IS E'@omit manyToMany'; +COMMENT ON CONSTRAINT owner_table_fkey ON metaschema_modules_public.notifications_module IS E'@behavior -manyToMany'; +COMMENT ON CONSTRAINT user_settings_table_fkey ON metaschema_modules_public.notifications_module IS E'@fieldName userSettingsTableByUserSettingsTableId\n@behavior -manyToMany'; +COMMENT ON CONSTRAINT organization_settings_table_fkey ON metaschema_modules_public.notifications_module IS E'@fieldName organizationSettingsTableByOrganizationSettingsTableId\n@behavior -manyToMany'; +COMMENT ON CONSTRAINT db_fkey ON metaschema_modules_public.notifications_module IS E'@behavior -manyToMany'; CREATE INDEX notifications_module_database_id_idx ON metaschema_modules_public.notifications_module ( database_id ); +CREATE INDEX notifications_module_channels_table_id_idx ON metaschema_modules_public.notifications_module ( channels_table_id ); +CREATE INDEX notifications_module_delivery_log_table_id_idx ON metaschema_modules_public.notifications_module ( delivery_log_table_id ); +CREATE INDEX notifications_module_notifications_table_id_idx ON metaschema_modules_public.notifications_module ( notifications_table_id ); +CREATE INDEX notifications_module_organization_settings_table_id_idx ON metaschema_modules_public.notifications_module ( organization_settings_table_id ); +CREATE INDEX notifications_module_owner_table_id_idx ON metaschema_modules_public.notifications_module ( owner_table_id ); +CREATE INDEX notifications_module_preferences_table_id_idx ON metaschema_modules_public.notifications_module ( preferences_table_id ); +CREATE INDEX notifications_module_read_state_table_id_idx ON metaschema_modules_public.notifications_module ( read_state_table_id ); +CREATE INDEX notifications_module_suppressions_table_id_idx ON metaschema_modules_public.notifications_module ( suppressions_table_id ); +CREATE INDEX notifications_module_user_settings_table_id_idx ON metaschema_modules_public.notifications_module ( user_settings_table_id ); +CREATE INDEX notifications_module_private_schema_id_idx ON metaschema_modules_public.notifications_module ( private_schema_id ); +CREATE INDEX notifications_module_schema_id_idx ON metaschema_modules_public.notifications_module ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/pages_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/pages_module/table.sql new file mode 100644 index 000000000..6eba4c310 --- /dev/null +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/pages_module/table.sql @@ -0,0 +1,62 @@ +-- Deploy schemas/metaschema_modules_public/tables/pages_module/table to pg + +-- requires: schemas/metaschema_modules_public/schema +-- requires: schemas/metaschema_modules_public/tables/merkle_store_module/table +-- requires: schemas/metaschema_modules_public/tables/site_surface_module/table + +BEGIN; + +CREATE TABLE metaschema_modules_public.pages_module ( + id uuid PRIMARY KEY DEFAULT uuidv7(), + database_id uuid NOT NULL, + public_schema_id uuid NOT NULL DEFAULT uuid_nil(), + private_schema_id uuid NOT NULL DEFAULT uuid_nil(), + public_schema_name text, + private_schema_name text, + scope text NOT NULL, + prefix text NOT NULL, + + -- Backing merkle store (reused, never a new store per the pages spec) + merkle_store_module_id uuid NOT NULL, + + -- Site surface whose sites table the pages head FKs into (resolved from the + -- same-database/scope site_surface_module by the insert trigger when NULL). + site_surface_module_id uuid, + -- Resolved sites table id (site_id FK target), populated by the trigger. + sites_table_id uuid NOT NULL DEFAULT uuid_nil(), + + -- Generated head table id (populated by the generator) + pages_table_id uuid NOT NULL DEFAULT uuid_nil(), + + -- Per-site store-row name prefix inside the reused Merkle store tables: + -- the actual store name is || site_id (one store per + -- site). The store holds ALL of the site's versioned content — pages, + -- metadata, themes — so it is named for the site, not for pages. + store_name_prefix text NOT NULL DEFAULT 'site:', + + api_name text, + private_api_name text, + entity_table_id uuid NULL, + policies jsonb NULL, + provisions jsonb NULL, + created_at timestamptz NOT NULL DEFAULT now(), + CONSTRAINT pages_module_db_fkey FOREIGN KEY (database_id) REFERENCES metaschema_public.database (id) ON DELETE CASCADE, + CONSTRAINT pages_module_public_schema_fkey FOREIGN KEY (public_schema_id) REFERENCES metaschema_public.schema (id) ON DELETE CASCADE, + CONSTRAINT pages_module_private_schema_fkey FOREIGN KEY (private_schema_id) REFERENCES metaschema_public.schema (id) ON DELETE CASCADE, + CONSTRAINT pages_module_merkle_store_fkey FOREIGN KEY (merkle_store_module_id) REFERENCES metaschema_modules_public.merkle_store_module (id) ON DELETE CASCADE, + CONSTRAINT pages_module_site_surface_fkey FOREIGN KEY (site_surface_module_id) REFERENCES metaschema_modules_public.site_surface_module (id) ON DELETE CASCADE, + CONSTRAINT pages_module_sites_table_fkey FOREIGN KEY (sites_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT pages_module_pages_table_fkey FOREIGN KEY (pages_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT pages_module_entity_table_fkey FOREIGN KEY (entity_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT pages_module_database_scope_unique UNIQUE (database_id, scope) +); + +CREATE INDEX pages_module_entity_table_id_idx ON metaschema_modules_public.pages_module ( entity_table_id ); +CREATE INDEX pages_module_pages_table_id_idx ON metaschema_modules_public.pages_module ( pages_table_id ); +CREATE INDEX pages_module_sites_table_id_idx ON metaschema_modules_public.pages_module ( sites_table_id ); +CREATE INDEX pages_module_site_surface_module_id_idx ON metaschema_modules_public.pages_module ( site_surface_module_id ); +CREATE INDEX pages_module_private_schema_id_idx ON metaschema_modules_public.pages_module ( private_schema_id ); +CREATE INDEX pages_module_public_schema_id_idx ON metaschema_modules_public.pages_module ( public_schema_id ); +CREATE INDEX pages_module_merkle_store_module_id_idx ON metaschema_modules_public.pages_module ( merkle_store_module_id ); + +COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/permissions_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/permissions_module/table.sql index 185a5686c..ab71cf2df 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/permissions_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/permissions_module/table.sql @@ -87,5 +87,11 @@ CREATE TABLE metaschema_modules_public.permissions_module ( ); CREATE INDEX permissions_module_database_id_idx ON metaschema_modules_public.permissions_module ( database_id ); +CREATE INDEX permissions_module_actor_table_id_idx ON metaschema_modules_public.permissions_module ( actor_table_id ); +CREATE INDEX permissions_module_default_table_id_idx ON metaschema_modules_public.permissions_module ( default_table_id ); +CREATE INDEX permissions_module_entity_table_id_idx ON metaschema_modules_public.permissions_module ( entity_table_id ); +CREATE INDEX permissions_module_table_id_idx ON metaschema_modules_public.permissions_module ( table_id ); +CREATE INDEX permissions_module_private_schema_id_idx ON metaschema_modules_public.permissions_module ( private_schema_id ); +CREATE INDEX permissions_module_schema_id_idx ON metaschema_modules_public.permissions_module ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/phone_numbers_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/phone_numbers_module/table.sql index 35db3eb86..6b73cc13b 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/phone_numbers_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/phone_numbers_module/table.sql @@ -29,5 +29,9 @@ CREATE TABLE metaschema_modules_public.phone_numbers_module ( ); CREATE INDEX phone_numbers_module_database_id_idx ON metaschema_modules_public.phone_numbers_module ( database_id ); +CREATE INDEX phone_numbers_module_owner_table_id_idx ON metaschema_modules_public.phone_numbers_module ( owner_table_id ); +CREATE INDEX phone_numbers_module_table_id_idx ON metaschema_modules_public.phone_numbers_module ( table_id ); +CREATE INDEX phone_numbers_module_private_schema_id_idx ON metaschema_modules_public.phone_numbers_module ( private_schema_id ); +CREATE INDEX phone_numbers_module_schema_id_idx ON metaschema_modules_public.phone_numbers_module ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/plans_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/plans_module/table.sql index 80b9e921b..d34661167 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/plans_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/plans_module/table.sql @@ -61,6 +61,13 @@ CREATE TABLE metaschema_modules_public.plans_module ( CONSTRAINT plans_module_database_id_unique UNIQUE (database_id) ); -CREATE INDEX plans_module_database_id_idx ON metaschema_modules_public.plans_module ( database_id ); +CREATE INDEX plans_module_plan_caps_table_id_idx ON metaschema_modules_public.plans_module ( plan_caps_table_id ); +CREATE INDEX plans_module_plan_limits_table_id_idx ON metaschema_modules_public.plans_module ( plan_limits_table_id ); +CREATE INDEX plans_module_plan_meter_limits_table_id_idx ON metaschema_modules_public.plans_module ( plan_meter_limits_table_id ); +CREATE INDEX plans_module_plan_overrides_table_id_idx ON metaschema_modules_public.plans_module ( plan_overrides_table_id ); +CREATE INDEX plans_module_plan_pricing_table_id_idx ON metaschema_modules_public.plans_module ( plan_pricing_table_id ); +CREATE INDEX plans_module_plans_table_id_idx ON metaschema_modules_public.plans_module ( plans_table_id ); +CREATE INDEX plans_module_private_schema_id_idx ON metaschema_modules_public.plans_module ( private_schema_id ); +CREATE INDEX plans_module_schema_id_idx ON metaschema_modules_public.plans_module ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/principal_auth_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/principal_auth_module/table.sql index 904d54cd1..0a4474bd3 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/principal_auth_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/principal_auth_module/table.sql @@ -41,17 +41,23 @@ CREATE TABLE metaschema_modules_public.principal_auth_module ( ); CREATE INDEX principal_auth_module_database_id_idx ON metaschema_modules_public.principal_auth_module ( database_id ); +CREATE INDEX principal_auth_module_principal_entities_table_id_idx ON metaschema_modules_public.principal_auth_module ( principal_entities_table_id ); +CREATE INDEX principal_auth_module_principals_table_id_idx ON metaschema_modules_public.principal_auth_module ( principals_table_id ); +CREATE INDEX principal_auth_module_session_credentials_table_id_idx ON metaschema_modules_public.principal_auth_module ( session_credentials_table_id ); +CREATE INDEX principal_auth_module_sessions_table_id_idx ON metaschema_modules_public.principal_auth_module ( sessions_table_id ); +CREATE INDEX principal_auth_module_users_table_id_idx ON metaschema_modules_public.principal_auth_module ( users_table_id ); +CREATE INDEX principal_auth_module_schema_id_idx ON metaschema_modules_public.principal_auth_module ( schema_id ); COMMENT ON CONSTRAINT principals_table_fkey - ON metaschema_modules_public.principal_auth_module IS E'@omit'; + ON metaschema_modules_public.principal_auth_module IS E'@behavior -*'; COMMENT ON CONSTRAINT users_table_fkey - ON metaschema_modules_public.principal_auth_module IS E'@omit'; + ON metaschema_modules_public.principal_auth_module IS E'@behavior -*'; COMMENT ON CONSTRAINT sessions_table_fkey - ON metaschema_modules_public.principal_auth_module IS E'@omit'; + ON metaschema_modules_public.principal_auth_module IS E'@behavior -*'; COMMENT ON CONSTRAINT session_credentials_table_fkey - ON metaschema_modules_public.principal_auth_module IS E'@omit'; + ON metaschema_modules_public.principal_auth_module IS E'@behavior -*'; COMMENT ON CONSTRAINT principal_entities_table_fkey - ON metaschema_modules_public.principal_auth_module IS E'@omit'; + ON metaschema_modules_public.principal_auth_module IS E'@behavior -*'; COMMENT ON TABLE metaschema_modules_public.principal_auth_module IS 'Provisions the principals subsystem: a principals table, a principal_entities junction table, create/delete mutations, and org API key management. Supports both human-owned principals (AuthzDirectOwner, AuthzHumanOnly) and org-owned principals (AuthzEntityMembership with is_admin). Org principal and org API key functions are only generated when an org-scoped memberships_module exists for the database.'; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/profiles_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/profiles_module/table.sql index e155fd89b..4226861c7 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/profiles_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/profiles_module/table.sql @@ -75,6 +75,16 @@ CREATE TABLE metaschema_modules_public.profiles_module ( CONSTRAINT profiles_module_unique UNIQUE (database_id, scope, prefix) ); -CREATE INDEX profiles_module_database_id_idx ON metaschema_modules_public.profiles_module ( database_id ); +CREATE INDEX profiles_module_actor_table_id_idx ON metaschema_modules_public.profiles_module ( actor_table_id ); +CREATE INDEX profiles_module_entity_table_id_idx ON metaschema_modules_public.profiles_module ( entity_table_id ); +CREATE INDEX profiles_module_memberships_table_id_idx ON metaschema_modules_public.profiles_module ( memberships_table_id ); +CREATE INDEX profiles_module_permissions_table_id_idx ON metaschema_modules_public.profiles_module ( permissions_table_id ); +CREATE INDEX profiles_module_profile_definition_grants_table_id_idx ON metaschema_modules_public.profiles_module ( profile_definition_grants_table_id ); +CREATE INDEX profiles_module_profile_grants_table_id_idx ON metaschema_modules_public.profiles_module ( profile_grants_table_id ); +CREATE INDEX profiles_module_profile_permissions_table_id_idx ON metaschema_modules_public.profiles_module ( profile_permissions_table_id ); +CREATE INDEX profiles_module_profile_templates_table_id_idx ON metaschema_modules_public.profiles_module ( profile_templates_table_id ); +CREATE INDEX profiles_module_table_id_idx ON metaschema_modules_public.profiles_module ( table_id ); +CREATE INDEX profiles_module_private_schema_id_idx ON metaschema_modules_public.profiles_module ( private_schema_id ); +CREATE INDEX profiles_module_schema_id_idx ON metaschema_modules_public.profiles_module ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/rate_limit_meters_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/rate_limit_meters_module/table.sql index b9a9ec463..36fe9fcf6 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/rate_limit_meters_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/rate_limit_meters_module/table.sql @@ -51,8 +51,6 @@ CREATE TABLE metaschema_modules_public.rate_limit_meters_module ( CONSTRAINT rate_limit_meters_module_database_id_unique UNIQUE (database_id) ); -CREATE INDEX rate_limit_meters_module_database_id_idx ON metaschema_modules_public.rate_limit_meters_module ( database_id ); - COMMENT ON CONSTRAINT rate_limit_state_table_fkey ON metaschema_modules_public.rate_limit_meters_module IS E'@fieldName rateLimitStateTableByRateLimitStateTableId'; COMMENT ON CONSTRAINT rate_limit_overrides_table_fkey @@ -60,4 +58,10 @@ COMMENT ON CONSTRAINT rate_limit_overrides_table_fkey COMMENT ON CONSTRAINT rate_window_limits_table_fkey ON metaschema_modules_public.rate_limit_meters_module IS E'@fieldName rateWindowLimitsTableByRateWindowLimitsTableId'; +CREATE INDEX rate_limit_meters_module_rate_limit_overrides_table_id_idx ON metaschema_modules_public.rate_limit_meters_module ( rate_limit_overrides_table_id ); +CREATE INDEX rate_limit_meters_module_rate_limit_state_table_id_idx ON metaschema_modules_public.rate_limit_meters_module ( rate_limit_state_table_id ); +CREATE INDEX rate_limit_meters_module_rate_window_limits_table_id_idx ON metaschema_modules_public.rate_limit_meters_module ( rate_window_limits_table_id ); +CREATE INDEX rate_limit_meters_module_private_schema_id_idx ON metaschema_modules_public.rate_limit_meters_module ( private_schema_id ); +CREATE INDEX rate_limit_meters_module_schema_id_idx ON metaschema_modules_public.rate_limit_meters_module ( schema_id ); + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/rate_limits_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/rate_limits_module/table.sql index e99b0fe84..72a0cd207 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/rate_limits_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/rate_limits_module/table.sql @@ -29,8 +29,6 @@ CREATE TABLE metaschema_modules_public.rate_limits_module ( CONSTRAINT rate_limits_module_database_id_uniq UNIQUE(database_id) ); -CREATE INDEX rate_limits_module_database_id_idx ON metaschema_modules_public.rate_limits_module ( database_id ); - COMMENT ON CONSTRAINT rate_limit_settings_table_fkey ON metaschema_modules_public.rate_limits_module IS E'@fieldName rateLimitSettingsTableByRateLimitSettingsTableId'; COMMENT ON CONSTRAINT ip_rate_limits_table_fkey @@ -38,4 +36,9 @@ COMMENT ON CONSTRAINT ip_rate_limits_table_fkey COMMENT ON CONSTRAINT rate_limits_table_fkey ON metaschema_modules_public.rate_limits_module IS E'@fieldName rateLimitsTableByRateLimitsTableId'; +CREATE INDEX rate_limits_module_ip_rate_limits_table_id_idx ON metaschema_modules_public.rate_limits_module ( ip_rate_limits_table_id ); +CREATE INDEX rate_limits_module_rate_limit_settings_table_id_idx ON metaschema_modules_public.rate_limits_module ( rate_limit_settings_table_id ); +CREATE INDEX rate_limits_module_rate_limits_table_id_idx ON metaschema_modules_public.rate_limits_module ( rate_limits_table_id ); +CREATE INDEX rate_limits_module_schema_id_idx ON metaschema_modules_public.rate_limits_module ( schema_id ); + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/realtime_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/realtime_module/table.sql index 419733243..3a56ae489 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/realtime_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/realtime_module/table.sql @@ -40,7 +40,6 @@ CREATE TABLE metaschema_modules_public.realtime_module ( CONSTRAINT source_registry_table_fkey FOREIGN KEY (source_registry_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE ); -CREATE INDEX realtime_module_database_id_idx ON metaschema_modules_public.realtime_module ( database_id ); CREATE UNIQUE INDEX realtime_module_unique_per_db ON metaschema_modules_public.realtime_module ( database_id ); CREATE INDEX realtime_module_schema_id_idx ON metaschema_modules_public.realtime_module ( schema_id ); CREATE INDEX realtime_module_private_schema_id_idx ON metaschema_modules_public.realtime_module ( private_schema_id ); diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/resource_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/resource_module/table.sql index 4168e825e..888f1666a 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/resource_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/resource_module/table.sql @@ -104,9 +104,19 @@ CREATE TABLE metaschema_modules_public.resource_module ( CONSTRAINT resource_module_namespace_module_fkey FOREIGN KEY (namespace_module_id) REFERENCES metaschema_modules_public.namespace_module (id) ON DELETE SET NULL ); -CREATE INDEX resource_module_database_id_idx ON metaschema_modules_public.resource_module ( database_id ); - -- Unique constraint: one resource module per database per scope (K8s infra: scopes never share). CREATE UNIQUE INDEX resource_module_unique_scope ON metaschema_modules_public.resource_module ( database_id, scope ); +CREATE INDEX resource_module_resource_definitions_table_id_idx ON metaschema_modules_public.resource_module ( resource_definitions_table_id ); +CREATE INDEX resource_module_entity_table_id_idx ON metaschema_modules_public.resource_module ( entity_table_id ); +CREATE INDEX resource_module_resource_events_table_id_idx ON metaschema_modules_public.resource_module ( resource_events_table_id ); +CREATE INDEX resource_module_resource_installations_table_id_idx ON metaschema_modules_public.resource_module ( resource_installations_table_id ); +CREATE INDEX resource_module_resources_table_id_idx ON metaschema_modules_public.resource_module ( resources_table_id ); +CREATE INDEX resource_module_resource_status_checks_table_id_idx ON metaschema_modules_public.resource_module ( resource_status_checks_table_id ); +CREATE INDEX resource_module_resource_usage_log_table_id_idx ON metaschema_modules_public.resource_module ( resource_usage_log_table_id ); +CREATE INDEX resource_module_resource_usage_summary_table_id_idx ON metaschema_modules_public.resource_module ( resource_usage_summary_table_id ); +CREATE INDEX resource_module_private_schema_id_idx ON metaschema_modules_public.resource_module ( private_schema_id ); +CREATE INDEX resource_module_schema_id_idx ON metaschema_modules_public.resource_module ( schema_id ); +CREATE INDEX resource_module_merkle_store_module_id_idx ON metaschema_modules_public.resource_module ( merkle_store_module_id ); +CREATE INDEX resource_module_namespace_module_id_idx ON metaschema_modules_public.resource_module ( namespace_module_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/rls_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/rls_module/table.sql index d518bf3f0..ea942ef5c 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/rls_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/rls_module/table.sql @@ -38,10 +38,15 @@ CREATE TABLE metaschema_modules_public.rls_module ( ); -COMMENT ON CONSTRAINT db_fkey ON metaschema_modules_public.rls_module IS E'@omit'; -COMMENT ON CONSTRAINT session_credentials_table_fkey ON metaschema_modules_public.rls_module IS E'@omit'; -COMMENT ON CONSTRAINT sessions_table_fkey ON metaschema_modules_public.rls_module IS E'@omit'; -COMMENT ON CONSTRAINT users_table_fkey ON metaschema_modules_public.rls_module IS E'@omit'; -CREATE INDEX rls_module_database_id_idx ON metaschema_modules_public.rls_module ( database_id ); +COMMENT ON CONSTRAINT db_fkey ON metaschema_modules_public.rls_module IS E'@behavior -*'; +COMMENT ON CONSTRAINT session_credentials_table_fkey ON metaschema_modules_public.rls_module IS E'@behavior -*'; +COMMENT ON CONSTRAINT sessions_table_fkey ON metaschema_modules_public.rls_module IS E'@behavior -*'; +COMMENT ON CONSTRAINT users_table_fkey ON metaschema_modules_public.rls_module IS E'@behavior -*'; + +CREATE INDEX rls_module_session_credentials_table_id_idx ON metaschema_modules_public.rls_module ( session_credentials_table_id ); +CREATE INDEX rls_module_sessions_table_id_idx ON metaschema_modules_public.rls_module ( sessions_table_id ); +CREATE INDEX rls_module_users_table_id_idx ON metaschema_modules_public.rls_module ( users_table_id ); +CREATE INDEX rls_module_private_schema_id_idx ON metaschema_modules_public.rls_module ( private_schema_id ); +CREATE INDEX rls_module_schema_id_idx ON metaschema_modules_public.rls_module ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/route_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/route_module/table.sql index c19527393..da0c1ca0d 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/route_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/route_module/table.sql @@ -45,6 +45,13 @@ CREATE TABLE metaschema_modules_public.route_module ( -- Generated resolver name (populated by the generator) resolver_function_name text, + -- Generated site app-link / deep-link read-path function names (populated by + -- the generator). NULL when the routing plane's catalog carries no app-links + -- / deep-links mirror, so the serving edge fails loud rather than calling a + -- function that was never generated. + app_links_function_name text, + deep_link_function_name text, + -- API routing (get-or-create: if set, schema is added to this API) api_name text, private_api_name text, @@ -105,10 +112,15 @@ CREATE TABLE metaschema_modules_public.route_module ( ON DELETE CASCADE ); -CREATE INDEX route_module_database_id_idx - ON metaschema_modules_public.route_module (database_id); - CREATE UNIQUE INDEX route_module_unique_scope ON metaschema_modules_public.route_module (database_id, scope); +CREATE INDEX route_module_entity_table_id_idx ON metaschema_modules_public.route_module ( entity_table_id ); +CREATE INDEX route_module_hostname_bindings_table_id_idx ON metaschema_modules_public.route_module ( hostname_bindings_table_id ); +CREATE INDEX route_module_route_bindings_table_id_idx ON metaschema_modules_public.route_module ( route_bindings_table_id ); +CREATE INDEX route_module_routes_table_id_idx ON metaschema_modules_public.route_module ( routes_table_id ); +CREATE INDEX route_module_private_schema_id_idx ON metaschema_modules_public.route_module ( private_schema_id ); +CREATE INDEX route_module_schema_id_idx ON metaschema_modules_public.route_module ( schema_id ); +CREATE INDEX route_module_catalog_module_id_idx ON metaschema_modules_public.route_module ( catalog_module_id ); +CREATE INDEX route_module_domain_module_id_idx ON metaschema_modules_public.route_module ( domain_module_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/secure_table_provision/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/secure_table_provision/table.sql index 3737c9757..ca5b36e8b 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/secure_table_provision/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/secure_table_provision/table.sql @@ -71,5 +71,6 @@ COMMENT ON COLUMN metaschema_modules_public.secure_table_provision.out_fields IS CREATE INDEX secure_table_provision_database_id_idx ON metaschema_modules_public.secure_table_provision ( database_id ); CREATE INDEX secure_table_provision_table_id_idx ON metaschema_modules_public.secure_table_provision ( table_id ); +CREATE INDEX secure_table_provision_schema_id_idx ON metaschema_modules_public.secure_table_provision ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/sessions_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/sessions_module/table.sql index 8007fda1a..54ec2df7d 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/sessions_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/sessions_module/table.sql @@ -30,6 +30,11 @@ CREATE TABLE metaschema_modules_public.sessions_module ( ); CREATE INDEX sessions_module_database_id_idx ON metaschema_modules_public.sessions_module ( database_id ); +CREATE INDEX sessions_module_auth_settings_table_id_idx ON metaschema_modules_public.sessions_module ( auth_settings_table_id ); +CREATE INDEX sessions_module_session_credentials_table_id_idx ON metaschema_modules_public.sessions_module ( session_credentials_table_id ); +CREATE INDEX sessions_module_sessions_table_id_idx ON metaschema_modules_public.sessions_module ( sessions_table_id ); +CREATE INDEX sessions_module_users_table_id_idx ON metaschema_modules_public.sessions_module ( users_table_id ); +CREATE INDEX sessions_module_schema_id_idx ON metaschema_modules_public.sessions_module ( schema_id ); COMMENT ON CONSTRAINT sessions_table_fkey ON metaschema_modules_public.sessions_module IS E'@fieldName sessionsTableBySessionsTableId'; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/site_surface_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/site_surface_module/table.sql index 2d978f9ec..c602a6b06 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/site_surface_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/site_surface_module/table.sql @@ -15,9 +15,12 @@ CREATE TABLE metaschema_modules_public.site_surface_module ( -- Schema reference (if uuid_nil, resolved from schema name or default) schema_id uuid NOT NULL DEFAULT uuid_nil(), + -- Private schema hosting the backing seam-guard trigger function. + private_schema_id uuid NOT NULL DEFAULT uuid_nil(), - -- Optional schema name override (used when schema_id is not provided) + -- Optional schema name overrides (used when the ids are not provided) public_schema_name text, + private_schema_name text, -- Catalog the sites register their owner-qualified identity into. -- Resolved by the insert trigger from the same-database catalog_module @@ -29,12 +32,23 @@ CREATE TABLE metaschema_modules_public.site_surface_module ( site_metadata_table_id uuid NOT NULL DEFAULT uuid_nil(), site_modules_table_id uuid NOT NULL DEFAULT uuid_nil(), site_themes_table_id uuid NOT NULL DEFAULT uuid_nil(), + site_app_links_table_id uuid NOT NULL DEFAULT uuid_nil(), + site_deep_links_table_id uuid NOT NULL DEFAULT uuid_nil(), + -- Serving-config companions (the distribution tier's typed behavior): + -- site_web_config (1:1) + site_error_pages (1:N). Always generated — a + -- site IS the distribution, so it always owns its serving configuration. + site_web_config_table_id uuid NOT NULL DEFAULT uuid_nil(), + site_error_pages_table_id uuid NOT NULL DEFAULT uuid_nil(), -- Table names (input to the generator) sites_table_name text NOT NULL DEFAULT 'sites', site_metadata_table_name text NOT NULL DEFAULT 'site_metadata', site_modules_table_name text NOT NULL DEFAULT 'site_modules', site_themes_table_name text NOT NULL DEFAULT 'site_themes', + site_app_links_table_name text NOT NULL DEFAULT 'site_app_links', + site_deep_links_table_name text NOT NULL DEFAULT 'site_deep_links', + site_web_config_table_name text NOT NULL DEFAULT 'site_web_config', + site_error_pages_table_name text NOT NULL DEFAULT 'site_error_pages', -- API routing (get-or-create: if set, schema is added to this API) api_name text, @@ -66,6 +80,10 @@ CREATE TABLE metaschema_modules_public.site_surface_module ( FOREIGN KEY (schema_id) REFERENCES metaschema_public.schema (id) ON DELETE CASCADE, + CONSTRAINT site_module_private_schema_fkey + FOREIGN KEY (private_schema_id) + REFERENCES metaschema_public.schema (id) + ON DELETE CASCADE, CONSTRAINT site_module_catalog_fkey FOREIGN KEY (catalog_module_id) REFERENCES metaschema_modules_public.catalog_module (id) @@ -86,16 +104,40 @@ CREATE TABLE metaschema_modules_public.site_surface_module ( FOREIGN KEY (site_themes_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT site_module_site_app_links_table_fkey + FOREIGN KEY (site_app_links_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + CONSTRAINT site_module_site_deep_links_table_fkey + FOREIGN KEY (site_deep_links_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + CONSTRAINT site_module_site_web_config_table_fkey + FOREIGN KEY (site_web_config_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + CONSTRAINT site_module_site_error_pages_table_fkey + FOREIGN KEY (site_error_pages_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, CONSTRAINT site_module_entity_table_fkey FOREIGN KEY (entity_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE ); -CREATE INDEX site_module_database_id_idx - ON metaschema_modules_public.site_surface_module (database_id); - CREATE UNIQUE INDEX site_module_unique_scope ON metaschema_modules_public.site_surface_module (database_id, scope); +CREATE INDEX site_surface_module_entity_table_id_idx ON metaschema_modules_public.site_surface_module ( entity_table_id ); +CREATE INDEX site_surface_module_site_metadata_table_id_idx ON metaschema_modules_public.site_surface_module ( site_metadata_table_id ); +CREATE INDEX site_surface_module_site_modules_table_id_idx ON metaschema_modules_public.site_surface_module ( site_modules_table_id ); +CREATE INDEX site_surface_module_site_themes_table_id_idx ON metaschema_modules_public.site_surface_module ( site_themes_table_id ); +CREATE INDEX site_surface_module_site_app_links_table_id_idx ON metaschema_modules_public.site_surface_module ( site_app_links_table_id ); +CREATE INDEX site_surface_module_site_deep_links_table_id_idx ON metaschema_modules_public.site_surface_module ( site_deep_links_table_id ); +CREATE INDEX site_surface_module_site_web_config_table_id_idx ON metaschema_modules_public.site_surface_module ( site_web_config_table_id ); +CREATE INDEX site_surface_module_site_error_pages_table_id_idx ON metaschema_modules_public.site_surface_module ( site_error_pages_table_id ); +CREATE INDEX site_surface_module_sites_table_id_idx ON metaschema_modules_public.site_surface_module ( sites_table_id ); +CREATE INDEX site_surface_module_schema_id_idx ON metaschema_modules_public.site_surface_module ( schema_id ); +CREATE INDEX site_surface_module_catalog_module_id_idx ON metaschema_modules_public.site_surface_module ( catalog_module_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/storage_log_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/storage_log_module/table.sql index 4ab062ad0..bcb69b0d1 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/storage_log_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/storage_log_module/table.sql @@ -53,6 +53,9 @@ CREATE TABLE metaschema_modules_public.storage_log_module ( CONSTRAINT storage_log_module_database_id_scope_unique UNIQUE (database_id, scope) ); -CREATE INDEX storage_log_module_database_id_idx ON metaschema_modules_public.storage_log_module ( database_id ); +CREATE INDEX storage_log_module_storage_log_table_id_idx ON metaschema_modules_public.storage_log_module ( storage_log_table_id ); +CREATE INDEX storage_log_module_usage_summary_table_id_idx ON metaschema_modules_public.storage_log_module ( usage_summary_table_id ); +CREATE INDEX storage_log_module_private_schema_id_idx ON metaschema_modules_public.storage_log_module ( private_schema_id ); +CREATE INDEX storage_log_module_schema_id_idx ON metaschema_modules_public.storage_log_module ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/storage_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/storage_module/table.sql index d1d4dd16d..e629667db 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/storage_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/storage_module/table.sql @@ -122,9 +122,14 @@ CREATE TABLE metaschema_modules_public.storage_module ( CONSTRAINT file_events_table_fkey FOREIGN KEY (file_events_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE ); -CREATE INDEX storage_module_database_id_idx ON metaschema_modules_public.storage_module ( database_id ); - -- Unique constraint: one storage module per database per scope per prefix. CREATE UNIQUE INDEX storage_module_unique_scope ON metaschema_modules_public.storage_module ( database_id, scope, prefix ); +CREATE INDEX storage_module_buckets_table_id_idx ON metaschema_modules_public.storage_module ( buckets_table_id ); +CREATE INDEX storage_module_entity_table_id_idx ON metaschema_modules_public.storage_module ( entity_table_id ); +CREATE INDEX storage_module_file_events_table_id_idx ON metaschema_modules_public.storage_module ( file_events_table_id ); +CREATE INDEX storage_module_files_table_id_idx ON metaschema_modules_public.storage_module ( files_table_id ); +CREATE INDEX storage_module_path_shares_table_id_idx ON metaschema_modules_public.storage_module ( path_shares_table_id ); +CREATE INDEX storage_module_private_schema_id_idx ON metaschema_modules_public.storage_module ( private_schema_id ); +CREATE INDEX storage_module_schema_id_idx ON metaschema_modules_public.storage_module ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/transfer_log_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/transfer_log_module/table.sql index fa9a94e95..c312b31fa 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/transfer_log_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/transfer_log_module/table.sql @@ -53,6 +53,9 @@ CREATE TABLE metaschema_modules_public.transfer_log_module ( CONSTRAINT transfer_log_module_database_id_prefix_unique UNIQUE NULLS NOT DISTINCT (database_id, prefix) ); -CREATE INDEX transfer_log_module_database_id_idx ON metaschema_modules_public.transfer_log_module ( database_id ); +CREATE INDEX transfer_log_module_transfer_log_table_id_idx ON metaschema_modules_public.transfer_log_module ( transfer_log_table_id ); +CREATE INDEX transfer_log_module_usage_summary_table_id_idx ON metaschema_modules_public.transfer_log_module ( usage_summary_table_id ); +CREATE INDEX transfer_log_module_private_schema_id_idx ON metaschema_modules_public.transfer_log_module ( private_schema_id ); +CREATE INDEX transfer_log_module_schema_id_idx ON metaschema_modules_public.transfer_log_module ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/user_auth_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/user_auth_module/table.sql index 2e8d0bc62..c56392889 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/user_auth_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/user_auth_module/table.sql @@ -60,20 +60,27 @@ CREATE TABLE metaschema_modules_public.user_auth_module ( ); CREATE INDEX user_auth_module_database_id_idx ON metaschema_modules_public.user_auth_module ( database_id ); +CREATE INDEX user_auth_module_emails_table_id_idx ON metaschema_modules_public.user_auth_module ( emails_table_id ); +CREATE INDEX user_auth_module_encrypted_table_id_idx ON metaschema_modules_public.user_auth_module ( encrypted_table_id ); +CREATE INDEX user_auth_module_secrets_table_id_idx ON metaschema_modules_public.user_auth_module ( secrets_table_id ); +CREATE INDEX user_auth_module_session_credentials_table_id_idx ON metaschema_modules_public.user_auth_module ( session_credentials_table_id ); +CREATE INDEX user_auth_module_sessions_table_id_idx ON metaschema_modules_public.user_auth_module ( sessions_table_id ); +CREATE INDEX user_auth_module_users_table_id_idx ON metaschema_modules_public.user_auth_module ( users_table_id ); +CREATE INDEX user_auth_module_schema_id_idx ON metaschema_modules_public.user_auth_module ( schema_id ); COMMENT ON CONSTRAINT email_table_fkey - ON metaschema_modules_public.user_auth_module IS E'@omit'; + ON metaschema_modules_public.user_auth_module IS E'@behavior -*'; COMMENT ON CONSTRAINT users_table_fkey - ON metaschema_modules_public.user_auth_module IS E'@omit'; + ON metaschema_modules_public.user_auth_module IS E'@behavior -*'; COMMENT ON CONSTRAINT secrets_table_fkey - ON metaschema_modules_public.user_auth_module IS E'@omit'; + ON metaschema_modules_public.user_auth_module IS E'@behavior -*'; COMMENT ON CONSTRAINT encrypted_table_fkey - ON metaschema_modules_public.user_auth_module IS E'@omit'; + ON metaschema_modules_public.user_auth_module IS E'@behavior -*'; -- TOKENS_REMOVAL: tokens_table_fkey comment removed -- SESSION_MIGRATION: omit comments for sessions and session_credentials foreign keys COMMENT ON CONSTRAINT sessions_table_fkey - ON metaschema_modules_public.user_auth_module IS E'@omit'; + ON metaschema_modules_public.user_auth_module IS E'@behavior -*'; COMMENT ON CONSTRAINT session_credentials_table_fkey - ON metaschema_modules_public.user_auth_module IS E'@omit'; + ON metaschema_modules_public.user_auth_module IS E'@behavior -*'; COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/user_credentials_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/user_credentials_module/table.sql index 2194f5f9b..1aa8b24a5 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/user_credentials_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/user_credentials_module/table.sql @@ -30,7 +30,6 @@ CREATE TABLE metaschema_modules_public.user_credentials_module ( CONSTRAINT user_credentials_module_table_fkey FOREIGN KEY (table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE ); -CREATE INDEX user_credentials_module_database_id_idx ON metaschema_modules_public.user_credentials_module ( database_id ); CREATE INDEX user_credentials_module_schema_id_idx ON metaschema_modules_public.user_credentials_module ( schema_id ); CREATE INDEX user_credentials_module_table_id_idx ON metaschema_modules_public.user_credentials_module ( table_id ); diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/user_settings_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/user_settings_module/table.sql index 5a50044b0..51be32d64 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/user_settings_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/user_settings_module/table.sql @@ -28,7 +28,9 @@ CREATE TABLE metaschema_modules_public.user_settings_module ( CONSTRAINT owner_table_fkey FOREIGN KEY (owner_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE ); -CREATE INDEX user_settings_module_database_id_idx ON metaschema_modules_public.user_settings_module ( database_id ); CREATE UNIQUE INDEX user_settings_module_unique_per_db ON metaschema_modules_public.user_settings_module ( database_id ); +CREATE INDEX user_settings_module_owner_table_id_idx ON metaschema_modules_public.user_settings_module ( owner_table_id ); +CREATE INDEX user_settings_module_table_id_idx ON metaschema_modules_public.user_settings_module ( table_id ); +CREATE INDEX user_settings_module_schema_id_idx ON metaschema_modules_public.user_settings_module ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/user_state_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/user_state_module/table.sql index 569a9a7f0..f6d8546d8 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/user_state_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/user_state_module/table.sql @@ -23,5 +23,7 @@ CREATE TABLE metaschema_modules_public.user_state_module ( ); CREATE INDEX user_state_module_database_id_idx ON metaschema_modules_public.user_state_module ( database_id ); +CREATE INDEX user_state_module_table_id_idx ON metaschema_modules_public.user_state_module ( table_id ); +CREATE INDEX user_state_module_schema_id_idx ON metaschema_modules_public.user_state_module ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/users_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/users_module/table.sql index 8a9a727b1..21313e2a7 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/users_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/users_module/table.sql @@ -29,5 +29,8 @@ CREATE TABLE metaschema_modules_public.users_module ( ); CREATE INDEX users_module_database_id_idx ON metaschema_modules_public.users_module ( database_id ); +CREATE INDEX users_module_table_id_idx ON metaschema_modules_public.users_module ( table_id ); +CREATE INDEX users_module_type_table_id_idx ON metaschema_modules_public.users_module ( type_table_id ); +CREATE INDEX users_module_schema_id_idx ON metaschema_modules_public.users_module ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/webauthn_auth_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/webauthn_auth_module/table.sql index d21c3b49d..9c61a911e 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/webauthn_auth_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/webauthn_auth_module/table.sql @@ -58,5 +58,12 @@ CREATE TABLE metaschema_modules_public.webauthn_auth_module ( ); CREATE INDEX webauthn_auth_module_database_id_idx ON metaschema_modules_public.webauthn_auth_module ( database_id ); +CREATE INDEX webauthn_auth_module_auth_settings_table_id_idx ON metaschema_modules_public.webauthn_auth_module ( auth_settings_table_id ); +CREATE INDEX webauthn_auth_module_credentials_table_id_idx ON metaschema_modules_public.webauthn_auth_module ( credentials_table_id ); +CREATE INDEX webauthn_auth_module_session_credentials_table_id_idx ON metaschema_modules_public.webauthn_auth_module ( session_credentials_table_id ); +CREATE INDEX webauthn_auth_module_session_secrets_table_id_idx ON metaschema_modules_public.webauthn_auth_module ( session_secrets_table_id ); +CREATE INDEX webauthn_auth_module_sessions_table_id_idx ON metaschema_modules_public.webauthn_auth_module ( sessions_table_id ); +CREATE INDEX webauthn_auth_module_users_table_id_idx ON metaschema_modules_public.webauthn_auth_module ( users_table_id ); +CREATE INDEX webauthn_auth_module_schema_id_idx ON metaschema_modules_public.webauthn_auth_module ( schema_id ); COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/webauthn_credentials_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/webauthn_credentials_module/table.sql index f540f4b45..94c224cf9 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/webauthn_credentials_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/webauthn_credentials_module/table.sql @@ -29,6 +29,10 @@ CREATE TABLE metaschema_modules_public.webauthn_credentials_module ( ); CREATE INDEX webauthn_credentials_module_database_id_idx ON metaschema_modules_public.webauthn_credentials_module ( database_id ); +CREATE INDEX webauthn_credentials_module_owner_table_id_idx ON metaschema_modules_public.webauthn_credentials_module ( owner_table_id ); +CREATE INDEX webauthn_credentials_module_table_id_idx ON metaschema_modules_public.webauthn_credentials_module ( table_id ); +CREATE INDEX webauthn_credentials_module_private_schema_id_idx ON metaschema_modules_public.webauthn_credentials_module ( private_schema_id ); +CREATE INDEX webauthn_credentials_module_schema_id_idx ON metaschema_modules_public.webauthn_credentials_module ( schema_id ); COMMENT ON TABLE metaschema_modules_public.webauthn_credentials_module IS 'Config row for the webauthn_credentials_module, which provisions the per-user WebAuthn/passkey credentials table (public key, counter, transports, device type, backup state) mirroring crypto_addresses_module. The sibling webauthn_auth_module holds RP config and the registration/sign-in challenge state.'; COMMENT ON COLUMN metaschema_modules_public.webauthn_credentials_module.private_schema_id IS 'Private schema that hosts SECURITY DEFINER helpers which write to webauthn_credentials (registration / counter-bump / delete).'; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/webhook_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/webhook_module/table.sql index 66daea7ec..f2abd2fd4 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/webhook_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/webhook_module/table.sql @@ -91,10 +91,16 @@ CREATE TABLE metaschema_modules_public.webhook_module ( ON DELETE CASCADE ); -CREATE INDEX webhook_module_database_id_idx - ON metaschema_modules_public.webhook_module (database_id); - CREATE UNIQUE INDEX webhook_module_unique_scope ON metaschema_modules_public.webhook_module (database_id, scope); +CREATE INDEX webhook_module_webhook_endpoints_table_id_idx ON metaschema_modules_public.webhook_module ( webhook_endpoints_table_id ); +CREATE INDEX webhook_module_entity_table_id_idx ON metaschema_modules_public.webhook_module ( entity_table_id ); +CREATE INDEX webhook_module_webhook_events_table_id_idx ON metaschema_modules_public.webhook_module ( webhook_events_table_id ); +CREATE INDEX webhook_module_private_schema_id_idx ON metaschema_modules_public.webhook_module ( private_schema_id ); +CREATE INDEX webhook_module_schema_id_idx ON metaschema_modules_public.webhook_module ( schema_id ); +CREATE INDEX webhook_module_function_module_id_idx ON metaschema_modules_public.webhook_module ( function_module_id ); +CREATE INDEX webhook_module_function_invocation_module_id_idx ON metaschema_modules_public.webhook_module ( function_invocation_module_id ); +CREATE INDEX webhook_module_namespace_module_id_idx ON metaschema_modules_public.webhook_module ( namespace_module_id ); +CREATE INDEX webhook_module_infra_secrets_module_id_idx ON metaschema_modules_public.webhook_module ( infra_secrets_module_id ); COMMIT; diff --git a/packages/metaschema-modules/pgpm.plan b/packages/metaschema-modules/pgpm.plan index d1aa1b275..1d46d9793 100644 --- a/packages/metaschema-modules/pgpm.plan +++ b/packages/metaschema-modules/pgpm.plan @@ -86,3 +86,4 @@ schemas/metaschema_modules_public/tables/site_surface_module/table [schemas/meta schemas/metaschema_modules_public/tables/route_module/table [schemas/metaschema_modules_public/schema schemas/metaschema_modules_public/tables/catalog_module/table schemas/metaschema_modules_public/tables/domain_module/table] 2026-07-19T12:00:04Z devin # add scoped route module config (compiled routing plane) schemas/metaschema_modules_public/tables/app_module/table [schemas/metaschema_modules_public/schema schemas/metaschema_modules_public/tables/catalog_module/table] 2026-07-19T14:00:00Z devin # add app aggregate module config schemas/metaschema_modules_public/tables/database_settings_module/table [schemas/metaschema_modules_public/schema] 2026-07-20T21:00:00Z devin # add scoped database settings module config (database/rls/pubkey/webauthn settings) +schemas/metaschema_modules_public/tables/pages_module/table [schemas/metaschema_modules_public/schema schemas/metaschema_modules_public/tables/merkle_store_module/table schemas/metaschema_modules_public/tables/site_surface_module/table] 2026-07-31T19:00:00Z devin # add pages_module config table for site-owned merkle-versioned page content diff --git a/packages/metaschema-modules/revert/schemas/metaschema_modules_public/tables/pages_module/table.sql b/packages/metaschema-modules/revert/schemas/metaschema_modules_public/tables/pages_module/table.sql new file mode 100644 index 000000000..66bf58c5b --- /dev/null +++ b/packages/metaschema-modules/revert/schemas/metaschema_modules_public/tables/pages_module/table.sql @@ -0,0 +1,7 @@ +-- Revert schemas/metaschema_modules_public/tables/pages_module/table from pg + +BEGIN; + +DROP TABLE IF EXISTS metaschema_modules_public.pages_module CASCADE; + +COMMIT; diff --git a/packages/metaschema-modules/sql/metaschema-modules--0.34.0.bundle.tar.gz b/packages/metaschema-modules/sql/metaschema-modules--0.34.0.bundle.tar.gz index 37172a375843738135b018a7a7e5855d494e4737..07b3cd5939a2660fb46027833fca211ce80b9cbf 100644 GIT binary patch literal 79155 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 literal 71146 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

1mUl->8VgDrwQJ2XkiFn3)y2qQvl*EJ)= z2=$QdL=mRg418qaD2!~xn9VH8uowC`nApVjkzsHUBnzl+0vV8K`8nFz_73wD#QwAIPLM_K>G!(u34T{A~%e$U%xW4bSo;UT-1uz0a%>^Uz1Ox zbzJGI=3<*Q=B)eC&Je5<8VDcNU{_t^c9-=XFs-HVk_7d zp-m`3ei#MBIi0y~|D;Y3oVBBqp^;inKuqR29Q!_v9M|!~4v4h%kC0)8S*;^Bzm)Jds)S zaV5=@$(g$%z0OkRqf42eyPVm5N4vzbePa5YQqQvk$E7xMY2aBjVAKyW^MVL@#E+=& zIuUlTLoAr zMYa~@)3dd*hRf0q3sDJT8Rwh1C~yHxLDW$NUR7NX8FDUU=$If`a{{W=K>tuo;8J#7 z)EWi;djVLesazBYI2UuPr|z;Sy!__1A({d7#}5dKeggkBuMUyxq3d+RXhN4b*!*mW&I~NE0;-};{z(I_s7_G502v0 zo}LLhFC125->;p61B~Rt8X@?M@mla1#nOzIP~M=#-_^yE1giiBk_lF;@Gy(EKEz0s ztu~$+Uw{AZUAfg17W(It5>LXi>zkRw3hN_RX8bI@G_Yo;hd|A2X+kb!g?O%)jh*<}Hk*vCi=Rr{z-k>)V+^^(Q(4WM8=twGe@76Sm#=yVIUG$>FkOW9}g zL($GAqQ~%M)lANh+e)f!2|lFxTUL+hNJ~T{Gk^ z4{Yo^fo+)~Mv$y)`Ht)RmB#g9VAbC^wB&x??cSY%^jTNq&vW6X#dIRv}DZ@GS8M^0qh zn9!Xr5Q{M<@~H12hlVa;wo3>y9fU0_WEQarM$~pqk718tjy;Yo09L}>@qKLb@CYuD z+ChHwl=V@;#fPar2gNZzOxt>ZqIIy2wNIDXuf~kjV8-bl)2SSXYa8Pfjfd+OhYIn3 z4mg9ykl9ZyuAfd)e`-SdQ<2Y~fN1`Rf_cqf*@JNua2wLzu7Y@LrN8H`N!0vbT`t zaV5M&>2kZ0C5^NNx2(M+rsN_Q7e7feTGm5~lbmInqCH(63CzNkfvT3$EWZ|sC2)@~ zWRDl(i#d3}FK-I6jjMkx+MHF!GMnpCUswMs>zzrxA{W)`E@o;1V>%O6)h_48?J~t^ z36G1~OtMw=m~i?CA!Pp8QSoB##Z@h5T$jVUQFVyfW?ri|wauA`F381{Z@}A^a^ntV zl%%j6+HNfdDEE^ls*pGZ%?*mHKaP*q9~yVx-q}wj>fVqgU$4+dltGX|x@I>9Wg95Z zmoObmAY{e_Et|PlV&vuK7hVsDj99b=yeJBE$|fLagcuu?-Lg$y8mZFrikM9E0?ciE8s=IUciVLR~*)!x?U4c;za zV%b%3I>kG4gP=@!T*UMpA~a^ ztUA!tv z&55U<%O(4N|L6az-YZ}9ZijMZ^`;ec@9=LmcC7N*!$3v-V(|ieLhJR_l6_#yf>oAJ z)(X5{)_7s#*jH!x&yth!d8dZ7`>(BhyZ6S%nA#BDEA5OEx_1aoyYX`R`yY|tysP&e zs5$+8x0d{2G_>WD5wr|Xdfr7s13~BN%J?afLJU+Q7Qs52E5HZAo4OO>`zZy~!7Ypu znD-RhWv(uQ(GjNo?Z0{}58$jOagcVzX>Svq$=lU?S^4GL4X7&sf;~aT`Uyk{+jwUD z^ysy3A!#u&7{pU8_AcNd7@_typnS~?n(#Q^cHzWu!iyYf0gt(MD%wksPd5D@Q^066$ zn~DX=qsaFI zYC0q^X%yI&?J&=`9W(T;AhK=OJDqEF--J%!U+wK;sFT&l6fsHy+k;}$j^n#tV52|*$DsSU|!gxWS`mKz|;_d|!;7O|XNPF6FpkV%N+n?ZyEWV?>-Q_IGlXGWeK z5@cgL^gQYy9)!q-^+nu44tKr4bZmDzC+m(2|G}Qtwi)T@iD!MLoqoH{v=CKYmYfL^ z&$<-+y*lv@)%7#aWczHh%H}80Pfwzq?uOnvwsyJ;fa|fe)Ar68L(3%EX(uGuV=A3( zopVx^^Q>*2waq85ZJzbb4t=vnW)E!Y25!h%gd*DvI0~ufVV{JqZ9Adq1`+j5*TIZ2 z&kuZzEy6v^;XV%;qEi=TNYYIa`Sm#l3G|Qe6!8IF)C>&`&@Onk_~07Hj1n*|X41vq zbj4p+^3PNZL7o=5lDW)ajW-4Y4k<7uslgH1bojgD-Cu zu?yonhTw+3x-BaEJ26zrZziYs9&ca$fG2cjYciGb3Z0 zZI01@ihC0GO9pHH+NaOy}dKG3AsbbEu+_^J60lu zHfC;Kq=qF4TXz3Q8Kg63_lsqE+xY-^zq8JW=wk5>#Xto2${JQ2EpL=Mx?wB0*O}%R z86=KxQiJ`r0pwMISt|AlEPy=VdG)X=%v7`~oHl^%`jsR_U2}QIii-C0GSO4S3U^0U z7wMa~D2acUk;%PJmTYN@uejW3#wNYJU9$YTMz0+3mD)QHoh(pkW!`*hd{%Qf_I{k>+Sg5&ovnQ(9YVz0m$l+s)#&{CrPdLe-@Nsv?Z4yR?5b_pak)-Q zN5}QtVQKBU!>6U=WEinT(@8xu8&t+xK+C!=^=Z~%LUeRBENruzgeTO}q zSZMbxG^+@GQ~NxU$evs7;Z#-{R&>5@d^3{LuAA`TWa?HGjo(&3jwG<}s(d(+y5;ZF z+oEc0{hN`b_T8orC$-wLqV;X_t5>w2vex~2bhgrau|9khz1B_&vQMS zm`+47Cn$^TJg}P7rX`)%ws_v(T~}kC+fe#)%zb zmvhgH9OfXxY|{;hX$Ec>gp51P33!CD??sGx#3q5wY;*bjzBYaJ=b)p$pRa>{&cZs-3NJ$Yv!{EI6KtwaG1|whpoQP zOux%Qzsop39?N}~&3ll!dyF-Bq#^h~8}K3K-|?2;!DiKg7SbmSe}5`N=xJ@BCpUkd z(DL~NjGj-x-g)ZM3@5X4K1l=TpQ&iYag3Uss^ZbDnxlH1)~tDuRWlhw?}TQ}QC7`l z+)_?w)*Nls97XA5X3Y^+%~1qSYStWW)f`3Yq-M>-teVHQYmQjsLWClP|zEh zVgt2nmI#6&MH0hz8Dn$fb(YQnT1cV1itsbJFyq31tMBY9*-@d;SjMY(Q_#6WYegjF zl8E2r%)-YN`c2m0(fuvt%LhntV^zo!Vs@lq6nBKKs;a$#;F@L!2jo2Y^! z&}GrJYM~!_Nq1EVJCvP4l%T?PBHMhEuG9<_4;FnC-|X*Y1({Vlmq9*}FSobiqaL!z zTPb=J5A`fayHf%kbaqD2x?FMiAXePC&;h>?DV`U*bO8k=36Ke1@NW6|LO;H{3{B+)bbFgIh=CvUYB!}7A|Ys4&pKoeiP^iz*+z01 zh`nYaHA@AxO29Q0wXFcZBz3Bl&SB|rr^-0Q>~=mTc~B)!yEf^A16_NJxZ51vvRRGM z?G0{y+>qACjR-p}cv!Xf3YYKbx^{0oG&Hf%ZJoDtci!YbQG3fn zkr}$&4~YYHU~Gf}<`R!EM!9VUcIaT&ay`>!L1a^#Mv)zu5sGMpc*FwJbxs#U(xJ=j ziye9Oo$>O2zIyxa?Z62gGJz&_T;|$gU{Wh^k?#hsAK@T$G4(^vJ!*&C@hyrmcd%u0 zWFqAIEOG*$c?dhFiyrBi!2YNa;YF`w7pQBdBg|l4WQx~shIva{s6W}{6!RXLy?m=f zSex$_$SOSwG3J-#yEi}mFmOZslKlPOU%q*1eE0SDZ(k0JghAM10X7kJ9XqmoWHUd& zCJP-3AYjDAHo=6mDDaudqJUc1aj0p-o@3GkmLIfwQxWf zcaarB86D;`=3&4BPg~>Jqrg1j=#xJOl+M=qM+Vgaq5mxth)k%bX47G2lA=CyV->z0D)Ad^v zGEYg1YVe?O)ZZO74$Y1#iy#Zi=wFndkf04(rni8ILnRzffg~wlcuHb)iwBLQ@$$f- zls>k?y9U3=>ShZu{R6#y`A5dqvbHFr4K6XPg)Chzw`}qU(MUF2 z!axDsB%=VL*@204b=8<-wG)vFA=#j*pjVSvbj->{S#cr!X>_5 zqI+q%Q$4`8ujG6bTG8CtCh-3RZP;y^-An0wZp8Tl2~X!A*Q#+bJ+Rkuh+Ddo9!HU3 zqJ}O3=yVtAIIBJSA9DT~5{D3z*vK)R$fhpB+-0uia~={Bcs`>(b%~2HGAY7t z$VliA)3O3Lifqq6A*ev7QKRA#9_a|KH`nh#r`W?Gjc^np({r(pJmxtT@ww>-l$eZJ z)S}q-P43z#;#NQd0ARoXB0$aXbpGGY`RermOVdo#@G`F%TDt8h^9~zAw~1iBM}6O~ zozFWI>u$Yy-l@{|X{_^pHEgGrHSg6j1}hW$b%uGV80__C*BAW&f41e~z+)D3n9H!^ zM;1fK^N>q?2XW7JkWXxvm>xrR7^1*)X&Bj2;72|&BMZ5^{Mi8uh(|0lV6MY$&RuRZ z(<8+9Ezb^V$Q|w?KeR%h2aZhw*YgPC5eaF4Oee(C`LmmR^mFuRk2dR#vFSa`3U{ap zZoExxj6v-X3)ndG*TEL61I$$iTa^wlDIIS3ImGHS)~xeDo6eyIosOu2!Pbfg!)2TU z6`n?*!sDs)PfM3SjUs+J)AC2$x8h!ILW+jUtO1Qurz zi#*fCp2sM*T$9*#=s3i2P0R8*_L<|`4l+4LCJv4iETO9h+nduYU}~Z zkl-}JE&knKb?LYpV~z6Mh!cpI$N+0W6`)b?eV1m&TZG=;$k>E>kZqSDQ+bbFk#x0U z8G#(nETvnr5vio&uf+$H#o*iq;5e#0+WM*P)JH?5q4xc{Qyr_hkG>U!&M0`T*G1N= zpg`|AnTR?*E~M}MA&%V2e(#)xfn7IVAJ=nyKmR^EeZLSP zEQb=&*~r6O_)zAN<#`e3Et;Odo&G=vYV|~(y{Avcd)mi+I;8(zK6eDKQG+A(Q`6#n zM6zcRdnVa6wbCf{1HBu^GoG}9Q4Nx7 z$o`maU-Z$@BZg1n1m4x=V6C#H9~|HoMgim843TGhj9Y|wQQ+IuvOQ+nF0p;bqmk)5 zj_+Gx;4*9@>^YWYIib&K#82-Q?$+8K?jLTn+dG5ACOo1Rb4}_5foq1`Gi}Q?9ZX%@ zv;B}^&Mm@FL_JO-%m`yP_Dn*<2%CXOEcB&JG=CzFT$KtC`Gq zsvrBbi}?-}Vz-7c->(J?lJe&RMEPNo`h368eTYB0v9}IMv^M?7M#zNP49v&A>zK%~ zkP|q8NqFF*Fe02p5%NtI`X*tJaUCMZw5@;>)7j;iHc=QbWJNe|9MiW6!j?@q#>iz} z;6#z*W6uw{A5ja@z~VN>CgNs5sb#r{xYIkPTP*$Qd#DFmWOmv(b{IJJTQ?qLyExEr z@erHEVFruCZ54+YDjsa3cz}W8;kJo~7$y$3JPghzFLwOdLwiCG?Ws)$Psd*HG>ipL z(Ngd<%>*a35uC_C@Fc7Q6PgAd-7qk~@9cQkbKTHoJcI&Vj?Ww$QGy-Y1%;n8&q5Si zG;m!TbC;WpS{Ad2=O8bLTr{!YIb&!EDQKUezqxa0r|>g32$BBf5gz9KKIUo`eWjq) z#X4PYm%{0T??oD2oaA8rQMvS&^4*ah>H~e$qNf_W813S2II`q|zIxF$P?edP>M=su zghV0Gc)Q5N0*!z1Ol8^0@{1cU1?-*|vW7#LJ9Ep||tLd(f*5F1D zb!gRdJ3ClbM`UOxW1EzaZtmByFg;xI0mO9rg&J4!II*vFkGK3lsxKvrc6TY|Rfs%a zP&`qG-8~ii`;eiPm-F6!T4(!^{@OCd{_%C6=7UDtBbe-^q2nYU(tnqDvbXQ<^Lt45 zJtEHj73ev(2Q5LLpft$AY9SJs1ZpF5%dt)7x;7`&#y)l;$F)7;h8D-B6Gl!%ZK#jq zV#~9c6`F`RVRSkNYqy$mcpdLXdqXCVy37nLWO){~IdQEJan7-WEgLz+a@;8LEstSr zhrWd@i-g2@IHC->%!%wEqyZzGnbgB3 zvwS-WY3Ml2BChAV+##59+YOumd0x27ixyEHIRtYQ5u1}B2tz+~T+4R@$0SZ8U$ zYi9cusK<&$k@^|Fie5JB}kun&7Jlg#jXSCo;?LmptgfoJ;jg zO`lWMTUCu-psNvM?rt8bPK6XBDXLDMMg#k6A7HUhI8U;0UUZ>Iid0adDl+m{Mg-|@ zbUNM4zRxa<2|6^{ls0cxsPL}H%zlBaQ|mL1LO(S~G;p3{qA9Woi>LW8*_pV~lX3C} z!ozg_?g8d-kJ)d2nZo41E#dLw|M};H+P^&^bu!C<%udKU5%Lnf+4RY(NB`+=``1lU z)Z|TO`p#kY_N7*}{&BkyA115WG$eB5*XcYge$7i-XDOq&%!@>S{u=yxvHUvQI$sx; zm6|A9qv{&>q{td>@0iy1eM_^?)bla@m_0x?Pqp#qPHP*{mMeQ_5N2P`&L^|G8>(N{fTej~OUk~Ml)b{F$c6*# zP>RNba=>J^mV>EPptH8UY&>}yM5;f|&a+B;CegEU&N>Zx+~#kz)*7_G%r3aV#pR!IL-1$~Gjt`?F!GT4ybAAFw9*SSCQ8L6fgq78hzhI- zGDJ+JmAQ7@I`E7dZ@EF;MyN&UG^LhVLLCHZDffzLDYXI>O)AgI9T*k7wG5Hi7#yIn z+9xiQIyE4n)_CZ@#LB79a2QYX7CXCkr~7ps{jgJ=uv6TsmI9ftWiNl*#ND_q$MyLe z*X3*s>1mAMXB_fpeZ7p+E#K4KixVA;fko}*S)Als3@30Or=rP^2viD0<TOxRyqfb=j8^h3iEi3?woSUw>V4Ln@9qv^6tMBBi`&h#m#L&noQpPmwk*m$^Ygi|6{sv@)4K#_I7eVTR51d z%hPjb$Z~N}_OWhxo!54(lW)r%ms)_9MB-za8kN6rpI6?zgFJI+f0Onjrt0qP+KF|E z@8JG^iTByw-0x4B*SpW?Q303JUsAoz1WM&16em*o?POn6>K6O?{Q(2k_Uc}# zq!&sh)g3v9BGeyh1JWaPr^=xi_2<@rV$@j}drnUN!BpI*v}b?JzMnsR`{PgFe)q?p z_BLk;i_~*CN2fgMSJj(E{VN7qKs%qhY`I{;5d)F21ly}f zWMt^IwAwpA9w6VccIPS-Sbv(dT0pnWW=pG8a$7Yi_DzOegP>kNH)!QP74zy=_=IwK zPB0z0QK*^Gky8y3cyt&&dTs(}KoEi;i`Jqe)Ca+-Q-V-WHPfn%m*7M=jbNAv>8o~z zgLVNU*Cs?k(Sg;%aTi=rk?}x96pU%Df?`|*7><{yKg^!ZNgR4O*GN;G>N}j^IGpSQ zoZtZTv*~*o^vA6ET0^|m3U4>Tk6O&HJjQkN7-QMH*I?{k&eFZ0o!g-RR-{xIp#e;E zU@$~3og#v0r!^zS06~j^Vj$E)P*Ky!DYZsRsbYvj7r^q1hsUS&ONES^o^A}l_)wNt zxcC(=J|A5C$9%uFfyIl5#~JRx#k*Uy9}s(Z=POkF3KhRX#jjBDnV{ms1E(fyzUDZ4 zc`)&zU9o4$<_fww#HR2{>+#?tV;{AW>ujF>Sg}R)}2dV2&{XWjo;hAe}!~kA>A(#(jCJty*4;^AdB=u_Gkyp)*B%t z6P!E2s9`}<<*5}Qh_S>dL!ASgj8H43=9FrJLV73A6H9R?3u_q6cD;o8D&q2mg0_v1 zHwJ23Bg`vo`wH8h54QcO*l^v0eD}6!KTx#h)>qv26}NrGZC`QQGvT&1C(fY+wI|xk zLvCwqi!;af9-Hx~0bOej^+$A>v6-RlsG=do`9h?@hp4p|08zUDBA8Uro+1MVJaCId z3Kt_PMd)~lZnJTEI;2}OW=kJ%jGl2Kkw~tY!AN}Y#K^#6DpIe#iRgr~7zAMwq@`L$ zB1sg%=sGO?QkZV@$_)hS)}9)-O*YODu)}cDn|{Wwaqg9(@!j0w>W5hExb4Q7Io$8xb)$ z5x}BDFP3osQp0we zo^A{P_)wNt{Pz|AJ!g6HY`?X@zpFVsu0Af-CH}j+L;GQ?hj+fBzpv=;EBgD2{+`uO8faq1!+0Cb&(k5^!yy~jO$rJSj0r|dO1#40P+)XiSQ&-kC{bD& z48h0rezHfND#vcTPDAUI}Z6r<_GWFfax{m?LfIE{QIN6!)Z@24I9o<2hKSc;G@y8yOLi zi5Lx1=71vzNR=U+w?dLIU>DZ9Q|b!=cTcnUdz<^O(C#a=`$hJJ9l=VyHeh!k`}9KA zX_vYSi7JnX)CsF3Cvp&%Nk7-LFOpZXnetHH4V9KDoAc|LRuZ*X_{3w(L# zZSA9t0o_&vdBtsCaoh9ZwtxCV0oSH#@T&~I-2-m__y7I>W$0CY(Gnr7zW#MNT_?Y3 z`nQd5nH7`2ds^W#Khjruh;MefXCt2yKS+-?a5uR9COq*@KMM7z}@Q4 z87W1BaLn20l@Asm_+X8f7@4$|h(IIP%xS8FvBofGWJm=lg4d2aLdN5a>Yd)x38Tt* z%?%aQAKTJ z%@MQo_L%9pGfNLM^R|~M*_$h>tY$Z&NP-WR03pEuFh@BUADmFm*whbHIY7ds7TRfU zBOyizLsSR~I1!e)*6yO#YGwjeUKxtOCE*Gbq3D=ULPtUZk6vg^rSt@hKtr_mQE96L z02_`dIyjfUloWuIL4%VJgJ(hjC;R`;aM4fl&!6dVpX_a)?oOZXOAq8o59CE(9Y=VS z=zDEA`$CdEMs(J$%~QJ;H|^Sdw4oiev%6;<5&mW)G>3}=(V%prH;z_d0Z)#r8@q3HwZ>n#p!>q9SbW`)Dj^CMIe^Y&59d4Y# z{N~^l9=-3T=7n~cEWiGy?lm93yS!nCiTitm_0tk3aR&DpG5ir$*(0qcZn2ml%nwJ4 zFk9uAUAnj&wDS#_ES;`ieS~E?Cyre?5FfYuUb^yerSAMN38|_5!*pJ7kt_61%cP`c z_zTV^aj~4NKTcPLvdWHLn0qXV%pXd%vR+J}WH~=hAMe(mA2ZJv)7cH{%`u)uN8}22 z@7h&<*1o?S>-+BAvzh-csnw0@ zoFq#nB=f1{b0*sx{%y6GyUH9t6yMN3pI=bbZ^HBe=NUk8JMkZ%=AZ6TRMO`E>!f1u zKi^Jp?ccxMCB}29R_W#>{6@StTA6S=p@fjV0Uu!r_e*&EI4K7$hx_KQkowVlnEcDX z|NPZfo}a(^FrkvG1pjOYO23ta?EJDAE&TwhKvlot=dV^cUnk4z=db?bUw4nO`lb2D zOnG2(*xY@Se}~?WA$nJxGI-BJBHKXIq6mTfb%@D$d=x>m<7z@_-o2arQw}2gjq3U^Sr=%paP19i)+r#!)4&6bmeD|h5W+^q8R1@}KWHE< zGG<9CUYOe3v&cO)N(swklmhFLp)VB>RDqmndmMV0U)Mg`R@+mVop9wBy(G>elM%G^)(7g9N8k)n+8D@alrbu@C^>B{kIB#)WZuLeoX|v}vRVsjq_oaa zjYuJS%c%^2N;_kMMa8&|oCF~~9WE|r|5N=^f@1nYzbD|neL>$75Z|M4?{TcR3((sM zkvgvnWGG8noU^e|5hRK`xB6Sd$&QkQw z(>&mE0{$ziC_J+9v^mhbYwl@F6?%!4M2EjL{i z(`Hd|(^b0ncj=PU*U5)nej25)zgxQ znWS>+%P_;$D$SPdgB7mR{wY>(Bf#!1tO;i*gIdZ6jHCq88!Z6zdq`vM#_pyE6_Z@W z<_FWN)a#iXn?ZNNI(7zx^`zW7U#F5F`CBf(+y|H^M>Jcs)y>=Yo58Zz`G5(3$|6x< zHp68Whc?fT?AhnZuPH2LvUtS#P7qo#Z!ywVrlddH7v-nv1FqKa@K`+3wv}r3jc0#a z|LyS0o-cmgKddU@B9|_jap|%dV;9cYn}1IW9?o7-lFucU56X69Yf(r%&%}GmxVEMI zuC5+*>a9YrbF1S(lWy&``RsE>V;9F!wy3pi_J1x9PQQ3?)A^=;(w_7+e#6!~u5C}$ zy`5(3*j+sDTBqiK>pwc@!S{CR%!ihCCzd`?AB_hov_&2Q17T1ZC6JIHKuM}S10$@l z!Yc^YSmUG>A!;dXV0Ju~zS+e+ovg1Jv&$k9;;f2Zn@EC}jylai3lBPaBZ(wR21HMT zvRX<6?Eno?Mq9%zqc)Dm**7oZbE*59k-IVYOw(WtCz5loye3=+8HEnYgCb4~1vV%a z0|Vo!Zii#=Yd_*Igvjsh3itMc`#Zoreczsi!W(GL24?fPuW;OO?r9#smLNDI|9Cm0 zcMN-X98>qwR_+<>(u-N8O|;PYtNm+#?Hi?ECSCRXyyK&o|6n=7y~vp#$_-K$BKXTL+LS#_o~2qmQ+{BtCMCjDr|@dO z)j@c_5*Euo>kLQFXpreVt0n%n7&8^P-zjaM!}zo5FX@dGJlW>Y8*e%dpAUH&Yj>3_ z*P!{^$1}K3&EekRLVoW(KCV|2nEa0)zyGexYmNE+p9|}M^vdJM3}pTGLo^g}wS(>4G8 z{{8#^_>W?(8*|E^mpa{?Je}{xowYefa`b@d(d`M+1Exq1o+RBjP5R|hX#1M7#;>o~ z0xyeD+f!zBp~Q8%u1SP$7-c89_Vm)BTotu7DCxCpzh5q_vz7hWp|lJPiE%)T zreGydu%H|e&7JXa#5~cOWqU5!v^!)smdOW(mO34c4K66>DOIV#AOj|Y3QTZKgyX>p zZdulx*-K-PqR^m0#x|CT6TxI;;B6pA8f`-~)-v?WXjGBfXthb~AXtT{Xr$3gBQ!)u z3=Ua8egE4$2ffta)4o`z-IJ2WIyr~^y{?XQP~Vib=O(B9CP<=-8hBSi8C{84H;zSj z1;*St?XNRhUmfZ~D~FUTCcrA`gEE|X0YPZ6;H}~=YT~qHUIxN^3<133I*{NL3r<;g z7N(_&ZCwfHQbPlcOt#c7)JU|;;qp9#Z>c`nEA#T2A@p0LTn?CtJ^w$$&9@+b@!Q2? zk=6kBkf6yeT=>&RJiNSk6&X@ma0n$`P^jSBJ!E0aLS*kQ2{oI}KVjI@IawOO21HG! z;QJkVp$kbe1lyE=MVL>*G)7$J^6m+_mzz*#E$l4BYVx1UFJ-fC8!-ARsjO#HOW$nv zN7np!vlVumCntHQ59LnSu1xRru*K8*@oC-vzWE~L-Au4AQB}{-tanS2yXDR-MKzP@*iM5O(`wq8$DRFwo)yXRHN;^H?_-n%20R3 z5I2nreA1{p!`%Efc|w?niJQ){BtclOms6KLS%r_v1m3=vOdk}9a>cn_oFZ=)%lqWI zKfcXoC`L|(5iYl>UFV`0t7W3!kHzY3m+H3Mytli1?(Lil>Mhy3OEY2(Vq7}c ztU-*i8M6kl_AH$Sc%wJeQpI1NBjAA&ssTU_b^95ZwFAla6C0R@j9u-C;h^n=Rbf6?42N}_;h=O|0sH9O4 z7X{;l0yiRXjHsE>5~xK>mD0|7D>c!2Xb$x7%l<-=?b;EXQ%h@}0wSD%ADjps4Cb&8 z>Z_l{O@DF3@;E-!`0ms7c}~~tG+m{?bY-s6m3m3n<3w~mDSysbwvRwR{v#QhiD(e7xkgr!T zmML7m=qQk(KYR3bF7KhWyqT{Lg>;OwX(n0PNRCrTh1blP*UXu^U9kV%)$EDGPjgUA zy?WMOG>hh#Ea%FAX`ZNy$#Bl|`TkMoB3#z%3%6cP=kKPkSA_Ju@ zb>4tCfv2`=LNU&{@=jr-l1OiYu|!xcO&AY2ZdlM}$heX*bC{S>12{H)AGbUDwo=_c zeV#{hajK&KJfG|*8C3#sO^)>P4HSwk^zIl0r@JejKbDMz|FaoDQy`e)T+P{1k=_!IWX9k#o#@He~Ddj>Yr_lmN->OUb9_Z zvt3?ZKb)N{wkVSpHaq`>Jc7+fgTJH>rO)V9Q)UlL=Z{b8O}5T4QQPSH?Zr3k;&vLO zxaBv~l;*j4KR=Y;+VvPcM@b8n=FVp5pFGsHQrgZwK2|hs=hC;MBsY{P8s%Y?PUFW} zk|$fPvOHK(T5W~vR39%D{rY^j{dP(TUQ4vqBy;R;hU#(iTDa{>3%9i;om5T9i>I3$ z2yp2{lLG<9rj`x_Ia!fX!hqCt6-1DW=Wk`{TY#@3mo8Z|TG@LTHR{vSGZ_1O^r zltUGM^HG1uip6biuPqptekc;4Ps)%uc(m>TMeWbkD=R{3;E3Eyu%M%*V7z7M#E2AE19mV3#Z?`;%R+i(g_ev5Mm&vRLL@%*X^Msz zA9O@ek~67z)SL&ST~I6pbf}D%l8#7iH7sNgYO9sg%8!_ONAtGXg>1Pmr@>mhx$V7` z<7vwY9IaqiU6rzmU4+>RyOCx(3X>HBbjm7;NR@Yv8p#5+j!UmmlE4*3Yh4QE18E7j z#(N>0VYZbtBbq=|OjsY8l97g#1ERS?!Gb|g(MvSOI!d{)&hSXkq4kj%?GP{wN17cT zMqfxG$4S7+b1;+B@sDAkkLR>dI-bFD;e?104fZi@^=mTIugpTfI^+C0?D7j(<($JT)cM=q2-+B$C>@pND|aFc}g z^2os2M;n6+tO)W-1-?>&Uj`MpQ@O1-7wD$*FrDA`zcD>V{`u|QS-ZA=xtNzXB-U;9 z^!T_~mL>W=!s;%&!Yvjvg!$p*ne*0@d(2t^U81Pj;p%tFM&7w?pPlsUCz$OVBk(xg zyrrFzZK);W{;5*k7L`|9yWw8B(Cg+xzk`SA{QliyKKuM(m-SrYqzKg7tNyZM7oCv@ zE%)$o8gz5zZ;l1se5bD@XbTCtbBMiip1(oPvtlw|obs&Be`&_EI{(;&=fV3puq|p{ zPmT3AD7RP@s$y3hN_1dTo>iQxAzHtA_D$8Z3N$YDda#B1U_1vdbT8tyy!$M?YxTLh z!$_?U)r)mClv7F>Q-smrqU7AjD2NP3MTM4lbQUcd!-J0)(Rt?rK}Ho7PU$!v>sk-e zoL+>kGG3R(vs_1K6w{s)$%p~(qmfz%!L0DqXdRek0yIfgF*E>}Ah-@zD+iYQ@tD^7 z#T%gPTxH;{_2$qhVBAV?C5cgK!-4^&LM0~IfoxxBF1J)*^ZMaK5E+1b})VqcSWeHDiF+0E)s%;|s@Z=aH7 zUXsALFwujNktc#w5T_z%)F*q*qE{rD6d@2tBL@u%4CO(1t=+kJ)9L(|g@>0;p*B3_ zsBG$iOs~Z1E3x`z5Ubm*-=81d){UGkPM}v|y-rln`EoNa#*ZE@VkZ}2=eC=+CG9lW z{+&1VYur<;yYlugBf0d;O9AcC1Z!urzIMSn!Wr(Y)otaI{w*}X>O`j<*i7RwYlotY zMzS4>ay5M0p=gI{>rlEn``|p((xH4iDzK#>`@ZpUDcLHD^-#V8>*i9DT?sc=b3UAe zC)D_6r!jWhfzC_b9X|L8sK$|}?nUWwic|~DG_k~aVLf;$iKK>-5D68MNaL(G7PSUO zSr8xrnPe`tMbi2TD7_}oV2G5;=1DsB?&98ph7he4To6ivax|)_E!89nMu0l0g;kzN zPQeE7DM;Tc$CZ*=T><6Sw77$(SswbhwItE@hC1bQ+vIk(-ImYQ=v-}YE&Yo_B4&Hd zUX{}Wl4a*{3%hfdSE(gaj%Iu|zp4{*Ke-NGNvDa_O!6SLb(RN56_3$I0^F*|g$B^x z2k#LOtVVCRu-qwU+o)9uF8HW~S6cX#Ny@2+8ck5z3(cHC=AE@70@E~Vqdj$;vH%pl z1?SH|t=62RUkJ;38nkmds&fjUGYE7tAZjukVDjRL-HSVb*WvqJr`vbM9^aKZdspe_ zU7L$Hl7rWeJ3g1g)tymR0*DC|gtpcL3a1HZr-D=zL4ZPFsFX2AGARQEV2CU-<-o^a zqaK)1&V1LD)v-)fo?jl9-28lFu*h}N49*`nbEO-4)P0`(;hS_0Ouqf@$8Uc4X`g*4 zZLV>c(jV&x(hmhUibdi~DQ}rcvcfW_C8ZvHgk|uH#3hw*|NC*7)AEf!lf5j-%Xja# zROR`Y%6*~RtlQ$sA(_8Aes4Qr&aB+D5q^z~#czxKJ43?au{6a#$%!39REiCf&v+20 zvKcLpS9xZf%698-oP_`V|NOrVfhy@QHIXWdU+1{o2~^n(Sp=-Sd7QyIE|w2pXZ&Rv zB@1B5=&+{;T&^a|bQWb>=ZHOY=a%Wvs(GrsCeo_I>b3&vPkSeVrC&YWAHP=!F%_GxV#GuT0 z{9ubCI0Q3T`|f-66bvSkK#k!Ny#OwQrieNOCu07Xw)=V7en-fau7aHO_VcIpktcyNOg2XqR8mGfRYgsNTg0_%28<%4OM~JNUi5l5$2InPHd0{kP1nS$KmL& z`V;Zl#Md=83+(NNpW*}`b6UIjtHX0WH9TY=`e$UTeQbmM+HCc!GSjceLcgGW-o!hc z(>~wsovt$uWS<}Gmdje_b?nM8w)t{w&V&GCJ$fApCyr4e2)B_T=%9@d&TBz* z>Mrb=vcR2;jL;Nm!?Y0WEId-K;$AF`RP%V_u}FKuye1)znuPdDtc^sh6(7NGidWl{ zxy_^4vRtpM+84#DeIdlpo(3C<_t}?W9NK4JhU;K`_GQ{TvJNGxoWf_IeD=k;2F9nd zdHXw*75l9V-&4C;PoME9+tacMPM@`^vXA+a`$F_}C0kbcnLN+_$jvm*<1C$lNz-h7 z$^72uxRS*PwVq_IKK=rar*S->gG3Rmj+z2+VbC&XJv!>Z3&E9*R#K*sa_$W^I-m($ zYNNRDh%h$CQ|F}(NAc{x_8tt6L<5$H5KUBGFsC&bf~n_9)WJz@oaHw4Fw|TC;~EU7 z7(jSHovIm*&G6JM>uCf}(MIa0D@zIORqo#Pa}%JqVrNnV9^o7 zJ?ECwq3NBuoT~MG^@evt33VwjMN0{zgUgbpjR@!nRT7=Hk_oSQ)Q*FZ!Ez-* z7;c^7fd^3F24`{BxSYf6MJEKcJmNTPPOU(%X+bZay*POFzbPK0LHahMxq8bhxAB@W z^qMjBnlaRaII2~aBalb+a$KH3s+VJY5~*IU2Axq?S)xHT4ooi9i#ayI)Ue6>xws8x z}FL!y9=9DOErEhM4;O<73%}bU(zgymO;- zSL?+R-%q|<9J<9D&+l{QAFcyfF%6M+=m{e7p z8#)YKRlgy6P*y@Q8zDF(sWO|R#0X<_6vQ%(iV^N4(`cOWG=O(OS|6k|kp*Kz;C4*P zs%?2sqpccGjZ+A$TJcUHu@u*VbE3I(0Ngl(mLj!WI3fs$h*3)nG?7YZY_!~HNi+a4 zj-X(%jl@#OePlvNqm+f9m{vwgp(N!7s7Ni{)o^yc z#5AR6zyiZKZMZ6r;o|)vSbs6=23W7dH%8;BoEy}ma1_j)n8$+k*q{_f4yW;pNN)yQNO)>27bE#|Y&nE-j8 zh;&)bV?p66>~LBAXsR~cyy088IBwn~$E9)eCOMkyw{tDGAAwL`r}-o^7~ zZh?B+*Zz6aR)E~pJ8h0lGwwBYX=v5bBy4WT4fS4nS#M3lZjjzY&ZUbcF0Z zF?sU{tJSZIWk{XPKc=n|>BLH#KL5GYMU&speudAgY!OPMFohE&Zu;Zj{xn^pUw@yp zSR#%$RAzR1XF|f$`ePwo+3KRv)Vs|a%qlB6dZ{O5_F(J1QQr2 zaIIy||}Qh0IAC ztc=8PrGl2sXzxS}(n_tA78X6@6cv}&P;QwZjtz&_HXeLqrycYFQu~^JoiNeyEwU>x z#zwZoE^dXj18C>8!rB0|Gg@KC;jyz=Rfp?5giZAl&8d3b#F(T40udl>)G9C`oTjLa zMlg=MU?U09E3iD3p)_0*qXh!eAgC8`4#;eU>*PhhSiG$E`9=fFD$-mk1ic3M*^ldd z7SNQ#KW&o@f->bF?z%eJ22xuuvX8ikXw9bHd$=48>_2s9J0*X$%{Z0cjU9c&<-2?n zw1!phz1bbLerZ_g((ut4&6C5)c6Y|%l>7VUEcjIASUABfIyhLGkf}o}p*nfNpgrR9 zF1SIaKJE<*Vkt($JWsxv@)4;~CaU1PjF!d-lxx9!^j3PJ3`HRnVGIc!Gt<1V^isVZsY7qo)cP;Z(6`rRA1zBGCgNwazkO9Y@BgaWP=9q7_dd z(G!^x5?!iEK(v*pz*_AL#$WZvD!Qtm|5UQrK$apzS~5uKzw8V5QGiO75uL0jp;xe*=0!_$9|RHN;v zU6zl4)su@TkX!tDek{RgE9lSj-Z@1<3kyo>pd@;R7?2?~oVdunkc@#8)&xs}lU4;U zrKU1@o60yNl^|_iB?>MDprk@E?xGK#*#HtirCNC2f*}g2Kpp_l1Sbtjp)eVN%1J$- zSGjixTzwwV32ML9P3%cmzf4zh#8j7ys_C;S=}sQy5K6j(|LB!0s%*bY7v|C?k9X_OkC-Jqrk4ua`eN(p0~V*>-n9jKckx

0Bs|fb&N~5KcpwE*eX6-4SPd{O6-q20Jo!)z~TL-u%A9jMXtN&yU9PN?Nh3Pr0X7Mxws!UcjrTY zPM`H;I!|wN_W7>vq$p+Cj{bY^@o}A!6aUAL-+woO(z(N^^?iJ z|NPZ|N?*^D z$zqPXW?ebZq$Y(o`yn@+-=umYS*L&x`EOQ5zWwSWr)?AdTeVR zWr#J=TH=*TF{p+R=Bx@Bxr7vNstqAjLR8FZ>PZBzBx*vb;4V5c9^-fviyMM~Y@Vc3 z>M(Jrq6mr*6w+DFkq|D>2>`Ur8fG2$QA(}|<-&Nbgdu#^UUd-{XY*n*)VZ(%~w1%CGA1l&zF-{I1X?y;C7cGI|i+791$;0%1nbk`D zFe&BOq8<4zp5tnj$OD|m#nNLaIlc_)_u0+afHU} z`sU4g`GjxZ?vD0%J7fL2c$$TYTOxeQ##-ZQJ(;c+v+NNkZxH;){Fj>rn$FAZx}JUB zHPy;dbNVqGu6S38^x86{2`efh9Nxaqh<^O*bd^!zMWvE7#b2`lYL0`_SbaNzS*qTd zWXN^wBs}GBrwA`dRNG`Vo!`%LX*NaaCVyNmR;zb)@BB?xNixA>o2~JuKP34dmy7U} zy`Z<*V7r@R@re0`N?{0DiI87lHVs+O1|)Xt;qhsWlV2ChPYEnr!*c!f_`U;%!bNaA zQkq~9L7Y*{GeR(dCxi%XSdff>;8sbHj!;Vwl`*IT5ms7#1prm&1E3bMD!5xSm|AXljvOh2NW5c!ItUxJ z^-*&wA~Ojx0ON#l5uFcINypd~;8mU1x(2}7oQ|1f#ToY@Ck@MG%;?moCC)zYFZBED z_Cjp;Ij3_|2+4hRfAwU`P0H+}Pef&LAkzF8d@OqCu1d@&`ziBZ|8B?sEr`qnIQ{;+ zKNV|LUe&l_HyyDf;+&(zF>95k&e)J%cQnE=qajcUDK9)2;E@v<5S4_eC51?+iM+Li zJs9gOw^30gm6Qk$&@*O?(hz`fa1o;lS}Eh13PNh>d@#mH><@Vw-v@(yWyW6h)hKy_&qI$zNMstR}2CCk$7l!x!@_zedTY|I*Y~99o zXCZ@&<^4{?;wo2YZ}*;WvApm9jC(g#p0nS8bvGS6Z&_7un5Ru(a|%@N@vOxy<&!S) zm&K=kgB{+oeaeQWOX(22`9c$^_dncPthag|4;pRKcxbnXa(KQED$?%JeJI8L!9M83 zmD9g2VXdMb&M|$B4r!F6R^JSr>|SfF^n*GZ44(EX@y9-tg5W-3;%|SPd~@?(7Z1~Q zazg5-tnR||&Q`PaE;3=mW;^fPt!K_qQ}-&4+c@COKW;I#CWsm`Kh*}4%GA3^^IQMZL{CDGux&t$I;HewX1$g-(QK^8mk>K#OOexkqT{4(i_RR zv@}SirIvyiDz!F56N$=3=55phVk`2844k2X8J*R9L=g#-I&zef1r;qvp#oFUL?6AB zQ5cY31f#i@M2P`ANi>*7m#)^)AM|-1-ZKc)(;MYE1>kumw$mThIUUa#0?HWz#TgQE z84_(73LF^<7ikAXzKG&97sfxX3;GxX^%xKExH7EcqDV(u=a!=%#A&{8gDc#&<<2!x z-99_>TunRcT+_B6CWFrU3TC`4Fr%TD06NBjdnyeDt)dB*A-5oj^PKts=zLVEX^{$= zMgkI9q=H#NoyVPUqhUe>QcT^`vReOY>;hj6Ww}ln>H(LZQVKxocXcI!o3(5H?0ALK zVmj+r`qa@H7yG1eipn~@RvUY*Huhyy8!I<{|5%gFCv!rjvAz3OYgj+6?)*pepPn(y zPBo*`2YFh-J>Jb0_s<<-_4M!n%g?=sDGF|-k>0tdc}U^bKd#{(C-g)4{jXtG26X@Y z)e>h2EByJZx0Czj;^{Gq(%h-DwUKN0#urc*uDWsC0ItooH?4cO%Md%&-;QqLPUG#} zcyoMHcN%o(wwq&HywiZ2n{K*n_Z~wQHy#XIw_7_6yLaPF{QIJ%d z;L>!dx(Ahm{;s^dc(5){uyZtJc3M_jiPM2)?X` znAI0cHPDhoA0eH8%T;FF?3DYOEg+=Ci$#_l^Ynnr)n>T7fJri%QqcU9&+~jXvgRUX zsye+3znG`bIgfcSS1B1AcgyXQuI|$92ReE0iu4uZ;dL*+K;-4hIG&^Y;%09SUwpB1 z1;mXEnQ2&f|LaB18i?&iLy@GF`%FbcW|;5W5`OXUFkNrIr0IH%f1Se4M61KbHqbjrUhwnsSq854&6x-~V*J%Ibio(`0uw4os_$2%%h)?6HfPcP}dD zZ_`WJg4~>^TIJ{@GOM=wg+`SCu!3i^70nw@`*IS13;DG7Fv>%}U zy$WuYcb}!o=D`8bxf)CBL-nes$vgw?wcwH~o-&QC0IG})JaLK4aIQ3y0u&<@MP!yE zk6e1m9OJ~nc=6BmwATz|}xqcZ3FPC{}x!pFh3(a@sg)*Cw-TgaTK%U!HXs2_v&HfcNYfIuC zEwfp9NhfqNRGceCr8g9nL;&HHi-M;A21A303KS?Uf^x_p8mYaqRth0au$sHJC~0Sv zjgoLK(HH}0jF14{I2EOhLTWVLU{*_3ar8{5c4I7XO;SmQ0K-K|ADoL{NI}h07`|ta zd(Y?fo=fRHkIj2Nk@tMc?NoAW2wrP=N^4j)Yd9incn)iL`s&&A(=&LVZe&OY9%QUa zwnu8!9>tJP#Cp$O1oy&N<%lrl6(N+@1WsNVE_v0EVg5~2z6AVG6KEV290$_dGCUA z(hwpB&K$^^jOH~f?~1tDFB3cVa5)HY8CEc z_IfS*-oCf{7{~2K#sM$iU5d?1dA1B&ecDfggYEHbNe(r9KZ(li@N7XgC*USl;`{kV zH#7!B6sL2@yF@%qS08aTd3c(wr;j@U=Bu~$4pHlqb@z_CZ@5aMio+_C&oZFD{W1UG zZ}Pa{EK<2l;b^VAvk2r8 z^eR;AI-r)QD_mjWCbawwVzn%Q!Vzs_s zW^Xz#5jGE#*>siXYG9?~?@wr%>sgrsk9H*B^1YX;xBg zMs-_tsozc>V4eD+e8kNIO;)p~`}~1c>*aKQ->qUGhaf!#%B3?tIPZdHiW6?Mj=@_K zbxO6@+$$*riQIbcJyBLi^v25(JJ5D;J%scFF*O|)dZ+-K$u<^cH$-OdH0w}}uTA1pit=gA zcm$(-kWzA^EU{5V=8;&=tPl~Ewy02p;z*UyC@AMz7#oBmB(@giGcq*_lTuqngXY0f zA*c^hGYTY7=A<^kqa{c=qk#*qL@Ifaxi>3eeTOHX zufzkq3g_=y{Jv{-`L55~8`0NmVnr_L>uq0aPYDM1^$s^$Pl<-|^){QTk*T_fW7g6@ zaA3FW)g!xlkF4Ilq!zjLsfM$S%vwRMCp-W*9HaL@0i2-GF~x(ITzeHzQ>AE7%0}hg zz~trq5*|Mu?d6wk?#(-L8L}R0@Z8R^hmU>G81eV($-`o`-fIh*=lM@|@7}|& z8q#!jufIEdn0))U9(Q{)?kT_g=BB=}of;Sb(Tq?aS{Vt!22B_esf-fB+W>||&m(fD zt*1nzQzA+bLO8}`aC|&CqR)nD#wGH1)NSo+-d>j_b{v%ROlT1tDlM2{Tqw@aE3X7~ z1~?1oH2_B?xZoTF3?a%uWkdrGsdStX%ZvyiXw8I03c@oCA>zm=UrS>i39*Dz2mD3egiUrScZFA(BSQqzaPqz=Pottw7_f zHqvmELZl||`b52ZY-LV9dirW!biotrBvQ)_Gg14%jVI}wKrSc?f=FYC6q0x!1^0v! zD-8)jSq9b(9-~{-@6B=%F0X)V=O0-QpRgv+RmaWC&_^rRjnYLq*WGuTj;@tpU{y`E z;ZB+K{R9k19U3K(16U%oqme~z6$r(cW6{dw=K+#nx#nC+%En~t`){n%HFn3h+NlH@ zipY5KoSjDRm5r2gs~Ku0Lgdsi1;B)4K&d%Vjdxt2=N?jhmAa!^^AxS%6qSKdtBG-v zaYrl-1XL6n6&2PIVl*<~HmDeQR6@p}V;ESe7aaOXD!pd*krjIH^?0s2Z(4#r%KUJQ zE~@F}u%Lk%YmEuS5jma)KVeUuuEM*$(oU?kqaGOrWt7syM=c?sWQ0-VCV=N! zdCE;tBq9cFwT_WlNo)Yi&!a8bkN)30Eu%I!Sy2=S{A`3vc^x7g~ zbi(*Z6q6}pJ|J=toHa5^A|-8g!Uf?%Tg52{C2Vvq3PjCRkio^sX^4s5MH2}Eg= z8b#6=j3y5KsT_8<^?By;)K`!5popX-L}7*X$`K(`7!5}XK@nvwI!>Zf%4x@?L?1&$ zjZ{nP0Fe)@$5Ta@vck{h)p*V9BWv;A>+xJA-n0aLbok*IT~zqtU8iaAn%M_d;G79= zg~niz0H`z(j3H`D40lPT8+67Qq}oK6{Bs15ic!sFXjk4!gCa6g=_QR;2jxTv zKv-ZZd7v5zH5fIGPD$^$jNTj2f?A4F!->kf)ABs;VCt*7Q$ckHloF&sEmNEdqFnUc z8XY9H(SV`eGQ%yGPD!FTQOZeUyivy6fmL^KMG?Hq>+R~)BP;EGEAd>7UHkBT)OBTm zF1osM%V~dzg{K*&L3nB?wO$ZrrSZlf^&t>2fSkwRgB2iATkE3Z-b)%7b=)x} z#CZC-=R%LCoR7b#u9}$sz&iO?bRQRsPvHL?4hhYZI>YCr>Ie)9?4_B?fI<|3Aw(&)Jdh58L*;*<$~0uju9DGE-JNZJ5il zneETeR$}Ggo}0GE=`>Q&R%W*^F=T1tWi~kE$>sRhl(4=^L+;iLt(=JE65dw+dT_*5 zF04DVDwi~M3u&y%x_C_U!E6HIVLG2CJ9$0*1t)*};h+9AS>^JfA;!fsojd3 zcB@fZ-#)sniSsFamv>5=?4QkL<(o}QwB`~x+e^CF!r9)_p~PlIvYoOo4bpAPadebz zrvS`zB&#V*(;(qt;gHKpT0M4JL~TB8yUM&RW%DeNtF2Rx$y;fma#3Nc2V;x8hiB+f zQ7cweWrSx7e|TJX5x?$`Klw=x27CUgv9DcPo~S_^^?jDQVV?aIwXHWAo};b@N6%-d zZN~AubEi@wt3mc^t*jwG-r8EpRqeN5F{=YQTyb-7S1mShtPpC~_3RWH=Rtat zf~Tc$k(1~nC(>hJUVGyO5UVsb0+=u+Rc!%dm5IQNLEMc-xj2+uyL7!un`V3TNO98r zSxRU*!fb`z@L!bP%9IA^xgnZ+0~{ko?o&)uK#Qn2Sk7qVpgFT9B9T%k7ZpLLv6Y!+ z!ZD+5DlNhzRgQRvV1qZQYYtJ0Fkz(!&Hn%PuBFM1969?uzk;{cge48$4^8;6v1?yE zVQ;MGx}gA&35h%XD3k0N>#+ab0lu2WdOujjR+AU0y9=l+umI$jU*b!_dGIt^&zN<_ zDGrQSGM*ag`9yvr`lCZ|e18Z(7W5vDx+~#x8{}LMnyc~hT;)D5U3Rk^zD^P^qsoz_Y@6U?JJfg?W6I!RBP#3<2D=$o4*$BKzEQwl$5~f|ckNK! zKrq+M%2_KXwwkx|DHzuyuxY{9aNJda7l5RLmzr4?0!rek6biHl!L{e!GA@mbPRpQF zbVf)W6k&=5$B=6~cJ}($%_jStBIfwLGVW*6wF7!OWJ6vDD_-%(!v1r^CafwCau9!|N8k?KAHKvxW5Etg=ipIV!dah)!&(^6L`-@9jSNjW< z%14-X`IWS8`kk-2U9Hb|FoyA0%VCwQy`5>S54Wj3qq6#oTBF-m?lim$7fY}_5CTWLXWM^iw4aD69Eep z^y>6@_%cSQm6HOqjfyj8U_8dFWVXK%(yJdr8Ul`L zaZxn~RfUDBV9@tUEL9?!DY&It#BynRsTCrbieYMjI9dRWk?5Ruh+;lQryXKw1PcA} zLHF0XhzOd1KyUxQvvG6MB8^V{9RB<$u6%{_X_CS;Rg^lk%zA|^#28gDgqxVO#Vjyq zypSRq;#~BE3#(Fn3GReaV{7d0%JW^0ADK@rx8%tN^9N_A_<#MDAskB_?q7yoUBc&G zNyJav6aJ})h|ZAXVSHU06hex3gR^GPAc(_ioHa{E7Q`*K;9uJO;|H%v#Zwg<`%mM+)3 zYZmKo>kU36$K)Tlz4hS`%CV~CpMLpee`ai34AP|%i{CQ*dG||L>`d5pw}1W>ep#+J zxJpGUpBBr_;`imTpycPnA9wbwci->sd;0Ld&+dL1m-|sYImEO`hnnu69DMNTQXR*| z?v;DM$4&a;HY*o4>yNEzll)6|xdVUs19FRZ%Xsvj-&Y@yTco3WJD2ds9z@IW{{MYA zYn1EzcU-NOfQxs}YlOugU-9vz`{jD^__R6H&pgC>s@a#iV{waj*;Dp>zx}2Ec6!S3 zX|?ZoKQlUWGHD)lZnT|som;)k(aueev$=E2-$`y=>G3UP-5c%KtA2+c ze?3_;-Yp-q=gm6p9l2NU=fk3tTThOQNa>qd2Wt0M-W6ZXx>o73yOI~PuFdwkyQ=rH zuI0%YqE*d+h<*0tJS zc~^N-^b2l2Jgq*26}k<6S}fyYjmOwgTBsesu5j|^>vEmi{@9oBJseI?8+@88hqI}; zof>Nl&#QED{1DRkd0*K1)af~Plqxu{@&0#QZ#{_QL#=l^+>0aeaq-u^0Lb>5^hx6-;L=8*Mv#Oj#3)hv)mvGQ0n_?QgGVxZ3`(8-l9B zSov|<2dxkGw5f=77O^Tu%Nvp>2nm5BWx)bh&XZt`#|Tmglq#TB)G%(T3S3JM+;gLt z(NtKB$o-5mo}~fd{;4PV?%E6;MB*s-oH7I>EcF4<+dzmU!3!n0QQk$$6b;J6bRyU( z7Bvlq7;pk-tX)+$blsCq&K=G7`S{!Wv&dRwK1$xKKFKIzdss!0;Dn&awO~9+LV{q@ z``{@C$Gy}dx*!ZU2EYfQkTAxg*R@qGI2gxLr7{;JaIGB&*w&yH3JAp{HW|HE$`dLg zv%(9FUTG?UP+$_rOGY`L@`E!`MoA&*9!HzqoMIJ8?Nv`-LpNS4-&Nm%9Kt|>CGs>4~APQPjl zS2aYbM#^=n4@cESp)O;ecs*g-9Gm78-Dw- zj~M*axo&^m0fs}@DI4HrlrD-rrj^6QJrO#Dz z&*Gz1+`ENt{+|!&B46x<+dgReqW1ltZD=KW?$f3^?pK>_Sa=zFX5#HT z=}}i8wNCYxz94+=^9VJmd4rGP>8_|%Z+EN|EqYqsPKJ#4=<78Z8suG$+#Vr_`U z*P5@Fx3X+gY_zq)>zLH=w)Hj2U7SfxE#K#BY_4*wrXApG)r~ouW}P)-&Tx9G^QHNF zcGQZgzF`-g7#c}%K#(#=RCJcOz%^x5SmV4Cz&&WrmEv0Kz`*=4Ulk2Tjij(2a8KZSdUeZPp%S3RNlPF>o&Z-!d=Ypa%UQlnM#^9^~sRj3nxfu)S zmJHnRG@ZsgoZM}Dq~T~r12bM2sysx=jIbOW2_hP114?Cu;T(nG0)pVm2@)wqhSF=P zbZr$}#()B<;GNSTv{j6Nr9S=O3`0ec3KP7isnh}*jDonxoeQWe*Gi9`!M(^OofVf4kWR_9G4?`mlV+0+(SLvKmFgZoiMkQFhbk0U27@SHjryA@v zVZ7eZu9HP`WwW#cYh5tfMGR}GR#Ab$E@DbG*lLNfE;B$gO7hg=r75A(V3br*rGPuB zL&7l0=5i3kxDrseyu3R7f9C0ZV#TG}3oKX!p|K+0L5XTbuI3ZR%iu^-xxDeF-R$UP_eqz;Ypqo$3y*|;Eym4pSP`!->M_^i0^BZ1+spo#j#G{(u z7Mq6k+*6s(*s@K$Zfcb}R@0e#wbb|NYTlXmE<>iRB048`?Z|vL+_DS(9h}pY634s+ z?jvQMI7tG6ax@4c95FlyW4+aqM@2w_=R^f2gW=4``RMP;NJoDTyx3)%A!No%Mjemd zawaw9Oo@nrT9?ERtcc79#Ulr)2{G0)Pk|XQ(im@Du=5e&l|$H_4bN?YjZ}E?#(iWd ztRNIfQUn1AGHOLU;lz3wROE&;ur?`GL?*q|E*QyO45>hkLnR%pV_~y(>b5~=dX<^Ygh^WGYciwBuJr^P>r!=rs zWX2e&6pNHcPoi*0yyP|_0i`7MoEXrAC@&a}Om!#qk{j1OV4Pk%*zVxo}Gh-3BXI?TQ33y4EWh#PU^D(>CgV>$g?O1N0bMuG|z+C4I5%t;@Jh>Gio+%hZBQVC9YYJ&#iv;!H8vWPZH8aVfy1s{zEH!|Uw zBDt@D>Fm={nP&NHjA?P8uZk+|*H_61_hMa72j`|UUe33!Cn8)gtn|GuQng!N(yg!? zS=&dBI~BZyEqjHFjaz-e&H9wk-u-IpdM{z|)Bcj(7QK8?O#hGnTrd80u}1f>`10&l z@Z;4GzJJ-y#{=_~ZnS;Y^};V7;ixsfBV#^R7+ZM7D~#U$wA(N9LKo*|=jAg-qp5dK z)|o6m48rF$B)twv?-r|G&3iD;xyP(6X|}!auHiB3dMLEHt9#-`TXNl$eA)X2Y_(e- zT72RA>yHJO%IEuypT6Nz)*8eu&cB!N4vty58HLy1Msh4ESv0vLf?;4y&n^D*ls z(Vza5`e|ovh7BwURBY=A66<|*N>WgSGeJ0up1KIy)5wSr1ULo53>u?+3`Bq`J7_)? zmtHb#-AVMbg}RYNKfP%W`dl%B(V?^fNz}xdD45*-m!M(98fsXG4v<784We`rJPj5Y z6P`0wN1vNult3XpilB{j!Vz%k-L@b^I^OQBq=4Ljv&2TjjT25=mu{j3u<_{g{CvJi zg_lG)x<@Dm1tp4cnyj41K5WsjOQdx;2P-_smuqu)$j3k7NuIQcJPB*t7p4YG7o!!Xw z8@YY~a{bpWp&oML;MvJ(>2w@=;T~ZTo*uHN$5bujWzb)}EO^#Oo;&;eG8UJY*v{JN zM`b4h*ChrvG(Kr?J1TsmV&A$xb#|5d)Y(<)Q)jP$ggvqHY%jTPG41R{;45pTsGLnG zO?+xxal@%Mvup>Q&fqK7QqG2GDQ8{9!m{2P%GppRFgj2qVDK^`W12bY1f>B26_F5y zOrX|LO2&v#5Q)$-3KM9ImIx#`r*?8So@R2^fdv!<&=F3Eu)%T4w6rlOBO=#8Jx~M# z#0Kq!7usv4Y;?wH4^jv!Se#QUIUBB#oORMj&ieCzQE?|DI3b>Xkb?INJMmz zX(u9$lyfVTjALpeXE*lmps<{ElpyX20lUGu;YjZL6#~v?5dzL;5dzMxfH4(2F)vaoAngE9mjti=DJq6Udn1NO-jZA48L!l{48!Gul^5~j+c8zuAh^kw@I z4#hX9^U<~Yb^pfMvrpe{@AiM7ch8%zkCPP`ts1X7AGpxwu6pQd^VIIwg)Yhmu&$T0 z7IzIJS=Uve&5fzKF*R?Ssj1qLuZg#*wDF2qoN60e*GH`0+AbW|ue3ca;LYcg?$_62 z@qV*tG`eaZpUdv!&eUjmwFfbm?N`eMRj+NGnW1Xn(h6r+TGEjJ(`1}!6p;kN z1%fj{1Z7hSCIqLQ);d^ z3X)6b3^(X4RVZS#lG6};;EGd?%!9KbFcMqPS01Vj$MgRZ+ diff --git a/packages/metaschema-modules/sql/metaschema-modules--0.34.0.sql b/packages/metaschema-modules/sql/metaschema-modules--0.34.0.sql index 3d5b31436..2a46f502c 100644 --- a/packages/metaschema-modules/sql/metaschema-modules--0.34.0.sql +++ b/packages/metaschema-modules/sql/metaschema-modules--0.34.0.sql @@ -57,6 +57,14 @@ CREATE TABLE metaschema_modules_public.connected_accounts_module ( CREATE INDEX connected_accounts_module_database_id_idx ON metaschema_modules_public.connected_accounts_module (database_id); +CREATE INDEX connected_accounts_module_owner_table_id_idx ON metaschema_modules_public.connected_accounts_module (owner_table_id); + +CREATE INDEX connected_accounts_module_table_id_idx ON metaschema_modules_public.connected_accounts_module (table_id); + +CREATE INDEX connected_accounts_module_private_schema_id_idx ON metaschema_modules_public.connected_accounts_module (private_schema_id); + +CREATE INDEX connected_accounts_module_schema_id_idx ON metaschema_modules_public.connected_accounts_module (schema_id); + CREATE TABLE metaschema_modules_public.crypto_addresses_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -92,6 +100,14 @@ CREATE TABLE metaschema_modules_public.crypto_addresses_module ( CREATE INDEX crypto_addresses_module_database_id_idx ON metaschema_modules_public.crypto_addresses_module (database_id); +CREATE INDEX crypto_addresses_module_owner_table_id_idx ON metaschema_modules_public.crypto_addresses_module (owner_table_id); + +CREATE INDEX crypto_addresses_module_table_id_idx ON metaschema_modules_public.crypto_addresses_module (table_id); + +CREATE INDEX crypto_addresses_module_private_schema_id_idx ON metaschema_modules_public.crypto_addresses_module (private_schema_id); + +CREATE INDEX crypto_addresses_module_schema_id_idx ON metaschema_modules_public.crypto_addresses_module (schema_id); + CREATE TABLE metaschema_modules_public.crypto_auth_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -135,6 +151,16 @@ CREATE TABLE metaschema_modules_public.crypto_auth_module ( CREATE INDEX crypto_auth_module_database_id_idx ON metaschema_modules_public.crypto_auth_module (database_id); +CREATE INDEX crypto_auth_module_secrets_table_id_idx ON metaschema_modules_public.crypto_auth_module (secrets_table_id); + +CREATE INDEX crypto_auth_module_session_credentials_table_id_idx ON metaschema_modules_public.crypto_auth_module (session_credentials_table_id); + +CREATE INDEX crypto_auth_module_sessions_table_id_idx ON metaschema_modules_public.crypto_auth_module (sessions_table_id); + +CREATE INDEX crypto_auth_module_users_table_id_idx ON metaschema_modules_public.crypto_auth_module (users_table_id); + +CREATE INDEX crypto_auth_module_schema_id_idx ON metaschema_modules_public.crypto_auth_module (schema_id); + CREATE TABLE metaschema_modules_public.default_ids_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -183,6 +209,14 @@ CREATE TABLE metaschema_modules_public.denormalized_table_field ( CREATE INDEX denormalized_table_field_database_id_idx ON metaschema_modules_public.denormalized_table_field (database_id); +CREATE INDEX denormalized_table_field_ref_table_id_idx ON metaschema_modules_public.denormalized_table_field (ref_table_id); + +CREATE INDEX denormalized_table_field_table_id_idx ON metaschema_modules_public.denormalized_table_field (table_id); + +CREATE INDEX denormalized_table_field_field_id_idx ON metaschema_modules_public.denormalized_table_field (field_id); + +CREATE INDEX denormalized_table_field_ref_field_id_idx ON metaschema_modules_public.denormalized_table_field (ref_field_id); + CREATE TABLE metaschema_modules_public.emails_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -217,6 +251,14 @@ CREATE TABLE metaschema_modules_public.emails_module ( CREATE INDEX emails_module_database_id_idx ON metaschema_modules_public.emails_module (database_id); +CREATE INDEX emails_module_owner_table_id_idx ON metaschema_modules_public.emails_module (owner_table_id); + +CREATE INDEX emails_module_table_id_idx ON metaschema_modules_public.emails_module (table_id); + +CREATE INDEX emails_module_private_schema_id_idx ON metaschema_modules_public.emails_module (private_schema_id); + +CREATE INDEX emails_module_schema_id_idx ON metaschema_modules_public.emails_module (schema_id); + CREATE TABLE metaschema_modules_public.config_secrets_user_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -242,6 +284,10 @@ CREATE TABLE metaschema_modules_public.config_secrets_user_module ( CREATE UNIQUE INDEX config_secrets_user_module_database_id_idx ON metaschema_modules_public.config_secrets_user_module (database_id); +CREATE INDEX config_secrets_user_module_table_id_idx ON metaschema_modules_public.config_secrets_user_module (table_id); + +CREATE INDEX config_secrets_user_module_schema_id_idx ON metaschema_modules_public.config_secrets_user_module (schema_id); + CREATE TABLE metaschema_modules_public.invites_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -296,10 +342,22 @@ CREATE TABLE metaschema_modules_public.invites_module ( ON DELETE CASCADE ); -CREATE INDEX invites_module_database_id_idx ON metaschema_modules_public.invites_module (database_id); - CREATE UNIQUE INDEX invites_module_unique_scope ON metaschema_modules_public.invites_module (database_id, scope, prefix); +CREATE INDEX invites_module_claimed_invites_table_id_idx ON metaschema_modules_public.invites_module (claimed_invites_table_id); + +CREATE INDEX invites_module_emails_table_id_idx ON metaschema_modules_public.invites_module (emails_table_id); + +CREATE INDEX invites_module_entity_table_id_idx ON metaschema_modules_public.invites_module (entity_table_id); + +CREATE INDEX invites_module_invites_table_id_idx ON metaschema_modules_public.invites_module (invites_table_id); + +CREATE INDEX invites_module_users_table_id_idx ON metaschema_modules_public.invites_module (users_table_id); + +CREATE INDEX invites_module_private_schema_id_idx ON metaschema_modules_public.invites_module (private_schema_id); + +CREATE INDEX invites_module_schema_id_idx ON metaschema_modules_public.invites_module (schema_id); + CREATE TABLE metaschema_modules_public.events_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -397,6 +455,28 @@ CREATE TABLE metaschema_modules_public.events_module ( CREATE INDEX events_module_database_id_idx ON metaschema_modules_public.events_module (database_id); +CREATE INDEX events_module_achievement_rewards_table_id_idx ON metaschema_modules_public.events_module (achievement_rewards_table_id); + +CREATE INDEX events_module_actor_table_id_idx ON metaschema_modules_public.events_module (actor_table_id); + +CREATE INDEX events_module_entity_table_id_idx ON metaschema_modules_public.events_module (entity_table_id); + +CREATE INDEX events_module_event_aggregates_table_id_idx ON metaschema_modules_public.events_module (event_aggregates_table_id); + +CREATE INDEX events_module_event_types_table_id_idx ON metaschema_modules_public.events_module (event_types_table_id); + +CREATE INDEX events_module_events_table_id_idx ON metaschema_modules_public.events_module (events_table_id); + +CREATE INDEX events_module_level_grants_table_id_idx ON metaschema_modules_public.events_module (level_grants_table_id); + +CREATE INDEX events_module_level_requirements_table_id_idx ON metaschema_modules_public.events_module (level_requirements_table_id); + +CREATE INDEX events_module_levels_table_id_idx ON metaschema_modules_public.events_module (levels_table_id); + +CREATE INDEX events_module_private_schema_id_idx ON metaschema_modules_public.events_module (private_schema_id); + +CREATE INDEX events_module_schema_id_idx ON metaschema_modules_public.events_module (schema_id); + CREATE TABLE metaschema_modules_public.limits_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -507,6 +587,38 @@ CREATE TABLE metaschema_modules_public.limits_module ( CREATE INDEX limits_module_database_id_idx ON metaschema_modules_public.limits_module (database_id); +CREATE INDEX limits_module_actor_table_id_idx ON metaschema_modules_public.limits_module (actor_table_id); + +CREATE INDEX limits_module_aggregate_table_id_idx ON metaschema_modules_public.limits_module (aggregate_table_id); + +CREATE INDEX limits_module_credit_code_items_table_id_idx ON metaschema_modules_public.limits_module (credit_code_items_table_id); + +CREATE INDEX limits_module_credit_codes_table_id_idx ON metaschema_modules_public.limits_module (credit_codes_table_id); + +CREATE INDEX limits_module_credit_redemptions_table_id_idx ON metaschema_modules_public.limits_module (credit_redemptions_table_id); + +CREATE INDEX limits_module_default_table_id_idx ON metaschema_modules_public.limits_module (default_table_id); + +CREATE INDEX limits_module_entity_table_id_idx ON metaschema_modules_public.limits_module (entity_table_id); + +CREATE INDEX limits_module_events_table_id_idx ON metaschema_modules_public.limits_module (events_table_id); + +CREATE INDEX limits_module_limit_caps_defaults_table_id_idx ON metaschema_modules_public.limits_module (limit_caps_defaults_table_id); + +CREATE INDEX limits_module_limit_caps_table_id_idx ON metaschema_modules_public.limits_module (limit_caps_table_id); + +CREATE INDEX limits_module_limit_credits_table_id_idx ON metaschema_modules_public.limits_module (limit_credits_table_id); + +CREATE INDEX limits_module_limit_warning_state_table_id_idx ON metaschema_modules_public.limits_module (limit_warning_state_table_id); + +CREATE INDEX limits_module_limit_warnings_table_id_idx ON metaschema_modules_public.limits_module (limit_warnings_table_id); + +CREATE INDEX limits_module_table_id_idx ON metaschema_modules_public.limits_module (table_id); + +CREATE INDEX limits_module_private_schema_id_idx ON metaschema_modules_public.limits_module (private_schema_id); + +CREATE INDEX limits_module_schema_id_idx ON metaschema_modules_public.limits_module (schema_id); + CREATE TABLE metaschema_modules_public.membership_types_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -529,6 +641,10 @@ CREATE TABLE metaschema_modules_public.membership_types_module ( CREATE INDEX membership_types_module_database_id_idx ON metaschema_modules_public.membership_types_module (database_id); +CREATE INDEX membership_types_module_table_id_idx ON metaschema_modules_public.membership_types_module (table_id); + +CREATE INDEX membership_types_module_schema_id_idx ON metaschema_modules_public.membership_types_module (schema_id); + CREATE TABLE metaschema_modules_public.memberships_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -640,7 +756,35 @@ CREATE TABLE metaschema_modules_public.memberships_module ( UNIQUE (database_id, scope, prefix) ); -CREATE INDEX memberships_module_database_id_idx ON metaschema_modules_public.memberships_module (database_id); +CREATE INDEX memberships_module_actor_table_id_idx ON metaschema_modules_public.memberships_module (actor_table_id); + +CREATE INDEX memberships_module_default_limits_table_id_idx ON metaschema_modules_public.memberships_module (default_limits_table_id); + +CREATE INDEX memberships_module_default_permissions_table_id_idx ON metaschema_modules_public.memberships_module (default_permissions_table_id); + +CREATE INDEX memberships_module_entity_table_id_idx ON metaschema_modules_public.memberships_module (entity_table_id); + +CREATE INDEX memberships_module_grants_table_id_idx ON metaschema_modules_public.memberships_module (grants_table_id); + +CREATE INDEX memberships_module_limits_table_id_idx ON metaschema_modules_public.memberships_module (limits_table_id); + +CREATE INDEX memberships_module_members_table_id_idx ON metaschema_modules_public.memberships_module (members_table_id); + +CREATE INDEX memberships_module_membership_defaults_table_id_idx ON metaschema_modules_public.memberships_module (membership_defaults_table_id); + +CREATE INDEX memberships_module_membership_settings_table_id_idx ON metaschema_modules_public.memberships_module (membership_settings_table_id); + +CREATE INDEX memberships_module_memberships_table_id_idx ON metaschema_modules_public.memberships_module (memberships_table_id); + +CREATE INDEX memberships_module_permissions_table_id_idx ON metaschema_modules_public.memberships_module (permissions_table_id); + +CREATE INDEX memberships_module_sprt_table_id_idx ON metaschema_modules_public.memberships_module (sprt_table_id); + +CREATE INDEX memberships_module_private_schema_id_idx ON metaschema_modules_public.memberships_module (private_schema_id); + +CREATE INDEX memberships_module_schema_id_idx ON metaschema_modules_public.memberships_module (schema_id); + +CREATE INDEX memberships_module_entity_table_owner_id_idx ON metaschema_modules_public.memberships_module (entity_table_owner_id); CREATE TABLE metaschema_modules_public.permissions_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), @@ -697,6 +841,18 @@ CREATE TABLE metaschema_modules_public.permissions_module ( CREATE INDEX permissions_module_database_id_idx ON metaschema_modules_public.permissions_module (database_id); +CREATE INDEX permissions_module_actor_table_id_idx ON metaschema_modules_public.permissions_module (actor_table_id); + +CREATE INDEX permissions_module_default_table_id_idx ON metaschema_modules_public.permissions_module (default_table_id); + +CREATE INDEX permissions_module_entity_table_id_idx ON metaschema_modules_public.permissions_module (entity_table_id); + +CREATE INDEX permissions_module_table_id_idx ON metaschema_modules_public.permissions_module (table_id); + +CREATE INDEX permissions_module_private_schema_id_idx ON metaschema_modules_public.permissions_module (private_schema_id); + +CREATE INDEX permissions_module_schema_id_idx ON metaschema_modules_public.permissions_module (schema_id); + CREATE TABLE metaschema_modules_public.phone_numbers_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -731,6 +887,14 @@ CREATE TABLE metaschema_modules_public.phone_numbers_module ( CREATE INDEX phone_numbers_module_database_id_idx ON metaschema_modules_public.phone_numbers_module (database_id); +CREATE INDEX phone_numbers_module_owner_table_id_idx ON metaschema_modules_public.phone_numbers_module (owner_table_id); + +CREATE INDEX phone_numbers_module_table_id_idx ON metaschema_modules_public.phone_numbers_module (table_id); + +CREATE INDEX phone_numbers_module_private_schema_id_idx ON metaschema_modules_public.phone_numbers_module (private_schema_id); + +CREATE INDEX phone_numbers_module_schema_id_idx ON metaschema_modules_public.phone_numbers_module (schema_id); + CREATE TABLE metaschema_modules_public.profiles_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -809,7 +973,27 @@ CREATE TABLE metaschema_modules_public.profiles_module ( UNIQUE (database_id, scope, prefix) ); -CREATE INDEX profiles_module_database_id_idx ON metaschema_modules_public.profiles_module (database_id); +CREATE INDEX profiles_module_actor_table_id_idx ON metaschema_modules_public.profiles_module (actor_table_id); + +CREATE INDEX profiles_module_entity_table_id_idx ON metaschema_modules_public.profiles_module (entity_table_id); + +CREATE INDEX profiles_module_memberships_table_id_idx ON metaschema_modules_public.profiles_module (memberships_table_id); + +CREATE INDEX profiles_module_permissions_table_id_idx ON metaschema_modules_public.profiles_module (permissions_table_id); + +CREATE INDEX profiles_module_profile_definition_grants_table_id_idx ON metaschema_modules_public.profiles_module (profile_definition_grants_table_id); + +CREATE INDEX profiles_module_profile_grants_table_id_idx ON metaschema_modules_public.profiles_module (profile_grants_table_id); + +CREATE INDEX profiles_module_profile_permissions_table_id_idx ON metaschema_modules_public.profiles_module (profile_permissions_table_id); + +CREATE INDEX profiles_module_profile_templates_table_id_idx ON metaschema_modules_public.profiles_module (profile_templates_table_id); + +CREATE INDEX profiles_module_table_id_idx ON metaschema_modules_public.profiles_module (table_id); + +CREATE INDEX profiles_module_private_schema_id_idx ON metaschema_modules_public.profiles_module (private_schema_id); + +CREATE INDEX profiles_module_schema_id_idx ON metaschema_modules_public.profiles_module (schema_id); CREATE TABLE metaschema_modules_public.rls_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), @@ -853,15 +1037,23 @@ CREATE TABLE metaschema_modules_public.rls_module ( UNIQUE (database_id) ); -COMMENT ON CONSTRAINT db_fkey ON metaschema_modules_public.rls_module IS '@omit'; +COMMENT ON CONSTRAINT db_fkey ON metaschema_modules_public.rls_module IS '@behavior -*'; + +COMMENT ON CONSTRAINT session_credentials_table_fkey ON metaschema_modules_public.rls_module IS '@behavior -*'; + +COMMENT ON CONSTRAINT sessions_table_fkey ON metaschema_modules_public.rls_module IS '@behavior -*'; + +COMMENT ON CONSTRAINT users_table_fkey ON metaschema_modules_public.rls_module IS '@behavior -*'; -COMMENT ON CONSTRAINT session_credentials_table_fkey ON metaschema_modules_public.rls_module IS '@omit'; +CREATE INDEX rls_module_session_credentials_table_id_idx ON metaschema_modules_public.rls_module (session_credentials_table_id); -COMMENT ON CONSTRAINT sessions_table_fkey ON metaschema_modules_public.rls_module IS '@omit'; +CREATE INDEX rls_module_sessions_table_id_idx ON metaschema_modules_public.rls_module (sessions_table_id); -COMMENT ON CONSTRAINT users_table_fkey ON metaschema_modules_public.rls_module IS '@omit'; +CREATE INDEX rls_module_users_table_id_idx ON metaschema_modules_public.rls_module (users_table_id); -CREATE INDEX rls_module_database_id_idx ON metaschema_modules_public.rls_module (database_id); +CREATE INDEX rls_module_private_schema_id_idx ON metaschema_modules_public.rls_module (private_schema_id); + +CREATE INDEX rls_module_schema_id_idx ON metaschema_modules_public.rls_module (schema_id); CREATE TABLE metaschema_modules_public.user_state_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), @@ -886,6 +1078,10 @@ CREATE TABLE metaschema_modules_public.user_state_module ( CREATE INDEX user_state_module_database_id_idx ON metaschema_modules_public.user_state_module (database_id); +CREATE INDEX user_state_module_table_id_idx ON metaschema_modules_public.user_state_module (table_id); + +CREATE INDEX user_state_module_schema_id_idx ON metaschema_modules_public.user_state_module (schema_id); + CREATE TABLE metaschema_modules_public.sessions_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -926,6 +1122,16 @@ CREATE TABLE metaschema_modules_public.sessions_module ( CREATE INDEX sessions_module_database_id_idx ON metaschema_modules_public.sessions_module (database_id); +CREATE INDEX sessions_module_auth_settings_table_id_idx ON metaschema_modules_public.sessions_module (auth_settings_table_id); + +CREATE INDEX sessions_module_session_credentials_table_id_idx ON metaschema_modules_public.sessions_module (session_credentials_table_id); + +CREATE INDEX sessions_module_sessions_table_id_idx ON metaschema_modules_public.sessions_module (sessions_table_id); + +CREATE INDEX sessions_module_users_table_id_idx ON metaschema_modules_public.sessions_module (users_table_id); + +CREATE INDEX sessions_module_schema_id_idx ON metaschema_modules_public.sessions_module (schema_id); + COMMENT ON CONSTRAINT sessions_table_fkey ON metaschema_modules_public.sessions_module IS '@fieldName sessionsTableBySessionsTableId'; COMMENT ON CONSTRAINT session_credentials_table_fkey ON metaschema_modules_public.sessions_module IS '@fieldName sessionCredentialsTableBySessionCredentialsTableId'; @@ -997,17 +1203,31 @@ CREATE TABLE metaschema_modules_public.user_auth_module ( CREATE INDEX user_auth_module_database_id_idx ON metaschema_modules_public.user_auth_module (database_id); -COMMENT ON CONSTRAINT email_table_fkey ON metaschema_modules_public.user_auth_module IS '@omit'; +CREATE INDEX user_auth_module_emails_table_id_idx ON metaschema_modules_public.user_auth_module (emails_table_id); + +CREATE INDEX user_auth_module_encrypted_table_id_idx ON metaschema_modules_public.user_auth_module (encrypted_table_id); + +CREATE INDEX user_auth_module_secrets_table_id_idx ON metaschema_modules_public.user_auth_module (secrets_table_id); + +CREATE INDEX user_auth_module_session_credentials_table_id_idx ON metaschema_modules_public.user_auth_module (session_credentials_table_id); + +CREATE INDEX user_auth_module_sessions_table_id_idx ON metaschema_modules_public.user_auth_module (sessions_table_id); + +CREATE INDEX user_auth_module_users_table_id_idx ON metaschema_modules_public.user_auth_module (users_table_id); + +CREATE INDEX user_auth_module_schema_id_idx ON metaschema_modules_public.user_auth_module (schema_id); -COMMENT ON CONSTRAINT users_table_fkey ON metaschema_modules_public.user_auth_module IS '@omit'; +COMMENT ON CONSTRAINT email_table_fkey ON metaschema_modules_public.user_auth_module IS '@behavior -*'; -COMMENT ON CONSTRAINT secrets_table_fkey ON metaschema_modules_public.user_auth_module IS '@omit'; +COMMENT ON CONSTRAINT users_table_fkey ON metaschema_modules_public.user_auth_module IS '@behavior -*'; -COMMENT ON CONSTRAINT encrypted_table_fkey ON metaschema_modules_public.user_auth_module IS '@omit'; +COMMENT ON CONSTRAINT secrets_table_fkey ON metaschema_modules_public.user_auth_module IS '@behavior -*'; -COMMENT ON CONSTRAINT sessions_table_fkey ON metaschema_modules_public.user_auth_module IS '@omit'; +COMMENT ON CONSTRAINT encrypted_table_fkey ON metaschema_modules_public.user_auth_module IS '@behavior -*'; -COMMENT ON CONSTRAINT session_credentials_table_fkey ON metaschema_modules_public.user_auth_module IS '@omit'; +COMMENT ON CONSTRAINT sessions_table_fkey ON metaschema_modules_public.user_auth_module IS '@behavior -*'; + +COMMENT ON CONSTRAINT session_credentials_table_fkey ON metaschema_modules_public.user_auth_module IS '@behavior -*'; CREATE TABLE metaschema_modules_public.users_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), @@ -1039,6 +1259,12 @@ CREATE TABLE metaschema_modules_public.users_module ( CREATE INDEX users_module_database_id_idx ON metaschema_modules_public.users_module (database_id); +CREATE INDEX users_module_table_id_idx ON metaschema_modules_public.users_module (table_id); + +CREATE INDEX users_module_type_table_id_idx ON metaschema_modules_public.users_module (type_table_id); + +CREATE INDEX users_module_schema_id_idx ON metaschema_modules_public.users_module (schema_id); + CREATE TABLE metaschema_modules_public.hierarchy_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -1099,7 +1325,19 @@ CREATE TABLE metaschema_modules_public.hierarchy_module ( UNIQUE (database_id) ); -CREATE INDEX hierarchy_module_database_id_idx ON metaschema_modules_public.hierarchy_module (database_id); +CREATE INDEX hierarchy_module_chart_edge_grants_table_id_idx ON metaschema_modules_public.hierarchy_module (chart_edge_grants_table_id); + +CREATE INDEX hierarchy_module_chart_edges_table_id_idx ON metaschema_modules_public.hierarchy_module (chart_edges_table_id); + +CREATE INDEX hierarchy_module_entity_table_id_idx ON metaschema_modules_public.hierarchy_module (entity_table_id); + +CREATE INDEX hierarchy_module_hierarchy_sprt_table_id_idx ON metaschema_modules_public.hierarchy_module (hierarchy_sprt_table_id); + +CREATE INDEX hierarchy_module_users_table_id_idx ON metaschema_modules_public.hierarchy_module (users_table_id); + +CREATE INDEX hierarchy_module_private_schema_id_idx ON metaschema_modules_public.hierarchy_module (private_schema_id); + +CREATE INDEX hierarchy_module_schema_id_idx ON metaschema_modules_public.hierarchy_module (schema_id); CREATE TABLE metaschema_modules_public.secure_table_provision ( id uuid PRIMARY KEY DEFAULT uuidv7(), @@ -1155,6 +1393,8 @@ CREATE INDEX secure_table_provision_database_id_idx ON metaschema_modules_public CREATE INDEX secure_table_provision_table_id_idx ON metaschema_modules_public.secure_table_provision (table_id); +CREATE INDEX secure_table_provision_schema_id_idx ON metaschema_modules_public.secure_table_provision (schema_id); + CREATE TABLE metaschema_modules_public.relation_provision ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -1381,8 +1621,6 @@ COMMENT ON COLUMN metaschema_modules_public.blueprint_template.table_hashes IS ' COMMENT ON COLUMN metaschema_modules_public.blueprint_template.updated_at IS 'Timestamp when this template was last modified.'; -CREATE INDEX blueprint_template_owner_id_idx ON metaschema_modules_public.blueprint_template (owner_id); - CREATE INDEX blueprint_template_visibility_idx ON metaschema_modules_public.blueprint_template (visibility); CREATE INDEX blueprint_template_forked_from_id_idx ON metaschema_modules_public.blueprint_template (forked_from_id); @@ -1445,8 +1683,6 @@ COMMENT ON COLUMN metaschema_modules_public.blueprint.updated_at IS 'Timestamp w CREATE INDEX blueprint_owner_id_idx ON metaschema_modules_public.blueprint (owner_id); -CREATE INDEX blueprint_database_id_idx ON metaschema_modules_public.blueprint (database_id); - CREATE INDEX blueprint_template_id_idx ON metaschema_modules_public.blueprint (template_id); CREATE INDEX blueprint_definition_hash_idx ON metaschema_modules_public.blueprint (definition_hash); @@ -1579,10 +1815,22 @@ CREATE TABLE metaschema_modules_public.storage_module ( ON DELETE CASCADE ); -CREATE INDEX storage_module_database_id_idx ON metaschema_modules_public.storage_module (database_id); - CREATE UNIQUE INDEX storage_module_unique_scope ON metaschema_modules_public.storage_module (database_id, scope, prefix); +CREATE INDEX storage_module_buckets_table_id_idx ON metaschema_modules_public.storage_module (buckets_table_id); + +CREATE INDEX storage_module_entity_table_id_idx ON metaschema_modules_public.storage_module (entity_table_id); + +CREATE INDEX storage_module_file_events_table_id_idx ON metaschema_modules_public.storage_module (file_events_table_id); + +CREATE INDEX storage_module_files_table_id_idx ON metaschema_modules_public.storage_module (files_table_id); + +CREATE INDEX storage_module_path_shares_table_id_idx ON metaschema_modules_public.storage_module (path_shares_table_id); + +CREATE INDEX storage_module_private_schema_id_idx ON metaschema_modules_public.storage_module (private_schema_id); + +CREATE INDEX storage_module_schema_id_idx ON metaschema_modules_public.storage_module (schema_id); + CREATE TABLE metaschema_modules_public.entity_type_provision ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -1868,14 +2116,20 @@ CREATE TABLE metaschema_modules_public.rate_limits_module ( UNIQUE (database_id) ); -CREATE INDEX rate_limits_module_database_id_idx ON metaschema_modules_public.rate_limits_module (database_id); - COMMENT ON CONSTRAINT rate_limit_settings_table_fkey ON metaschema_modules_public.rate_limits_module IS '@fieldName rateLimitSettingsTableByRateLimitSettingsTableId'; COMMENT ON CONSTRAINT ip_rate_limits_table_fkey ON metaschema_modules_public.rate_limits_module IS '@fieldName ipRateLimitsTableByIpRateLimitsTableId'; COMMENT ON CONSTRAINT rate_limits_table_fkey ON metaschema_modules_public.rate_limits_module IS '@fieldName rateLimitsTableByRateLimitsTableId'; +CREATE INDEX rate_limits_module_ip_rate_limits_table_id_idx ON metaschema_modules_public.rate_limits_module (ip_rate_limits_table_id); + +CREATE INDEX rate_limits_module_rate_limit_settings_table_id_idx ON metaschema_modules_public.rate_limits_module (rate_limit_settings_table_id); + +CREATE INDEX rate_limits_module_rate_limits_table_id_idx ON metaschema_modules_public.rate_limits_module (rate_limits_table_id); + +CREATE INDEX rate_limits_module_schema_id_idx ON metaschema_modules_public.rate_limits_module (schema_id); + CREATE TABLE metaschema_modules_public.devices_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -1904,12 +2158,16 @@ CREATE TABLE metaschema_modules_public.devices_module ( UNIQUE (database_id) ); -CREATE INDEX devices_module_database_id_idx ON metaschema_modules_public.devices_module (database_id); - COMMENT ON CONSTRAINT user_devices_table_fkey ON metaschema_modules_public.devices_module IS '@fieldName userDevicesTableByUserDevicesTableId'; COMMENT ON CONSTRAINT device_settings_table_fkey ON metaschema_modules_public.devices_module IS '@fieldName deviceSettingsTableByDeviceSettingsTableId'; +CREATE INDEX devices_module_device_settings_table_id_idx ON metaschema_modules_public.devices_module (device_settings_table_id); + +CREATE INDEX devices_module_user_devices_table_id_idx ON metaschema_modules_public.devices_module (user_devices_table_id); + +CREATE INDEX devices_module_schema_id_idx ON metaschema_modules_public.devices_module (schema_id); + CREATE TABLE metaschema_modules_public.session_secrets_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -1981,6 +2239,14 @@ CREATE TABLE metaschema_modules_public.webauthn_credentials_module ( CREATE INDEX webauthn_credentials_module_database_id_idx ON metaschema_modules_public.webauthn_credentials_module (database_id); +CREATE INDEX webauthn_credentials_module_owner_table_id_idx ON metaschema_modules_public.webauthn_credentials_module (owner_table_id); + +CREATE INDEX webauthn_credentials_module_table_id_idx ON metaschema_modules_public.webauthn_credentials_module (table_id); + +CREATE INDEX webauthn_credentials_module_private_schema_id_idx ON metaschema_modules_public.webauthn_credentials_module (private_schema_id); + +CREATE INDEX webauthn_credentials_module_schema_id_idx ON metaschema_modules_public.webauthn_credentials_module (schema_id); + COMMENT ON TABLE metaschema_modules_public.webauthn_credentials_module IS 'Config row for the webauthn_credentials_module, which provisions the per-user WebAuthn/passkey credentials table (public key, counter, transports, device type, backup state) mirroring crypto_addresses_module. The sibling webauthn_auth_module holds RP config and the registration/sign-in challenge state.'; COMMENT ON COLUMN metaschema_modules_public.webauthn_credentials_module.private_schema_id IS 'Private schema that hosts SECURITY DEFINER helpers which write to webauthn_credentials (registration / counter-bump / delete).'; @@ -2038,6 +2304,20 @@ CREATE TABLE metaschema_modules_public.webauthn_auth_module ( CREATE INDEX webauthn_auth_module_database_id_idx ON metaschema_modules_public.webauthn_auth_module (database_id); +CREATE INDEX webauthn_auth_module_auth_settings_table_id_idx ON metaschema_modules_public.webauthn_auth_module (auth_settings_table_id); + +CREATE INDEX webauthn_auth_module_credentials_table_id_idx ON metaschema_modules_public.webauthn_auth_module (credentials_table_id); + +CREATE INDEX webauthn_auth_module_session_credentials_table_id_idx ON metaschema_modules_public.webauthn_auth_module (session_credentials_table_id); + +CREATE INDEX webauthn_auth_module_session_secrets_table_id_idx ON metaschema_modules_public.webauthn_auth_module (session_secrets_table_id); + +CREATE INDEX webauthn_auth_module_sessions_table_id_idx ON metaschema_modules_public.webauthn_auth_module (sessions_table_id); + +CREATE INDEX webauthn_auth_module_users_table_id_idx ON metaschema_modules_public.webauthn_auth_module (users_table_id); + +CREATE INDEX webauthn_auth_module_schema_id_idx ON metaschema_modules_public.webauthn_auth_module (schema_id); + CREATE TABLE metaschema_modules_public.identity_providers_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -2075,8 +2355,6 @@ CREATE TABLE metaschema_modules_public.identity_providers_module ( ON DELETE CASCADE ); -CREATE INDEX identity_providers_module_database_id_idx ON metaschema_modules_public.identity_providers_module (database_id); - CREATE INDEX identity_providers_module_schema_id_idx ON metaschema_modules_public.identity_providers_module (schema_id); CREATE INDEX identity_providers_module_private_schema_id_idx ON metaschema_modules_public.identity_providers_module (private_schema_id); @@ -2085,6 +2363,8 @@ CREATE INDEX identity_providers_module_table_id_idx ON metaschema_modules_public CREATE UNIQUE INDEX identity_providers_module_unique_scope ON metaschema_modules_public.identity_providers_module (database_id, scope); +CREATE INDEX identity_providers_module_entity_table_id_idx ON metaschema_modules_public.identity_providers_module (entity_table_id); + COMMENT ON TABLE metaschema_modules_public.identity_providers_module IS 'Entity-aware config row for the identity_providers_module, which provisions a per-database identity_providers table holding OAuth2 / OIDC (and future SAML) provider definitions. The scope column determines which internal_secrets_module table the rotate proc targets @@ -2172,39 +2452,61 @@ CREATE TABLE metaschema_modules_public.notifications_module ( ON DELETE CASCADE ); -COMMENT ON CONSTRAINT schema_fkey ON metaschema_modules_public.notifications_module IS '@omit manyToMany'; +COMMENT ON CONSTRAINT schema_fkey ON metaschema_modules_public.notifications_module IS '@behavior -manyToMany'; -COMMENT ON CONSTRAINT private_schema_fkey ON metaschema_modules_public.notifications_module IS '@omit manyToMany'; +COMMENT ON CONSTRAINT private_schema_fkey ON metaschema_modules_public.notifications_module IS '@behavior -manyToMany'; COMMENT ON CONSTRAINT notifications_table_fkey ON metaschema_modules_public.notifications_module IS '@fieldName notificationsTableByNotificationsTableId -@omit manyToMany'; +@behavior -manyToMany'; COMMENT ON CONSTRAINT read_state_table_fkey ON metaschema_modules_public.notifications_module IS '@fieldName readStateTableByReadStateTableId -@omit manyToMany'; +@behavior -manyToMany'; COMMENT ON CONSTRAINT preferences_table_fkey ON metaschema_modules_public.notifications_module IS '@fieldName preferencesTableByPreferencesTableId -@omit manyToMany'; +@behavior -manyToMany'; COMMENT ON CONSTRAINT channels_table_fkey ON metaschema_modules_public.notifications_module IS '@fieldName channelsTableByChannelsTableId -@omit manyToMany'; +@behavior -manyToMany'; COMMENT ON CONSTRAINT delivery_log_table_fkey ON metaschema_modules_public.notifications_module IS '@fieldName deliveryLogTableByDeliveryLogTableId -@omit manyToMany'; +@behavior -manyToMany'; COMMENT ON CONSTRAINT suppressions_table_fkey ON metaschema_modules_public.notifications_module IS '@fieldName suppressionsTableBySuppressionsTableId'; -COMMENT ON CONSTRAINT owner_table_fkey ON metaschema_modules_public.notifications_module IS '@omit manyToMany'; +COMMENT ON CONSTRAINT owner_table_fkey ON metaschema_modules_public.notifications_module IS '@behavior -manyToMany'; COMMENT ON CONSTRAINT user_settings_table_fkey ON metaschema_modules_public.notifications_module IS '@fieldName userSettingsTableByUserSettingsTableId -@omit manyToMany'; +@behavior -manyToMany'; COMMENT ON CONSTRAINT organization_settings_table_fkey ON metaschema_modules_public.notifications_module IS '@fieldName organizationSettingsTableByOrganizationSettingsTableId -@omit manyToMany'; +@behavior -manyToMany'; -COMMENT ON CONSTRAINT db_fkey ON metaschema_modules_public.notifications_module IS '@omit manyToMany'; +COMMENT ON CONSTRAINT db_fkey ON metaschema_modules_public.notifications_module IS '@behavior -manyToMany'; CREATE INDEX notifications_module_database_id_idx ON metaschema_modules_public.notifications_module (database_id); +CREATE INDEX notifications_module_channels_table_id_idx ON metaschema_modules_public.notifications_module (channels_table_id); + +CREATE INDEX notifications_module_delivery_log_table_id_idx ON metaschema_modules_public.notifications_module (delivery_log_table_id); + +CREATE INDEX notifications_module_notifications_table_id_idx ON metaschema_modules_public.notifications_module (notifications_table_id); + +CREATE INDEX notifications_module_organization_settings_table_id_idx ON metaschema_modules_public.notifications_module (organization_settings_table_id); + +CREATE INDEX notifications_module_owner_table_id_idx ON metaschema_modules_public.notifications_module (owner_table_id); + +CREATE INDEX notifications_module_preferences_table_id_idx ON metaschema_modules_public.notifications_module (preferences_table_id); + +CREATE INDEX notifications_module_read_state_table_id_idx ON metaschema_modules_public.notifications_module (read_state_table_id); + +CREATE INDEX notifications_module_suppressions_table_id_idx ON metaschema_modules_public.notifications_module (suppressions_table_id); + +CREATE INDEX notifications_module_user_settings_table_id_idx ON metaschema_modules_public.notifications_module (user_settings_table_id); + +CREATE INDEX notifications_module_private_schema_id_idx ON metaschema_modules_public.notifications_module (private_schema_id); + +CREATE INDEX notifications_module_schema_id_idx ON metaschema_modules_public.notifications_module (schema_id); + CREATE TABLE metaschema_modules_public.plans_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -2267,7 +2569,21 @@ CREATE TABLE metaschema_modules_public.plans_module ( UNIQUE (database_id) ); -CREATE INDEX plans_module_database_id_idx ON metaschema_modules_public.plans_module (database_id); +CREATE INDEX plans_module_plan_caps_table_id_idx ON metaschema_modules_public.plans_module (plan_caps_table_id); + +CREATE INDEX plans_module_plan_limits_table_id_idx ON metaschema_modules_public.plans_module (plan_limits_table_id); + +CREATE INDEX plans_module_plan_meter_limits_table_id_idx ON metaschema_modules_public.plans_module (plan_meter_limits_table_id); + +CREATE INDEX plans_module_plan_overrides_table_id_idx ON metaschema_modules_public.plans_module (plan_overrides_table_id); + +CREATE INDEX plans_module_plan_pricing_table_id_idx ON metaschema_modules_public.plans_module (plan_pricing_table_id); + +CREATE INDEX plans_module_plans_table_id_idx ON metaschema_modules_public.plans_module (plans_table_id); + +CREATE INDEX plans_module_private_schema_id_idx ON metaschema_modules_public.plans_module (private_schema_id); + +CREATE INDEX plans_module_schema_id_idx ON metaschema_modules_public.plans_module (schema_id); CREATE TABLE metaschema_modules_public.billing_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), @@ -2342,7 +2658,23 @@ CREATE TABLE metaschema_modules_public.billing_module ( UNIQUE (database_id) ); -CREATE INDEX billing_module_database_id_idx ON metaschema_modules_public.billing_module (database_id); +CREATE INDEX billing_module_balances_table_id_idx ON metaschema_modules_public.billing_module (balances_table_id); + +CREATE INDEX billing_module_ledger_table_id_idx ON metaschema_modules_public.billing_module (ledger_table_id); + +CREATE INDEX billing_module_meter_credits_table_id_idx ON metaschema_modules_public.billing_module (meter_credits_table_id); + +CREATE INDEX billing_module_meter_defaults_table_id_idx ON metaschema_modules_public.billing_module (meter_defaults_table_id); + +CREATE INDEX billing_module_meter_sources_table_id_idx ON metaschema_modules_public.billing_module (meter_sources_table_id); + +CREATE INDEX billing_module_meters_table_id_idx ON metaschema_modules_public.billing_module (meters_table_id); + +CREATE INDEX billing_module_plan_subscriptions_table_id_idx ON metaschema_modules_public.billing_module (plan_subscriptions_table_id); + +CREATE INDEX billing_module_private_schema_id_idx ON metaschema_modules_public.billing_module (private_schema_id); + +CREATE INDEX billing_module_schema_id_idx ON metaschema_modules_public.billing_module (schema_id); CREATE TABLE metaschema_modules_public.billing_provider_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), @@ -2415,7 +2747,25 @@ CREATE TABLE metaschema_modules_public.billing_provider_module ( UNIQUE (database_id) ); -CREATE INDEX billing_provider_module_database_id_idx ON metaschema_modules_public.billing_provider_module (database_id); +CREATE INDEX billing_provider_module_billing_customers_table_id_idx ON metaschema_modules_public.billing_provider_module (billing_customers_table_id); + +CREATE INDEX billing_provider_module_billing_prices_table_id_idx ON metaschema_modules_public.billing_provider_module (billing_prices_table_id); + +CREATE INDEX billing_provider_module_billing_products_table_id_idx ON metaschema_modules_public.billing_provider_module (billing_products_table_id); + +CREATE INDEX billing_provider_module_billing_subscriptions_table_id_idx ON metaschema_modules_public.billing_provider_module (billing_subscriptions_table_id); + +CREATE INDEX billing_provider_module_billing_webhook_events_table_id_idx ON metaschema_modules_public.billing_provider_module (billing_webhook_events_table_id); + +CREATE INDEX billing_provider_module_prices_table_id_idx ON metaschema_modules_public.billing_provider_module (prices_table_id); + +CREATE INDEX billing_provider_module_products_table_id_idx ON metaschema_modules_public.billing_provider_module (products_table_id); + +CREATE INDEX billing_provider_module_subscriptions_table_id_idx ON metaschema_modules_public.billing_provider_module (subscriptions_table_id); + +CREATE INDEX billing_provider_module_private_schema_id_idx ON metaschema_modules_public.billing_provider_module (private_schema_id); + +CREATE INDEX billing_provider_module_schema_id_idx ON metaschema_modules_public.billing_provider_module (schema_id); CREATE TABLE metaschema_modules_public.realtime_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), @@ -2462,8 +2812,6 @@ CREATE TABLE metaschema_modules_public.realtime_module ( ON DELETE CASCADE ); -CREATE INDEX realtime_module_database_id_idx ON metaschema_modules_public.realtime_module (database_id); - CREATE UNIQUE INDEX realtime_module_unique_per_db ON metaschema_modules_public.realtime_module (database_id); CREATE INDEX realtime_module_schema_id_idx ON metaschema_modules_public.realtime_module (schema_id); @@ -2524,14 +2872,22 @@ CREATE TABLE metaschema_modules_public.rate_limit_meters_module ( UNIQUE (database_id) ); -CREATE INDEX rate_limit_meters_module_database_id_idx ON metaschema_modules_public.rate_limit_meters_module (database_id); - COMMENT ON CONSTRAINT rate_limit_state_table_fkey ON metaschema_modules_public.rate_limit_meters_module IS '@fieldName rateLimitStateTableByRateLimitStateTableId'; COMMENT ON CONSTRAINT rate_limit_overrides_table_fkey ON metaschema_modules_public.rate_limit_meters_module IS '@fieldName rateLimitOverridesTableByRateLimitOverridesTableId'; COMMENT ON CONSTRAINT rate_window_limits_table_fkey ON metaschema_modules_public.rate_limit_meters_module IS '@fieldName rateWindowLimitsTableByRateWindowLimitsTableId'; +CREATE INDEX rate_limit_meters_module_rate_limit_overrides_table_id_idx ON metaschema_modules_public.rate_limit_meters_module (rate_limit_overrides_table_id); + +CREATE INDEX rate_limit_meters_module_rate_limit_state_table_id_idx ON metaschema_modules_public.rate_limit_meters_module (rate_limit_state_table_id); + +CREATE INDEX rate_limit_meters_module_rate_window_limits_table_id_idx ON metaschema_modules_public.rate_limit_meters_module (rate_window_limits_table_id); + +CREATE INDEX rate_limit_meters_module_private_schema_id_idx ON metaschema_modules_public.rate_limit_meters_module (private_schema_id); + +CREATE INDEX rate_limit_meters_module_schema_id_idx ON metaschema_modules_public.rate_limit_meters_module (schema_id); + CREATE TABLE metaschema_modules_public.inference_log_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -2577,7 +2933,13 @@ CREATE TABLE metaschema_modules_public.inference_log_module ( UNIQUE NULLS NOT DISTINCT (database_id, prefix) ); -CREATE INDEX inference_log_module_database_id_idx ON metaschema_modules_public.inference_log_module (database_id); +CREATE INDEX inference_log_module_inference_log_table_id_idx ON metaschema_modules_public.inference_log_module (inference_log_table_id); + +CREATE INDEX inference_log_module_usage_summary_table_id_idx ON metaschema_modules_public.inference_log_module (usage_summary_table_id); + +CREATE INDEX inference_log_module_private_schema_id_idx ON metaschema_modules_public.inference_log_module (private_schema_id); + +CREATE INDEX inference_log_module_schema_id_idx ON metaschema_modules_public.inference_log_module (schema_id); CREATE TABLE metaschema_modules_public.compute_log_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), @@ -2624,7 +2986,13 @@ CREATE TABLE metaschema_modules_public.compute_log_module ( UNIQUE (database_id, scope) ); -CREATE INDEX compute_log_module_database_id_idx ON metaschema_modules_public.compute_log_module (database_id); +CREATE INDEX compute_log_module_compute_log_table_id_idx ON metaschema_modules_public.compute_log_module (compute_log_table_id); + +CREATE INDEX compute_log_module_usage_summary_table_id_idx ON metaschema_modules_public.compute_log_module (usage_summary_table_id); + +CREATE INDEX compute_log_module_private_schema_id_idx ON metaschema_modules_public.compute_log_module (private_schema_id); + +CREATE INDEX compute_log_module_schema_id_idx ON metaschema_modules_public.compute_log_module (schema_id); CREATE TABLE metaschema_modules_public.transfer_log_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), @@ -2671,7 +3039,13 @@ CREATE TABLE metaschema_modules_public.transfer_log_module ( UNIQUE NULLS NOT DISTINCT (database_id, prefix) ); -CREATE INDEX transfer_log_module_database_id_idx ON metaschema_modules_public.transfer_log_module (database_id); +CREATE INDEX transfer_log_module_transfer_log_table_id_idx ON metaschema_modules_public.transfer_log_module (transfer_log_table_id); + +CREATE INDEX transfer_log_module_usage_summary_table_id_idx ON metaschema_modules_public.transfer_log_module (usage_summary_table_id); + +CREATE INDEX transfer_log_module_private_schema_id_idx ON metaschema_modules_public.transfer_log_module (private_schema_id); + +CREATE INDEX transfer_log_module_schema_id_idx ON metaschema_modules_public.transfer_log_module (schema_id); CREATE TABLE metaschema_modules_public.storage_log_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), @@ -2718,7 +3092,13 @@ CREATE TABLE metaschema_modules_public.storage_log_module ( UNIQUE (database_id, scope) ); -CREATE INDEX storage_log_module_database_id_idx ON metaschema_modules_public.storage_log_module (database_id); +CREATE INDEX storage_log_module_storage_log_table_id_idx ON metaschema_modules_public.storage_log_module (storage_log_table_id); + +CREATE INDEX storage_log_module_usage_summary_table_id_idx ON metaschema_modules_public.storage_log_module (usage_summary_table_id); + +CREATE INDEX storage_log_module_private_schema_id_idx ON metaschema_modules_public.storage_log_module (private_schema_id); + +CREATE INDEX storage_log_module_schema_id_idx ON metaschema_modules_public.storage_log_module (schema_id); CREATE TABLE metaschema_modules_public.db_usage_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), @@ -2780,7 +3160,17 @@ CREATE TABLE metaschema_modules_public.db_usage_module ( UNIQUE (database_id, scope) ); -CREATE INDEX db_usage_module_database_id_idx ON metaschema_modules_public.db_usage_module (database_id); +CREATE INDEX db_usage_module_query_stats_log_table_id_idx ON metaschema_modules_public.db_usage_module (query_stats_log_table_id); + +CREATE INDEX db_usage_module_query_stats_summary_table_id_idx ON metaschema_modules_public.db_usage_module (query_stats_summary_table_id); + +CREATE INDEX db_usage_module_table_stats_log_table_id_idx ON metaschema_modules_public.db_usage_module (table_stats_log_table_id); + +CREATE INDEX db_usage_module_table_stats_summary_table_id_idx ON metaschema_modules_public.db_usage_module (table_stats_summary_table_id); + +CREATE INDEX db_usage_module_private_schema_id_idx ON metaschema_modules_public.db_usage_module (private_schema_id); + +CREATE INDEX db_usage_module_schema_id_idx ON metaschema_modules_public.db_usage_module (schema_id); CREATE TABLE metaschema_modules_public.agent_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), @@ -2869,10 +3259,30 @@ CREATE TABLE metaschema_modules_public.agent_module ( ON DELETE CASCADE ); -CREATE INDEX agent_module_database_id_idx ON metaschema_modules_public.agent_module (database_id); - CREATE UNIQUE INDEX agent_module_unique_scope ON metaschema_modules_public.agent_module (database_id, scope, prefix); +CREATE INDEX agent_module_agent_table_id_idx ON metaschema_modules_public.agent_module (agent_table_id); + +CREATE INDEX agent_module_entity_table_id_idx ON metaschema_modules_public.agent_module (entity_table_id); + +CREATE INDEX agent_module_message_table_id_idx ON metaschema_modules_public.agent_module (message_table_id); + +CREATE INDEX agent_module_persona_table_id_idx ON metaschema_modules_public.agent_module (persona_table_id); + +CREATE INDEX agent_module_plan_table_id_idx ON metaschema_modules_public.agent_module (plan_table_id); + +CREATE INDEX agent_module_prompts_table_id_idx ON metaschema_modules_public.agent_module (prompts_table_id); + +CREATE INDEX agent_module_resource_table_id_idx ON metaschema_modules_public.agent_module (resource_table_id); + +CREATE INDEX agent_module_task_table_id_idx ON metaschema_modules_public.agent_module (task_table_id); + +CREATE INDEX agent_module_thread_table_id_idx ON metaschema_modules_public.agent_module (thread_table_id); + +CREATE INDEX agent_module_private_schema_id_idx ON metaschema_modules_public.agent_module (private_schema_id); + +CREATE INDEX agent_module_schema_id_idx ON metaschema_modules_public.agent_module (schema_id); + CREATE TABLE metaschema_modules_public.merkle_store_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -2924,10 +3334,18 @@ CREATE TABLE metaschema_modules_public.merkle_store_module ( UNIQUE (database_id, prefix) ); -CREATE INDEX merkle_store_module_database_id_idx ON metaschema_modules_public.merkle_store_module (database_id); - CREATE INDEX merkle_store_module_private_schema_id_idx ON metaschema_modules_public.merkle_store_module (private_schema_id); +CREATE INDEX merkle_store_module_commit_table_id_idx ON metaschema_modules_public.merkle_store_module (commit_table_id); + +CREATE INDEX merkle_store_module_object_table_id_idx ON metaschema_modules_public.merkle_store_module (object_table_id); + +CREATE INDEX merkle_store_module_ref_table_id_idx ON metaschema_modules_public.merkle_store_module (ref_table_id); + +CREATE INDEX merkle_store_module_store_table_id_idx ON metaschema_modules_public.merkle_store_module (store_table_id); + +CREATE INDEX merkle_store_module_schema_id_idx ON metaschema_modules_public.merkle_store_module (schema_id); + CREATE TABLE metaschema_modules_public.graph_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -2975,7 +3393,15 @@ CREATE TABLE metaschema_modules_public.graph_module ( UNIQUE (database_id, merkle_store_module_id) ); -CREATE INDEX graph_module_database_id_idx ON metaschema_modules_public.graph_module (database_id); +CREATE INDEX graph_module_entity_table_id_idx ON metaschema_modules_public.graph_module (entity_table_id); + +CREATE INDEX graph_module_graphs_table_id_idx ON metaschema_modules_public.graph_module (graphs_table_id); + +CREATE INDEX graph_module_private_schema_id_idx ON metaschema_modules_public.graph_module (private_schema_id); + +CREATE INDEX graph_module_public_schema_id_idx ON metaschema_modules_public.graph_module (public_schema_id); + +CREATE INDEX graph_module_merkle_store_module_id_idx ON metaschema_modules_public.graph_module (merkle_store_module_id); CREATE TABLE metaschema_modules_public.graph_execution_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), @@ -3035,10 +3461,22 @@ CREATE TABLE metaschema_modules_public.graph_execution_module ( ON DELETE CASCADE ); -CREATE INDEX graph_execution_module_database_id_idx ON metaschema_modules_public.graph_execution_module (database_id); - CREATE UNIQUE INDEX graph_execution_module_unique_scope ON metaschema_modules_public.graph_execution_module (database_id, scope); +CREATE INDEX graph_execution_module_entity_table_id_idx ON metaschema_modules_public.graph_execution_module (entity_table_id); + +CREATE INDEX graph_execution_module_executions_table_id_idx ON metaschema_modules_public.graph_execution_module (executions_table_id); + +CREATE INDEX graph_execution_module_node_states_table_id_idx ON metaschema_modules_public.graph_execution_module (node_states_table_id); + +CREATE INDEX graph_execution_module_outputs_table_id_idx ON metaschema_modules_public.graph_execution_module (outputs_table_id); + +CREATE INDEX graph_execution_module_private_schema_id_idx ON metaschema_modules_public.graph_execution_module (private_schema_id); + +CREATE INDEX graph_execution_module_schema_id_idx ON metaschema_modules_public.graph_execution_module (schema_id); + +CREATE INDEX graph_execution_module_graph_module_id_idx ON metaschema_modules_public.graph_execution_module (graph_module_id); + CREATE TABLE metaschema_modules_public.db_preset_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -3085,7 +3523,15 @@ CREATE TABLE metaschema_modules_public.db_preset_module ( UNIQUE (database_id, merkle_store_module_id) ); -CREATE INDEX db_preset_module_database_id_idx ON metaschema_modules_public.db_preset_module (database_id); +CREATE INDEX db_preset_module_entity_table_id_idx ON metaschema_modules_public.db_preset_module (entity_table_id); + +CREATE INDEX db_preset_module_db_presets_table_id_idx ON metaschema_modules_public.db_preset_module (db_presets_table_id); + +CREATE INDEX db_preset_module_private_schema_id_idx ON metaschema_modules_public.db_preset_module (private_schema_id); + +CREATE INDEX db_preset_module_public_schema_id_idx ON metaschema_modules_public.db_preset_module (public_schema_id); + +CREATE INDEX db_preset_module_merkle_store_module_id_idx ON metaschema_modules_public.db_preset_module (merkle_store_module_id); CREATE TABLE metaschema_modules_public.namespace_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), @@ -3133,10 +3579,18 @@ CREATE TABLE metaschema_modules_public.namespace_module ( ON DELETE CASCADE ); -CREATE INDEX namespace_module_database_id_idx ON metaschema_modules_public.namespace_module (database_id); - CREATE UNIQUE INDEX namespace_module_unique_scope ON metaschema_modules_public.namespace_module (database_id, scope); +CREATE INDEX namespace_module_entity_table_id_idx ON metaschema_modules_public.namespace_module (entity_table_id); + +CREATE INDEX namespace_module_namespace_events_table_id_idx ON metaschema_modules_public.namespace_module (namespace_events_table_id); + +CREATE INDEX namespace_module_namespaces_table_id_idx ON metaschema_modules_public.namespace_module (namespaces_table_id); + +CREATE INDEX namespace_module_private_schema_id_idx ON metaschema_modules_public.namespace_module (private_schema_id); + +CREATE INDEX namespace_module_schema_id_idx ON metaschema_modules_public.namespace_module (schema_id); + CREATE TABLE metaschema_modules_public.function_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -3148,6 +3602,7 @@ CREATE TABLE metaschema_modules_public.function_module ( definitions_table_id uuid NOT NULL DEFAULT uuid_nil(), bindings_table_id uuid NOT NULL DEFAULT uuid_nil(), schedules_table_id uuid, + capability_bindings_table_id uuid NULL, has_cron boolean NOT NULL DEFAULT false, definitions_table_name text NOT NULL DEFAULT 'function_definitions', bindings_table_name text, @@ -3186,13 +3641,29 @@ CREATE TABLE metaschema_modules_public.function_module ( CONSTRAINT function_module_entity_table_fkey FOREIGN KEY(entity_table_id) REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + CONSTRAINT function_module_capability_bindings_table_fkey + FOREIGN KEY(capability_bindings_table_id) + REFERENCES metaschema_public.table (id) ON DELETE CASCADE ); -CREATE INDEX function_module_database_id_idx ON metaschema_modules_public.function_module (database_id); - CREATE UNIQUE INDEX function_module_unique_scope ON metaschema_modules_public.function_module (database_id, scope); +CREATE INDEX function_module_bindings_table_id_idx ON metaschema_modules_public.function_module (bindings_table_id); + +CREATE INDEX function_module_definitions_table_id_idx ON metaschema_modules_public.function_module (definitions_table_id); + +CREATE INDEX function_module_entity_table_id_idx ON metaschema_modules_public.function_module (entity_table_id); + +CREATE INDEX function_module_schedules_table_id_idx ON metaschema_modules_public.function_module (schedules_table_id); + +CREATE INDEX function_module_capability_bindings_table_id_idx ON metaschema_modules_public.function_module (capability_bindings_table_id); + +CREATE INDEX function_module_private_schema_id_idx ON metaschema_modules_public.function_module (private_schema_id); + +CREATE INDEX function_module_schema_id_idx ON metaschema_modules_public.function_module (schema_id); + CREATE TABLE metaschema_modules_public.function_invocation_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -3245,10 +3716,20 @@ CREATE TABLE metaschema_modules_public.function_invocation_module ( ON DELETE CASCADE ); -CREATE INDEX function_invocation_module_database_id_idx ON metaschema_modules_public.function_invocation_module (database_id); - CREATE UNIQUE INDEX function_invocation_module_unique_scope ON metaschema_modules_public.function_invocation_module (database_id, scope); +CREATE INDEX function_invocation_module_attempts_table_id_idx ON metaschema_modules_public.function_invocation_module (attempts_table_id); + +CREATE INDEX function_invocation_module_entity_table_id_idx ON metaschema_modules_public.function_invocation_module (entity_table_id); + +CREATE INDEX function_invocation_module_invocations_table_id_idx ON metaschema_modules_public.function_invocation_module (invocations_table_id); + +CREATE INDEX function_invocation_module_execution_logs_table_id_idx ON metaschema_modules_public.function_invocation_module (execution_logs_table_id); + +CREATE INDEX function_invocation_module_private_schema_id_idx ON metaschema_modules_public.function_invocation_module (private_schema_id); + +CREATE INDEX function_invocation_module_schema_id_idx ON metaschema_modules_public.function_invocation_module (schema_id); + CREATE TABLE metaschema_modules_public.infra_secrets_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -3288,14 +3769,16 @@ CREATE TABLE metaschema_modules_public.infra_secrets_module ( ON DELETE CASCADE ); -CREATE INDEX infra_secrets_module_database_id_idx ON metaschema_modules_public.infra_secrets_module (database_id); - CREATE INDEX infra_secrets_module_schema_id_idx ON metaschema_modules_public.infra_secrets_module (schema_id); CREATE INDEX infra_secrets_module_secrets_table_id_idx ON metaschema_modules_public.infra_secrets_module (secrets_table_id); CREATE UNIQUE INDEX infra_secrets_module_unique_scope ON metaschema_modules_public.infra_secrets_module (database_id, scope); +CREATE INDEX infra_secrets_module_entity_table_id_idx ON metaschema_modules_public.infra_secrets_module (entity_table_id); + +CREATE INDEX infra_secrets_module_private_schema_id_idx ON metaschema_modules_public.infra_secrets_module (private_schema_id); + COMMENT ON TABLE metaschema_modules_public.infra_secrets_module IS 'Namespace-backed PGP-encrypted key-value secrets module. Requires namespace_module and emits namespace:sync_secrets job triggers for K8s Secret synchronization.'; CREATE TABLE metaschema_modules_public.infra_config_module ( @@ -3337,14 +3820,16 @@ CREATE TABLE metaschema_modules_public.infra_config_module ( ON DELETE CASCADE ); -CREATE INDEX infra_config_module_database_id_idx ON metaschema_modules_public.infra_config_module (database_id); - CREATE INDEX infra_config_module_schema_id_idx ON metaschema_modules_public.infra_config_module (schema_id); CREATE INDEX infra_config_module_config_table_id_idx ON metaschema_modules_public.infra_config_module (config_table_id); CREATE UNIQUE INDEX infra_config_module_unique_scope ON metaschema_modules_public.infra_config_module (database_id, scope); +CREATE INDEX infra_config_module_entity_table_id_idx ON metaschema_modules_public.infra_config_module (entity_table_id); + +CREATE INDEX infra_config_module_private_schema_id_idx ON metaschema_modules_public.infra_config_module (private_schema_id); + COMMENT ON TABLE metaschema_modules_public.infra_config_module IS 'Namespace-backed plaintext key-value config module. Requires namespace_module and emits namespace:sync_config job triggers for K8s ConfigMap synchronization.'; CREATE TABLE metaschema_modules_public.internal_secrets_module ( @@ -3386,14 +3871,16 @@ CREATE TABLE metaschema_modules_public.internal_secrets_module ( ON DELETE CASCADE ); -CREATE INDEX internal_secrets_module_database_id_idx ON metaschema_modules_public.internal_secrets_module (database_id); - CREATE INDEX internal_secrets_module_schema_id_idx ON metaschema_modules_public.internal_secrets_module (schema_id); CREATE INDEX internal_secrets_module_internal_secrets_table_id_idx ON metaschema_modules_public.internal_secrets_module (internal_secrets_table_id); CREATE UNIQUE INDEX internal_secrets_module_unique_scope ON metaschema_modules_public.internal_secrets_module (database_id, scope); +CREATE INDEX internal_secrets_module_entity_table_id_idx ON metaschema_modules_public.internal_secrets_module (entity_table_id); + +CREATE INDEX internal_secrets_module_private_schema_id_idx ON metaschema_modules_public.internal_secrets_module (private_schema_id); + COMMENT ON TABLE metaschema_modules_public.internal_secrets_module IS 'App-scoped PGP-encrypted internal secrets store. No namespace_module dependency and no K8s synchronization. Used by identity_providers_module for OAuth2 client_secret storage.'; CREATE TABLE metaschema_modules_public.user_credentials_module ( @@ -3418,8 +3905,6 @@ CREATE TABLE metaschema_modules_public.user_credentials_module ( ON DELETE CASCADE ); -CREATE INDEX user_credentials_module_database_id_idx ON metaschema_modules_public.user_credentials_module (database_id); - CREATE INDEX user_credentials_module_schema_id_idx ON metaschema_modules_public.user_credentials_module (schema_id); CREATE INDEX user_credentials_module_table_id_idx ON metaschema_modules_public.user_credentials_module (table_id); @@ -3456,10 +3941,14 @@ CREATE TABLE metaschema_modules_public.user_settings_module ( ON DELETE CASCADE ); -CREATE INDEX user_settings_module_database_id_idx ON metaschema_modules_public.user_settings_module (database_id); - CREATE UNIQUE INDEX user_settings_module_unique_per_db ON metaschema_modules_public.user_settings_module (database_id); +CREATE INDEX user_settings_module_owner_table_id_idx ON metaschema_modules_public.user_settings_module (owner_table_id); + +CREATE INDEX user_settings_module_table_id_idx ON metaschema_modules_public.user_settings_module (table_id); + +CREATE INDEX user_settings_module_schema_id_idx ON metaschema_modules_public.user_settings_module (schema_id); + CREATE TABLE metaschema_modules_public.i18n_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -3486,10 +3975,14 @@ CREATE TABLE metaschema_modules_public.i18n_module ( ON DELETE CASCADE ); -CREATE INDEX i18n_module_database_id_idx ON metaschema_modules_public.i18n_module (database_id); - CREATE UNIQUE INDEX i18n_module_unique_per_db ON metaschema_modules_public.i18n_module (database_id); +CREATE INDEX i18n_module_settings_table_id_idx ON metaschema_modules_public.i18n_module (settings_table_id); + +CREATE INDEX i18n_module_private_schema_id_idx ON metaschema_modules_public.i18n_module (private_schema_id); + +CREATE INDEX i18n_module_schema_id_idx ON metaschema_modules_public.i18n_module (schema_id); + CREATE TABLE metaschema_modules_public.function_deployment_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -3546,10 +4039,22 @@ CREATE TABLE metaschema_modules_public.function_deployment_module ( ON DELETE SET NULL ); -CREATE INDEX function_deployment_module_database_id_idx ON metaschema_modules_public.function_deployment_module (database_id); - CREATE UNIQUE INDEX function_deployment_module_unique_scope ON metaschema_modules_public.function_deployment_module (database_id, scope); +CREATE INDEX function_deployment_module_deployments_table_id_idx ON metaschema_modules_public.function_deployment_module (deployments_table_id); + +CREATE INDEX function_deployment_module_entity_table_id_idx ON metaschema_modules_public.function_deployment_module (entity_table_id); + +CREATE INDEX function_deployment_module_deployment_events_table_id_idx ON metaschema_modules_public.function_deployment_module (deployment_events_table_id); + +CREATE INDEX function_deployment_module_private_schema_id_idx ON metaschema_modules_public.function_deployment_module (private_schema_id); + +CREATE INDEX function_deployment_module_schema_id_idx ON metaschema_modules_public.function_deployment_module (schema_id); + +CREATE INDEX function_deployment_module_function_module_id_idx ON metaschema_modules_public.function_deployment_module (function_module_id); + +CREATE INDEX function_deployment_module_namespace_module_id_idx ON metaschema_modules_public.function_deployment_module (namespace_module_id); + CREATE TABLE metaschema_modules_public.principal_auth_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -3601,15 +4106,27 @@ CREATE TABLE metaschema_modules_public.principal_auth_module ( CREATE INDEX principal_auth_module_database_id_idx ON metaschema_modules_public.principal_auth_module (database_id); -COMMENT ON CONSTRAINT principals_table_fkey ON metaschema_modules_public.principal_auth_module IS '@omit'; +CREATE INDEX principal_auth_module_principal_entities_table_id_idx ON metaschema_modules_public.principal_auth_module (principal_entities_table_id); + +CREATE INDEX principal_auth_module_principals_table_id_idx ON metaschema_modules_public.principal_auth_module (principals_table_id); + +CREATE INDEX principal_auth_module_session_credentials_table_id_idx ON metaschema_modules_public.principal_auth_module (session_credentials_table_id); + +CREATE INDEX principal_auth_module_sessions_table_id_idx ON metaschema_modules_public.principal_auth_module (sessions_table_id); -COMMENT ON CONSTRAINT users_table_fkey ON metaschema_modules_public.principal_auth_module IS '@omit'; +CREATE INDEX principal_auth_module_users_table_id_idx ON metaschema_modules_public.principal_auth_module (users_table_id); -COMMENT ON CONSTRAINT sessions_table_fkey ON metaschema_modules_public.principal_auth_module IS '@omit'; +CREATE INDEX principal_auth_module_schema_id_idx ON metaschema_modules_public.principal_auth_module (schema_id); -COMMENT ON CONSTRAINT session_credentials_table_fkey ON metaschema_modules_public.principal_auth_module IS '@omit'; +COMMENT ON CONSTRAINT principals_table_fkey ON metaschema_modules_public.principal_auth_module IS '@behavior -*'; -COMMENT ON CONSTRAINT principal_entities_table_fkey ON metaschema_modules_public.principal_auth_module IS '@omit'; +COMMENT ON CONSTRAINT users_table_fkey ON metaschema_modules_public.principal_auth_module IS '@behavior -*'; + +COMMENT ON CONSTRAINT sessions_table_fkey ON metaschema_modules_public.principal_auth_module IS '@behavior -*'; + +COMMENT ON CONSTRAINT session_credentials_table_fkey ON metaschema_modules_public.principal_auth_module IS '@behavior -*'; + +COMMENT ON CONSTRAINT principal_entities_table_fkey ON metaschema_modules_public.principal_auth_module IS '@behavior -*'; COMMENT ON TABLE metaschema_modules_public.principal_auth_module IS 'Provisions the principals subsystem: a principals table, a principal_entities junction table, create/delete mutations, and org API key management. Supports both human-owned principals (AuthzDirectOwner, AuthzHumanOnly) and org-owned principals (AuthzEntityMembership with is_admin). Org principal and org API key functions are only generated when an org-scoped memberships_module exists for the database.'; @@ -3704,10 +4221,32 @@ CREATE TABLE metaschema_modules_public.resource_module ( ON DELETE SET NULL ); -CREATE INDEX resource_module_database_id_idx ON metaschema_modules_public.resource_module (database_id); - CREATE UNIQUE INDEX resource_module_unique_scope ON metaschema_modules_public.resource_module (database_id, scope); +CREATE INDEX resource_module_resource_definitions_table_id_idx ON metaschema_modules_public.resource_module (resource_definitions_table_id); + +CREATE INDEX resource_module_entity_table_id_idx ON metaschema_modules_public.resource_module (entity_table_id); + +CREATE INDEX resource_module_resource_events_table_id_idx ON metaschema_modules_public.resource_module (resource_events_table_id); + +CREATE INDEX resource_module_resource_installations_table_id_idx ON metaschema_modules_public.resource_module (resource_installations_table_id); + +CREATE INDEX resource_module_resources_table_id_idx ON metaschema_modules_public.resource_module (resources_table_id); + +CREATE INDEX resource_module_resource_status_checks_table_id_idx ON metaschema_modules_public.resource_module (resource_status_checks_table_id); + +CREATE INDEX resource_module_resource_usage_log_table_id_idx ON metaschema_modules_public.resource_module (resource_usage_log_table_id); + +CREATE INDEX resource_module_resource_usage_summary_table_id_idx ON metaschema_modules_public.resource_module (resource_usage_summary_table_id); + +CREATE INDEX resource_module_private_schema_id_idx ON metaschema_modules_public.resource_module (private_schema_id); + +CREATE INDEX resource_module_schema_id_idx ON metaschema_modules_public.resource_module (schema_id); + +CREATE INDEX resource_module_merkle_store_module_id_idx ON metaschema_modules_public.resource_module (merkle_store_module_id); + +CREATE INDEX resource_module_namespace_module_id_idx ON metaschema_modules_public.resource_module (namespace_module_id); + CREATE TABLE metaschema_modules_public.integration_providers_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -3745,8 +4284,6 @@ CREATE TABLE metaschema_modules_public.integration_providers_module ( ON DELETE CASCADE ); -CREATE INDEX integration_providers_module_database_id_idx ON metaschema_modules_public.integration_providers_module (database_id); - CREATE INDEX integration_providers_module_schema_id_idx ON metaschema_modules_public.integration_providers_module (schema_id); CREATE INDEX integration_providers_module_private_schema_id_idx ON metaschema_modules_public.integration_providers_module (private_schema_id); @@ -3755,6 +4292,8 @@ CREATE INDEX integration_providers_module_table_id_idx ON metaschema_modules_pub CREATE UNIQUE INDEX integration_providers_module_unique_scope ON metaschema_modules_public.integration_providers_module (database_id, scope, prefix); +CREATE INDEX integration_providers_module_entity_table_id_idx ON metaschema_modules_public.integration_providers_module (entity_table_id); + COMMENT ON TABLE metaschema_modules_public.integration_providers_module IS 'Config row for the integration_providers_module, which provisions a per-database integration_providers table holding branded, reusable service definitions. Integration providers act as a catalog of external services (e.g. Mailgun, Postgres) @@ -3841,10 +4380,26 @@ CREATE TABLE metaschema_modules_public.webhook_module ( ON DELETE CASCADE ); -CREATE INDEX webhook_module_database_id_idx ON metaschema_modules_public.webhook_module (database_id); - CREATE UNIQUE INDEX webhook_module_unique_scope ON metaschema_modules_public.webhook_module (database_id, scope); +CREATE INDEX webhook_module_webhook_endpoints_table_id_idx ON metaschema_modules_public.webhook_module (webhook_endpoints_table_id); + +CREATE INDEX webhook_module_entity_table_id_idx ON metaschema_modules_public.webhook_module (entity_table_id); + +CREATE INDEX webhook_module_webhook_events_table_id_idx ON metaschema_modules_public.webhook_module (webhook_events_table_id); + +CREATE INDEX webhook_module_private_schema_id_idx ON metaschema_modules_public.webhook_module (private_schema_id); + +CREATE INDEX webhook_module_schema_id_idx ON metaschema_modules_public.webhook_module (schema_id); + +CREATE INDEX webhook_module_function_module_id_idx ON metaschema_modules_public.webhook_module (function_module_id); + +CREATE INDEX webhook_module_function_invocation_module_id_idx ON metaschema_modules_public.webhook_module (function_invocation_module_id); + +CREATE INDEX webhook_module_namespace_module_id_idx ON metaschema_modules_public.webhook_module (namespace_module_id); + +CREATE INDEX webhook_module_infra_secrets_module_id_idx ON metaschema_modules_public.webhook_module (infra_secrets_module_id); + CREATE TABLE metaschema_modules_public.http_route_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -3901,10 +4456,22 @@ CREATE TABLE metaschema_modules_public.http_route_module ( ON DELETE CASCADE ); -CREATE INDEX http_route_module_database_id_idx ON metaschema_modules_public.http_route_module (database_id); - CREATE UNIQUE INDEX http_route_module_unique_scope ON metaschema_modules_public.http_route_module (database_id, scope); +CREATE INDEX http_route_module_entity_table_id_idx ON metaschema_modules_public.http_route_module (entity_table_id); + +CREATE INDEX http_route_module_http_routes_table_id_idx ON metaschema_modules_public.http_route_module (http_routes_table_id); + +CREATE INDEX http_route_module_private_schema_id_idx ON metaschema_modules_public.http_route_module (private_schema_id); + +CREATE INDEX http_route_module_schema_id_idx ON metaschema_modules_public.http_route_module (schema_id); + +CREATE INDEX http_route_module_function_module_id_idx ON metaschema_modules_public.http_route_module (function_module_id); + +CREATE INDEX http_route_module_resource_module_id_idx ON metaschema_modules_public.http_route_module (resource_module_id); + +CREATE INDEX http_route_module_storage_module_id_idx ON metaschema_modules_public.http_route_module (storage_module_id); + CREATE TABLE metaschema_modules_public.catalog_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -3920,6 +4487,10 @@ CREATE TABLE metaschema_modules_public.catalog_module ( resource_installations_table_id uuid NOT NULL DEFAULT uuid_nil(), apps_table_id uuid NOT NULL DEFAULT uuid_nil(), buckets_table_id uuid NOT NULL DEFAULT uuid_nil(), + sites_web_config_table_id uuid NOT NULL DEFAULT uuid_nil(), + sites_error_pages_table_id uuid NOT NULL DEFAULT uuid_nil(), + sites_app_links_table_id uuid NOT NULL DEFAULT uuid_nil(), + sites_deep_links_table_id uuid NOT NULL DEFAULT uuid_nil(), domains_table_name text NOT NULL DEFAULT 'domains', apis_table_name text NOT NULL DEFAULT 'apis', sites_table_name text NOT NULL DEFAULT 'sites', @@ -3930,6 +4501,10 @@ CREATE TABLE metaschema_modules_public.catalog_module ( resource_installations_table_name text NOT NULL DEFAULT 'resource_installations', apps_table_name text NOT NULL DEFAULT 'apps', buckets_table_name text NOT NULL DEFAULT 'buckets', + sites_web_config_table_name text NOT NULL DEFAULT 'sites_web_config', + sites_error_pages_table_name text NOT NULL DEFAULT 'sites_error_pages', + sites_app_links_table_name text NOT NULL DEFAULT 'sites_app_links', + sites_deep_links_table_name text NOT NULL DEFAULT 'sites_deep_links', api_name text, private_api_name text, scope text NOT NULL, @@ -3985,6 +4560,22 @@ CREATE TABLE metaschema_modules_public.catalog_module ( FOREIGN KEY(buckets_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT catalog_module_sites_web_config_table_fkey + FOREIGN KEY(sites_web_config_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + CONSTRAINT catalog_module_sites_error_pages_table_fkey + FOREIGN KEY(sites_error_pages_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + CONSTRAINT catalog_module_sites_app_links_table_fkey + FOREIGN KEY(sites_app_links_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + CONSTRAINT catalog_module_sites_deep_links_table_fkey + FOREIGN KEY(sites_deep_links_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, CONSTRAINT catalog_module_entity_table_fkey FOREIGN KEY(entity_table_id) REFERENCES metaschema_public.table (id) @@ -3993,6 +4584,38 @@ CREATE TABLE metaschema_modules_public.catalog_module ( CREATE UNIQUE INDEX catalog_module_unique_database ON metaschema_modules_public.catalog_module (database_id); +CREATE INDEX catalog_module_apis_table_id_idx ON metaschema_modules_public.catalog_module (apis_table_id); + +CREATE INDEX catalog_module_apps_table_id_idx ON metaschema_modules_public.catalog_module (apps_table_id); + +CREATE INDEX catalog_module_buckets_table_id_idx ON metaschema_modules_public.catalog_module (buckets_table_id); + +CREATE INDEX catalog_module_sites_web_config_table_id_idx ON metaschema_modules_public.catalog_module (sites_web_config_table_id); + +CREATE INDEX catalog_module_sites_error_pages_table_id_idx ON metaschema_modules_public.catalog_module (sites_error_pages_table_id); + +CREATE INDEX catalog_module_sites_app_links_table_id_idx ON metaschema_modules_public.catalog_module (sites_app_links_table_id); + +CREATE INDEX catalog_module_sites_deep_links_table_id_idx ON metaschema_modules_public.catalog_module (sites_deep_links_table_id); + +CREATE INDEX catalog_module_domains_table_id_idx ON metaschema_modules_public.catalog_module (domains_table_id); + +CREATE INDEX catalog_module_entity_table_id_idx ON metaschema_modules_public.catalog_module (entity_table_id); + +CREATE INDEX catalog_module_functions_table_id_idx ON metaschema_modules_public.catalog_module (functions_table_id); + +CREATE INDEX catalog_module_namespaces_table_id_idx ON metaschema_modules_public.catalog_module (namespaces_table_id); + +CREATE INDEX catalog_module_resource_definitions_table_id_idx ON metaschema_modules_public.catalog_module (resource_definitions_table_id); + +CREATE INDEX catalog_module_resource_installations_table_id_idx ON metaschema_modules_public.catalog_module (resource_installations_table_id); + +CREATE INDEX catalog_module_resources_table_id_idx ON metaschema_modules_public.catalog_module (resources_table_id); + +CREATE INDEX catalog_module_sites_table_id_idx ON metaschema_modules_public.catalog_module (sites_table_id); + +CREATE INDEX catalog_module_schema_id_idx ON metaschema_modules_public.catalog_module (schema_id); + CREATE TABLE metaschema_modules_public.domain_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -4056,10 +4679,24 @@ CREATE TABLE metaschema_modules_public.domain_module ( ON DELETE CASCADE ); -CREATE INDEX domain_module_database_id_idx ON metaschema_modules_public.domain_module (database_id); - CREATE UNIQUE INDEX domain_module_unique_scope ON metaschema_modules_public.domain_module (database_id, scope); +CREATE INDEX domain_module_domains_table_id_idx ON metaschema_modules_public.domain_module (domains_table_id); + +CREATE INDEX domain_module_entity_table_id_idx ON metaschema_modules_public.domain_module (entity_table_id); + +CREATE INDEX domain_module_domain_events_table_id_idx ON metaschema_modules_public.domain_module (domain_events_table_id); + +CREATE INDEX domain_module_managed_domains_table_id_idx ON metaschema_modules_public.domain_module (managed_domains_table_id); + +CREATE INDEX domain_module_domain_verifications_table_id_idx ON metaschema_modules_public.domain_module (domain_verifications_table_id); + +CREATE INDEX domain_module_private_schema_id_idx ON metaschema_modules_public.domain_module (private_schema_id); + +CREATE INDEX domain_module_schema_id_idx ON metaschema_modules_public.domain_module (schema_id); + +CREATE INDEX domain_module_catalog_module_id_idx ON metaschema_modules_public.domain_module (catalog_module_id); + CREATE TABLE metaschema_modules_public.api_surface_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -4069,12 +4706,10 @@ CREATE TABLE metaschema_modules_public.api_surface_module ( catalog_module_id uuid, apis_table_id uuid NOT NULL DEFAULT uuid_nil(), api_schemas_table_id uuid NOT NULL DEFAULT uuid_nil(), - api_modules_table_id uuid NOT NULL DEFAULT uuid_nil(), api_settings_table_id uuid NOT NULL DEFAULT uuid_nil(), cors_settings_table_id uuid NOT NULL DEFAULT uuid_nil(), apis_table_name text NOT NULL DEFAULT 'apis', api_schemas_table_name text NOT NULL DEFAULT 'api_schemas', - api_modules_table_name text NOT NULL DEFAULT 'api_modules', api_settings_table_name text NOT NULL DEFAULT 'api_settings', cors_settings_table_name text NOT NULL DEFAULT 'cors_settings', api_name text, @@ -4105,10 +4740,6 @@ CREATE TABLE metaschema_modules_public.api_surface_module ( FOREIGN KEY(api_schemas_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, - CONSTRAINT api_module_api_modules_table_fkey - FOREIGN KEY(api_modules_table_id) - REFERENCES metaschema_public.table (id) - ON DELETE CASCADE, CONSTRAINT api_module_api_settings_table_fkey FOREIGN KEY(api_settings_table_id) REFERENCES metaschema_public.table (id) @@ -4123,25 +4754,47 @@ CREATE TABLE metaschema_modules_public.api_surface_module ( ON DELETE CASCADE ); -CREATE INDEX api_module_database_id_idx ON metaschema_modules_public.api_surface_module (database_id); - CREATE UNIQUE INDEX api_module_unique_scope ON metaschema_modules_public.api_surface_module (database_id, scope); +CREATE INDEX api_surface_module_api_schemas_table_id_idx ON metaschema_modules_public.api_surface_module (api_schemas_table_id); + +CREATE INDEX api_surface_module_api_settings_table_id_idx ON metaschema_modules_public.api_surface_module (api_settings_table_id); + +CREATE INDEX api_surface_module_apis_table_id_idx ON metaschema_modules_public.api_surface_module (apis_table_id); + +CREATE INDEX api_surface_module_cors_settings_table_id_idx ON metaschema_modules_public.api_surface_module (cors_settings_table_id); + +CREATE INDEX api_surface_module_entity_table_id_idx ON metaschema_modules_public.api_surface_module (entity_table_id); + +CREATE INDEX api_surface_module_schema_id_idx ON metaschema_modules_public.api_surface_module (schema_id); + +CREATE INDEX api_surface_module_catalog_module_id_idx ON metaschema_modules_public.api_surface_module (catalog_module_id); + CREATE TABLE metaschema_modules_public.site_surface_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, entity_field text, schema_id uuid NOT NULL DEFAULT uuid_nil(), + private_schema_id uuid NOT NULL DEFAULT uuid_nil(), public_schema_name text, + private_schema_name text, catalog_module_id uuid, sites_table_id uuid NOT NULL DEFAULT uuid_nil(), site_metadata_table_id uuid NOT NULL DEFAULT uuid_nil(), site_modules_table_id uuid NOT NULL DEFAULT uuid_nil(), site_themes_table_id uuid NOT NULL DEFAULT uuid_nil(), + site_app_links_table_id uuid NOT NULL DEFAULT uuid_nil(), + site_deep_links_table_id uuid NOT NULL DEFAULT uuid_nil(), + site_web_config_table_id uuid NOT NULL DEFAULT uuid_nil(), + site_error_pages_table_id uuid NOT NULL DEFAULT uuid_nil(), sites_table_name text NOT NULL DEFAULT 'sites', site_metadata_table_name text NOT NULL DEFAULT 'site_metadata', site_modules_table_name text NOT NULL DEFAULT 'site_modules', site_themes_table_name text NOT NULL DEFAULT 'site_themes', + site_app_links_table_name text NOT NULL DEFAULT 'site_app_links', + site_deep_links_table_name text NOT NULL DEFAULT 'site_deep_links', + site_web_config_table_name text NOT NULL DEFAULT 'site_web_config', + site_error_pages_table_name text NOT NULL DEFAULT 'site_error_pages', api_name text, private_api_name text, scope text NOT NULL, @@ -4158,6 +4811,10 @@ CREATE TABLE metaschema_modules_public.site_surface_module ( FOREIGN KEY(schema_id) REFERENCES metaschema_public.schema (id) ON DELETE CASCADE, + CONSTRAINT site_module_private_schema_fkey + FOREIGN KEY(private_schema_id) + REFERENCES metaschema_public.schema (id) + ON DELETE CASCADE, CONSTRAINT site_module_catalog_fkey FOREIGN KEY(catalog_module_id) REFERENCES metaschema_modules_public.catalog_module (id) @@ -4178,16 +4835,52 @@ CREATE TABLE metaschema_modules_public.site_surface_module ( FOREIGN KEY(site_themes_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT site_module_site_app_links_table_fkey + FOREIGN KEY(site_app_links_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + CONSTRAINT site_module_site_deep_links_table_fkey + FOREIGN KEY(site_deep_links_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + CONSTRAINT site_module_site_web_config_table_fkey + FOREIGN KEY(site_web_config_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + CONSTRAINT site_module_site_error_pages_table_fkey + FOREIGN KEY(site_error_pages_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, CONSTRAINT site_module_entity_table_fkey FOREIGN KEY(entity_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE ); -CREATE INDEX site_module_database_id_idx ON metaschema_modules_public.site_surface_module (database_id); - CREATE UNIQUE INDEX site_module_unique_scope ON metaschema_modules_public.site_surface_module (database_id, scope); +CREATE INDEX site_surface_module_entity_table_id_idx ON metaschema_modules_public.site_surface_module (entity_table_id); + +CREATE INDEX site_surface_module_site_metadata_table_id_idx ON metaschema_modules_public.site_surface_module (site_metadata_table_id); + +CREATE INDEX site_surface_module_site_modules_table_id_idx ON metaschema_modules_public.site_surface_module (site_modules_table_id); + +CREATE INDEX site_surface_module_site_themes_table_id_idx ON metaschema_modules_public.site_surface_module (site_themes_table_id); + +CREATE INDEX site_surface_module_site_app_links_table_id_idx ON metaschema_modules_public.site_surface_module (site_app_links_table_id); + +CREATE INDEX site_surface_module_site_deep_links_table_id_idx ON metaschema_modules_public.site_surface_module (site_deep_links_table_id); + +CREATE INDEX site_surface_module_site_web_config_table_id_idx ON metaschema_modules_public.site_surface_module (site_web_config_table_id); + +CREATE INDEX site_surface_module_site_error_pages_table_id_idx ON metaschema_modules_public.site_surface_module (site_error_pages_table_id); + +CREATE INDEX site_surface_module_sites_table_id_idx ON metaschema_modules_public.site_surface_module (sites_table_id); + +CREATE INDEX site_surface_module_schema_id_idx ON metaschema_modules_public.site_surface_module (schema_id); + +CREATE INDEX site_surface_module_catalog_module_id_idx ON metaschema_modules_public.site_surface_module (catalog_module_id); + CREATE TABLE metaschema_modules_public.route_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -4205,6 +4898,8 @@ CREATE TABLE metaschema_modules_public.route_module ( hostname_bindings_table_name text NOT NULL DEFAULT 'hostname_bindings', route_bindings_table_name text NOT NULL DEFAULT 'route_bindings', resolver_function_name text, + app_links_function_name text, + deep_link_function_name text, api_name text, private_api_name text, scope text NOT NULL, @@ -4251,10 +4946,24 @@ CREATE TABLE metaschema_modules_public.route_module ( ON DELETE CASCADE ); -CREATE INDEX route_module_database_id_idx ON metaschema_modules_public.route_module (database_id); - CREATE UNIQUE INDEX route_module_unique_scope ON metaschema_modules_public.route_module (database_id, scope); +CREATE INDEX route_module_entity_table_id_idx ON metaschema_modules_public.route_module (entity_table_id); + +CREATE INDEX route_module_hostname_bindings_table_id_idx ON metaschema_modules_public.route_module (hostname_bindings_table_id); + +CREATE INDEX route_module_route_bindings_table_id_idx ON metaschema_modules_public.route_module (route_bindings_table_id); + +CREATE INDEX route_module_routes_table_id_idx ON metaschema_modules_public.route_module (routes_table_id); + +CREATE INDEX route_module_private_schema_id_idx ON metaschema_modules_public.route_module (private_schema_id); + +CREATE INDEX route_module_schema_id_idx ON metaschema_modules_public.route_module (schema_id); + +CREATE INDEX route_module_catalog_module_id_idx ON metaschema_modules_public.route_module (catalog_module_id); + +CREATE INDEX route_module_domain_module_id_idx ON metaschema_modules_public.route_module (domain_module_id); + CREATE TABLE metaschema_modules_public.app_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -4306,10 +5015,20 @@ CREATE TABLE metaschema_modules_public.app_module ( ON DELETE CASCADE ); -CREATE INDEX app_module_database_id_idx ON metaschema_modules_public.app_module (database_id); - CREATE UNIQUE INDEX app_module_unique_scope ON metaschema_modules_public.app_module (database_id, scope); +CREATE INDEX app_module_app_components_table_id_idx ON metaschema_modules_public.app_module (app_components_table_id); + +CREATE INDEX app_module_apps_table_id_idx ON metaschema_modules_public.app_module (apps_table_id); + +CREATE INDEX app_module_entity_table_id_idx ON metaschema_modules_public.app_module (entity_table_id); + +CREATE INDEX app_module_private_schema_id_idx ON metaschema_modules_public.app_module (private_schema_id); + +CREATE INDEX app_module_schema_id_idx ON metaschema_modules_public.app_module (schema_id); + +CREATE INDEX app_module_catalog_module_id_idx ON metaschema_modules_public.app_module (catalog_module_id); + CREATE TABLE metaschema_modules_public.database_settings_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -4362,6 +5081,86 @@ CREATE TABLE metaschema_modules_public.database_settings_module ( ON DELETE CASCADE ); -CREATE INDEX database_settings_module_database_id_idx ON metaschema_modules_public.database_settings_module (database_id); +CREATE UNIQUE INDEX database_settings_module_unique_scope ON metaschema_modules_public.database_settings_module (database_id, scope); + +CREATE INDEX database_settings_module_entity_table_id_idx ON metaschema_modules_public.database_settings_module (entity_table_id); + +CREATE INDEX database_settings_module_pubkey_settings_table_id_idx ON metaschema_modules_public.database_settings_module (pubkey_settings_table_id); + +CREATE INDEX database_settings_module_rls_settings_table_id_idx ON metaschema_modules_public.database_settings_module (rls_settings_table_id); + +CREATE INDEX database_settings_module_database_settings_table_id_idx ON metaschema_modules_public.database_settings_module (database_settings_table_id); + +CREATE INDEX database_settings_module_webauthn_settings_table_id_idx ON metaschema_modules_public.database_settings_module (webauthn_settings_table_id); + +CREATE INDEX database_settings_module_schema_id_idx ON metaschema_modules_public.database_settings_module (schema_id); + +CREATE TABLE metaschema_modules_public.pages_module ( + id uuid PRIMARY KEY DEFAULT uuidv7(), + database_id uuid NOT NULL, + public_schema_id uuid NOT NULL DEFAULT uuid_nil(), + private_schema_id uuid NOT NULL DEFAULT uuid_nil(), + public_schema_name text, + private_schema_name text, + scope text NOT NULL, + prefix text NOT NULL, + merkle_store_module_id uuid NOT NULL, + site_surface_module_id uuid, + sites_table_id uuid NOT NULL DEFAULT uuid_nil(), + pages_table_id uuid NOT NULL DEFAULT uuid_nil(), + store_name_prefix text NOT NULL DEFAULT 'site:', + api_name text, + private_api_name text, + entity_table_id uuid NULL, + policies jsonb NULL, + provisions jsonb NULL, + created_at timestamptz NOT NULL DEFAULT now(), + CONSTRAINT pages_module_db_fkey + FOREIGN KEY(database_id) + REFERENCES metaschema_public.database (id) + ON DELETE CASCADE, + CONSTRAINT pages_module_public_schema_fkey + FOREIGN KEY(public_schema_id) + REFERENCES metaschema_public.schema (id) + ON DELETE CASCADE, + CONSTRAINT pages_module_private_schema_fkey + FOREIGN KEY(private_schema_id) + REFERENCES metaschema_public.schema (id) + ON DELETE CASCADE, + CONSTRAINT pages_module_merkle_store_fkey + FOREIGN KEY(merkle_store_module_id) + REFERENCES metaschema_modules_public.merkle_store_module (id) + ON DELETE CASCADE, + CONSTRAINT pages_module_site_surface_fkey + FOREIGN KEY(site_surface_module_id) + REFERENCES metaschema_modules_public.site_surface_module (id) + ON DELETE CASCADE, + CONSTRAINT pages_module_sites_table_fkey + FOREIGN KEY(sites_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + CONSTRAINT pages_module_pages_table_fkey + FOREIGN KEY(pages_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + CONSTRAINT pages_module_entity_table_fkey + FOREIGN KEY(entity_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + CONSTRAINT pages_module_database_scope_unique + UNIQUE (database_id, scope) +); + +CREATE INDEX pages_module_entity_table_id_idx ON metaschema_modules_public.pages_module (entity_table_id); + +CREATE INDEX pages_module_pages_table_id_idx ON metaschema_modules_public.pages_module (pages_table_id); + +CREATE INDEX pages_module_sites_table_id_idx ON metaschema_modules_public.pages_module (sites_table_id); + +CREATE INDEX pages_module_site_surface_module_id_idx ON metaschema_modules_public.pages_module (site_surface_module_id); + +CREATE INDEX pages_module_private_schema_id_idx ON metaschema_modules_public.pages_module (private_schema_id); + +CREATE INDEX pages_module_public_schema_id_idx ON metaschema_modules_public.pages_module (public_schema_id); -CREATE UNIQUE INDEX database_settings_module_unique_scope ON metaschema_modules_public.database_settings_module (database_id, scope); \ No newline at end of file +CREATE INDEX pages_module_merkle_store_module_id_idx ON metaschema_modules_public.pages_module (merkle_store_module_id); \ No newline at end of file diff --git a/packages/metaschema-modules/verify/schemas/metaschema_modules_public/tables/pages_module/table.sql b/packages/metaschema-modules/verify/schemas/metaschema_modules_public/tables/pages_module/table.sql new file mode 100644 index 000000000..f7a7568fa --- /dev/null +++ b/packages/metaschema-modules/verify/schemas/metaschema_modules_public/tables/pages_module/table.sql @@ -0,0 +1,10 @@ +-- Verify schemas/metaschema_modules_public/tables/pages_module/table on pg + +BEGIN; + +SELECT id, database_id, public_schema_id, private_schema_id, merkle_store_module_id, + site_surface_module_id, sites_table_id, pages_table_id, store_name_prefix, scope, prefix + FROM metaschema_modules_public.pages_module + WHERE FALSE; + +ROLLBACK; diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/check_constraint/table.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/check_constraint/table.sql index a5326b313..74cc77e71 100644 --- a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/check_constraint/table.sql +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/check_constraint/table.sql @@ -38,7 +38,6 @@ CREATE TABLE metaschema_public.check_constraint ( ); -CREATE INDEX check_constraint_table_id_idx ON metaschema_public.check_constraint ( table_id ); CREATE INDEX check_constraint_database_id_idx ON metaschema_public.check_constraint ( database_id ); COMMIT; diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/composite_type/table.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/composite_type/table.sql index eea0ffc35..3e5a3f566 100644 --- a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/composite_type/table.sql +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/composite_type/table.sql @@ -30,7 +30,6 @@ CREATE TABLE metaschema_public.composite_type ( UNIQUE (schema_id, name) ); -CREATE INDEX composite_type_schema_id_idx ON metaschema_public.composite_type ( schema_id ); CREATE INDEX composite_type_database_id_idx ON metaschema_public.composite_type ( database_id ); COMMIT; diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/database/table.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/database/table.sql index 624a811dc..0d7f1b82e 100644 --- a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/database/table.sql +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/database/table.sql @@ -30,7 +30,8 @@ ALTER TABLE metaschema_public.database CREATE UNIQUE INDEX databases_database_platform_singleton_idx ON metaschema_public.database (platform) WHERE platform; +CREATE INDEX database_owner_id_idx ON metaschema_public.database ( owner_id ); -COMMENT ON COLUMN metaschema_public.database.schema_hash IS '@omit'; +COMMENT ON COLUMN metaschema_public.database.schema_hash IS '@behavior -*'; COMMIT; diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/default_privilege/table.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/default_privilege/table.sql index c6f94f1b3..9a70e24a6 100644 --- a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/default_privilege/table.sql +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/default_privilege/table.sql @@ -31,7 +31,6 @@ CREATE TABLE metaschema_public.default_privilege ( ); -CREATE INDEX default_privilege_schema_id_idx ON metaschema_public.default_privilege ( schema_id ); CREATE INDEX default_privilege_database_id_idx ON metaschema_public.default_privilege ( database_id ); COMMIT; diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/derives/table.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/derives/table.sql index 6fc61e4ae..04faa7776 100644 --- a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/derives/table.sql +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/derives/table.sql @@ -40,7 +40,6 @@ CREATE TABLE metaschema_public.derives ( CONSTRAINT derives_table_source_uniq UNIQUE (table_id, source_table_id) ); -CREATE INDEX derives_table_id_idx ON metaschema_public.derives ( table_id ); CREATE INDEX derives_source_table_id_idx ON metaschema_public.derives ( source_table_id ); CREATE INDEX derives_database_id_idx ON metaschema_public.derives ( database_id ); diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/domain_type/table.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/domain_type/table.sql index 0dccb6666..50faa22e2 100644 --- a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/domain_type/table.sql +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/domain_type/table.sql @@ -40,7 +40,6 @@ CREATE TABLE metaschema_public.domain_type ( ); -CREATE INDEX domain_type_schema_id_idx ON metaschema_public.domain_type ( schema_id ); CREATE INDEX domain_type_database_id_idx ON metaschema_public.domain_type ( database_id ); COMMIT; diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/embedding_chunks/table.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/embedding_chunks/table.sql index 0d9ba3fb8..26882fb53 100644 --- a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/embedding_chunks/table.sql +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/embedding_chunks/table.sql @@ -66,5 +66,7 @@ CREATE TABLE metaschema_public.embedding_chunks ( CREATE INDEX embedding_chunks_table_id_idx ON metaschema_public.embedding_chunks ( table_id ); CREATE INDEX embedding_chunks_database_id_idx ON metaschema_public.embedding_chunks ( database_id ); CREATE INDEX embedding_chunks_chunks_table_id_idx ON metaschema_public.embedding_chunks ( chunks_table_id ); +CREATE INDEX embedding_chunks_embedding_field_id_idx ON metaschema_public.embedding_chunks ( embedding_field_id ); +CREATE INDEX embedding_chunks_parent_fk_field_id_idx ON metaschema_public.embedding_chunks ( parent_fk_field_id ); COMMIT; diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/enum/table.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/enum/table.sql index 4cb6fd79c..ca320acdb 100644 --- a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/enum/table.sql +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/enum/table.sql @@ -31,7 +31,6 @@ CREATE TABLE metaschema_public.enum ( ); -CREATE INDEX enum_schema_id_idx ON metaschema_public.enum ( schema_id ); CREATE INDEX enum_database_id_idx ON metaschema_public.enum ( database_id ); COMMIT; diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/exclusion_constraint/table.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/exclusion_constraint/table.sql index 82af1e9c2..c5db5e1ed 100644 --- a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/exclusion_constraint/table.sql +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/exclusion_constraint/table.sql @@ -39,7 +39,6 @@ CREATE TABLE metaschema_public.exclusion_constraint ( ); -CREATE INDEX exclusion_constraint_table_id_idx ON metaschema_public.exclusion_constraint ( table_id ); CREATE INDEX exclusion_constraint_database_id_idx ON metaschema_public.exclusion_constraint ( database_id ); COMMIT; diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/field/table.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/field/table.sql index 5925c9268..25a09358d 100644 --- a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/field/table.sql +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/field/table.sql @@ -70,7 +70,6 @@ CREATE TABLE metaschema_public.field ( ); -CREATE INDEX field_table_id_idx ON metaschema_public.field ( table_id ); CREATE INDEX field_database_id_idx ON metaschema_public.field ( database_id ); COMMIT; diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/field_behavior/table.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/field_behavior/table.sql new file mode 100644 index 000000000..da5b01d10 --- /dev/null +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/field_behavior/table.sql @@ -0,0 +1,52 @@ +-- Deploy schemas/metaschema_public/tables/field_behavior/table to pg + +-- requires: schemas/metaschema_public/schema +-- requires: schemas/metaschema_public/tables/database/table +-- requires: schemas/metaschema_public/tables/field/table + +BEGIN; + +-- One row per PostGraphile v5 behavior fragment attached to a field. An +-- entity's fragments are emitted, ordered by sort_order, as a single +-- '@behavior ' smart tag on the corresponding database object: +-- +-- ('-', 'insert') + ('-', 'update') -> @behavior -insert -update +-- +-- `scope` is the fragment's natural key, so an entity carries at most one +-- fragment per scope: writers upsert on (field_id, scope) rather than appending a +-- second fragment that would silently shadow the first. +CREATE TABLE metaschema_public.field_behavior ( + id uuid PRIMARY KEY DEFAULT uuidv7(), + database_id uuid NOT NULL DEFAULT uuid_nil(), + + field_id uuid NOT NULL REFERENCES metaschema_public.field (id) ON DELETE CASCADE, + + -- '+' (grant) or '-' (revoke). PostGraphile infers '+' when the modifier is + -- omitted; we always store it explicitly so fragments round-trip. + modifier char(1) NOT NULL DEFAULT '+', + + -- One or more camelCase words (or '*') joined by ':', e.g. 'insert', + -- 'resource:connection:filter', 'query:*:filter'. + scope text NOT NULL, + + -- Emission order within the entity. Later fragments win in PostGraphile, so + -- sort_order is meaningful when scopes overlap (e.g. '*' before 'insert'). + sort_order int NOT NULL DEFAULT 0, + + created_at timestamptz DEFAULT now(), + updated_at timestamptz DEFAULT now(), + + CONSTRAINT db_fkey FOREIGN KEY (database_id) REFERENCES metaschema_public.database (id) ON DELETE CASCADE, + + CONSTRAINT field_behavior_modifier_check CHECK (modifier IN ('+', '-')), + + CONSTRAINT field_behavior_scope_check CHECK ( + scope ~ '^([a-zA-Z][a-zA-Z0-9]*|\*)(:([a-zA-Z][a-zA-Z0-9]*|\*))*$' + ), + + CONSTRAINT field_behavior_scope_key UNIQUE (field_id, scope) +); + +CREATE INDEX field_behavior_database_id_idx ON metaschema_public.field_behavior ( database_id ); + +COMMIT; diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/foreign_key_constraint/table.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/foreign_key_constraint/table.sql index 05099b146..a08fa8487 100644 --- a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/foreign_key_constraint/table.sql +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/foreign_key_constraint/table.sql @@ -51,7 +51,7 @@ CREATE TABLE metaschema_public.foreign_key_constraint ( ); -CREATE INDEX foreign_key_constraint_table_id_idx ON metaschema_public.foreign_key_constraint ( table_id ); CREATE INDEX foreign_key_constraint_database_id_idx ON metaschema_public.foreign_key_constraint ( database_id ); +CREATE INDEX foreign_key_constraint_ref_table_id_idx ON metaschema_public.foreign_key_constraint ( ref_table_id ); COMMIT; diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/foreign_key_constraint_behavior/table.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/foreign_key_constraint_behavior/table.sql new file mode 100644 index 000000000..1c4de0306 --- /dev/null +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/foreign_key_constraint_behavior/table.sql @@ -0,0 +1,52 @@ +-- Deploy schemas/metaschema_public/tables/foreign_key_constraint_behavior/table to pg + +-- requires: schemas/metaschema_public/schema +-- requires: schemas/metaschema_public/tables/database/table +-- requires: schemas/metaschema_public/tables/foreign_key_constraint/table + +BEGIN; + +-- One row per PostGraphile v5 behavior fragment attached to a foreign key constraint. An +-- entity's fragments are emitted, ordered by sort_order, as a single +-- '@behavior ' smart tag on the corresponding database object: +-- +-- ('-', 'insert') + ('-', 'update') -> @behavior -insert -update +-- +-- `scope` is the fragment's natural key, so an entity carries at most one +-- fragment per scope: writers upsert on (foreign_key_constraint_id, scope) rather than appending a +-- second fragment that would silently shadow the first. +CREATE TABLE metaschema_public.foreign_key_constraint_behavior ( + id uuid PRIMARY KEY DEFAULT uuidv7(), + database_id uuid NOT NULL DEFAULT uuid_nil(), + + foreign_key_constraint_id uuid NOT NULL REFERENCES metaschema_public.foreign_key_constraint (id) ON DELETE CASCADE, + + -- '+' (grant) or '-' (revoke). PostGraphile infers '+' when the modifier is + -- omitted; we always store it explicitly so fragments round-trip. + modifier char(1) NOT NULL DEFAULT '+', + + -- One or more camelCase words (or '*') joined by ':', e.g. 'insert', + -- 'resource:connection:filter', 'query:*:filter'. + scope text NOT NULL, + + -- Emission order within the entity. Later fragments win in PostGraphile, so + -- sort_order is meaningful when scopes overlap (e.g. '*' before 'insert'). + sort_order int NOT NULL DEFAULT 0, + + created_at timestamptz DEFAULT now(), + updated_at timestamptz DEFAULT now(), + + CONSTRAINT db_fkey FOREIGN KEY (database_id) REFERENCES metaschema_public.database (id) ON DELETE CASCADE, + + CONSTRAINT foreign_key_constraint_behavior_modifier_check CHECK (modifier IN ('+', '-')), + + CONSTRAINT foreign_key_constraint_behavior_scope_check CHECK ( + scope ~ '^([a-zA-Z][a-zA-Z0-9]*|\*)(:([a-zA-Z][a-zA-Z0-9]*|\*))*$' + ), + + CONSTRAINT foreign_key_constraint_behavior_scope_key UNIQUE (foreign_key_constraint_id, scope) +); + +CREATE INDEX foreign_key_constraint_behavior_database_id_idx ON metaschema_public.foreign_key_constraint_behavior ( database_id ); + +COMMIT; diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/function/table.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/function/table.sql index 0f0b33e38..8f5980c1d 100644 --- a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/function/table.sql +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/function/table.sql @@ -21,6 +21,5 @@ CREATE TABLE metaschema_public.function ( ); CREATE INDEX function_database_id_idx ON metaschema_public.function ( database_id ); -CREATE INDEX function_schema_id_idx ON metaschema_public.function ( schema_id ); COMMIT; diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/index/table.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/index/table.sql index a2295c7b3..671bf9567 100644 --- a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/index/table.sql +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/index/table.sql @@ -43,6 +43,5 @@ CREATE TABLE metaschema_public.index ( CREATE INDEX index_table_id_idx ON metaschema_public.index ( table_id ); -CREATE INDEX index_database_id_idx ON metaschema_public.index ( database_id ); COMMIT; diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/partition/table.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/partition/table.sql index 6385452e5..91d446617 100644 --- a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/partition/table.sql +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/partition/table.sql @@ -43,5 +43,6 @@ CREATE TABLE metaschema_public.partition ( CREATE INDEX partition_database_id_idx ON metaschema_public.partition (database_id); +CREATE INDEX partition_partition_key_id_idx ON metaschema_public.partition ( partition_key_id ); COMMIT; diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/policy/table.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/policy/table.sql index c387a7a53..49c1f3ca4 100644 --- a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/policy/table.sql +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/policy/table.sql @@ -66,7 +66,6 @@ COMMENT ON COLUMN metaschema_public.policy.with_check IS 'Optional WITH CHECK override node {"$type": "Authz...", "data": {...}}. Only valid for UPDATE policies; NULL inherits the USING expression.'; -CREATE INDEX policy_table_id_idx ON metaschema_public.policy ( table_id ); CREATE INDEX policy_database_id_idx ON metaschema_public.policy ( database_id ); CREATE INDEX policy_derived_from_table_id_idx ON metaschema_public.policy ( derived_from_table_id ) WHERE derived_from_table_id IS NOT NULL; CREATE INDEX policy_derived_from_policy_id_idx ON metaschema_public.policy ( derived_from_policy_id ) WHERE derived_from_policy_id IS NOT NULL; diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/primary_key_constraint/table.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/primary_key_constraint/table.sql index 4136eb0ed..94bcc9d4d 100644 --- a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/primary_key_constraint/table.sql +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/primary_key_constraint/table.sql @@ -39,7 +39,6 @@ CREATE TABLE metaschema_public.primary_key_constraint ( ); -CREATE INDEX primary_key_constraint_table_id_idx ON metaschema_public.primary_key_constraint ( table_id ); CREATE INDEX primary_key_constraint_database_id_idx ON metaschema_public.primary_key_constraint ( database_id ); COMMIT; diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/schema/table.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/schema/table.sql index 44a9be587..708c2d7e6 100644 --- a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/schema/table.sql +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/schema/table.sql @@ -36,11 +36,9 @@ CREATE TABLE metaschema_public.schema ( ); -- TODO: build out services --- COMMENT ON COLUMN metaschema_public.schema.schema_name IS '@omit'; +-- COMMENT ON COLUMN metaschema_public.schema.schema_name IS '@behavior -*'; ALTER TABLE metaschema_public.schema ADD CONSTRAINT schema_namechk CHECK (char_length(name) > 2); -CREATE INDEX schema_database_id_idx ON metaschema_public.schema ( database_id ); - COMMIT; diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/spatial_relation/table.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/spatial_relation/table.sql index 8a47c4d6e..1c3d883be 100644 --- a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/spatial_relation/table.sql +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/spatial_relation/table.sql @@ -57,7 +57,6 @@ CREATE TABLE metaschema_public.spatial_relation ( ) ); -CREATE INDEX spatial_relation_table_id_idx ON metaschema_public.spatial_relation ( table_id ); CREATE INDEX spatial_relation_field_id_idx ON metaschema_public.spatial_relation ( field_id ); CREATE INDEX spatial_relation_database_id_idx ON metaschema_public.spatial_relation ( database_id ); CREATE INDEX spatial_relation_ref_table_id_idx ON metaschema_public.spatial_relation ( ref_table_id ); diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/table/table.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/table/table.sql index 7322b1a12..614782ef3 100644 --- a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/table/table.sql +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/table/table.sql @@ -61,7 +61,7 @@ ALTER TABLE metaschema_public.table ADD COLUMN CREATE INDEX table_schema_id_idx ON metaschema_public.table ( schema_id ); -CREATE INDEX table_database_id_idx ON metaschema_public.table ( database_id ); +CREATE INDEX table_inherits_id_idx ON metaschema_public.table ( inherits_id ); COMMIT; diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/table_behavior/table.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/table_behavior/table.sql new file mode 100644 index 000000000..cdea49e7c --- /dev/null +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/table_behavior/table.sql @@ -0,0 +1,52 @@ +-- Deploy schemas/metaschema_public/tables/table_behavior/table to pg + +-- requires: schemas/metaschema_public/schema +-- requires: schemas/metaschema_public/tables/database/table +-- requires: schemas/metaschema_public/tables/table/table + +BEGIN; + +-- One row per PostGraphile v5 behavior fragment attached to a table. An +-- entity's fragments are emitted, ordered by sort_order, as a single +-- '@behavior ' smart tag on the corresponding database object: +-- +-- ('-', 'insert') + ('-', 'update') -> @behavior -insert -update +-- +-- `scope` is the fragment's natural key, so an entity carries at most one +-- fragment per scope: writers upsert on (table_id, scope) rather than appending a +-- second fragment that would silently shadow the first. +CREATE TABLE metaschema_public.table_behavior ( + id uuid PRIMARY KEY DEFAULT uuidv7(), + database_id uuid NOT NULL DEFAULT uuid_nil(), + + table_id uuid NOT NULL REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + + -- '+' (grant) or '-' (revoke). PostGraphile infers '+' when the modifier is + -- omitted; we always store it explicitly so fragments round-trip. + modifier char(1) NOT NULL DEFAULT '+', + + -- One or more camelCase words (or '*') joined by ':', e.g. 'insert', + -- 'resource:connection:filter', 'query:*:filter'. + scope text NOT NULL, + + -- Emission order within the entity. Later fragments win in PostGraphile, so + -- sort_order is meaningful when scopes overlap (e.g. '*' before 'insert'). + sort_order int NOT NULL DEFAULT 0, + + created_at timestamptz DEFAULT now(), + updated_at timestamptz DEFAULT now(), + + CONSTRAINT db_fkey FOREIGN KEY (database_id) REFERENCES metaschema_public.database (id) ON DELETE CASCADE, + + CONSTRAINT table_behavior_modifier_check CHECK (modifier IN ('+', '-')), + + CONSTRAINT table_behavior_scope_check CHECK ( + scope ~ '^([a-zA-Z][a-zA-Z0-9]*|\*)(:([a-zA-Z][a-zA-Z0-9]*|\*))*$' + ), + + CONSTRAINT table_behavior_scope_key UNIQUE (table_id, scope) +); + +CREATE INDEX table_behavior_database_id_idx ON metaschema_public.table_behavior ( database_id ); + +COMMIT; diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/trigger/table.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/trigger/table.sql index 710b003c2..7cd4f7ab1 100644 --- a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/trigger/table.sql +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/trigger/table.sql @@ -33,7 +33,6 @@ CREATE TABLE metaschema_public.trigger ( ); -CREATE INDEX trigger_table_id_idx ON metaschema_public.trigger ( table_id ); CREATE INDEX trigger_database_id_idx ON metaschema_public.trigger ( database_id ); COMMIT; diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/trigger_function/table.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/trigger_function/table.sql index 161e09fd4..63260be72 100644 --- a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/trigger_function/table.sql +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/trigger_function/table.sql @@ -20,6 +20,4 @@ CREATE TABLE metaschema_public.trigger_function ( UNIQUE (database_id, name) ); -CREATE INDEX trigger_function_database_id_idx ON metaschema_public.trigger_function ( database_id ); - COMMIT; diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/unique_constraint/table.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/unique_constraint/table.sql index 7043e8c7c..156a3751b 100644 --- a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/unique_constraint/table.sql +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/unique_constraint/table.sql @@ -44,7 +44,6 @@ CREATE TABLE metaschema_public.unique_constraint ( ); -CREATE INDEX unique_constraint_table_id_idx ON metaschema_public.unique_constraint ( table_id ); CREATE INDEX unique_constraint_database_id_idx ON metaschema_public.unique_constraint ( database_id ); COMMIT; diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/unique_constraint_behavior/table.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/unique_constraint_behavior/table.sql new file mode 100644 index 000000000..48ad6eac0 --- /dev/null +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/unique_constraint_behavior/table.sql @@ -0,0 +1,52 @@ +-- Deploy schemas/metaschema_public/tables/unique_constraint_behavior/table to pg + +-- requires: schemas/metaschema_public/schema +-- requires: schemas/metaschema_public/tables/database/table +-- requires: schemas/metaschema_public/tables/unique_constraint/table + +BEGIN; + +-- One row per PostGraphile v5 behavior fragment attached to a unique constraint. An +-- entity's fragments are emitted, ordered by sort_order, as a single +-- '@behavior ' smart tag on the corresponding database object: +-- +-- ('-', 'insert') + ('-', 'update') -> @behavior -insert -update +-- +-- `scope` is the fragment's natural key, so an entity carries at most one +-- fragment per scope: writers upsert on (unique_constraint_id, scope) rather than appending a +-- second fragment that would silently shadow the first. +CREATE TABLE metaschema_public.unique_constraint_behavior ( + id uuid PRIMARY KEY DEFAULT uuidv7(), + database_id uuid NOT NULL DEFAULT uuid_nil(), + + unique_constraint_id uuid NOT NULL REFERENCES metaschema_public.unique_constraint (id) ON DELETE CASCADE, + + -- '+' (grant) or '-' (revoke). PostGraphile infers '+' when the modifier is + -- omitted; we always store it explicitly so fragments round-trip. + modifier char(1) NOT NULL DEFAULT '+', + + -- One or more camelCase words (or '*') joined by ':', e.g. 'insert', + -- 'resource:connection:filter', 'query:*:filter'. + scope text NOT NULL, + + -- Emission order within the entity. Later fragments win in PostGraphile, so + -- sort_order is meaningful when scopes overlap (e.g. '*' before 'insert'). + sort_order int NOT NULL DEFAULT 0, + + created_at timestamptz DEFAULT now(), + updated_at timestamptz DEFAULT now(), + + CONSTRAINT db_fkey FOREIGN KEY (database_id) REFERENCES metaschema_public.database (id) ON DELETE CASCADE, + + CONSTRAINT unique_constraint_behavior_modifier_check CHECK (modifier IN ('+', '-')), + + CONSTRAINT unique_constraint_behavior_scope_check CHECK ( + scope ~ '^([a-zA-Z][a-zA-Z0-9]*|\*)(:([a-zA-Z][a-zA-Z0-9]*|\*))*$' + ), + + CONSTRAINT unique_constraint_behavior_scope_key UNIQUE (unique_constraint_id, scope) +); + +CREATE INDEX unique_constraint_behavior_database_id_idx ON metaschema_public.unique_constraint_behavior ( database_id ); + +COMMIT; diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/view/table.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/view/table.sql index 7091c7766..d82ea5a3f 100644 --- a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/view/table.sql +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/view/table.sql @@ -52,7 +52,6 @@ CREATE TABLE metaschema_public.view ( ); -CREATE INDEX view_schema_id_idx ON metaschema_public.view ( schema_id ); CREATE INDEX view_database_id_idx ON metaschema_public.view ( database_id ); CREATE INDEX view_table_id_idx ON metaschema_public.view ( table_id ); diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/view_behavior/table.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/view_behavior/table.sql new file mode 100644 index 000000000..902b54332 --- /dev/null +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/view_behavior/table.sql @@ -0,0 +1,52 @@ +-- Deploy schemas/metaschema_public/tables/view_behavior/table to pg + +-- requires: schemas/metaschema_public/schema +-- requires: schemas/metaschema_public/tables/database/table +-- requires: schemas/metaschema_public/tables/view/table + +BEGIN; + +-- One row per PostGraphile v5 behavior fragment attached to a view. An +-- entity's fragments are emitted, ordered by sort_order, as a single +-- '@behavior ' smart tag on the corresponding database object: +-- +-- ('-', 'insert') + ('-', 'update') -> @behavior -insert -update +-- +-- `scope` is the fragment's natural key, so an entity carries at most one +-- fragment per scope: writers upsert on (view_id, scope) rather than appending a +-- second fragment that would silently shadow the first. +CREATE TABLE metaschema_public.view_behavior ( + id uuid PRIMARY KEY DEFAULT uuidv7(), + database_id uuid NOT NULL DEFAULT uuid_nil(), + + view_id uuid NOT NULL REFERENCES metaschema_public.view (id) ON DELETE CASCADE, + + -- '+' (grant) or '-' (revoke). PostGraphile infers '+' when the modifier is + -- omitted; we always store it explicitly so fragments round-trip. + modifier char(1) NOT NULL DEFAULT '+', + + -- One or more camelCase words (or '*') joined by ':', e.g. 'insert', + -- 'resource:connection:filter', 'query:*:filter'. + scope text NOT NULL, + + -- Emission order within the entity. Later fragments win in PostGraphile, so + -- sort_order is meaningful when scopes overlap (e.g. '*' before 'insert'). + sort_order int NOT NULL DEFAULT 0, + + created_at timestamptz DEFAULT now(), + updated_at timestamptz DEFAULT now(), + + CONSTRAINT db_fkey FOREIGN KEY (database_id) REFERENCES metaschema_public.database (id) ON DELETE CASCADE, + + CONSTRAINT view_behavior_modifier_check CHECK (modifier IN ('+', '-')), + + CONSTRAINT view_behavior_scope_check CHECK ( + scope ~ '^([a-zA-Z][a-zA-Z0-9]*|\*)(:([a-zA-Z][a-zA-Z0-9]*|\*))*$' + ), + + CONSTRAINT view_behavior_scope_key UNIQUE (view_id, scope) +); + +CREATE INDEX view_behavior_database_id_idx ON metaschema_public.view_behavior ( database_id ); + +COMMIT; diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/view_grant/table.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/view_grant/table.sql index a87f7e255..d6306164d 100644 --- a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/view_grant/table.sql +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/view_grant/table.sql @@ -26,7 +26,6 @@ CREATE TABLE metaschema_public.view_grant ( ); -CREATE INDEX view_grant_view_id_idx ON metaschema_public.view_grant ( view_id ); CREATE INDEX view_grant_database_id_idx ON metaschema_public.view_grant ( database_id ); COMMIT; diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/view_rule/table.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/view_rule/table.sql index 116203ea7..d7f999a20 100644 --- a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/view_rule/table.sql +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/view_rule/table.sql @@ -26,7 +26,6 @@ COMMENT ON COLUMN metaschema_public.view_rule.event IS 'INSERT, UPDATE, or DELET COMMENT ON COLUMN metaschema_public.view_rule.action IS 'NOTHING (for read-only) or custom action'; -CREATE INDEX view_rule_view_id_idx ON metaschema_public.view_rule ( view_id ); CREATE INDEX view_rule_database_id_idx ON metaschema_public.view_rule ( database_id ); COMMIT; diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/view_table/table.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/view_table/table.sql index 2e065e53e..2a60ed9fc 100644 --- a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/view_table/table.sql +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/view_table/table.sql @@ -29,7 +29,6 @@ CREATE TABLE metaschema_public.view_table ( COMMENT ON TABLE metaschema_public.view_table IS 'Junction table linking views to their joined tables for referential integrity'; CREATE INDEX view_table_database_id_idx ON metaschema_public.view_table ( database_id ); -CREATE INDEX view_table_view_id_idx ON metaschema_public.view_table ( view_id ); CREATE INDEX view_table_table_id_idx ON metaschema_public.view_table ( table_id ); COMMIT; diff --git a/packages/metaschema-schema/pgpm.plan b/packages/metaschema-schema/pgpm.plan index 77681ca87..cf67a3381 100644 --- a/packages/metaschema-schema/pgpm.plan +++ b/packages/metaschema-schema/pgpm.plan @@ -41,3 +41,8 @@ schemas/metaschema_public/tables/domain_type/table [schemas/metaschema_public/sc schemas/metaschema_public/tables/schema/triggers/enforce_api_exposure_ratchet [schemas/metaschema_public/tables/schema/table] 2026-06-18T00:00:03Z devin # enforce one-way ratchet on api_exposure (never_expose is permanent) schemas/metaschema_public/tables/exclusion_constraint/table [schemas/metaschema_public/schema schemas/metaschema_public/tables/database/table schemas/metaschema_public/tables/table/table schemas/metaschema_public/types/object_category] 2026-07-22T00:00:00Z devin # add metaschema_public.exclusion_constraint table for EXCLUDE constraints schemas/metaschema_public/tables/derives/table [schemas/metaschema_public/schema schemas/metaschema_public/tables/database/table schemas/metaschema_public/tables/table/table] 2026-07-30T00:00:00Z devin # add metaschema_public.derives: derived companion table provenance (history/i18n) +schemas/metaschema_public/tables/table_behavior/table [schemas/metaschema_public/schema schemas/metaschema_public/tables/database/table schemas/metaschema_public/tables/table/table] 2026-08-01T00:00:00Z devin # add metaschema_public.table_behavior: one row per PostGraphile v5 behavior fragment +schemas/metaschema_public/tables/field_behavior/table [schemas/metaschema_public/schema schemas/metaschema_public/tables/database/table schemas/metaschema_public/tables/field/table] 2026-08-01T00:00:00Z devin # add metaschema_public.field_behavior: one row per PostGraphile v5 behavior fragment +schemas/metaschema_public/tables/view_behavior/table [schemas/metaschema_public/schema schemas/metaschema_public/tables/database/table schemas/metaschema_public/tables/view/table] 2026-08-01T00:00:00Z devin # add metaschema_public.view_behavior: one row per PostGraphile v5 behavior fragment +schemas/metaschema_public/tables/foreign_key_constraint_behavior/table [schemas/metaschema_public/schema schemas/metaschema_public/tables/database/table schemas/metaschema_public/tables/foreign_key_constraint/table] 2026-08-01T00:00:00Z devin # add metaschema_public.foreign_key_constraint_behavior: one row per PostGraphile v5 behavior fragment +schemas/metaschema_public/tables/unique_constraint_behavior/table [schemas/metaschema_public/schema schemas/metaschema_public/tables/database/table schemas/metaschema_public/tables/unique_constraint/table] 2026-08-01T00:00:00Z devin # add metaschema_public.unique_constraint_behavior: one row per PostGraphile v5 behavior fragment diff --git a/packages/metaschema-schema/revert/schemas/metaschema_public/tables/field/table.sql b/packages/metaschema-schema/revert/schemas/metaschema_public/tables/field/table.sql index ee7d49d0d..eaf7fae30 100644 --- a/packages/metaschema-schema/revert/schemas/metaschema_public/tables/field/table.sql +++ b/packages/metaschema-schema/revert/schemas/metaschema_public/tables/field/table.sql @@ -2,7 +2,6 @@ BEGIN; DROP INDEX metaschema_public.field_database_id_idx; -DROP INDEX metaschema_public.field_table_id_idx; DROP TABLE metaschema_public.field; COMMIT; diff --git a/packages/metaschema-schema/revert/schemas/metaschema_public/tables/field_behavior/table.sql b/packages/metaschema-schema/revert/schemas/metaschema_public/tables/field_behavior/table.sql new file mode 100644 index 000000000..1f8e292f7 --- /dev/null +++ b/packages/metaschema-schema/revert/schemas/metaschema_public/tables/field_behavior/table.sql @@ -0,0 +1,7 @@ +-- Revert schemas/metaschema_public/tables/field_behavior/table from pg + +BEGIN; + +DROP TABLE metaschema_public.field_behavior; + +COMMIT; diff --git a/packages/metaschema-schema/revert/schemas/metaschema_public/tables/foreign_key_constraint_behavior/table.sql b/packages/metaschema-schema/revert/schemas/metaschema_public/tables/foreign_key_constraint_behavior/table.sql new file mode 100644 index 000000000..f8afdee5e --- /dev/null +++ b/packages/metaschema-schema/revert/schemas/metaschema_public/tables/foreign_key_constraint_behavior/table.sql @@ -0,0 +1,7 @@ +-- Revert schemas/metaschema_public/tables/foreign_key_constraint_behavior/table from pg + +BEGIN; + +DROP TABLE metaschema_public.foreign_key_constraint_behavior; + +COMMIT; diff --git a/packages/metaschema-schema/revert/schemas/metaschema_public/tables/table_behavior/table.sql b/packages/metaschema-schema/revert/schemas/metaschema_public/tables/table_behavior/table.sql new file mode 100644 index 000000000..f892305e9 --- /dev/null +++ b/packages/metaschema-schema/revert/schemas/metaschema_public/tables/table_behavior/table.sql @@ -0,0 +1,7 @@ +-- Revert schemas/metaschema_public/tables/table_behavior/table from pg + +BEGIN; + +DROP TABLE metaschema_public.table_behavior; + +COMMIT; diff --git a/packages/metaschema-schema/revert/schemas/metaschema_public/tables/unique_constraint_behavior/table.sql b/packages/metaschema-schema/revert/schemas/metaschema_public/tables/unique_constraint_behavior/table.sql new file mode 100644 index 000000000..4c7b80ab3 --- /dev/null +++ b/packages/metaschema-schema/revert/schemas/metaschema_public/tables/unique_constraint_behavior/table.sql @@ -0,0 +1,7 @@ +-- Revert schemas/metaschema_public/tables/unique_constraint_behavior/table from pg + +BEGIN; + +DROP TABLE metaschema_public.unique_constraint_behavior; + +COMMIT; diff --git a/packages/metaschema-schema/revert/schemas/metaschema_public/tables/view_behavior/table.sql b/packages/metaschema-schema/revert/schemas/metaschema_public/tables/view_behavior/table.sql new file mode 100644 index 000000000..0dafd0c4c --- /dev/null +++ b/packages/metaschema-schema/revert/schemas/metaschema_public/tables/view_behavior/table.sql @@ -0,0 +1,7 @@ +-- Revert schemas/metaschema_public/tables/view_behavior/table from pg + +BEGIN; + +DROP TABLE metaschema_public.view_behavior; + +COMMIT; diff --git a/packages/metaschema-schema/sql/metaschema-schema--0.34.0.bundle.tar.gz b/packages/metaschema-schema/sql/metaschema-schema--0.34.0.bundle.tar.gz index c08deba0ddca91cc57be2db2602b24a29530b3f1..72107662ede792432812b86d9fdc77258ba08967 100644 GIT binary patch literal 28239 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 W{2V{W&++rn&;JKVh+(q;>;eGkBS%{R delta 25858 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

Rg%W#=F4v3>$}dxyt2>B-m)jT5_3OOywP_ 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 2); -CREATE INDEX schema_database_id_idx ON metaschema_public.schema (database_id); - CREATE TABLE metaschema_public.table ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL DEFAULT uuid_nil(), @@ -378,7 +378,7 @@ ALTER TABLE metaschema_public.table CREATE INDEX table_schema_id_idx ON metaschema_public.table (schema_id); -CREATE INDEX table_database_id_idx ON metaschema_public.table (database_id); +CREATE INDEX table_inherits_id_idx ON metaschema_public.table (inherits_id); CREATE TABLE metaschema_public.check_constraint ( id uuid PRIMARY KEY DEFAULT uuidv7(), @@ -407,8 +407,6 @@ CREATE TABLE metaschema_public.check_constraint ( CHECK (field_ids <> '{}') ); -CREATE INDEX check_constraint_table_id_idx ON metaschema_public.check_constraint (table_id); - CREATE INDEX check_constraint_database_id_idx ON metaschema_public.check_constraint (database_id); CREATE FUNCTION metaschema_private.database_name_hash( @@ -457,8 +455,6 @@ CREATE TABLE metaschema_public.field ( UNIQUE (table_id, name) ); -CREATE INDEX field_table_id_idx ON metaschema_public.field (table_id); - CREATE INDEX field_database_id_idx ON metaschema_public.field (database_id); CREATE UNIQUE INDEX databases_field_uniq_names_idx ON metaschema_public.field (table_id, (decode(md5(lower(CASE @@ -508,10 +504,10 @@ CREATE TABLE metaschema_public.foreign_key_constraint ( CHECK (ref_field_ids <> '{}') ); -CREATE INDEX foreign_key_constraint_table_id_idx ON metaschema_public.foreign_key_constraint (table_id); - CREATE INDEX foreign_key_constraint_database_id_idx ON metaschema_public.foreign_key_constraint (database_id); +CREATE INDEX foreign_key_constraint_ref_table_id_idx ON metaschema_public.foreign_key_constraint (ref_table_id); + CREATE TABLE metaschema_public.full_text_search ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL DEFAULT uuid_nil(), @@ -572,8 +568,6 @@ CREATE TABLE metaschema_public.index ( CREATE INDEX index_table_id_idx ON metaschema_public.index (table_id); -CREATE INDEX index_database_id_idx ON metaschema_public.index (database_id); - CREATE TABLE metaschema_public.policy ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL DEFAULT uuid_nil(), @@ -623,8 +617,6 @@ CREATE TABLE metaschema_public.policy ( COMMENT ON COLUMN metaschema_public.policy.with_check IS 'Optional WITH CHECK override node {"$type": "Authz...", "data": {...}}. Only valid for UPDATE policies; NULL inherits the USING expression.'; -CREATE INDEX policy_table_id_idx ON metaschema_public.policy (table_id); - CREATE INDEX policy_database_id_idx ON metaschema_public.policy (database_id); CREATE INDEX policy_derived_from_table_id_idx ON metaschema_public.policy (derived_from_table_id) WHERE derived_from_table_id IS NOT NULL; @@ -658,8 +650,6 @@ CREATE TABLE metaschema_public.primary_key_constraint ( CHECK (field_ids <> '{}') ); -CREATE INDEX primary_key_constraint_table_id_idx ON metaschema_public.primary_key_constraint (table_id); - CREATE INDEX primary_key_constraint_database_id_idx ON metaschema_public.primary_key_constraint (database_id); CREATE TABLE metaschema_public.schema_grant ( @@ -732,8 +722,6 @@ CREATE TABLE metaschema_public.trigger_function ( UNIQUE (database_id, name) ); -CREATE INDEX trigger_function_database_id_idx ON metaschema_public.trigger_function (database_id); - CREATE TABLE metaschema_public.trigger ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL DEFAULT uuid_nil(), @@ -757,8 +745,6 @@ CREATE TABLE metaschema_public.trigger ( UNIQUE (table_id, name) ); -CREATE INDEX trigger_table_id_idx ON metaschema_public.trigger (table_id); - CREATE INDEX trigger_database_id_idx ON metaschema_public.trigger (database_id); CREATE TABLE metaschema_public.unique_constraint ( @@ -789,8 +775,6 @@ CREATE TABLE metaschema_public.unique_constraint ( CHECK (field_ids <> '{}') ); -CREATE INDEX unique_constraint_table_id_idx ON metaschema_public.unique_constraint (table_id); - CREATE INDEX unique_constraint_database_id_idx ON metaschema_public.unique_constraint (database_id); CREATE TABLE metaschema_public.view ( @@ -830,8 +814,6 @@ CREATE TABLE metaschema_public.view ( UNIQUE (schema_id, name) ); -CREATE INDEX view_schema_id_idx ON metaschema_public.view (schema_id); - CREATE INDEX view_database_id_idx ON metaschema_public.view (database_id); CREATE INDEX view_table_id_idx ON metaschema_public.view (table_id); @@ -861,8 +843,6 @@ COMMENT ON TABLE metaschema_public.view_table IS 'Junction table linking views t CREATE INDEX view_table_database_id_idx ON metaschema_public.view_table (database_id); -CREATE INDEX view_table_view_id_idx ON metaschema_public.view_table (view_id); - CREATE INDEX view_table_table_id_idx ON metaschema_public.view_table (table_id); CREATE TABLE metaschema_public.view_grant ( @@ -884,8 +864,6 @@ CREATE TABLE metaschema_public.view_grant ( UNIQUE (view_id, grantee_name, privilege, is_grant) ); -CREATE INDEX view_grant_view_id_idx ON metaschema_public.view_grant (view_id); - CREATE INDEX view_grant_database_id_idx ON metaschema_public.view_grant (database_id); CREATE TABLE metaschema_public.view_rule ( @@ -912,8 +890,6 @@ COMMENT ON COLUMN metaschema_public.view_rule.event IS 'INSERT, UPDATE, or DELET COMMENT ON COLUMN metaschema_public.view_rule.action IS 'NOTHING (for read-only) or custom action'; -CREATE INDEX view_rule_view_id_idx ON metaschema_public.view_rule (view_id); - CREATE INDEX view_rule_database_id_idx ON metaschema_public.view_rule (database_id); CREATE TABLE metaschema_public.default_privilege ( @@ -935,8 +911,6 @@ CREATE TABLE metaschema_public.default_privilege ( UNIQUE (schema_id, object_type, privilege, grantee_name, is_grant) ); -CREATE INDEX default_privilege_schema_id_idx ON metaschema_public.default_privilege (schema_id); - CREATE INDEX default_privilege_database_id_idx ON metaschema_public.default_privilege (database_id); CREATE TABLE metaschema_public.enum ( @@ -961,8 +935,6 @@ CREATE TABLE metaschema_public.enum ( UNIQUE (schema_id, name) ); -CREATE INDEX enum_schema_id_idx ON metaschema_public.enum (schema_id); - CREATE INDEX enum_database_id_idx ON metaschema_public.enum (database_id); CREATE TABLE metaschema_public.embedding_chunks ( @@ -1028,6 +1000,10 @@ CREATE INDEX embedding_chunks_database_id_idx ON metaschema_public.embedding_chu CREATE INDEX embedding_chunks_chunks_table_id_idx ON metaschema_public.embedding_chunks (chunks_table_id); +CREATE INDEX embedding_chunks_embedding_field_id_idx ON metaschema_public.embedding_chunks (embedding_field_id); + +CREATE INDEX embedding_chunks_parent_fk_field_id_idx ON metaschema_public.embedding_chunks (parent_fk_field_id); + CREATE TABLE metaschema_public.spatial_relation ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL DEFAULT uuid_nil(), @@ -1072,8 +1048,6 @@ CREATE TABLE metaschema_public.spatial_relation ( ) ); -CREATE INDEX spatial_relation_table_id_idx ON metaschema_public.spatial_relation (table_id); - CREATE INDEX spatial_relation_field_id_idx ON metaschema_public.spatial_relation (field_id); CREATE INDEX spatial_relation_database_id_idx ON metaschema_public.spatial_relation (database_id); @@ -1112,8 +1086,6 @@ CREATE TABLE metaschema_public.function ( CREATE INDEX function_database_id_idx ON metaschema_public.function (database_id); -CREATE INDEX function_schema_id_idx ON metaschema_public.function (schema_id); - CREATE TABLE metaschema_public.partition ( id uuid PRIMARY KEY DEFAULT uuid_generate_v4(), database_id uuid NOT NULL, @@ -1145,6 +1117,8 @@ CREATE TABLE metaschema_public.partition ( CREATE INDEX partition_database_id_idx ON metaschema_public.partition (database_id); +CREATE INDEX partition_partition_key_id_idx ON metaschema_public.partition (partition_key_id); + CREATE TABLE metaschema_public.composite_type ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -1167,8 +1141,6 @@ CREATE TABLE metaschema_public.composite_type ( UNIQUE (schema_id, name) ); -CREATE INDEX composite_type_schema_id_idx ON metaschema_public.composite_type (schema_id); - CREATE INDEX composite_type_database_id_idx ON metaschema_public.composite_type (database_id); CREATE TABLE metaschema_public.domain_type ( @@ -1196,8 +1168,6 @@ CREATE TABLE metaschema_public.domain_type ( UNIQUE (schema_id, name) ); -CREATE INDEX domain_type_schema_id_idx ON metaschema_public.domain_type (schema_id); - CREATE INDEX domain_type_database_id_idx ON metaschema_public.domain_type (database_id); CREATE FUNCTION metaschema_public.tg_enforce_api_exposure_ratchet() RETURNS trigger AS $EOFCODE$ @@ -1246,8 +1216,6 @@ CREATE TABLE metaschema_public.exclusion_constraint ( UNIQUE (table_id, name) ); -CREATE INDEX exclusion_constraint_table_id_idx ON metaschema_public.exclusion_constraint (table_id); - CREATE INDEX exclusion_constraint_database_id_idx ON metaschema_public.exclusion_constraint (database_id); CREATE TABLE metaschema_public.derives ( @@ -1280,8 +1248,126 @@ CREATE TABLE metaschema_public.derives ( UNIQUE (table_id, source_table_id) ); -CREATE INDEX derives_table_id_idx ON metaschema_public.derives (table_id); - CREATE INDEX derives_source_table_id_idx ON metaschema_public.derives (source_table_id); -CREATE INDEX derives_database_id_idx ON metaschema_public.derives (database_id); \ No newline at end of file +CREATE INDEX derives_database_id_idx ON metaschema_public.derives (database_id); + +CREATE TABLE metaschema_public.table_behavior ( + id uuid PRIMARY KEY DEFAULT uuidv7(), + database_id uuid NOT NULL DEFAULT uuid_nil(), + table_id uuid NOT NULL REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + modifier char(1) NOT NULL DEFAULT '+', + scope text NOT NULL, + sort_order int NOT NULL DEFAULT 0, + created_at timestamptz DEFAULT now(), + updated_at timestamptz DEFAULT now(), + CONSTRAINT db_fkey + FOREIGN KEY(database_id) + REFERENCES metaschema_public.database (id) + ON DELETE CASCADE, + CONSTRAINT table_behavior_modifier_check + CHECK (modifier IN ('+', '-')), + CONSTRAINT table_behavior_scope_check + CHECK (scope ~ E'^([a-zA-Z][a-zA-Z0-9]*|\\*)(:([a-zA-Z][a-zA-Z0-9]*|\\*))*$'), + CONSTRAINT table_behavior_scope_key + UNIQUE (table_id, scope) +); + +CREATE INDEX table_behavior_database_id_idx ON metaschema_public.table_behavior (database_id); + +CREATE TABLE metaschema_public.field_behavior ( + id uuid PRIMARY KEY DEFAULT uuidv7(), + database_id uuid NOT NULL DEFAULT uuid_nil(), + field_id uuid NOT NULL REFERENCES metaschema_public.field (id) + ON DELETE CASCADE, + modifier char(1) NOT NULL DEFAULT '+', + scope text NOT NULL, + sort_order int NOT NULL DEFAULT 0, + created_at timestamptz DEFAULT now(), + updated_at timestamptz DEFAULT now(), + CONSTRAINT db_fkey + FOREIGN KEY(database_id) + REFERENCES metaschema_public.database (id) + ON DELETE CASCADE, + CONSTRAINT field_behavior_modifier_check + CHECK (modifier IN ('+', '-')), + CONSTRAINT field_behavior_scope_check + CHECK (scope ~ E'^([a-zA-Z][a-zA-Z0-9]*|\\*)(:([a-zA-Z][a-zA-Z0-9]*|\\*))*$'), + CONSTRAINT field_behavior_scope_key + UNIQUE (field_id, scope) +); + +CREATE INDEX field_behavior_database_id_idx ON metaschema_public.field_behavior (database_id); + +CREATE TABLE metaschema_public.view_behavior ( + id uuid PRIMARY KEY DEFAULT uuidv7(), + database_id uuid NOT NULL DEFAULT uuid_nil(), + view_id uuid NOT NULL REFERENCES metaschema_public.view (id) + ON DELETE CASCADE, + modifier char(1) NOT NULL DEFAULT '+', + scope text NOT NULL, + sort_order int NOT NULL DEFAULT 0, + created_at timestamptz DEFAULT now(), + updated_at timestamptz DEFAULT now(), + CONSTRAINT db_fkey + FOREIGN KEY(database_id) + REFERENCES metaschema_public.database (id) + ON DELETE CASCADE, + CONSTRAINT view_behavior_modifier_check + CHECK (modifier IN ('+', '-')), + CONSTRAINT view_behavior_scope_check + CHECK (scope ~ E'^([a-zA-Z][a-zA-Z0-9]*|\\*)(:([a-zA-Z][a-zA-Z0-9]*|\\*))*$'), + CONSTRAINT view_behavior_scope_key + UNIQUE (view_id, scope) +); + +CREATE INDEX view_behavior_database_id_idx ON metaschema_public.view_behavior (database_id); + +CREATE TABLE metaschema_public.foreign_key_constraint_behavior ( + id uuid PRIMARY KEY DEFAULT uuidv7(), + database_id uuid NOT NULL DEFAULT uuid_nil(), + foreign_key_constraint_id uuid NOT NULL REFERENCES metaschema_public.foreign_key_constraint (id) + ON DELETE CASCADE, + modifier char(1) NOT NULL DEFAULT '+', + scope text NOT NULL, + sort_order int NOT NULL DEFAULT 0, + created_at timestamptz DEFAULT now(), + updated_at timestamptz DEFAULT now(), + CONSTRAINT db_fkey + FOREIGN KEY(database_id) + REFERENCES metaschema_public.database (id) + ON DELETE CASCADE, + CONSTRAINT foreign_key_constraint_behavior_modifier_check + CHECK (modifier IN ('+', '-')), + CONSTRAINT foreign_key_constraint_behavior_scope_check + CHECK (scope ~ E'^([a-zA-Z][a-zA-Z0-9]*|\\*)(:([a-zA-Z][a-zA-Z0-9]*|\\*))*$'), + CONSTRAINT foreign_key_constraint_behavior_scope_key + UNIQUE (foreign_key_constraint_id, scope) +); + +CREATE INDEX foreign_key_constraint_behavior_database_id_idx ON metaschema_public.foreign_key_constraint_behavior (database_id); + +CREATE TABLE metaschema_public.unique_constraint_behavior ( + id uuid PRIMARY KEY DEFAULT uuidv7(), + database_id uuid NOT NULL DEFAULT uuid_nil(), + unique_constraint_id uuid NOT NULL REFERENCES metaschema_public.unique_constraint (id) + ON DELETE CASCADE, + modifier char(1) NOT NULL DEFAULT '+', + scope text NOT NULL, + sort_order int NOT NULL DEFAULT 0, + created_at timestamptz DEFAULT now(), + updated_at timestamptz DEFAULT now(), + CONSTRAINT db_fkey + FOREIGN KEY(database_id) + REFERENCES metaschema_public.database (id) + ON DELETE CASCADE, + CONSTRAINT unique_constraint_behavior_modifier_check + CHECK (modifier IN ('+', '-')), + CONSTRAINT unique_constraint_behavior_scope_check + CHECK (scope ~ E'^([a-zA-Z][a-zA-Z0-9]*|\\*)(:([a-zA-Z][a-zA-Z0-9]*|\\*))*$'), + CONSTRAINT unique_constraint_behavior_scope_key + UNIQUE (unique_constraint_id, scope) +); + +CREATE INDEX unique_constraint_behavior_database_id_idx ON metaschema_public.unique_constraint_behavior (database_id); \ No newline at end of file diff --git a/packages/metaschema-schema/verify/schemas/metaschema_public/tables/field_behavior/table.sql b/packages/metaschema-schema/verify/schemas/metaschema_public/tables/field_behavior/table.sql new file mode 100644 index 000000000..acb370657 --- /dev/null +++ b/packages/metaschema-schema/verify/schemas/metaschema_public/tables/field_behavior/table.sql @@ -0,0 +1,15 @@ +-- Verify schemas/metaschema_public/tables/field_behavior/table on pg + +BEGIN; + +SELECT + id, + database_id, + field_id, + modifier, + scope, + sort_order +FROM metaschema_public.field_behavior +WHERE FALSE; + +ROLLBACK; diff --git a/packages/metaschema-schema/verify/schemas/metaschema_public/tables/foreign_key_constraint_behavior/table.sql b/packages/metaschema-schema/verify/schemas/metaschema_public/tables/foreign_key_constraint_behavior/table.sql new file mode 100644 index 000000000..e424e8cd7 --- /dev/null +++ b/packages/metaschema-schema/verify/schemas/metaschema_public/tables/foreign_key_constraint_behavior/table.sql @@ -0,0 +1,15 @@ +-- Verify schemas/metaschema_public/tables/foreign_key_constraint_behavior/table on pg + +BEGIN; + +SELECT + id, + database_id, + foreign_key_constraint_id, + modifier, + scope, + sort_order +FROM metaschema_public.foreign_key_constraint_behavior +WHERE FALSE; + +ROLLBACK; diff --git a/packages/metaschema-schema/verify/schemas/metaschema_public/tables/table_behavior/table.sql b/packages/metaschema-schema/verify/schemas/metaschema_public/tables/table_behavior/table.sql new file mode 100644 index 000000000..51590f802 --- /dev/null +++ b/packages/metaschema-schema/verify/schemas/metaschema_public/tables/table_behavior/table.sql @@ -0,0 +1,15 @@ +-- Verify schemas/metaschema_public/tables/table_behavior/table on pg + +BEGIN; + +SELECT + id, + database_id, + table_id, + modifier, + scope, + sort_order +FROM metaschema_public.table_behavior +WHERE FALSE; + +ROLLBACK; diff --git a/packages/metaschema-schema/verify/schemas/metaschema_public/tables/unique_constraint_behavior/table.sql b/packages/metaschema-schema/verify/schemas/metaschema_public/tables/unique_constraint_behavior/table.sql new file mode 100644 index 000000000..4ff72123f --- /dev/null +++ b/packages/metaschema-schema/verify/schemas/metaschema_public/tables/unique_constraint_behavior/table.sql @@ -0,0 +1,15 @@ +-- Verify schemas/metaschema_public/tables/unique_constraint_behavior/table on pg + +BEGIN; + +SELECT + id, + database_id, + unique_constraint_id, + modifier, + scope, + sort_order +FROM metaschema_public.unique_constraint_behavior +WHERE FALSE; + +ROLLBACK; diff --git a/packages/metaschema-schema/verify/schemas/metaschema_public/tables/view_behavior/table.sql b/packages/metaschema-schema/verify/schemas/metaschema_public/tables/view_behavior/table.sql new file mode 100644 index 000000000..3b9ce6880 --- /dev/null +++ b/packages/metaschema-schema/verify/schemas/metaschema_public/tables/view_behavior/table.sql @@ -0,0 +1,15 @@ +-- Verify schemas/metaschema_public/tables/view_behavior/table on pg + +BEGIN; + +SELECT + id, + database_id, + view_id, + modifier, + scope, + sort_order +FROM metaschema_public.view_behavior +WHERE FALSE; + +ROLLBACK; diff --git a/packages/object-tree/__tests__/objects/flow-graph.test.ts b/packages/object-tree/__tests__/objects/flow-graph.test.ts index 51bf4005e..728009539 100644 --- a/packages/object-tree/__tests__/objects/flow-graph.test.ts +++ b/packages/object-tree/__tests__/objects/flow-graph.test.ts @@ -1,7 +1,8 @@ jest.setTimeout(30000); import { getConnections, PgTestClient } from 'pgsql-test'; -import { FlowGraphHelper, createFlowGraphHelper, VDOMNode } from '../../test-utils'; + +import { createFlowGraphHelper, FlowGraphHelper, VDOMNode } from '../../test-utils'; /** * Transform VDOM tree (storage format) into RuntimeGraph (renderer format) diff --git a/packages/object-tree/__tests__/objects/tailwind-vdom.test.ts b/packages/object-tree/__tests__/objects/tailwind-vdom.test.ts index 4e546bb7e..134619ebc 100644 --- a/packages/object-tree/__tests__/objects/tailwind-vdom.test.ts +++ b/packages/object-tree/__tests__/objects/tailwind-vdom.test.ts @@ -1,7 +1,8 @@ jest.setTimeout(30000); import { getConnections, PgTestClient } from 'pgsql-test'; -import { ObjectTreeHelper, createObjectTreeHelper, VDOMNode } from '../../test-utils'; + +import { createObjectTreeHelper, ObjectTreeHelper, VDOMNode } from '../../test-utils'; /** * Format VDOM with type first, then key, props, children diff --git a/packages/object-tree/__tests__/objects/time-travel.test.ts b/packages/object-tree/__tests__/objects/time-travel.test.ts index 0565f9075..e0753f7df 100644 --- a/packages/object-tree/__tests__/objects/time-travel.test.ts +++ b/packages/object-tree/__tests__/objects/time-travel.test.ts @@ -1,7 +1,8 @@ jest.setTimeout(30000); import { getConnections, PgTestClient } from 'pgsql-test'; -import { ObjectTreeHelper, createObjectTreeHelper, VDOMNode, CommitInfo } from '../../test-utils'; + +import { CommitInfo,createObjectTreeHelper, ObjectTreeHelper, VDOMNode } from '../../test-utils'; const scope_id = 'd0f7ab73-356f-4aac-b9cb-d1a4274906d6'; const store_id = 'c3d4e5f6-a7b8-9012-cdef-123456789012'; diff --git a/packages/verify/__tests__/ext-verify.test.ts b/packages/verify/__tests__/ext-verify.test.ts index eca3756d5..a07187470 100644 --- a/packages/verify/__tests__/ext-verify.test.ts +++ b/packages/verify/__tests__/ext-verify.test.ts @@ -1,4 +1,4 @@ -import { getConnections, PgTestClient, snapshot } from 'pgsql-test'; +import { getConnections, PgTestClient } from 'pgsql-test'; let pg: PgTestClient; let teardown: () => Promise; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 428cf6a65..b977866ea 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -147,6 +147,12 @@ importers: specifier: ^5 version: 5.8.0(@dataplan/json@1.0.0(grafast@1.0.2(graphql@16.13.0)))(@dataplan/pg@1.0.3(@dataplan/json@1.0.0(grafast@1.0.2(graphql@16.13.0)))(grafast@1.0.2(graphql@16.13.0))(graphile-config@1.0.1)(graphql@16.13.0)(pg-sql2@5.0.1)(pg@8.22.0))(@types/node@22.19.17)(grafserv@1.0.0(@types/node@22.19.17)(grafast@1.0.2(graphql@16.13.0))(graphile-config@1.0.1)(graphql@16.13.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(use-sync-external-store@1.6.0(react@19.2.5))(ws@8.20.0))(graphile-build@5.0.2(grafast@1.0.2(graphql@16.13.0))(graphile-config@1.0.1)(graphql@16.13.0))(pg-sql2@5.0.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(tamedevil@0.1.1)(use-sync-external-store@1.6.0(react@19.2.5))(ws@8.20.0) + packages/errors: + devDependencies: + pgpm: + specifier: ^5 + version: 5.8.0(@dataplan/json@1.0.0(grafast@1.0.2(graphql@16.13.0)))(@dataplan/pg@1.0.3(@dataplan/json@1.0.0(grafast@1.0.2(graphql@16.13.0)))(grafast@1.0.2(graphql@16.13.0))(graphile-config@1.0.1)(graphql@16.13.0)(pg-sql2@5.0.1)(pg@8.22.0))(@types/node@22.19.17)(grafserv@1.0.0(@types/node@22.19.17)(grafast@1.0.2(graphql@16.13.0))(graphile-config@1.0.1)(graphql@16.13.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(use-sync-external-store@1.6.0(react@19.2.5))(ws@8.20.0))(graphile-build@5.0.2(grafast@1.0.2(graphql@16.13.0))(graphile-config@1.0.1)(graphql@16.13.0))(pg-sql2@5.0.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(tamedevil@0.1.1)(use-sync-external-store@1.6.0(react@19.2.5))(ws@8.20.0) + packages/faker: dependencies: "@pgpm/types": @@ -233,6 +239,9 @@ importers: packages/jwt-claims: dependencies: + "@pgpm/errors": + specifier: workspace:* + version: link:../errors "@pgpm/types": specifier: workspace:* version: link:../types From 2fd095a75e808266d1e39c290a1fb53e27e4f5a9 Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Mon, 3 Aug 2026 10:13:14 +0000 Subject: [PATCH 2/2] test: raise the function-resolution jest timeout to 60s The portability suite's beforeAll deploys the full metaschema + app-scope + function-resolution closure, which now exceeds jest's 5s default hook timeout on CI runners. Matches metaschema-modules, whose config already sets 60s for the same reason. --- packages/function-resolution/jest.config.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/function-resolution/jest.config.js b/packages/function-resolution/jest.config.js index 4108cf46f..98f3a0e7e 100644 --- a/packages/function-resolution/jest.config.js +++ b/packages/function-resolution/jest.config.js @@ -3,6 +3,7 @@ module.exports = { forceExit: true, preset: 'ts-jest', testEnvironment: 'node', + testTimeout: 60000, // Match both __tests__ and colocated test files testMatch: ['**/?(*.)+(test|spec).{ts,tsx,js,jsx}'],