{"version":3,"file":"SystemSchemaTransferMappingFactory.cjs","sources":["../../../../../packages/engine-http/src/transfer/SystemSchemaTransferMappingFactory.ts"],"sourcesContent":["import { TransferMapping, TransferTableMapping } from './TransferMapping'\nimport { Model } from '@contember/schema'\nimport * as Typesafe from '@contember/typesafe'\nimport { Compiler, Operator, wrapIdentifier } from '@contember/database'\nimport { ImportError } from './ImportExecutor'\n\nexport class SystemSchemaTransferMappingFactory {\n\tbuild(args: {\n\t\texcludeTables?: readonly string[]\n\t} = {}): TransferMapping {\n\t\treturn {\n\t\t\ttables: this.associateByName([\n\t\t\t\tthis.buildEventDataMapping(args),\n\t\t\t\tthis.buildStageTransactionDataMapping(),\n\t\t\t]),\n\t\t}\n\t}\n\n\tprivate buildStageTransactionDataMapping(): TransferTableMapping {\n\t\treturn {\n\t\t\tname: 'stage_transaction',\n\n\t\t\tcolumns: this.associateByName([\n\t\t\t\t{ name: 'transaction_id', type: Model.ColumnType.Uuid },\n\t\t\t\t{ name: 'stage_slug', type: Model.ColumnType.String },\n\t\t\t\t{ name: 'applied_at', type: Model.ColumnType.DateTime },\n\t\t\t]),\n\n\t\t\tcreateSelect: (db, table) => {\n\t\t\t\tconst namespaceContext = new Compiler.Context(db.schema, new Set())\n\n\t\t\t\tlet builder = db.selectBuilder()\n\n\t\t\t\tfor (const column of Object.values(table.columns)) {\n\t\t\t\t\tif (column.name === 'stage_slug') {\n\t\t\t\t\t\tbuilder = builder.select(['stage', 'slug'], 'stage_slug')\n\n\t\t\t\t\t} else if (column.type === Model.ColumnType.Json || column.type === Model.ColumnType.Date || column.type === Model.ColumnType.DateTime) {\n\t\t\t\t\t\tbuilder = builder.select(expr => expr.raw(`${wrapIdentifier('stage_transaction')}.${wrapIdentifier(column.name)}::text`))\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbuilder = builder.select(['stage_transaction', column.name])\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn builder\n\t\t\t\t\t.from('stage_transaction')\n\t\t\t\t\t.join(\n\t\t\t\t\t\t'stage',\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\texpr => expr.compareColumns(['stage', 'id'], Operator.eq, ['stage_transaction', 'stage_id']),\n\t\t\t\t\t)\n\t\t\t\t\t.createQuery(namespaceContext)\n\t\t\t},\n\n\t\t\tcreateInsertStartFragment: (schema, tableName, columnNames) => {\n\t\t\t\tconst columnNames2 = columnNames.map(name => name === 'stage_slug' ? 'stage_id' : name)\n\t\t\t\tconst tableQuoted = `${wrapIdentifier(schema)}.${wrapIdentifier(tableName)}`\n\t\t\t\tconst columnsQuoted = '(' + columnNames2.map(it => wrapIdentifier(it)).join(', ') + ')'\n\t\t\t\treturn `INSERT INTO ${tableQuoted} ${columnsQuoted} VALUES\\n`\n\t\t\t},\n\n\t\t\tcreateRowParser: async (db, columns, baseType) => {\n\t\t\t\tconst stages = await db.selectBuilder<{id: string; slug: string}>()\n\t\t\t\t\t.select('id')\n\t\t\t\t\t.select('slug')\n\t\t\t\t\t.from('stage')\n\t\t\t\t\t.getResult(db)\n\n\t\t\t\tconst stageSlugToId = new Map(stages.map(row => ([row.slug, row.id])))\n\t\t\t\tconst stageSlugColumnIndex = columns.indexOf('stage_slug')\n\n\t\t\t\tif (stageSlugColumnIndex < 0) {\n\t\t\t\t\treturn baseType\n\t\t\t\t}\n\n\t\t\t\treturn (input, path) => {\n\t\t\t\t\tconst row = baseType(input, path)\n\t\t\t\t\tconst stageSlug = Typesafe.string(row[stageSlugColumnIndex])\n\t\t\t\t\tconst stageSlugId = stageSlugToId.get(stageSlug)\n\n\t\t\t\t\tif (stageSlugId === undefined) {\n\t\t\t\t\t\tthrow new ImportError(`Unknown stage slug ${stageSlug}`)\n\t\t\t\t\t}\n\n\t\t\t\t\tconst newRow = [...row]\n\t\t\t\t\tnewRow[stageSlugColumnIndex] = stageSlugId\n\n\t\t\t\t\treturn newRow\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\t}\n\n\tprivate buildEventDataMapping({ excludeTables = [] }: {\n\t\texcludeTables?: readonly string[]\n\t}): TransferTableMapping {\n\t\treturn {\n\t\t\tname: 'event_data',\n\n\t\t\tcolumns: this.associateByName([\n\t\t\t\t{ name: 'id', type: Model.ColumnType.Uuid },\n\t\t\t\t{ name: 'type', type: Model.ColumnType.Enum, values: ['create', 'update', 'delete'] },\n\t\t\t\t{ name: 'table_name', type: Model.ColumnType.String },\n\t\t\t\t{ name: 'row_ids', type: Model.ColumnType.Json, schema: Typesafe.array(Typesafe.string) },\n\t\t\t\t{ name: 'values', type: Model.ColumnType.Json, nullable: true, schema: Typesafe.object({}) },\n\t\t\t\t{ name: 'created_at', type: Model.ColumnType.DateTime },\n\t\t\t\t{ name: 'schema_version', type: Model.ColumnType.String },\n\t\t\t\t{ name: 'identity_id', type: Model.ColumnType.Uuid },\n\t\t\t\t{ name: 'transaction_id', type: Model.ColumnType.Uuid },\n\t\t\t]),\n\n\t\t\tcreateSelect: (db, table) => {\n\t\t\t\tconst namespaceContext = new Compiler.Context(db.schema, new Set())\n\n\t\t\t\tlet builder = db.selectBuilder()\n\n\t\t\t\tfor (const column of Object.values(table.columns)) {\n\t\t\t\t\tif (column.name === 'schema_version') {\n\t\t\t\t\t\tbuilder = builder.select(['schema_migration', 'version'], 'schema_version')\n\n\t\t\t\t\t} else if (column.type === Model.ColumnType.Json || column.type === Model.ColumnType.Date || column.type === Model.ColumnType.DateTime) {\n\t\t\t\t\t\tbuilder = builder.select(expr => expr.raw(`${wrapIdentifier('event_data')}.${wrapIdentifier(column.name)}::text`))\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbuilder = builder.select(['event_data', column.name])\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn builder\n\t\t\t\t\t.from('event_data')\n\t\t\t\t\t.join(\n\t\t\t\t\t\t'schema_migration',\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\texpr => expr.compareColumns(['schema_migration', 'id'], Operator.eq, ['event_data', 'schema_id']),\n\t\t\t\t\t)\n\t\t\t\t\t.match(it => {\n\t\t\t\t\t\tif (excludeTables.length === 0) {\n\t\t\t\t\t\t\treturn it\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn it.where(expr => expr.not(it => it.in('table_name', excludeTables)))\n\t\t\t\t\t})\n\t\t\t\t\t.createQuery(namespaceContext)\n\t\t\t},\n\n\t\t\tcreateInsertStartFragment: (schema, tableName, columnNames) => {\n\t\t\t\tconst columnNames2 = columnNames.map(name => name === 'schema_version' ? 'schema_id' : name)\n\t\t\t\tconst tableQuoted = `${wrapIdentifier(schema)}.${wrapIdentifier(tableName)}`\n\t\t\t\tconst columnsQuoted = '(' + columnNames2.map(it => wrapIdentifier(it)).join(', ') + ')'\n\t\t\t\treturn `INSERT INTO ${tableQuoted} ${columnsQuoted} VALUES\\n`\n\t\t\t},\n\n\t\t\tcreateRowParser: async (db, columns, baseType) => {\n\t\t\t\tconst schemaMigrations = await db.selectBuilder<{id: string; version: string}>()\n\t\t\t\t\t.select('id')\n\t\t\t\t\t.select('version')\n\t\t\t\t\t.from('schema_migration')\n\t\t\t\t\t.getResult(db)\n\n\t\t\t\tconst versionToId = new Map(schemaMigrations.map(row => ([row.version, row.id])))\n\t\t\t\tconst schemaVersionColumnIndex = columns.indexOf('schema_version')\n\n\t\t\t\tif (schemaVersionColumnIndex < 0) {\n\t\t\t\t\treturn baseType\n\t\t\t\t}\n\n\t\t\t\treturn (input, path) => {\n\t\t\t\t\tconst row = baseType(input, path)\n\t\t\t\t\tconst schemaVersion = Typesafe.string(row[schemaVersionColumnIndex])\n\t\t\t\t\tconst schemaVersionId = versionToId.get(schemaVersion)\n\n\t\t\t\t\tif (schemaVersionId === undefined) {\n\t\t\t\t\t\tthrow new ImportError(`Unknown schema version ${schemaVersion}`)\n\t\t\t\t\t}\n\n\t\t\t\t\tconst newRow = [...row]\n\t\t\t\t\tnewRow[schemaVersionColumnIndex] = schemaVersionId\n\n\t\t\t\t\treturn newRow\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\t}\n\n\tprivate associateByName<T extends { name: string }>(items: T[]): Record<string, T> {\n\t\treturn Object.fromEntries(items.map(item => [item.name, item]))\n\t}\n}\n"],"names":["Model","Compiler","wrapIdentifier","Operator","schema","Typesafe","ImportError","it"],"mappings":"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"}