@xemahq/biome-database-nest 0.5.2 → 0.6.1

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/dist/index.d.ts CHANGED
@@ -1,4 +1,7 @@
1
1
  export { DEFAULT_BIOME_DB_KEY, deriveBiomeSchemaName } from './lib/schema-name';
2
+ export { composeIdentifier, fitIdentifier, IDENTIFIER_HASH_LENGTH, POSTGRES_MAX_IDENTIFIER_LENGTH, sanitizeIdentifierChars, sanitizeIdentifierSegment, type ComposeIdentifierInput, type FitIdentifierInput, } from './lib/identifier';
3
+ export { rolesForSchema, schemaRoleBase, schemaRoleName, SchemaRoleKind, SCHEMA_ROLE_BASE_MAX_LENGTH, SCHEMA_ROLE_SUFFIX_LENGTH, type SchemaRoleNames, } from './lib/role-names';
4
+ export { unwrapPlatformResponseEnvelope } from './lib/response-envelope';
2
5
  export { resolveBiomeDatabaseConfigFromEnv, type BiomeDatabaseConfig, } from './lib/config';
3
6
  export { createBiomePrismaAdapter, createBiomePrismaAdapterFromEnv, } from './lib/adapter';
4
7
  export { fetchSystemDatabaseConfig, type SystemDatabaseConfigRequest, } from './lib/control-plane-client';
