@openhi/constructs 0.0.110 → 0.0.112
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/chunk-23PUSHBV.mjs +24 -0
- package/lib/chunk-23PUSHBV.mjs.map +1 -0
- package/lib/chunk-2O3CXY2C.mjs +79 -0
- package/lib/chunk-2O3CXY2C.mjs.map +1 -0
- package/lib/{chunk-7FUAMZOF.mjs → chunk-53OHXLIL.mjs} +3 -3
- package/lib/chunk-6NBGYGFL.mjs +1803 -0
- package/lib/chunk-6NBGYGFL.mjs.map +1 -0
- package/lib/chunk-7RZHFI77.mjs +22 -0
- package/lib/chunk-7RZHFI77.mjs.map +1 -0
- package/lib/{chunk-7Q2IJ2J5.mjs → chunk-CUUKXDB2.mjs} +6 -6
- package/lib/chunk-FYHBHHWK.mjs +47 -0
- package/lib/chunk-FYHBHHWK.mjs.map +1 -0
- package/lib/{chunk-MULKGFIJ.mjs → chunk-GBDIGTNV.mjs} +165 -10
- package/lib/chunk-GBDIGTNV.mjs.map +1 -0
- package/lib/chunk-HQ67J7BP.mjs +199 -0
- package/lib/chunk-HQ67J7BP.mjs.map +1 -0
- package/lib/{chunk-AJ3G3THO.mjs → chunk-KO64HPWQ.mjs} +2 -2
- package/lib/{chunk-BB5MK4L3.mjs → chunk-KSFC72TT.mjs} +3 -3
- package/lib/{chunk-2TPJ6HOF.mjs → chunk-NZRW7ROK.mjs} +72 -54
- package/lib/chunk-NZRW7ROK.mjs.map +1 -0
- package/lib/chunk-QJDHVMKT.mjs +117 -0
- package/lib/chunk-QJDHVMKT.mjs.map +1 -0
- package/lib/{chunk-IS4VQRI4.mjs → chunk-QMBJ4VHC.mjs} +12 -47
- package/lib/chunk-QMBJ4VHC.mjs.map +1 -0
- package/lib/chunk-TRY7JGWO.mjs +16 -0
- package/lib/chunk-TRY7JGWO.mjs.map +1 -0
- package/lib/chunk-W4KR4CSL.mjs +236 -0
- package/lib/chunk-W4KR4CSL.mjs.map +1 -0
- package/lib/{chunk-AGF3RAAZ.mjs → chunk-WPCBVDFZ.mjs} +2 -2
- package/lib/chunk-WQWFVEVX.mjs +66 -0
- package/lib/chunk-WQWFVEVX.mjs.map +1 -0
- package/lib/{chunk-SYBADQXI.mjs → chunk-ZM4GDHHC.mjs} +77 -2
- package/lib/chunk-ZM4GDHHC.mjs.map +1 -0
- package/lib/data-store-postgres-replication.handler.js +26 -17
- package/lib/data-store-postgres-replication.handler.js.map +1 -1
- package/lib/data-store-postgres-replication.handler.mjs +5 -65
- package/lib/data-store-postgres-replication.handler.mjs.map +1 -1
- package/lib/delete-chunk.handler.d.mts +29 -0
- package/lib/delete-chunk.handler.d.ts +29 -0
- package/lib/delete-chunk.handler.js +2716 -0
- package/lib/delete-chunk.handler.js.map +1 -0
- package/lib/delete-chunk.handler.mjs +47 -0
- package/lib/delete-chunk.handler.mjs.map +1 -0
- package/lib/events-CjS-sm0W.d.mts +107 -0
- package/lib/events-CjS-sm0W.d.ts +107 -0
- package/lib/events-Da_cFgtc.d.mts +208 -0
- package/lib/events-Da_cFgtc.d.ts +208 -0
- package/lib/finalize.handler.d.mts +35 -0
- package/lib/finalize.handler.d.ts +35 -0
- package/lib/finalize.handler.js +875 -0
- package/lib/finalize.handler.js.map +1 -0
- package/lib/finalize.handler.mjs +166 -0
- package/lib/finalize.handler.mjs.map +1 -0
- package/lib/index.d.mts +189 -2
- package/lib/index.d.ts +500 -3
- package/lib/index.js +1753 -174
- package/lib/index.js.map +1 -1
- package/lib/index.mjs +571 -17
- package/lib/index.mjs.map +1 -1
- package/lib/list-chunks.handler.d.mts +28 -0
- package/lib/list-chunks.handler.d.ts +28 -0
- package/lib/list-chunks.handler.js +2746 -0
- package/lib/list-chunks.handler.js.map +1 -0
- package/lib/list-chunks.handler.mjs +54 -0
- package/lib/list-chunks.handler.mjs.map +1 -0
- package/lib/platform-deploy-bridge.handler.js +76 -1
- package/lib/platform-deploy-bridge.handler.js.map +1 -1
- package/lib/platform-deploy-bridge.handler.mjs +1 -1
- package/lib/pre-token-generation.handler.js +1106 -155
- package/lib/pre-token-generation.handler.js.map +1 -1
- package/lib/pre-token-generation.handler.mjs +6 -4
- package/lib/pre-token-generation.handler.mjs.map +1 -1
- package/lib/provision-default-workspace.handler.js +1529 -142
- package/lib/provision-default-workspace.handler.js.map +1 -1
- package/lib/provision-default-workspace.handler.mjs +8 -4
- package/lib/provision-default-workspace.handler.mjs.map +1 -1
- package/lib/rename-finalize.handler.d.mts +30 -0
- package/lib/rename-finalize.handler.d.ts +30 -0
- package/lib/rename-finalize.handler.js +795 -0
- package/lib/rename-finalize.handler.js.map +1 -0
- package/lib/rename-finalize.handler.mjs +90 -0
- package/lib/rename-finalize.handler.mjs.map +1 -0
- package/lib/rename-list-targets.handler.d.mts +26 -0
- package/lib/rename-list-targets.handler.d.ts +26 -0
- package/lib/rename-list-targets.handler.js +2985 -0
- package/lib/rename-list-targets.handler.js.map +1 -0
- package/lib/rename-list-targets.handler.mjs +431 -0
- package/lib/rename-list-targets.handler.mjs.map +1 -0
- package/lib/rename-rewrite-chunk.handler.d.mts +35 -0
- package/lib/rename-rewrite-chunk.handler.d.ts +35 -0
- package/lib/rename-rewrite-chunk.handler.js +2021 -0
- package/lib/rename-rewrite-chunk.handler.js.map +1 -0
- package/lib/rename-rewrite-chunk.handler.mjs +27 -0
- package/lib/rename-rewrite-chunk.handler.mjs.map +1 -0
- package/lib/rest-api-lambda.handler.js +4087 -921
- package/lib/rest-api-lambda.handler.js.map +1 -1
- package/lib/rest-api-lambda.handler.mjs +1827 -81
- package/lib/rest-api-lambda.handler.mjs.map +1 -1
- package/lib/seed-demo-data.handler.js +1588 -124
- package/lib/seed-demo-data.handler.js.map +1 -1
- package/lib/seed-demo-data.handler.mjs +10 -6
- package/lib/seed-system-data.handler.js +1179 -155
- package/lib/seed-system-data.handler.js.map +1 -1
- package/lib/seed-system-data.handler.mjs +5 -4
- package/lib/seed-system-data.handler.mjs.map +1 -1
- package/package.json +1 -1
- package/lib/chunk-2TPJ6HOF.mjs.map +0 -1
- package/lib/chunk-IS4VQRI4.mjs.map +0 -1
- package/lib/chunk-MULKGFIJ.mjs.map +0 -1
- package/lib/chunk-QR5JVSCF.mjs +0 -862
- package/lib/chunk-QR5JVSCF.mjs.map +0 -1
- package/lib/chunk-SYBADQXI.mjs.map +0 -1
- /package/lib/{chunk-7FUAMZOF.mjs.map → chunk-53OHXLIL.mjs.map} +0 -0
- /package/lib/{chunk-7Q2IJ2J5.mjs.map → chunk-CUUKXDB2.mjs.map} +0 -0
- /package/lib/{chunk-AJ3G3THO.mjs.map → chunk-KO64HPWQ.mjs.map} +0 -0
- /package/lib/{chunk-BB5MK4L3.mjs.map → chunk-KSFC72TT.mjs.map} +0 -0
- /package/lib/{chunk-AGF3RAAZ.mjs.map → chunk-WPCBVDFZ.mjs.map} +0 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import {
|
|
2
|
+
require_lib
|
|
3
|
+
} from "./chunk-ZM4GDHHC.mjs";
|
|
4
|
+
import {
|
|
5
|
+
__toESM
|
|
6
|
+
} from "./chunk-LZOMFHX3.mjs";
|
|
7
|
+
|
|
8
|
+
// src/workflows/control-plane/rename-cascade/events.ts
|
|
9
|
+
var import_workflows = __toESM(require_lib());
|
|
10
|
+
var RENAME_CASCADE_CONSUMER_NAME = "rename-cascade";
|
|
11
|
+
var RENAME_CASCADE_DEFAULT_CONCURRENCY = 10;
|
|
12
|
+
var RENAME_CASCADE_FAILED_THRESHOLD = 0;
|
|
13
|
+
var RENAME_CASCADE_SLOW_THRESHOLD_SECONDS = 300;
|
|
14
|
+
var RENAME_CASCADE_OPS_EVENT_BUS_ENV_VAR = "RENAME_CASCADE_OPS_EVENT_BUS_NAME";
|
|
15
|
+
|
|
16
|
+
export {
|
|
17
|
+
RENAME_CASCADE_CONSUMER_NAME,
|
|
18
|
+
RENAME_CASCADE_DEFAULT_CONCURRENCY,
|
|
19
|
+
RENAME_CASCADE_FAILED_THRESHOLD,
|
|
20
|
+
RENAME_CASCADE_SLOW_THRESHOLD_SECONDS,
|
|
21
|
+
RENAME_CASCADE_OPS_EVENT_BUS_ENV_VAR,
|
|
22
|
+
import_workflows
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=chunk-23PUSHBV.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/workflows/control-plane/rename-cascade/events.ts"],"sourcesContent":["/**\n * Shared event-shape constants for the TR-023 rename-cascade consumer.\n * The cascade's input detail-type (on the data event bus) and its two\n * terminal detail-types (on the ops event bus) are owned by\n * `@openhi/workflows`; this module re-imports them so the workflow\n * construct can wire the EventBridge rule and the terminal publisher\n * from a single place.\n *\n * @see .state/adr-018-implementation-guide.md section 5\n */\n\nexport {\n ControlPlaneRenameCompleteV1,\n ControlPlaneRenameFailedV1,\n ControlPlaneRenameV1,\n OPENHI_DATA_SOURCE,\n OPENHI_OPS_SOURCE,\n RENAMABLE_ENTITY_TYPE,\n} from \"@openhi/workflows\";\nexport type {\n ControlPlaneRenameCompleteV1Detail,\n ControlPlaneRenameFailedV1Detail,\n ControlPlaneRenameV1Detail,\n RenamableEntityType,\n} from \"@openhi/workflows\";\n\nimport type { RenamableEntityType } from \"@openhi/workflows\";\nimport type { RenameCascadeRewriteTarget } from \"../../../data/operations/control/rename-cascade/rename-cascade-list-targets-operation\";\n\n/**\n * Stable logical name registered with the shared `WorkflowDedupTable`\n * (TR-015). The state machine's `DedupCheck` state writes a row keyed\n * by `(consumerName, eventId, attempt)` to absorb EventBridge retries.\n */\nexport const RENAME_CASCADE_CONSUMER_NAME = \"rename-cascade\" as const;\n\n/**\n * Distributed-Map max concurrency. Per the ADR-018 implementation guide\n * section 5: Distributed Map (NOT inline — TR-022 owning-delete uses\n * inline), tunable via the construct's `cascadeMapConcurrency` prop.\n * Operators may scale this down on first rollout.\n */\nexport const RENAME_CASCADE_DEFAULT_CONCURRENCY = 10 as const;\n\n/**\n * `CascadeFailed` alarm threshold — fires when ExecutionsFailed exceeds\n * the value over the configured period. Per the implementation guide\n * section 5 \"Alarm thresholds\" table.\n */\nexport const RENAME_CASCADE_FAILED_THRESHOLD = 0 as const;\n\n/**\n * `CascadeSlow` alarm threshold (in seconds) — fires when ExecutionTime\n * p99 exceeds the value. Per the implementation guide section 5.\n */\nexport const RENAME_CASCADE_SLOW_THRESHOLD_SECONDS = 300 as const;\n\n/**\n * Inputs the cascade list-targets step receives. Most fields come\n * straight off the `ControlPlaneRenameV1` envelope payload; `cursors`\n * threads through the outer loop.\n */\nexport interface RenameCascadeListInput {\n readonly entityType: RenamableEntityType;\n readonly entityId: string;\n readonly tenantId?: string;\n readonly oldName: string;\n readonly newName: string;\n readonly oldNormalizedName: string;\n readonly newNormalizedName: string;\n readonly cursors?: Record<string, string | null>;\n /** Cumulative `itemsRewritten` carried forward across pages. */\n readonly itemsRewritten?: number;\n /** Cumulative `chunkCount` carried forward across pages. */\n readonly chunkCount?: number;\n}\n\n/** Inputs the cascade rewrite-chunk step receives — one chunk per Map iteration. */\nexport interface RenameCascadeChunkInput {\n readonly entityType: RenamableEntityType;\n readonly entityId: string;\n readonly tenantId?: string;\n /** Targets to rewrite in this transaction. Length must be 1..50. */\n readonly targets: ReadonlyArray<RenameCascadeRewriteTarget>;\n /**\n * Idempotency token uniquely identifying this chunk within the\n * cascade execution. Forwarded to `executeMultiWrite` so replayed\n * chunks land idempotently.\n */\n readonly chunkToken: string;\n}\n\n/** Outputs the cascade list-targets step emits to feed the Distributed Map state. */\nexport interface RenameCascadeListOutput {\n readonly entityType: RenamableEntityType;\n readonly entityId: string;\n readonly tenantId?: string;\n readonly oldName: string;\n readonly newName: string;\n readonly oldNormalizedName: string;\n readonly newNormalizedName: string;\n readonly cursors: Record<string, string | null>;\n readonly chunks: ReadonlyArray<RenameCascadeChunkInput>;\n readonly exhausted: boolean;\n readonly itemsRewritten: number;\n readonly chunkCount: number;\n}\n\n/** Inputs the cascade finalize step receives. */\nexport interface RenameCascadeFinalizeInput {\n readonly entityType: RenamableEntityType;\n readonly entityId: string;\n readonly tenantId?: string;\n readonly newName: string;\n readonly itemsRewritten: number;\n readonly chunkCount: number;\n readonly startedAt: string;\n /** Optional eventId / correlation for ADR-016 envelope chaining. */\n readonly eventId?: string;\n readonly correlationId?: string;\n readonly causationId?: string;\n}\n\n/** Outputs the cascade finalize step emits (used by tests + telemetry). */\nexport interface RenameCascadeFinalizeOutput {\n readonly entityType: RenamableEntityType;\n readonly entityId: string;\n readonly tenantId?: string;\n readonly newName: string;\n readonly itemsRewritten: number;\n readonly chunkCount: number;\n readonly durationMs: number;\n readonly completedAt: string;\n}\n\n/** Env var the construct uses to inject the ops event bus name into the finalize Lambda. */\nexport const RENAME_CASCADE_OPS_EVENT_BUS_ENV_VAR =\n \"RENAME_CASCADE_OPS_EVENT_BUS_NAME\" as const;\n"],"mappings":";;;;;;;;AAWA,uBAOO;AAgBA,IAAM,+BAA+B;AAQrC,IAAM,qCAAqC;AAO3C,IAAM,kCAAkC;AAMxC,IAAM,wCAAwC;AAiF9C,IAAM,uCACX;","names":[]}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// src/components/postgres/data-store-postgres-schema.ts
|
|
2
|
+
var SCHEMA_NAME_PATTERN = /^[a-z_][a-z0-9_]{0,62}$/;
|
|
3
|
+
function quoteSchemaIdentifier(schemaName) {
|
|
4
|
+
if (!SCHEMA_NAME_PATTERN.test(schemaName)) {
|
|
5
|
+
throw new Error(
|
|
6
|
+
`Invalid Postgres schema name: ${JSON.stringify(schemaName)}; expected /[a-z_][a-z0-9_]{0,62}/`
|
|
7
|
+
);
|
|
8
|
+
}
|
|
9
|
+
return `"${schemaName}"`;
|
|
10
|
+
}
|
|
11
|
+
function buildSchemaBootstrapStatements(schemaName) {
|
|
12
|
+
const s = quoteSchemaIdentifier(schemaName);
|
|
13
|
+
return [
|
|
14
|
+
`CREATE SCHEMA IF NOT EXISTS ${s};`,
|
|
15
|
+
[
|
|
16
|
+
`CREATE TABLE IF NOT EXISTS ${s}.resources (`,
|
|
17
|
+
` tenant_id text NOT NULL,`,
|
|
18
|
+
` workspace_id text NOT NULL,`,
|
|
19
|
+
` resource_type text NOT NULL,`,
|
|
20
|
+
` resource_id text NOT NULL,`,
|
|
21
|
+
` version text NOT NULL,`,
|
|
22
|
+
` last_updated timestamptz NOT NULL,`,
|
|
23
|
+
` deleted_at timestamptz,`,
|
|
24
|
+
` resource jsonb NOT NULL,`,
|
|
25
|
+
` PRIMARY KEY (tenant_id, workspace_id, resource_type, resource_id)`,
|
|
26
|
+
`);`
|
|
27
|
+
].join("\n"),
|
|
28
|
+
[
|
|
29
|
+
`CREATE INDEX IF NOT EXISTS resources_jsonb_gin`,
|
|
30
|
+
` ON ${s}.resources USING gin (resource);`
|
|
31
|
+
].join("\n"),
|
|
32
|
+
[
|
|
33
|
+
`CREATE INDEX IF NOT EXISTS resources_listing`,
|
|
34
|
+
` ON ${s}.resources (tenant_id, workspace_id, resource_type, last_updated);`
|
|
35
|
+
].join("\n")
|
|
36
|
+
];
|
|
37
|
+
}
|
|
38
|
+
function buildSchemaBootstrapSql(schemaName) {
|
|
39
|
+
return buildSchemaBootstrapStatements(schemaName).join("\n");
|
|
40
|
+
}
|
|
41
|
+
function buildResourceUpsertSql(schemaName) {
|
|
42
|
+
const s = quoteSchemaIdentifier(schemaName);
|
|
43
|
+
return [
|
|
44
|
+
`INSERT INTO ${s}.resources`,
|
|
45
|
+
` (tenant_id, workspace_id, resource_type, resource_id, version, last_updated, deleted_at, resource)`,
|
|
46
|
+
`VALUES ($1, $2, $3, $4, $5, $6, NULL, $7::jsonb)`,
|
|
47
|
+
`ON CONFLICT (tenant_id, workspace_id, resource_type, resource_id)`,
|
|
48
|
+
`DO UPDATE SET`,
|
|
49
|
+
` version = EXCLUDED.version,`,
|
|
50
|
+
` last_updated = EXCLUDED.last_updated,`,
|
|
51
|
+
` deleted_at = NULL,`,
|
|
52
|
+
` resource = EXCLUDED.resource`,
|
|
53
|
+
`WHERE EXCLUDED.version > ${s}.resources.version;`
|
|
54
|
+
].join("\n");
|
|
55
|
+
}
|
|
56
|
+
function buildResourceSoftDeleteSql(schemaName) {
|
|
57
|
+
const s = quoteSchemaIdentifier(schemaName);
|
|
58
|
+
return [
|
|
59
|
+
`UPDATE ${s}.resources`,
|
|
60
|
+
`SET deleted_at = $6,`,
|
|
61
|
+
` version = $5`,
|
|
62
|
+
`WHERE tenant_id = $1`,
|
|
63
|
+
` AND workspace_id = $2`,
|
|
64
|
+
` AND resource_type = $3`,
|
|
65
|
+
` AND resource_id = $4`,
|
|
66
|
+
` AND $5 > version;`
|
|
67
|
+
].join("\n");
|
|
68
|
+
}
|
|
69
|
+
async function ensureSchemaBootstrap(client, schemaName) {
|
|
70
|
+
await client.query(buildSchemaBootstrapSql(schemaName));
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export {
|
|
74
|
+
buildSchemaBootstrapStatements,
|
|
75
|
+
buildResourceUpsertSql,
|
|
76
|
+
buildResourceSoftDeleteSql,
|
|
77
|
+
ensureSchemaBootstrap
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=chunk-2O3CXY2C.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/postgres/data-store-postgres-schema.ts"],"sourcesContent":["import type { Pool, PoolClient } from \"pg\";\n\n/**\n * @see sites/www-docs/content/architecture/adr/2026-04-17-01-ad-hoc-query-support-fhir-api.md\n *\n * SQL strings for the Postgres replication tier (ADR 2026-04-17-01, phase 1):\n * the JSONB `resources` table that mirrors current FHIR resources from the\n * DynamoDB single-table store. Phase 1 covers replication only; query routing\n * and indexes for individual SearchParameters are deferred to a follow-on phase.\n *\n * The `version` column stores the resource's `vid` (a ULID — see\n * `data-entity-common.ts`). ULIDs are monotonically lexically sortable, so the\n * UPSERT/UPDATE guards use plain `>` text comparison to reject out-of-order\n * Kinesis deliveries.\n */\n\nexport const POSTGRES_REPLICATION_SCHEMA_VERSION = 1;\n\nconst SCHEMA_NAME_PATTERN = /^[a-z_][a-z0-9_]{0,62}$/;\n\n/**\n * Validate that a schema name is a safe Postgres identifier and quote it for\n * inclusion in DDL/DML. Throws on anything that doesn't match the lower-snake\n * pattern OpenHI uses for branch-derived schema names (e.g. `b_a1b2c3`).\n */\nexport function quoteSchemaIdentifier(schemaName: string): string {\n if (!SCHEMA_NAME_PATTERN.test(schemaName)) {\n throw new Error(\n `Invalid Postgres schema name: ${JSON.stringify(schemaName)}; expected /[a-z_][a-z0-9_]{0,62}/`,\n );\n }\n return `\"${schemaName}\"`;\n}\n\n/**\n * Build the bootstrap DDL as a list of independent statements. Use this form\n * when sending the DDL through a transport that does not accept multi-statement\n * SQL in a single call — most importantly the AWS RDS Data API's\n * `ExecuteStatement`, which the REST API runner uses.\n *\n * Each statement is fully self-contained and idempotent (`IF NOT EXISTS`),\n * so the array can be executed in order with no transaction wrapper.\n */\nexport function buildSchemaBootstrapStatements(\n schemaName: string,\n): ReadonlyArray<string> {\n const s = quoteSchemaIdentifier(schemaName);\n return [\n `CREATE SCHEMA IF NOT EXISTS ${s};`,\n [\n `CREATE TABLE IF NOT EXISTS ${s}.resources (`,\n ` tenant_id text NOT NULL,`,\n ` workspace_id text NOT NULL,`,\n ` resource_type text NOT NULL,`,\n ` resource_id text NOT NULL,`,\n ` version text NOT NULL,`,\n ` last_updated timestamptz NOT NULL,`,\n ` deleted_at timestamptz,`,\n ` resource jsonb NOT NULL,`,\n ` PRIMARY KEY (tenant_id, workspace_id, resource_type, resource_id)`,\n `);`,\n ].join(\"\\n\"),\n [\n `CREATE INDEX IF NOT EXISTS resources_jsonb_gin`,\n ` ON ${s}.resources USING gin (resource);`,\n ].join(\"\\n\"),\n [\n `CREATE INDEX IF NOT EXISTS resources_listing`,\n ` ON ${s}.resources (tenant_id, workspace_id, resource_type, last_updated);`,\n ].join(\"\\n\"),\n ];\n}\n\nexport function buildSchemaBootstrapSql(schemaName: string): string {\n return buildSchemaBootstrapStatements(schemaName).join(\"\\n\");\n}\n\n/**\n * INSERT/MODIFY UPSERT with a monotonic `version` (ULID) guard. If a record\n * arrives out of order — e.g. a retried Kinesis delivery for an older `vid`\n * after a newer one — the WHERE clause in DO UPDATE leaves the row unchanged.\n *\n * Param order: $1 tenant_id, $2 workspace_id, $3 resource_type, $4 resource_id,\n * $5 version, $6 last_updated, $7 resource (jsonb-serialized).\n */\nexport function buildResourceUpsertSql(schemaName: string): string {\n const s = quoteSchemaIdentifier(schemaName);\n return [\n `INSERT INTO ${s}.resources`,\n ` (tenant_id, workspace_id, resource_type, resource_id, version, last_updated, deleted_at, resource)`,\n `VALUES ($1, $2, $3, $4, $5, $6, NULL, $7::jsonb)`,\n `ON CONFLICT (tenant_id, workspace_id, resource_type, resource_id)`,\n `DO UPDATE SET`,\n ` version = EXCLUDED.version,`,\n ` last_updated = EXCLUDED.last_updated,`,\n ` deleted_at = NULL,`,\n ` resource = EXCLUDED.resource`,\n `WHERE EXCLUDED.version > ${s}.resources.version;`,\n ].join(\"\\n\");\n}\n\n/**\n * REMOVE soft-delete with the same monotonic `version` guard. Using `>` (not\n * `>=`) means a duplicate REMOVE for the same version is a no-op. Param order\n * matches {@link buildResourceUpsertSql} for the first five params.\n *\n * Param order: $1 tenant_id, $2 workspace_id, $3 resource_type, $4 resource_id,\n * $5 version (incoming), $6 deleted_at.\n */\nexport function buildResourceSoftDeleteSql(schemaName: string): string {\n const s = quoteSchemaIdentifier(schemaName);\n return [\n `UPDATE ${s}.resources`,\n `SET deleted_at = $6,`,\n ` version = $5`,\n `WHERE tenant_id = $1`,\n ` AND workspace_id = $2`,\n ` AND resource_type = $3`,\n ` AND resource_id = $4`,\n ` AND $5 > version;`,\n ].join(\"\\n\");\n}\n\n/**\n * Run schema DDL idempotently. Safe to call from every Lambda cold start; the\n * `IF NOT EXISTS` clauses make repeats no-ops. Caller is responsible for\n * memoizing across invocations on the same warm container.\n */\nexport async function ensureSchemaBootstrap(\n client: Pool | PoolClient,\n schemaName: string,\n): Promise<void> {\n await client.query(buildSchemaBootstrapSql(schemaName));\n}\n"],"mappings":";AAkBA,IAAM,sBAAsB;AAOrB,SAAS,sBAAsB,YAA4B;AAChE,MAAI,CAAC,oBAAoB,KAAK,UAAU,GAAG;AACzC,UAAM,IAAI;AAAA,MACR,iCAAiC,KAAK,UAAU,UAAU,CAAC;AAAA,IAC7D;AAAA,EACF;AACA,SAAO,IAAI,UAAU;AACvB;AAWO,SAAS,+BACd,YACuB;AACvB,QAAM,IAAI,sBAAsB,UAAU;AAC1C,SAAO;AAAA,IACL,+BAA+B,CAAC;AAAA,IAChC;AAAA,MACE,8BAA8B,CAAC;AAAA,MAC/B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,IACX;AAAA,MACE;AAAA,MACA,QAAQ,CAAC;AAAA,IACX,EAAE,KAAK,IAAI;AAAA,IACX;AAAA,MACE;AAAA,MACA,QAAQ,CAAC;AAAA,IACX,EAAE,KAAK,IAAI;AAAA,EACb;AACF;AAEO,SAAS,wBAAwB,YAA4B;AAClE,SAAO,+BAA+B,UAAU,EAAE,KAAK,IAAI;AAC7D;AAUO,SAAS,uBAAuB,YAA4B;AACjE,QAAM,IAAI,sBAAsB,UAAU;AAC1C,SAAO;AAAA,IACL,eAAe,CAAC;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,4BAA4B,CAAC;AAAA,EAC/B,EAAE,KAAK,IAAI;AACb;AAUO,SAAS,2BAA2B,YAA4B;AACrE,QAAM,IAAI,sBAAsB,UAAU;AAC1C,SAAO;AAAA,IACL,UAAU,CAAC;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAOA,eAAsB,sBACpB,QACA,YACe;AACf,QAAM,OAAO,MAAM,wBAAwB,UAAU,CAAC;AACxD;","names":[]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
NotFoundError
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-FYHBHHWK.mjs";
|
|
4
4
|
import {
|
|
5
5
|
getDynamoControlService
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-6NBGYGFL.mjs";
|
|
7
7
|
|
|
8
8
|
// src/data/operations/control/role/role-get-by-id-operation.ts
|
|
9
9
|
async function getRoleByIdOperation(params) {
|
|
@@ -24,4 +24,4 @@ async function getRoleByIdOperation(params) {
|
|
|
24
24
|
export {
|
|
25
25
|
getRoleByIdOperation
|
|
26
26
|
};
|
|
27
|
-
//# sourceMappingURL=chunk-
|
|
27
|
+
//# sourceMappingURL=chunk-53OHXLIL.mjs.map
|