@@ -10,4 +13,6 @@ export { TenantIsolationMode, TENANT_ISOLATION_MODE_ENV_VAR, resolveTenantIsolat
10
13
  export { TenantIsolationError, TenantIsolationViolationKind, formatTenantIsolationViolation, type TenantIsolationViolation, } from './lib/tenant-isolation/tenant-isolation-error';
11
14
  export { PrismaModelOperation, scopeArgsToOrg, type OrgScopeOutcome, type OrgScopeRequest, } from './lib/tenant-isolation/org-scope';
12
15
  export { DEFAULT_ORG_FIELD, collectOrgScopedModels, createTenantIsolationExtension, type CreateTenantIsolationExtensionOptions, type TenantIsolationExtensionDefinition, type TenantIsolationLogger, type TenantIsolationQueryContext, } from './lib/tenant-isolation/tenant-isolation.extension';
16
+ export { eraseOrgData, OrgErasureBlockedError, type EraseOrgDataOptions, type OrgErasureReport, } from './lib/tenant-isolation/org-erasure';
17
+ export { OrgErasureModule, OrgErasureController, ORG_ERASURE_RUNNER, ORG_DATA_ERASURE_CAPABILITY, ORG_ERASURE_ROUTE_PATH, type OrgErasureModuleOptions, type OrgErasureRunner, } from './lib/nest/org-erasure.module';
13
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EACL,iCAAiC,EACjC,KAAK,mBAAmB,GACzB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,wBAAwB,EACxB,+BAA+B,GAChC,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,yBAAyB,EACzB,KAAK,2BAA2B,GACjC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,0BAA0B,EAC1B,8BAA8B,EAC9B,KAAK,4BAA4B,GAClC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,uBAAuB,EACvB,KAAK,wBAAwB,EAC7B,KAAK,8BAA8B,GACpC,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,KAAK,0BAA0B,GAChC,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,wBAAwB,EACxB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,0BAA0B,EAC/B,KAAK,+BAA+B,EACpC,KAAK,6BAA6B,EAClC,KAAK,eAAe,GACrB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,mBAAmB,EACnB,6BAA6B,EAC7B,0BAA0B,GAC3B,MAAM,8CAA8C,CAAC;AACtD,OAAO,EACL,oBAAoB,EACpB,4BAA4B,EAC5B,8BAA8B,EAC9B,KAAK,wBAAwB,GAC9B,MAAM,+CAA+C,CAAC;AACvD,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,KAAK,eAAe,EACpB,KAAK,eAAe,GACrB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,8BAA8B,EAC9B,KAAK,qCAAqC,EAC1C,KAAK,kCAAkC,EACvC,KAAK,qBAAqB,EAC1B,KAAK,2BAA2B,GACjC,MAAM,mDAAmD,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,sBAAsB,EACtB,8BAA8B,EAC9B,uBAAuB,EACvB,yBAAyB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,GACxB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,cAAc,EACd,cAAc,EACd,cAAc,EACd,cAAc,EACd,2BAA2B,EAC3B,yBAAyB,EACzB,KAAK,eAAe,GACrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EACL,iCAAiC,EACjC,KAAK,mBAAmB,GACzB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,wBAAwB,EACxB,+BAA+B,GAChC,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,yBAAyB,EACzB,KAAK,2BAA2B,GACjC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,0BAA0B,EAC1B,8BAA8B,EAC9B,KAAK,4BAA4B,GAClC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,uBAAuB,EACvB,KAAK,wBAAwB,EAC7B,KAAK,8BAA8B,GACpC,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,KAAK,0BAA0B,GAChC,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,wBAAwB,EACxB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,0BAA0B,EAC/B,KAAK,+BAA+B,EACpC,KAAK,6BAA6B,EAClC,KAAK,eAAe,GACrB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,mBAAmB,EACnB,6BAA6B,EAC7B,0BAA0B,GAC3B,MAAM,8CAA8C,CAAC;AACtD,OAAO,EACL,oBAAoB,EACpB,4BAA4B,EAC5B,8BAA8B,EAC9B,KAAK,wBAAwB,GAC9B,MAAM,+CAA+C,CAAC;AACvD,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,KAAK,eAAe,EACpB,KAAK,eAAe,GACrB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,8BAA8B,EAC9B,KAAK,qCAAqC,EAC1C,KAAK,kCAAkC,EACvC,KAAK,qBAAqB,EAC1B,KAAK,2BAA2B,GACjC,MAAM,mDAAmD,CAAC;AAC3D,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,GACtB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,2BAA2B,EAC3B,sBAAsB,EACtB,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,GACtB,MAAM,+BAA+B,CAAC"}
package/dist/index.js CHANGED
@@ -1,9 +1,25 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createTenantIsolationExtension = exports.collectOrgScopedModels = exports.DEFAULT_ORG_FIELD = exports.scopeArgsToOrg = exports.PrismaModelOperation = exports.formatTenantIsolationViolation = exports.TenantIsolationViolationKind = exports.TenantIsolationError = exports.resolveTenantIsolationMode = exports.TENANT_ISOLATION_MODE_ENV_VAR = exports.TenantIsolationMode = exports.createBiomePrismaService = exports.BIOME_DATABASE_READY = exports.BiomeDatabaseModule = exports.bootstrapBiomeDatabases = exports.ORG_DATABASE_POOL_SERVICE_NAME = exports.resolveControlPlaneBaseUrl = exports.fetchSystemDatabaseConfig = exports.createBiomePrismaAdapterFromEnv = exports.createBiomePrismaAdapter = exports.resolveBiomeDatabaseConfigFromEnv = exports.deriveBiomeSchemaName = exports.DEFAULT_BIOME_DB_KEY = void 0;
3
+ exports.ORG_ERASURE_ROUTE_PATH = exports.ORG_DATA_ERASURE_CAPABILITY = exports.ORG_ERASURE_RUNNER = exports.OrgErasureController = exports.OrgErasureModule = exports.OrgErasureBlockedError = exports.eraseOrgData = exports.createTenantIsolationExtension = exports.collectOrgScopedModels = exports.DEFAULT_ORG_FIELD = exports.scopeArgsToOrg = exports.PrismaModelOperation = exports.formatTenantIsolationViolation = exports.TenantIsolationViolationKind = exports.TenantIsolationError = exports.resolveTenantIsolationMode = exports.TENANT_ISOLATION_MODE_ENV_VAR = exports.TenantIsolationMode = exports.createBiomePrismaService = exports.BIOME_DATABASE_READY = exports.BiomeDatabaseModule = exports.bootstrapBiomeDatabases = exports.ORG_DATABASE_POOL_SERVICE_NAME = exports.resolveControlPlaneBaseUrl = exports.fetchSystemDatabaseConfig = exports.createBiomePrismaAdapterFromEnv = exports.createBiomePrismaAdapter = exports.resolveBiomeDatabaseConfigFromEnv = exports.unwrapPlatformResponseEnvelope = exports.SCHEMA_ROLE_SUFFIX_LENGTH = exports.SCHEMA_ROLE_BASE_MAX_LENGTH = exports.SchemaRoleKind = exports.schemaRoleName = exports.schemaRoleBase = exports.rolesForSchema = exports.sanitizeIdentifierSegment = exports.sanitizeIdentifierChars = exports.POSTGRES_MAX_IDENTIFIER_LENGTH = exports.IDENTIFIER_HASH_LENGTH = exports.fitIdentifier = exports.composeIdentifier = exports.deriveBiomeSchemaName = exports.DEFAULT_BIOME_DB_KEY = void 0;
4
4
  var schema_name_1 = require("./lib/schema-name");
5
5
  Object.defineProperty(exports, "DEFAULT_BIOME_DB_KEY", { enumerable: true, get: function () { return schema_name_1.DEFAULT_BIOME_DB_KEY; } });
6
6
  Object.defineProperty(exports, "deriveBiomeSchemaName", { enumerable: true, get: function () { return schema_name_1.deriveBiomeSchemaName; } });
7
+ var identifier_1 = require("./lib/identifier");
8
+ Object.defineProperty(exports, "composeIdentifier", { enumerable: true, get: function () { return identifier_1.composeIdentifier; } });
9
+ Object.defineProperty(exports, "fitIdentifier", { enumerable: true, get: function () { return identifier_1.fitIdentifier; } });
10
+ Object.defineProperty(exports, "IDENTIFIER_HASH_LENGTH", { enumerable: true, get: function () { return identifier_1.IDENTIFIER_HASH_LENGTH; } });
11
+ Object.defineProperty(exports, "POSTGRES_MAX_IDENTIFIER_LENGTH", { enumerable: true, get: function () { return identifier_1.POSTGRES_MAX_IDENTIFIER_LENGTH; } });
12
+ Object.defineProperty(exports, "sanitizeIdentifierChars", { enumerable: true, get: function () { return identifier_1.sanitizeIdentifierChars; } });
13
+ Object.defineProperty(exports, "sanitizeIdentifierSegment", { enumerable: true, get: function () { return identifier_1.sanitizeIdentifierSegment; } });
14
+ var role_names_1 = require("./lib/role-names");
15
+ Object.defineProperty(exports, "rolesForSchema", { enumerable: true, get: function () { return role_names_1.rolesForSchema; } });
16
+ Object.defineProperty(exports, "schemaRoleBase", { enumerable: true, get: function () { return role_names_1.schemaRoleBase; } });
17
+ Object.defineProperty(exports, "schemaRoleName", { enumerable: true, get: function () { return role_names_1.schemaRoleName; } });
18
+ Object.defineProperty(exports, "SchemaRoleKind", { enumerable: true, get: function () { return role_names_1.SchemaRoleKind; } });
19
+ Object.defineProperty(exports, "SCHEMA_ROLE_BASE_MAX_LENGTH", { enumerable: true, get: function () { return role_names_1.SCHEMA_ROLE_BASE_MAX_LENGTH; } });
20
+ Object.defineProperty(exports, "SCHEMA_ROLE_SUFFIX_LENGTH", { enumerable: true, get: function () { return role_names_1.SCHEMA_ROLE_SUFFIX_LENGTH; } });
21
+ var response_envelope_1 = require("./lib/response-envelope");
22
+ Object.defineProperty(exports, "unwrapPlatformResponseEnvelope", { enumerable: true, get: function () { return response_envelope_1.unwrapPlatformResponseEnvelope; } });
7
23
  var config_1 = require("./lib/config");
8
24
  Object.defineProperty(exports, "resolveBiomeDatabaseConfigFromEnv", { enumerable: true, get: function () { return config_1.resolveBiomeDatabaseConfigFromEnv; } });
9
25
  var adapter_1 = require("./lib/adapter");
@@ -36,4 +52,13 @@ var tenant_isolation_extension_1 = require("./lib/tenant-isolation/tenant-isolat
36
52
  Object.defineProperty(exports, "DEFAULT_ORG_FIELD", { enumerable: true, get: function () { return tenant_isolation_extension_1.DEFAULT_ORG_FIELD; } });
37
53
  Object.defineProperty(exports, "collectOrgScopedModels", { enumerable: true, get: function () { return tenant_isolation_extension_1.collectOrgScopedModels; } });
38
54
  Object.defineProperty(exports, "createTenantIsolationExtension", { enumerable: true, get: function () { return tenant_isolation_extension_1.createTenantIsolationExtension; } });
55
+ var org_erasure_1 = require("./lib/tenant-isolation/org-erasure");
56
+ Object.defineProperty(exports, "eraseOrgData", { enumerable: true, get: function () { return org_erasure_1.eraseOrgData; } });
57
+ Object.defineProperty(exports, "OrgErasureBlockedError", { enumerable: true, get: function () { return org_erasure_1.OrgErasureBlockedError; } });
58
+ var org_erasure_module_1 = require("./lib/nest/org-erasure.module");
59
+ Object.defineProperty(exports, "OrgErasureModule", { enumerable: true, get: function () { return org_erasure_module_1.OrgErasureModule; } });
60
+ Object.defineProperty(exports, "OrgErasureController", { enumerable: true, get: function () { return org_erasure_module_1.OrgErasureController; } });
61
+ Object.defineProperty(exports, "ORG_ERASURE_RUNNER", { enumerable: true, get: function () { return org_erasure_module_1.ORG_ERASURE_RUNNER; } });
62
+ Object.defineProperty(exports, "ORG_DATA_ERASURE_CAPABILITY", { enumerable: true, get: function () { return org_erasure_module_1.ORG_DATA_ERASURE_CAPABILITY; } });
63
+ Object.defineProperty(exports, "ORG_ERASURE_ROUTE_PATH", { enumerable: true, get: function () { return org_erasure_module_1.ORG_ERASURE_ROUTE_PATH; } });
39
64
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,iDAAgF;AAAvE,mHAAA,oBAAoB,OAAA;AAAE,oHAAA,qBAAqB,OAAA;AACpD,uCAGsB;AAFpB,2HAAA,iCAAiC,OAAA;AAGnC,yCAGuB;AAFrB,mHAAA,wBAAwB,OAAA;AACxB,0HAAA,+BAA+B,OAAA;AAEjC,mEAGoC;AAFlC,iIAAA,yBAAyB,OAAA;AAG3B,yEAIuC;AAHrC,qIAAA,0BAA0B,OAAA;AAC1B,yIAAA,8BAA8B,OAAA;AAGhC,6CAIyB;AAHvB,oHAAA,uBAAuB,OAAA;AAIzB,0EAI0C;AAHxC,4HAAA,mBAAmB,OAAA;AACnB,6HAAA,oBAAoB,OAAA;AAGtB,4EAQ2C;AAPzC,kIAAA,wBAAwB,OAAA;AAQ1B,sFAIsD;AAHpD,4HAAA,mBAAmB,OAAA;AACnB,sIAAA,6BAA6B,OAAA;AAC7B,mIAAA,0BAA0B,OAAA;AAE5B,wFAKuD;AAJrD,8HAAA,oBAAoB,OAAA;AACpB,sIAAA,4BAA4B,OAAA;AAC5B,wIAAA,8BAA8B,OAAA;AAGhC,8DAK0C;AAJxC,iHAAA,oBAAoB,OAAA;AACpB,2GAAA,cAAc,OAAA;AAIhB,gGAQ2D;AAPzD,+HAAA,iBAAiB,OAAA;AACjB,oIAAA,sBAAsB,OAAA;AACtB,4IAAA,8BAA8B,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,iDAAgF;AAAvE,mHAAA,oBAAoB,OAAA;AAAE,oHAAA,qBAAqB,OAAA;AACpD,+CAS0B;AARxB,+GAAA,iBAAiB,OAAA;AACjB,2GAAA,aAAa,OAAA;AACb,oHAAA,sBAAsB,OAAA;AACtB,4HAAA,8BAA8B,OAAA;AAC9B,qHAAA,uBAAuB,OAAA;AACvB,uHAAA,yBAAyB,OAAA;AAI3B,+CAQ0B;AAPxB,4GAAA,cAAc,OAAA;AACd,4GAAA,cAAc,OAAA;AACd,4GAAA,cAAc,OAAA;AACd,4GAAA,cAAc,OAAA;AACd,yHAAA,2BAA2B,OAAA;AAC3B,uHAAA,yBAAyB,OAAA;AAG3B,6DAAyE;AAAhE,mIAAA,8BAA8B,OAAA;AACvC,uCAGsB;AAFpB,2HAAA,iCAAiC,OAAA;AAGnC,yCAGuB;AAFrB,mHAAA,wBAAwB,OAAA;AACxB,0HAAA,+BAA+B,OAAA;AAEjC,mEAGoC;AAFlC,iIAAA,yBAAyB,OAAA;AAG3B,yEAIuC;AAHrC,qIAAA,0BAA0B,OAAA;AAC1B,yIAAA,8BAA8B,OAAA;AAGhC,6CAIyB;AAHvB,oHAAA,uBAAuB,OAAA;AAIzB,0EAI0C;AAHxC,4HAAA,mBAAmB,OAAA;AACnB,6HAAA,oBAAoB,OAAA;AAGtB,4EAQ2C;AAPzC,kIAAA,wBAAwB,OAAA;AAQ1B,sFAIsD;AAHpD,4HAAA,mBAAmB,OAAA;AACnB,sIAAA,6BAA6B,OAAA;AAC7B,mIAAA,0BAA0B,OAAA;AAE5B,wFAKuD;AAJrD,8HAAA,oBAAoB,OAAA;AACpB,sIAAA,4BAA4B,OAAA;AAC5B,wIAAA,8BAA8B,OAAA;AAGhC,8DAK0C;AAJxC,iHAAA,oBAAoB,OAAA;AACpB,2GAAA,cAAc,OAAA;AAIhB,gGAQ2D;AAPzD,+HAAA,iBAAiB,OAAA;AACjB,oIAAA,sBAAsB,OAAA;AACtB,4IAAA,8BAA8B,OAAA;AAMhC,kEAK4C;AAJ1C,2GAAA,YAAY,OAAA;AACZ,qHAAA,sBAAsB,OAAA;AAIxB,oEAQuC;AAPrC,sHAAA,gBAAgB,OAAA;AAChB,0HAAA,oBAAoB,OAAA;AACpB,wHAAA,kBAAkB,OAAA;AAClB,iIAAA,2BAA2B,OAAA;AAC3B,4HAAA,sBAAsB,OAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"control-plane-client.d.ts","sourceRoot":"","sources":["../../src/lib/control-plane-client.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEpD,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAYD,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,2BAA2B,GAC/B,OAAO,CAAC,mBAAmB,CAAC,CA0B9B"}
1
+ {"version":3,"file":"control-plane-client.d.ts","sourceRoot":"","sources":["../../src/lib/control-plane-client.ts"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEpD,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAYD,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,2BAA2B,GAC/B,OAAO,CAAC,mBAAmB,CAAC,CA6B9B"}
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.fetchSystemDatabaseConfig = fetchSystemDatabaseConfig;
4
+ const response_envelope_1 = require("./response-envelope");
4
5
  async function fetchSystemDatabaseConfig(baseUrl, serviceToken, req) {
5
6
  const url = `${baseUrl.replace(/\/$/, '')}/system-databases/config`;
6
7
  const response = await fetch(url, {
@@ -19,7 +20,7 @@ async function fetchSystemDatabaseConfig(baseUrl, serviceToken, req) {
19
20
  throw new Error(`fetchSystemDatabaseConfig: ${url} responded ${response.status} ${response.statusText}: ${body}`);
20
21
  }
21
22
  const payload = (await response.json());
22
- const config = unwrapEnvelope(payload);
23
+ const config = (0, response_envelope_1.unwrapPlatformResponseEnvelope)(payload, `fetchSystemDatabaseConfig: ${url}`);
23
24
  assertCompleteConfig(config, url);
24
25
  return config;
25
26
  }
@@ -30,16 +31,6 @@ const REQUIRED_CONFIG_FIELDS = [
30
31
  'password',
31
32
  'database',
32
33
  ];
33
- function unwrapEnvelope(payload) {
34
- if (payload !== null &&
35
- typeof payload === 'object' &&
36
- 'data' in payload &&
37
- payload.data !== null &&
38
- typeof payload.data === 'object') {
39
- return payload.data;
40
- }
41
- return payload;
42
- }
43
34
  function assertCompleteConfig(config, url) {
44
35
  const record = config !== null && typeof config === 'object'
45
36
  ? config
@@ -1 +1 @@
1
- {"version":3,"file":"control-plane-client.js","sourceRoot":"","sources":["../../src/lib/control-plane-client.ts"],"names":[],"mappings":";;AAiDA,8DA8BC;AA9BM,KAAK,UAAU,yBAAyB,CAC7C,OAAe,EACf,YAAoB,EACpB,GAAgC;IAEhC,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,0BAA0B,CAAC;IAEpE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,YAAY,EAAE;YACvC,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzD,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,CAAC;QACpE,MAAM,IAAI,KAAK,CACb,8BAA8B,GAAG,cAAc,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,KAAK,IAAI,EAAE,CACjG,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAY,CAAC;IACnD,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACvC,oBAAoB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,sBAAsB,GAAG;IAC7B,MAAM;IACN,MAAM;IACN,UAAU;IACV,UAAU;IACV,UAAU;CACF,CAAC;AAQX,SAAS,cAAc,CAAC,OAAgB;IACtC,IACE,OAAO,KAAK,IAAI;QAChB,OAAO,OAAO,KAAK,QAAQ;QAC3B,MAAM,IAAI,OAAO;QAChB,OAA6B,CAAC,IAAI,KAAK,IAAI;QAC5C,OAAQ,OAA6B,CAAC,IAAI,KAAK,QAAQ,EACvD,CAAC;QACD,OAAQ,OAAyC,CAAC,IAAI,CAAC;IACzD,CAAC;IACD,OAAO,OAA8B,CAAC;AACxC,CAAC;AASD,SAAS,oBAAoB,CAC3B,MAA2B,EAC3B,GAAW;IAIX,MAAM,MAAM,GACV,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ;QAC3C,CAAC,CAAE,MAA6C;QAChD,CAAC,CAAC,EAAE,CAAC;IACT,MAAM,OAAO,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QACtD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5B,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;IAC/D,CAAC,CAAC,CAAC;IACH,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,8BAA8B,GAAG,sCAAsC;YACrE,aAAa,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB;YACjD,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,mCAAmC;YACrE,gDAAgD,CACnD,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"control-plane-client.js","sourceRoot":"","sources":["../../src/lib/control-plane-client.ts"],"names":[],"mappings":";;AAmDA,8DAiCC;AApDD,2DAAqE;AAmB9D,KAAK,UAAU,yBAAyB,CAC7C,OAAe,EACf,YAAoB,EACpB,GAAgC;IAEhC,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,0BAA0B,CAAC;IAEpE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,YAAY,EAAE;YACvC,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzD,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,CAAC;QACpE,MAAM,IAAI,KAAK,CACb,8BAA8B,GAAG,cAAc,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,KAAK,IAAI,EAAE,CACjG,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAY,CAAC;IACnD,MAAM,MAAM,GAAG,IAAA,kDAA8B,EAC3C,OAAO,EACP,8BAA8B,GAAG,EAAE,CACpC,CAAC;IACF,oBAAoB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,sBAAsB,GAAG;IAC7B,MAAM;IACN,MAAM;IACN,UAAU;IACV,UAAU;IACV,UAAU;CACF,CAAC;AASX,SAAS,oBAAoB,CAC3B,MAA2B,EAC3B,GAAW;IAIX,MAAM,MAAM,GACV,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ;QAC3C,CAAC,CAAE,MAA6C;QAChD,CAAC,CAAC,EAAE,CAAC;IACT,MAAM,OAAO,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QACtD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5B,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;IAC/D,CAAC,CAAC,CAAC;IACH,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,8BAA8B,GAAG,sCAAsC;YACrE,aAAa,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB;YACjD,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,mCAAmC;YACrE,gDAAgD,CACnD,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,18 @@
1
+ export declare const POSTGRES_MAX_IDENTIFIER_LENGTH = 63;
2
+ export declare const IDENTIFIER_HASH_LENGTH = 12;
3
+ export declare function sanitizeIdentifierChars(value: string): string;
4
+ export declare function sanitizeIdentifierSegment(value: string): string;
5
+ export interface FitIdentifierInput {
6
+ readonly candidate: string;
7
+ readonly maxLength: number;
8
+ readonly hashInput: string;
9
+ readonly hashLength?: number;
10
+ }
11
+ export declare function fitIdentifier({ candidate, maxLength, hashInput, hashLength, }: FitIdentifierInput): string;
12
+ export interface ComposeIdentifierInput {
13
+ readonly prefix: string;
14
+ readonly parts: readonly string[];
15
+ readonly maxLength?: number;
16
+ }
17
+ export declare function composeIdentifier({ prefix, parts, maxLength, }: ComposeIdentifierInput): string;
18
+ //# sourceMappingURL=identifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identifier.d.ts","sourceRoot":"","sources":["../../src/lib/identifier.ts"],"names":[],"mappings":"AAsCA,eAAO,MAAM,8BAA8B,KAAK,CAAC;AAOjD,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAczC,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7D;AAUD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAI/D;AAED,MAAM,WAAW,kBAAkB;IAEjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAM3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAO3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAWD,wBAAgB,aAAa,CAAC,EAC5B,SAAS,EACT,SAAS,EACT,SAAS,EACT,UAAmC,GACpC,EAAE,kBAAkB,GAAG,MAAM,CAqB7B;AAED,MAAM,WAAW,sBAAsB;IAMrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAElC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AASD,wBAAgB,iBAAiB,CAAC,EAChC,MAAM,EACN,KAAK,EACL,SAA0C,GAC3C,EAAE,sBAAsB,GAAG,MAAM,CAkBjC"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IDENTIFIER_HASH_LENGTH = exports.POSTGRES_MAX_IDENTIFIER_LENGTH = void 0;
4
+ exports.sanitizeIdentifierChars = sanitizeIdentifierChars;
5
+ exports.sanitizeIdentifierSegment = sanitizeIdentifierSegment;
6
+ exports.fitIdentifier = fitIdentifier;
7
+ exports.composeIdentifier = composeIdentifier;
8
+ const node_crypto_1 = require("node:crypto");
9
+ exports.POSTGRES_MAX_IDENTIFIER_LENGTH = 63;
10
+ exports.IDENTIFIER_HASH_LENGTH = 12;
11
+ const IDENTIFIER_PREFIX_PATTERN = /^[a-z][a-z0-9_]*$/;
12
+ function sanitizeIdentifierChars(value) {
13
+ return value.toLowerCase().replace(/[^a-z0-9_]/g, '_');
14
+ }
15
+ function sanitizeIdentifierSegment(value) {
16
+ return sanitizeIdentifierChars(value)
17
+ .replace(/_+/g, '_')
18
+ .replace(/^_+|_+$/g, '');
19
+ }
20
+ function fitIdentifier({ candidate, maxLength, hashInput, hashLength = exports.IDENTIFIER_HASH_LENGTH, }) {
21
+ if (!Number.isInteger(maxLength) || maxLength <= hashLength + 1) {
22
+ throw new Error(`fitIdentifier: maxLength must be an integer greater than ${hashLength + 1} (hashLength + 1) to leave room for the disambiguating hash; received ${maxLength}`);
23
+ }
24
+ if (candidate.length <= maxLength) {
25
+ return candidate;
26
+ }
27
+ const hash = (0, node_crypto_1.createHash)('sha256')
28
+ .update(hashInput)
29
+ .digest('hex')
30
+ .slice(0, hashLength);
31
+ const prefix = candidate
32
+ .slice(0, maxLength - hashLength - 1)
33
+ .replace(/_+$/g, '');
34
+ return `${prefix}_${hash}`;
35
+ }
36
+ function composeIdentifier({ prefix, parts, maxLength = exports.POSTGRES_MAX_IDENTIFIER_LENGTH, }) {
37
+ if (!IDENTIFIER_PREFIX_PATTERN.test(prefix)) {
38
+ throw new Error(`composeIdentifier: prefix "${prefix}" is not a bare lowercase identifier fragment (${String(IDENTIFIER_PREFIX_PATTERN)})`);
39
+ }
40
+ const segments = parts
41
+ .map((part) => sanitizeIdentifierSegment(part))
42
+ .filter((part) => part.length > 0);
43
+ return fitIdentifier({
44
+ candidate: [prefix, ...segments].join('_'),
45
+ maxLength,
46
+ hashInput: parts.join(':'),
47
+ });
48
+ }
49
+ //# sourceMappingURL=identifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identifier.js","sourceRoot":"","sources":["../../src/lib/identifier.ts"],"names":[],"mappings":";;;AA2DA,0DAEC;AAUD,8DAIC;AA+BD,sCA0BC;AAsBD,8CAsBC;AAhLD,6CAAyC;AAsC5B,QAAA,8BAA8B,GAAG,EAAE,CAAC;AAOpC,QAAA,sBAAsB,GAAG,EAAE,CAAC;AAGzC,MAAM,yBAAyB,GAAG,mBAAmB,CAAC;AAWtD,SAAgB,uBAAuB,CAAC,KAAa;IACnD,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;AACzD,CAAC;AAUD,SAAgB,yBAAyB,CAAC,KAAa;IACrD,OAAO,uBAAuB,CAAC,KAAK,CAAC;SAClC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC;AA+BD,SAAgB,aAAa,CAAC,EAC5B,SAAS,EACT,SAAS,EACT,SAAS,EACT,UAAU,GAAG,8BAAsB,GAChB;IACnB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CACb,4DACE,UAAU,GAAG,CACf,yEAAyE,SAAS,EAAE,CACrF,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;QAClC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,IAAI,GAAG,IAAA,wBAAU,EAAC,QAAQ,CAAC;SAC9B,MAAM,CAAC,SAAS,CAAC;SACjB,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IACxB,MAAM,MAAM,GAAG,SAAS;SACrB,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,CAAC,CAAC;SACpC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACvB,OAAO,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC;AAC7B,CAAC;AAsBD,SAAgB,iBAAiB,CAAC,EAChC,MAAM,EACN,KAAK,EACL,SAAS,GAAG,sCAA8B,GACnB;IACvB,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CACb,8BAA8B,MAAM,kDAAkD,MAAM,CAC1F,yBAAyB,CAC1B,GAAG,CACL,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK;SACnB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC;SAC9C,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAErC,OAAO,aAAa,CAAC;QACnB,SAAS,EAAE,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAC1C,SAAS;QACT,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;KAC3B,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { type DynamicModule, type Type } from '@nestjs/common';
2
+ import { type EraseOrgDataOptions, type OrgErasureReport } from '../tenant-isolation/org-erasure';
3
+ export declare const ORG_ERASURE_RUNNER: unique symbol;
4
+ export declare const ORG_DATA_ERASURE_CAPABILITY = "xema.org-data-erasure";
5
+ export declare const ORG_ERASURE_ROUTE_PATH = "internal/org-erasure";
6
+ export interface OrgErasureRunner {
7
+ erase(orgId: string): Promise<OrgErasureReport>;
8
+ }
9
+ export declare class OrgErasureController {
10
+ private readonly runner;
11
+ constructor(runner: OrgErasureRunner);
12
+ erase(orgId: string): Promise<OrgErasureReport>;
13
+ }
14
+ export interface OrgErasureModuleOptions extends EraseOrgDataOptions {
15
+ readonly prismaServiceToken: Type<unknown> | string | symbol;
16
+ }
17
+ export declare class OrgErasureModule {
18
+ static forRoot(options: OrgErasureModuleOptions): DynamicModule;
19
+ }
20
+ //# sourceMappingURL=org-erasure.module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"org-erasure.module.d.ts","sourceRoot":"","sources":["../../../src/lib/nest/org-erasure.module.ts"],"names":[],"mappings":"AA4BA,OAAO,EAML,KAAK,aAAa,EAClB,KAAK,IAAI,EACV,MAAM,gBAAgB,CAAC;AAKxB,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACtB,MAAM,iCAAiC,CAAC;AAKzC,eAAO,MAAM,kBAAkB,eAE9B,CAAC;AAUF,eAAO,MAAM,2BAA2B,0BAA0B,CAAC;AAGnE,eAAO,MAAM,sBAAsB,yBAAyB,CAAC;AAE7D,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACjD;AAED,qBAGa,oBAAoB;IAED,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,gBAAgB;IASvE,KAAK,CAAiB,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAGhE;AAED,MAAM,WAAW,uBAAwB,SAAQ,mBAAmB;IAMlE,QAAQ,CAAC,kBAAkB,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC;CAC9D;AAQD,qBAAa,gBAAgB;IAC3B,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,uBAAuB,GAAG,aAAa;CAiBhE"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.OrgErasureModule = exports.OrgErasureController = exports.ORG_ERASURE_ROUTE_PATH = exports.ORG_DATA_ERASURE_CAPABILITY = exports.ORG_ERASURE_RUNNER = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const swagger_1 = require("@nestjs/swagger");
18
+ const platform_common_1 = require("@xemahq/platform-common");
19
+ const xema_decorators_1 = require("@xemahq/xema-decorators");
20
+ const org_erasure_1 = require("../tenant-isolation/org-erasure");
21
+ exports.ORG_ERASURE_RUNNER = Symbol.for('@xemahq/biome-database-nest/org-erasure-runner');
22
+ exports.ORG_DATA_ERASURE_CAPABILITY = 'xema.org-data-erasure';
23
+ exports.ORG_ERASURE_ROUTE_PATH = 'internal/org-erasure';
24
+ let OrgErasureController = class OrgErasureController {
25
+ runner;
26
+ constructor(runner) {
27
+ this.runner = runner;
28
+ }
29
+ erase(orgId) {
30
+ return this.runner.erase(orgId);
31
+ }
32
+ };
33
+ exports.OrgErasureController = OrgErasureController;
34
+ __decorate([
35
+ (0, xema_decorators_1.XemaInternalRoute)({ audience: xema_decorators_1.InternalRouteAudience.Service }),
36
+ (0, common_1.Post)(':orgId'),
37
+ (0, swagger_1.ApiOperation)({
38
+ summary: "Erase every row belonging to an org across this service's org-scoped models",
39
+ }),
40
+ __param(0, (0, common_1.Param)('orgId')),
41
+ __metadata("design:type", Function),
42
+ __metadata("design:paramtypes", [String]),
43
+ __metadata("design:returntype", Promise)
44
+ ], OrgErasureController.prototype, "erase", null);
45
+ exports.OrgErasureController = OrgErasureController = __decorate([
46
+ (0, swagger_1.ApiTags)('org-erasure'),
47
+ (0, common_1.UseGuards)(platform_common_1.ServiceActorGuard),
48
+ (0, common_1.Controller)('internal/org-erasure'),
49
+ __param(0, (0, common_1.Inject)(exports.ORG_ERASURE_RUNNER)),
50
+ __metadata("design:paramtypes", [Object])
51
+ ], OrgErasureController);
52
+ class OrgErasureModule {
53
+ static forRoot(options) {
54
+ const { prismaServiceToken, ...eraseOptions } = options;
55
+ return {
56
+ module: OrgErasureModule,
57
+ controllers: [OrgErasureController],
58
+ providers: [
59
+ {
60
+ provide: exports.ORG_ERASURE_RUNNER,
61
+ useFactory: (prisma) => ({
62
+ erase: (orgId) => (0, org_erasure_1.eraseOrgData)(prisma.asSystem(), orgId, eraseOptions),
63
+ }),
64
+ inject: [prismaServiceToken],
65
+ },
66
+ ],
67
+ };
68
+ }
69
+ }
70
+ exports.OrgErasureModule = OrgErasureModule;
71
+ //# sourceMappingURL=org-erasure.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"org-erasure.module.js","sourceRoot":"","sources":["../../../src/lib/nest/org-erasure.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AA4BA,2CAQwB;AACxB,6CAAwD;AACxD,6DAA4D;AAC5D,6DAAmF;AAEnF,iEAIyC;AAK5B,QAAA,kBAAkB,GAAG,MAAM,CAAC,GAAG,CAC1C,gDAAgD,CACjD,CAAC;AAUW,QAAA,2BAA2B,GAAG,uBAAuB,CAAC;AAGtD,QAAA,sBAAsB,GAAG,sBAAsB,CAAC;AAStD,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IAEgB;IAD/C,YAC+C,MAAwB;QAAxB,WAAM,GAAN,MAAM,CAAkB;IACpE,CAAC;IAQJ,KAAK,CAAiB,KAAa;QACjC,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;CACF,CAAA;AAdY,oDAAoB;AAW/B;IANC,IAAA,mCAAiB,EAAC,EAAE,QAAQ,EAAE,uCAAqB,CAAC,OAAO,EAAE,CAAC;IAC9D,IAAA,aAAI,EAAC,QAAQ,CAAC;IACd,IAAA,sBAAY,EAAC;QACZ,OAAO,EACL,6EAA6E;KAChF,CAAC;IACK,WAAA,IAAA,cAAK,EAAC,OAAO,CAAC,CAAA;;;;iDAEpB;+BAbU,oBAAoB;IAHhC,IAAA,iBAAO,EAAC,aAAa,CAAC;IACtB,IAAA,kBAAS,EAAC,mCAAiB,CAAC;IAC5B,IAAA,mBAAU,EAAC,sBAAsB,CAAC;IAG9B,WAAA,IAAA,eAAM,EAAC,0BAAkB,CAAC,CAAA;;GAFlB,oBAAoB,CAchC;AAiBD,MAAa,gBAAgB;IAC3B,MAAM,CAAC,OAAO,CAAC,OAAgC;QAC7C,MAAM,EAAE,kBAAkB,EAAE,GAAG,YAAY,EAAE,GAAG,OAAO,CAAC;QACxD,OAAO;YACL,MAAM,EAAE,gBAAgB;YACxB,WAAW,EAAE,CAAC,oBAAoB,CAAC;YACnC,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,0BAAkB;oBAC3B,UAAU,EAAE,CAAC,MAAwB,EAAoB,EAAE,CAAC,CAAC;wBAC3D,KAAK,EAAE,CAAC,KAAa,EAA6B,EAAE,CAClD,IAAA,0BAAY,EAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC;qBACvD,CAAC;oBACF,MAAM,EAAE,CAAC,kBAAkB,CAAC;iBAC7B;aACF;SACF,CAAC;IACJ,CAAC;CACF;AAlBD,4CAkBC"}
@@ -0,0 +1,2 @@
1
+ export declare function unwrapPlatformResponseEnvelope<T>(payload: unknown, context: string): T;
2
+ //# sourceMappingURL=response-envelope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-envelope.d.ts","sourceRoot":"","sources":["../../src/lib/response-envelope.ts"],"names":[],"mappings":"AAwCA,wBAAgB,8BAA8B,CAAC,CAAC,EAC9C,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,MAAM,GACd,CAAC,CAaH"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.unwrapPlatformResponseEnvelope = unwrapPlatformResponseEnvelope;
4
+ function describePayload(payload) {
5
+ if (payload === null) {
6
+ return 'null';
7
+ }
8
+ if (Array.isArray(payload)) {
9
+ return 'a bare array';
10
+ }
11
+ if (typeof payload === 'object') {
12
+ return `an object with keys [${Object.keys(payload).join(', ')}]`;
13
+ }
14
+ return `a bare ${typeof payload}`;
15
+ }
16
+ function unwrapPlatformResponseEnvelope(payload, context) {
17
+ if (payload === null ||
18
+ typeof payload !== 'object' ||
19
+ !('data' in payload)) {
20
+ throw new Error(`${context}: response is not a platform envelope — expected an object with a 'data' property, ` +
21
+ `received ${describePayload(payload)}. The peer either is not a Xema platform service or is ` +
22
+ `missing the global ResponseEnvelopeInterceptor.`);
23
+ }
24
+ return payload.data;
25
+ }
26
+ //# sourceMappingURL=response-envelope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-envelope.js","sourceRoot":"","sources":["../../src/lib/response-envelope.ts"],"names":[],"mappings":";;AAwCA,wEAgBC;AAvCD,SAAS,eAAe,CAAC,OAAgB;IACvC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,wBAAwB,MAAM,CAAC,IAAI,CACxC,OAAkC,CACnC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;IACD,OAAO,UAAU,OAAO,OAAO,EAAE,CAAC;AACpC,CAAC;AAUD,SAAgB,8BAA8B,CAC5C,OAAgB,EAChB,OAAe;IAEf,IACE,OAAO,KAAK,IAAI;QAChB,OAAO,OAAO,KAAK,QAAQ;QAC3B,CAAC,CAAC,MAAM,IAAK,OAAmC,CAAC,EACjD,CAAC;QACD,MAAM,IAAI,KAAK,CACb,GAAG,OAAO,qFAAqF;YAC7F,YAAY,eAAe,CAAC,OAAO,CAAC,yDAAyD;YAC7F,iDAAiD,CACpD,CAAC;IACJ,CAAC;IACD,OAAQ,OAAuB,CAAC,IAAI,CAAC;AACvC,CAAC"}
@@ -0,0 +1,14 @@
1
+ export declare enum SchemaRoleKind {
2
+ ReadWrite = "rw",
3
+ ReadOnly = "ro"
4
+ }
5
+ export declare const SCHEMA_ROLE_SUFFIX_LENGTH = 3;
6
+ export declare const SCHEMA_ROLE_BASE_MAX_LENGTH: number;
7
+ export interface SchemaRoleNames {
8
+ readonly rwRoleName: string;
9
+ readonly roRoleName: string;
10
+ }
11
+ export declare function schemaRoleBase(schemaName: string): string;
12
+ export declare function schemaRoleName(schemaName: string, kind: SchemaRoleKind): string;
13
+ export declare function rolesForSchema(schemaName: string): SchemaRoleNames;
14
+ //# sourceMappingURL=role-names.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-names.d.ts","sourceRoot":"","sources":["../../src/lib/role-names.ts"],"names":[],"mappings":"AAcA,oBAAY,cAAc;IACxB,SAAS,OAAO;IAChB,QAAQ,OAAO;CAChB;AAGD,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAU3C,eAAO,MAAM,2BAA2B,QACoB,CAAC;AAE7D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAaD,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAMzD;AAGD,wBAAgB,cAAc,CAC5B,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,cAAc,GACnB,MAAM,CAER;AAOD,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,CAMlE"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SCHEMA_ROLE_BASE_MAX_LENGTH = exports.SCHEMA_ROLE_SUFFIX_LENGTH = exports.SchemaRoleKind = void 0;
4
+ exports.schemaRoleBase = schemaRoleBase;
5
+ exports.schemaRoleName = schemaRoleName;
6
+ exports.rolesForSchema = rolesForSchema;
7
+ const identifier_1 = require("./identifier");
8
+ var SchemaRoleKind;
9
+ (function (SchemaRoleKind) {
10
+ SchemaRoleKind["ReadWrite"] = "rw";
11
+ SchemaRoleKind["ReadOnly"] = "ro";
12
+ })(SchemaRoleKind || (exports.SchemaRoleKind = SchemaRoleKind = {}));
13
+ exports.SCHEMA_ROLE_SUFFIX_LENGTH = 3;
14
+ exports.SCHEMA_ROLE_BASE_MAX_LENGTH = identifier_1.POSTGRES_MAX_IDENTIFIER_LENGTH - exports.SCHEMA_ROLE_SUFFIX_LENGTH;
15
+ function schemaRoleBase(schemaName) {
16
+ return (0, identifier_1.fitIdentifier)({
17
+ candidate: (0, identifier_1.sanitizeIdentifierChars)(schemaName),
18
+ maxLength: exports.SCHEMA_ROLE_BASE_MAX_LENGTH,
19
+ hashInput: schemaName,
20
+ });
21
+ }
22
+ function schemaRoleName(schemaName, kind) {
23
+ return `${schemaRoleBase(schemaName)}_${kind}`;
24
+ }
25
+ function rolesForSchema(schemaName) {
26
+ const base = schemaRoleBase(schemaName);
27
+ return {
28
+ rwRoleName: `${base}_${SchemaRoleKind.ReadWrite}`,
29
+ roRoleName: `${base}_${SchemaRoleKind.ReadOnly}`,
30
+ };
31
+ }
32
+ //# sourceMappingURL=role-names.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-names.js","sourceRoot":"","sources":["../../src/lib/role-names.ts"],"names":[],"mappings":";;;AAiDA,wCAMC;AAGD,wCAKC;AAOD,wCAMC;AA5ED,6CAIsB;AAUtB,IAAY,cAGX;AAHD,WAAY,cAAc;IACxB,kCAAgB,CAAA;IAChB,iCAAe,CAAA;AACjB,CAAC,EAHW,cAAc,8BAAd,cAAc,QAGzB;AAGY,QAAA,yBAAyB,GAAG,CAAC,CAAC;AAU9B,QAAA,2BAA2B,GACtC,2CAA8B,GAAG,iCAAyB,CAAC;AAkB7D,SAAgB,cAAc,CAAC,UAAkB;IAC/C,OAAO,IAAA,0BAAa,EAAC;QACnB,SAAS,EAAE,IAAA,oCAAuB,EAAC,UAAU,CAAC;QAC9C,SAAS,EAAE,mCAA2B;QACtC,SAAS,EAAE,UAAU;KACtB,CAAC,CAAC;AACL,CAAC;AAGD,SAAgB,cAAc,CAC5B,UAAkB,EAClB,IAAoB;IAEpB,OAAO,GAAG,cAAc,CAAC,UAAU,CAAC,IAAI,IAAI,EAAE,CAAC;AACjD,CAAC;AAOD,SAAgB,cAAc,CAAC,UAAkB;IAC/C,MAAM,IAAI,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IACxC,OAAO;QACL,UAAU,EAAE,GAAG,IAAI,IAAI,cAAc,CAAC,SAAS,EAAE;QACjD,UAAU,EAAE,GAAG,IAAI,IAAI,cAAc,CAAC,QAAQ,EAAE;KACjD,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"schema-name.d.ts","sourceRoot":"","sources":["../../src/lib/schema-name.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,oBAAoB,YAAY,CAAC;AAsC9C,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAuC7E"}
1
+ {"version":3,"file":"schema-name.d.ts","sourceRoot":"","sources":["../../src/lib/schema-name.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,oBAAoB,YAAY,CAAC;AAoB9C,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CA+B7E"}
@@ -2,43 +2,27 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DEFAULT_BIOME_DB_KEY = void 0;
4
4
  exports.deriveBiomeSchemaName = deriveBiomeSchemaName;
5
- const node_crypto_1 = require("node:crypto");
5
+ const identifier_1 = require("./identifier");
6
6
  exports.DEFAULT_BIOME_DB_KEY = 'primary';
7
7
  const SCHEMA_PREFIX = 'biome';
8
- const MAX_IDENTIFIER_LENGTH = 63;
9
- const HASH_LENGTH = 12;
10
- function sanitizeSegment(segment) {
11
- return segment
12
- .toLowerCase()
13
- .replace(/[^a-z0-9_]/g, '_')
14
- .replace(/_+/g, '_')
15
- .replace(/^_+|_+$/g, '');
16
- }
17
8
  function deriveBiomeSchemaName(biomeId, dbKey) {
18
- const sanitizedBiomeId = sanitizeSegment(biomeId);
9
+ const sanitizedBiomeId = (0, identifier_1.sanitizeIdentifierSegment)(biomeId);
19
10
  if (sanitizedBiomeId.length === 0) {
20
11
  throw new Error(`deriveBiomeSchemaName: biomeId "${biomeId}" sanitises to an empty identifier`);
21
12
  }
22
13
  const isDefaultKey = dbKey === undefined || dbKey === '' || dbKey === exports.DEFAULT_BIOME_DB_KEY;
23
- const sanitizedDbKey = isDefaultKey ? '' : sanitizeSegment(dbKey);
14
+ const sanitizedDbKey = isDefaultKey ? '' : (0, identifier_1.sanitizeIdentifierSegment)(dbKey);
24
15
  if (!isDefaultKey && sanitizedDbKey.length === 0) {
25
16
  throw new Error(`deriveBiomeSchemaName: dbKey "${dbKey}" sanitises to an empty identifier`);
26
17
  }
27
18
  const candidate = isDefaultKey
28
19
  ? `${SCHEMA_PREFIX}_${sanitizedBiomeId}`
29
20
  : `${SCHEMA_PREFIX}_${sanitizedBiomeId}__${sanitizedDbKey}`;
30
- if (candidate.length <= MAX_IDENTIFIER_LENGTH) {
31
- return candidate;
32
- }
33
21
  const hashParts = isDefaultKey ? [biomeId] : [biomeId, dbKey];
34
- const hash = (0, node_crypto_1.createHash)('sha256')
35
- .update(hashParts.join(':'))
36
- .digest('hex')
37
- .slice(0, HASH_LENGTH);
38
- const maxPrefixLength = MAX_IDENTIFIER_LENGTH - hash.length - 1;
39
- const trimmedPrefix = candidate
40
- .slice(0, maxPrefixLength)
41
- .replace(/_+$/g, '');
42
- return `${trimmedPrefix}_${hash}`;
22
+ return (0, identifier_1.fitIdentifier)({
23
+ candidate,
24
+ maxLength: identifier_1.POSTGRES_MAX_IDENTIFIER_LENGTH,
25
+ hashInput: hashParts.join(':'),
26
+ });
43
27
  }
44
28
  //# sourceMappingURL=schema-name.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema-name.js","sourceRoot":"","sources":["../../src/lib/schema-name.ts"],"names":[],"mappings":";;;AA4CA,sDAuCC;AAnFD,6CAAyC;AAM5B,QAAA,oBAAoB,GAAG,SAAS,CAAC;AAE9C,MAAM,aAAa,GAAG,OAAO,CAAC;AAC9B,MAAM,qBAAqB,GAAG,EAAE,CAAC;AACjC,MAAM,WAAW,GAAG,EAAE,CAAC;AAOvB,SAAS,eAAe,CAAC,OAAe;IACtC,OAAO,OAAO;SACX,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC;AAqBD,SAAgB,qBAAqB,CAAC,OAAe,EAAE,KAAc;IACnE,MAAM,gBAAgB,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAClD,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CACb,mCAAmC,OAAO,oCAAoC,CAC/E,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAChB,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,4BAAoB,CAAC;IACxE,MAAM,cAAc,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAElE,IAAI,CAAC,YAAY,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CACb,iCAAiC,KAAK,oCAAoC,CAC3E,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,YAAY;QAC5B,CAAC,CAAC,GAAG,aAAa,IAAI,gBAAgB,EAAE;QACxC,CAAC,CAAC,GAAG,aAAa,IAAI,gBAAgB,KAAK,cAAc,EAAE,CAAC;IAE9D,IAAI,SAAS,CAAC,MAAM,IAAI,qBAAqB,EAAE,CAAC;QAC9C,OAAO,SAAS,CAAC;IACnB,CAAC;IAKD,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,KAAe,CAAC,CAAC;IACxE,MAAM,IAAI,GAAG,IAAA,wBAAU,EAAC,QAAQ,CAAC;SAC9B,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SAC3B,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IACzB,MAAM,eAAe,GAAG,qBAAqB,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAChE,MAAM,aAAa,GAAG,SAAS;SAC5B,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC;SACzB,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACvB,OAAO,GAAG,aAAa,IAAI,IAAI,EAAE,CAAC;AACpC,CAAC"}
1
+ {"version":3,"file":"schema-name.js","sourceRoot":"","sources":["../../src/lib/schema-name.ts"],"names":[],"mappings":";;;AA8BA,sDA+BC;AA7DD,6CAIsB;AAMT,QAAA,oBAAoB,GAAG,SAAS,CAAC;AAE9C,MAAM,aAAa,GAAG,OAAO,CAAC;AAkB9B,SAAgB,qBAAqB,CAAC,OAAe,EAAE,KAAc;IACnE,MAAM,gBAAgB,GAAG,IAAA,sCAAyB,EAAC,OAAO,CAAC,CAAC;IAC5D,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CACb,mCAAmC,OAAO,oCAAoC,CAC/E,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAChB,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,4BAAoB,CAAC;IACxE,MAAM,cAAc,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAA,sCAAyB,EAAC,KAAK,CAAC,CAAC;IAE5E,IAAI,CAAC,YAAY,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CACb,iCAAiC,KAAK,oCAAoC,CAC3E,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,YAAY;QAC5B,CAAC,CAAC,GAAG,aAAa,IAAI,gBAAgB,EAAE;QACxC,CAAC,CAAC,GAAG,aAAa,IAAI,gBAAgB,KAAK,cAAc,EAAE,CAAC;IAI9D,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,KAAe,CAAC,CAAC;IAExE,OAAO,IAAA,0BAAa,EAAC;QACnB,SAAS;QACT,SAAS,EAAE,2CAA8B;QACzC,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;KAC/B,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,17 @@
1
+ export interface EraseOrgDataOptions {
2
+ readonly orgField?: string;
3
+ readonly exemptModels?: readonly string[];
4
+ }
5
+ export interface OrgErasureReport {
6
+ readonly orgId: string;
7
+ readonly deletedByModel: Readonly<Record<string, number>>;
8
+ readonly totalDeleted: number;
9
+ readonly passes: number;
10
+ }
11
+ export declare class OrgErasureBlockedError extends Error {
12
+ readonly orgId: string;
13
+ readonly blockedModels: readonly string[];
14
+ constructor(orgId: string, blockedModels: readonly string[]);
15
+ }
16
+ export declare function eraseOrgData(client: unknown, orgId: string, options?: EraseOrgDataOptions): Promise<OrgErasureReport>;
17
+ //# sourceMappingURL=org-erasure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"org-erasure.d.ts","sourceRoot":"","sources":["../../../src/lib/tenant-isolation/org-erasure.ts"],"names":[],"mappings":"AA8BA,MAAM,WAAW,mBAAmB;IAElC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAQ3B,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3C;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1D,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAE9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAGD,qBAAa,sBAAuB,SAAQ,KAAK;IAE7C,QAAQ,CAAC,KAAK,EAAE,MAAM;IACtB,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE;gBADhC,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,SAAS,MAAM,EAAE;CAY5C;AA2BD,wBAAsB,YAAY,CAChC,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,gBAAgB,CAAC,CA0D3B"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OrgErasureBlockedError = void 0;
4
+ exports.eraseOrgData = eraseOrgData;
5
+ const tenant_isolation_extension_1 = require("./tenant-isolation.extension");
6
+ const PRISMA_FK_VIOLATION_CODE = 'P2003';
7
+ class OrgErasureBlockedError extends Error {
8
+ orgId;
9
+ blockedModels;
10
+ constructor(orgId, blockedModels) {
11
+ super(`[org-erasure] could not erase org "${orgId}": models [${blockedModels.join(', ')}] remain blocked by a foreign key after a no-progress pass. This means a ` +
12
+ `non-org-scoped table references these org rows, or the org-scoped models ` +
13
+ `form a delete cycle. Add an onDelete rule or a service-specific eraser — ` +
14
+ `erasure MUST NOT leave a silent partial.`);
15
+ this.orgId = orgId;
16
+ this.blockedModels = blockedModels;
17
+ this.name = 'OrgErasureBlockedError';
18
+ }
19
+ }
20
+ exports.OrgErasureBlockedError = OrgErasureBlockedError;
21
+ function delegateKeyForModel(modelName) {
22
+ return modelName.charAt(0).toLowerCase() + modelName.slice(1);
23
+ }
24
+ function isForeignKeyViolation(error) {
25
+ return (typeof error === 'object' &&
26
+ error !== null &&
27
+ error.code === PRISMA_FK_VIOLATION_CODE);
28
+ }
29
+ async function eraseOrgData(client, orgId, options = {}) {
30
+ const orgField = options.orgField ?? tenant_isolation_extension_1.DEFAULT_ORG_FIELD;
31
+ if (orgId.trim() === '') {
32
+ throw new Error('[org-erasure] orgId must be a non-empty string.');
33
+ }
34
+ const scoped = (0, tenant_isolation_extension_1.collectOrgScopedModels)(client, orgField, options.exemptModels ?? []);
35
+ const deletedByModel = {};
36
+ let remaining = [...scoped];
37
+ let passes = 0;
38
+ while (remaining.length > 0) {
39
+ passes += 1;
40
+ const blocked = [];
41
+ let progressed = false;
42
+ for (const modelName of remaining) {
43
+ const delegate = client[delegateKeyForModel(modelName)];
44
+ if (delegate?.deleteMany === undefined) {
45
+ throw new Error(`[org-erasure] Prisma client has no deleteMany delegate for model ` +
46
+ `"${modelName}" (looked up "${delegateKeyForModel(modelName)}").`);
47
+ }
48
+ try {
49
+ const { count } = await delegate.deleteMany({
50
+ where: { [orgField]: orgId },
51
+ });
52
+ deletedByModel[modelName] = (deletedByModel[modelName] ?? 0) + count;
53
+ progressed = true;
54
+ }
55
+ catch (error) {
56
+ if (isForeignKeyViolation(error)) {
57
+ blocked.push(modelName);
58
+ continue;
59
+ }
60
+ throw error;
61
+ }
62
+ }
63
+ if (!progressed && blocked.length > 0) {
64
+ throw new OrgErasureBlockedError(orgId, blocked);
65
+ }
66
+ remaining = blocked;
67
+ }
68
+ const totalDeleted = Object.values(deletedByModel).reduce((sum, n) => sum + n, 0);
69
+ return { orgId, deletedByModel, totalDeleted, passes };
70
+ }
71
+ //# sourceMappingURL=org-erasure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"org-erasure.js","sourceRoot":"","sources":["../../../src/lib/tenant-isolation/org-erasure.ts"],"names":[],"mappings":";;;AA+FA,oCA8DC;AAvID,6EAGsC;AAGtC,MAAM,wBAAwB,GAAG,OAAO,CAAC;AAyBzC,MAAa,sBAAuB,SAAQ,KAAK;IAEpC;IACA;IAFX,YACW,KAAa,EACb,aAAgC;QAEzC,KAAK,CACH,sCAAsC,KAAK,cAAc,aAAa,CAAC,IAAI,CACzE,IAAI,CACL,2EAA2E;YAC1E,2EAA2E;YAC3E,2EAA2E;YAC3E,0CAA0C,CAC7C,CAAC;QAVO,UAAK,GAAL,KAAK,CAAQ;QACb,kBAAa,GAAb,aAAa,CAAmB;QAUzC,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAfD,wDAeC;AAOD,SAAS,mBAAmB,CAAC,SAAiB;IAC5C,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAc;IAC3C,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACb,KAA4B,CAAC,IAAI,KAAK,wBAAwB,CAChE,CAAC;AACJ,CAAC;AAUM,KAAK,UAAU,YAAY,CAChC,MAAe,EACf,KAAa,EACb,UAA+B,EAAE;IAEjC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,8CAAiB,CAAC;IACvD,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,mDAAsB,EACnC,MAAM,EACN,QAAQ,EACR,OAAO,CAAC,YAAY,IAAI,EAAE,CAC3B,CAAC;IAEF,MAAM,cAAc,GAA2B,EAAE,CAAC;IAClD,IAAI,SAAS,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;IAC5B,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,CAAC,CAAC;QACZ,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,IAAI,UAAU,GAAG,KAAK,CAAC;QAEvB,KAAK,MAAM,SAAS,IAAI,SAAS,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAI,MAAkC,CAClD,mBAAmB,CAAC,SAAS,CAAC,CACG,CAAC;YACpC,IAAI,QAAQ,EAAE,UAAU,KAAK,SAAS,EAAE,CAAC;gBACvC,MAAM,IAAI,KAAK,CACb,mEAAmE;oBACjE,IAAI,SAAS,iBAAiB,mBAAmB,CAAC,SAAS,CAAC,KAAK,CACpE,CAAC;YACJ,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC;oBAC1C,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE;iBAC7B,CAAC,CAAC;gBACH,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC;gBACrE,UAAU,GAAG,IAAI,CAAC;YACpB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;oBACjC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBACxB,SAAS;gBACX,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QAED,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,sBAAsB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACnD,CAAC;QACD,SAAS,GAAG,OAAO,CAAC;IACtB,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,MAAM,CACvD,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,EACnB,CAAC,CACF,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;AACzD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xemahq/biome-database-nest",
3
- "version": "0.5.2",
3
+ "version": "0.6.1",
4
4
  "description": "Layer 1 SDK that centralizes ALL database concerns for Xema biome services. Provides the single correct construction of a schema-qualified Prisma driver-adapter (the second-arg `{ schema }` that makes `@prisma/adapter-pg` qualify `biome_<id>.<table>` instead of `public.<table>`), the per-biome schema-naming convention, env/control-plane config resolution, and a boot-time bootstrap that creates the schema and runs migrations. Biomes carry zero DB boilerplate.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Neuralchowder Inc. <developer@xema.dev> (https://xema.dev)",
@@ -23,25 +23,29 @@
23
23
  "devDependencies": {
24
24
  "@nestjs/common": "11.1.13",
25
25
  "@nestjs/core": "11.1.13",
26
+ "@nestjs/swagger": "11.2.6",
26
27
  "@types/jest": "^30.0.0",
27
28
  "@types/node": "25.2.3",
28
29
  "@types/pg": "^8.16.0",
29
30
  "@xemahq/identity-client": "^0.3.5",
30
- "@xemahq/kernel-contracts": "^0.48.0",
31
+ "@xemahq/kernel-contracts": "^0.52.0",
32
+ "@xemahq/xema-decorators": "^0.2.0",
31
33
  "jest": "^30.3.0",
32
34
  "prettier": "3.6.2",
33
35
  "ts-jest": "^29.4.9",
34
36
  "typescript": "5.9.3",
35
- "@xemahq/service-registry-nest": "0.3.2"
37
+ "@xemahq/service-registry-nest": "0.5.0"
36
38
  },
37
39
  "peerDependencies": {
38
40
  "@nestjs/common": "^10 || ^11",
39
41
  "@nestjs/core": "^10 || ^11",
42
+ "@nestjs/swagger": "^10 || ^11",
40
43
  "@prisma/adapter-pg": "^7",
41
44
  "@prisma/client": "^7",
42
45
  "@xemahq/identity-client": "^0.3.0",
43
46
  "@xemahq/kernel-contracts": ">=0.13.0",
44
- "@xemahq/service-registry-nest": ">=0.2.0"
47
+ "@xemahq/service-registry-nest": ">=0.2.0",
48
+ "@xemahq/xema-decorators": ">=0.2.0"
45
49
  },
46
50
  "dependencies": {
47
51
  "@xemahq/migration-runner-prisma": "^0.1.2",