@javalabs/prisma-client 1.0.4 → 1.0.8

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.
Files changed (75) hide show
  1. package/dist/scripts/data-migration/batch-migrator.d.ts +14 -19
  2. package/dist/scripts/data-migration/batch-migrator.js +98 -297
  3. package/dist/scripts/data-migration/batch-migrator.js.map +1 -1
  4. package/dist/scripts/data-migration/data-transformer.d.ts +16 -7
  5. package/dist/scripts/data-migration/data-transformer.js +169 -133
  6. package/dist/scripts/data-migration/data-transformer.js.map +1 -1
  7. package/dist/scripts/data-migration/db-connector.d.ts +6 -1
  8. package/dist/scripts/data-migration/db-connector.js +44 -8
  9. package/dist/scripts/data-migration/db-connector.js.map +1 -1
  10. package/dist/scripts/data-migration/dependency-resolver.d.ts +10 -10
  11. package/dist/scripts/data-migration/dependency-resolver.js +92 -211
  12. package/dist/scripts/data-migration/dependency-resolver.js.map +1 -1
  13. package/dist/scripts/data-migration/foreign-key-manager.d.ts +6 -5
  14. package/dist/scripts/data-migration/foreign-key-manager.js +108 -18
  15. package/dist/scripts/data-migration/foreign-key-manager.js.map +1 -1
  16. package/dist/scripts/data-migration/migration-config.json +63 -0
  17. package/dist/scripts/data-migration/migration-tool.d.ts +25 -6
  18. package/dist/scripts/data-migration/migration-tool.js +78 -38
  19. package/dist/scripts/data-migration/migration-tool.js.map +1 -1
  20. package/dist/scripts/data-migration/multi-source-migrator.d.ts +17 -0
  21. package/dist/scripts/data-migration/multi-source-migrator.js +130 -0
  22. package/dist/scripts/data-migration/multi-source-migrator.js.map +1 -0
  23. package/dist/scripts/data-migration/schema-utils.d.ts +3 -3
  24. package/dist/scripts/data-migration/schema-utils.js +62 -19
  25. package/dist/scripts/data-migration/schema-utils.js.map +1 -1
  26. package/dist/scripts/data-migration/tenant-migrator.js +9 -2
  27. package/dist/scripts/data-migration/tenant-migrator.js.map +1 -1
  28. package/dist/scripts/data-migration/typecast-manager.d.ts +7 -3
  29. package/dist/scripts/data-migration/typecast-manager.js +169 -25
  30. package/dist/scripts/data-migration/typecast-manager.js.map +1 -1
  31. package/dist/scripts/data-migration/types.d.ts +68 -2
  32. package/dist/scripts/database-initializer.d.ts +5 -0
  33. package/dist/scripts/database-initializer.js +45 -0
  34. package/dist/scripts/database-initializer.js.map +1 -0
  35. package/dist/scripts/fix-table-indexes.d.ts +26 -0
  36. package/dist/scripts/fix-table-indexes.js +460 -0
  37. package/dist/scripts/fix-table-indexes.js.map +1 -0
  38. package/dist/scripts/multi-db-migration.d.ts +1 -0
  39. package/dist/scripts/multi-db-migration.js +55 -0
  40. package/dist/scripts/multi-db-migration.js.map +1 -0
  41. package/dist/scripts/post-migration-validator.d.ts +18 -5
  42. package/dist/scripts/post-migration-validator.js +61 -39
  43. package/dist/scripts/post-migration-validator.js.map +1 -1
  44. package/dist/scripts/run-migration.js +83 -96
  45. package/dist/scripts/run-migration.js.map +1 -1
  46. package/dist/scripts/sequence-synchronizer.d.ts +8 -0
  47. package/dist/scripts/sequence-synchronizer.js +88 -0
  48. package/dist/scripts/sequence-synchronizer.js.map +1 -0
  49. package/dist/tsconfig.tsbuildinfo +1 -1
  50. package/migration-config.json +40 -72
  51. package/{migration-config-public.json → migration-config.json.bk} +14 -14
  52. package/package.json +10 -3
  53. package/prisma/migrations/{20250422001248_add_bank_account_id → 0_init}/migration.sql +269 -47
  54. package/prisma/migrations/20250505171324_add_bank_owner_name_in_manual_transfer/migration.sql +2 -0
  55. package/prisma/migrations/20250505173850_add_method_name_in_manual_transfer/migration.sql +2 -0
  56. package/prisma/migrations/migration_lock.toml +2 -2
  57. package/prisma/schema.prisma +214 -77
  58. package/src/scripts/data-migration/batch-migrator.ts +192 -513
  59. package/src/scripts/data-migration/data-transformer.ts +252 -203
  60. package/src/scripts/data-migration/db-connector.ts +66 -13
  61. package/src/scripts/data-migration/dependency-resolver.ts +121 -266
  62. package/src/scripts/data-migration/foreign-key-manager.ts +214 -32
  63. package/src/scripts/data-migration/migration-config.json +63 -0
  64. package/src/scripts/data-migration/migration-tool.ts +377 -225
  65. package/src/scripts/data-migration/schema-utils.ts +94 -32
  66. package/src/scripts/data-migration/tenant-migrator.ts +12 -5
  67. package/src/scripts/data-migration/typecast-manager.ts +186 -31
  68. package/src/scripts/data-migration/types.ts +78 -5
  69. package/src/scripts/database-initializer.ts +49 -0
  70. package/src/scripts/fix-table-indexes.ts +602 -0
  71. package/src/scripts/post-migration-validator.ts +206 -107
  72. package/src/scripts/run-migration.ts +140 -124
  73. package/src/scripts/sequence-synchronizer.ts +127 -0
  74. package/prisma/migrations/20250422001957_add_bank_account_id_relations/migration.sql +0 -14
  75. package/src/scripts/dumps/source_dump_20250413_112626.sql +0 -1527
@@ -1,25 +1,20 @@
1
- import { PrismaClient } from "@prisma/client";
2
- import { EntityType, ColumnSchema } from "./types";
3
- import { DataTransformer } from "./data-transformer";
4
1
  import { SchemaUtils } from "./schema-utils";
5
- import { DatabaseConnections } from "./types";
6
- import { DependencyResolver } from "./dependency-resolver";
2
+ import { DataTransformer } from "./data-transformer";
3
+ import { ColumnSchema, DatabaseConnections, MigrationOptions, TableConfig } from "./types";
7
4
  export declare class BatchMigrator {
8
- private readonly dataTransformer;
9
5
  private readonly schemaUtils;
6
+ private readonly dataTransformer;
10
7
  private readonly connections;
11
- private readonly dependencyResolver;
12
- private readonly schemaCache;
13
- private readonly targetSchemaCache;
8
+ private readonly options;
9
+ private readonly providerId?;
14
10
  private readonly logger;
15
- private readonly BATCH_SIZE;
16
- constructor(dataTransformer: DataTransformer, schemaUtils: SchemaUtils, connections: DatabaseConnections, dependencyResolver: DependencyResolver, schemaCache?: Record<string, ColumnSchema[]>, targetSchemaCache?: Record<string, ColumnSchema[]>);
17
- private checkTableHasData;
18
- migrateEntityDataInBatches(prisma: PrismaClient, entity: EntityType, providerId: number | null, targetSchema: string): Promise<void>;
19
- private ensureSchemaExists;
20
- private getSourceSchema;
21
- private getTargetSchema;
22
- private executeSourceQuery;
23
- private getPrimaryKeyField;
24
- private processRecords;
11
+ private readonly typecastManager;
12
+ constructor(schemaUtils: SchemaUtils, dataTransformer: DataTransformer, connections: DatabaseConnections, options: MigrationOptions, providerId?: string | null);
13
+ validateSchema(sourceColumns: ColumnSchema[], targetColumns: ColumnSchema[]): Promise<void>;
14
+ migrateEntityDataInBatches(sourceSchema: string, targetSchema: string, tableConfig: TableConfig, tenantId: string): Promise<void>;
15
+ private fetchBatch;
16
+ private buildWhereClause;
17
+ private processBatchWithTransaction;
18
+ private transformRecord;
19
+ private insertRecord;
25
20
  }
@@ -2,331 +2,132 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BatchMigrator = void 0;
4
4
  const common_1 = require("@nestjs/common");
5
+ const typecast_manager_1 = require("./typecast-manager");
6
+ const BATCH_SIZE = 100;
7
+ const MAX_RETRIES = 3;
8
+ const RETRY_BASE_DELAY = 1000;
5
9
  class BatchMigrator {
6
- constructor(dataTransformer, schemaUtils, connections, dependencyResolver, schemaCache = {}, targetSchemaCache = {}) {
7
- this.dataTransformer = dataTransformer;
10
+ constructor(schemaUtils, dataTransformer, connections, options, providerId) {
8
11
  this.schemaUtils = schemaUtils;
12
+ this.dataTransformer = dataTransformer;
9
13
  this.connections = connections;
10
- this.dependencyResolver = dependencyResolver;
11
- this.schemaCache = schemaCache;
12
- this.targetSchemaCache = targetSchemaCache;
14
+ this.options = options;
15
+ this.providerId = providerId;
13
16
  this.logger = new common_1.Logger("BatchMigrator");
14
- this.BATCH_SIZE = 10;
17
+ this.typecastManager = new typecast_manager_1.TypecastManager();
15
18
  }
16
- async checkTableHasData(tenantId, tableName) {
17
- var _a;
18
- try {
19
- const result = await this.connections.targetPool.query(`SELECT EXISTS (SELECT 1 FROM "${tenantId}"."${tableName}" LIMIT 1)`);
20
- return ((_a = result.rows[0]) === null || _a === void 0 ? void 0 : _a.exists) || false;
21
- }
22
- catch (error) {
23
- this.logger.warn(`Error checking data existence for ${tableName}: ${error.message}`);
24
- return false;
19
+ async validateSchema(sourceColumns, targetColumns) {
20
+ for (const targetColumn of targetColumns) {
21
+ const sourceColumn = sourceColumns.find((col) => col.column_name === targetColumn.column_name);
22
+ if (!sourceColumn) {
23
+ if (targetColumn.is_nullable === "NO") {
24
+ throw new Error(`Required column ${targetColumn.column_name} not found in source schema`);
25
+ }
26
+ this.logger.warn(`Column ${targetColumn.column_name} not found in source schema but is nullable`);
27
+ continue;
28
+ }
29
+ if (!this.typecastManager.areTypesCompatible(sourceColumn.data_type, targetColumn.data_type)) {
30
+ throw new Error(`Incompatible data types for column ${targetColumn.column_name}: ` +
31
+ `source ${sourceColumn.data_type} -> target ${targetColumn.data_type}`);
32
+ }
25
33
  }
26
34
  }
27
- async migrateEntityDataInBatches(prisma, entity, providerId, targetSchema) {
28
- try {
29
- if (targetSchema !== "public") {
30
- await this.ensureSchemaExists(targetSchema);
31
- }
32
- await this.connections.targetPool.query(`SET session_replication_role = 'replica';`);
33
- const { name: tableName, idField, filterColumn, filterVia } = entity;
34
- this.logger.log(`Migrating ${tableName} -> target schema '${targetSchema}'. ${providerId
35
- ? `Filtering source by Provider ID: ${providerId}`
36
- : "Migrating all source records."}`);
35
+ async migrateEntityDataInBatches(sourceSchema, targetSchema, tableConfig, tenantId) {
36
+ const sourceColumns = await this.schemaUtils.getTableColumns(sourceSchema, tableConfig.sourceTable);
37
+ const targetColumns = await this.schemaUtils.getTableColumns(targetSchema, tableConfig.targetTable);
38
+ await this.validateSchema(sourceColumns, targetColumns);
39
+ let offset = 0;
40
+ let hasMoreRecords = true;
41
+ let retryCount = 0;
42
+ while (hasMoreRecords) {
37
43
  try {
38
- const sourceTableSchema = await this.getSourceSchema(tableName);
39
- const targetTableSchema = await this.getTargetSchema(targetSchema, tableName);
40
- if (!sourceTableSchema.length) {
41
- this.logger.warn(`Source table ${tableName} schema not found. Skipping.`);
42
- return;
43
- }
44
- if (!targetTableSchema.length) {
45
- this.logger.warn(`Target table ${tableName} schema '${targetSchema}' not found. Skipping.`);
46
- return;
44
+ const records = await this.fetchBatch(sourceSchema, tableConfig, offset, BATCH_SIZE);
45
+ if (records.length === 0) {
46
+ hasMoreRecords = false;
47
+ continue;
47
48
  }
48
- let selectQuery;
49
- let queryParams = [];
50
- const columnList = sourceTableSchema
51
- .map((col) => `"${col.column_name}"`)
52
- .join(", ");
53
- let fromClause = `FROM "${tableName}" t`;
54
- let whereClause = "";
55
- if (providerId && filterColumn) {
56
- if (filterVia) {
57
- const joinTable = filterVia;
58
- const joinCondition = `t."${filterColumn}" = j.id`;
59
- const providerFilter = `j.provider_id = $1`;
60
- fromClause = `FROM "${tableName}" t JOIN "${joinTable}" j ON ${joinCondition}`;
61
- whereClause = `WHERE ${providerFilter}`;
62
- queryParams = [providerId];
63
- this.logger.log(`Using JOIN filter: ${fromClause} ${whereClause}`);
64
- }
65
- else {
66
- whereClause = `WHERE t."${filterColumn}" = $1`;
67
- queryParams = [providerId];
68
- this.logger.log(`Using direct filter: ${whereClause}`);
69
- }
49
+ await this.processBatchWithTransaction(records, targetSchema, tableConfig, sourceColumns, targetColumns, tenantId);
50
+ offset += BATCH_SIZE;
51
+ retryCount = 0;
52
+ }
53
+ catch (error) {
54
+ if (retryCount < MAX_RETRIES) {
55
+ retryCount++;
56
+ const delay = RETRY_BASE_DELAY * Math.pow(2, retryCount - 1);
57
+ this.logger.warn(`Error processing batch, retrying in ${delay}ms (attempt ${retryCount}/${MAX_RETRIES}): ${error.message}`);
58
+ await new Promise((resolve) => setTimeout(resolve, delay));
70
59
  }
71
60
  else {
72
- this.logger.log(`No providerId filter applied for ${tableName}. Selecting all records.`);
73
- }
74
- selectQuery = `SELECT t.* ${fromClause} ${whereClause}`;
75
- const sourceData = await this.executeSourceQuery(selectQuery, queryParams);
76
- const totalRecords = sourceData.rows.length;
77
- this.logger.log(`Found ${totalRecords} ${tableName} records in source to migrate to '${targetSchema}'.`);
78
- if (totalRecords === 0) {
79
- this.logger.log(`No records to migrate for ${tableName} with current filter. Skipping processing.`);
80
- await this.connections.targetPool.query(`SET session_replication_role = 'origin';`);
81
- return;
61
+ throw new Error(`Failed to process batch after ${MAX_RETRIES} retries: ${error.message}`);
82
62
  }
83
- const primaryKeyField = idField;
84
- await this.processRecords(prisma, targetSchema, tableName, primaryKeyField, sourceData.rows, sourceTableSchema, targetTableSchema);
85
- }
86
- catch (error) {
87
- this.logger.error(`Error during migration step for ${tableName} to schema '${targetSchema}': ${error.message}`);
88
- console.error(`Entity Config:`, JSON.stringify(entity));
89
- console.error(`Provider ID used for filter:`, providerId);
90
- throw error;
91
- }
92
- }
93
- catch (error) {
94
- this.logger.error(`Error preparing migration for ${entity.name} to schema '${targetSchema}': ${error.message}`);
95
- throw error;
96
- }
97
- finally {
98
- try {
99
- await this.connections.targetPool.query(`SET session_replication_role = 'origin';`);
100
- }
101
- catch (finallyError) {
102
- this.logger.error(`Failed to reset session_replication_role: ${finallyError.message}`);
103
63
  }
104
64
  }
105
65
  }
106
- async ensureSchemaExists(schemaName) {
107
- const schemaExistsResult = await this.connections.targetPool.query(`SELECT schema_name FROM information_schema.schemata WHERE schema_name = $1`, [schemaName]);
108
- if (schemaExistsResult.rows.length === 0) {
109
- this.logger.log(`Schema '${schemaName}' does not exist. Creating...`);
110
- await this.schemaUtils.createSchema(schemaName);
111
- this.logger.log(`Schema '${schemaName}' created.`);
112
- try {
113
- await this.connections.targetPool.query(`
114
- INSERT INTO "${schemaName}"."_prisma_migrations" (id, checksum, finished_at, migration_name, logs, rolled_back_at, started_at, applied_steps_count)
115
- SELECT id, checksum, finished_at, migration_name, logs, rolled_back_at, started_at, applied_steps_count
116
- FROM "public"."_prisma_migrations" WHERE migration_name LIKE '%_init'
117
- ON CONFLICT DO NOTHING;
118
- `);
119
- this.logger.log(`Attempted to copy initial migration record to schema '${schemaName}'.`);
120
- }
121
- catch (migrationError) {
122
- this.logger.warn(`Could not copy baseline migration to schema '${schemaName}': ${migrationError.message}`);
123
- }
124
- }
66
+ async fetchBatch(sourceSchema, tableConfig, offset, limit) {
67
+ const query = `
68
+ SELECT *
69
+ FROM "${sourceSchema}"."${tableConfig.sourceTable}"
70
+ ${this.buildWhereClause(tableConfig)}
71
+ ORDER BY "${tableConfig.idField}"
72
+ LIMIT ${limit}
73
+ OFFSET ${offset}
74
+ `;
75
+ const result = await this.connections.sourcePool.query(query);
76
+ return result.rows;
125
77
  }
126
- async getSourceSchema(tableName) {
127
- const cacheKey = `source.${tableName}`;
128
- if (!this.schemaCache[cacheKey]) {
129
- this.logger.debug(`Cache miss for source schema: ${tableName}`);
130
- this.schemaCache[cacheKey] = await this.schemaUtils.getTableSchema(tableName, "source", "public");
78
+ buildWhereClause(tableConfig) {
79
+ const conditions = [];
80
+ if (this.providerId) {
81
+ conditions.push(`"${tableConfig.providerLink}" = '${this.providerId}'`);
131
82
  }
132
- return this.schemaCache[cacheKey];
133
- }
134
- async getTargetSchema(schema, tableName) {
135
- const cacheKey = `${schema}.${tableName}`;
136
- if (!this.targetSchemaCache[cacheKey]) {
137
- this.logger.debug(`Cache miss for target schema: ${cacheKey}`);
138
- this.targetSchemaCache[cacheKey] = await this.schemaUtils.getTableSchema(tableName, "target", schema);
83
+ if (tableConfig.filterColumn) {
84
+ conditions.push(`"${tableConfig.filterColumn}" IS NOT NULL`);
139
85
  }
140
- return this.targetSchemaCache[cacheKey];
86
+ return conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
141
87
  }
142
- async executeSourceQuery(query, params) {
143
- var _a;
88
+ async processBatchWithTransaction(records, targetSchema, tableConfig, sourceColumns, targetColumns, tenantId) {
89
+ const client = await this.connections.targetPool.connect();
144
90
  try {
145
- this.logger.debug(`Executing source query: ${query.replace(/\s\s+/g, " ")} || PARAMS: ${JSON.stringify(params)}`);
146
- const result = await this.connections.sourcePool.query(query, params);
147
- this.logger.debug(`Query returned ${((_a = result.rows) === null || _a === void 0 ? void 0 : _a.length) || 0} rows`);
148
- return result;
91
+ await client.query("BEGIN");
92
+ for (const record of records) {
93
+ const transformedRecord = await this.transformRecord(record, sourceColumns, targetColumns, tenantId);
94
+ await this.insertRecord(client, targetSchema, tableConfig.targetTable, transformedRecord);
95
+ }
96
+ await client.query("COMMIT");
149
97
  }
150
98
  catch (error) {
151
- this.logger.error(`Error executing source query: ${error.message}`);
152
- this.logger.error(`Query was: ${query}`);
153
- this.logger.error(`Params were: ${JSON.stringify(params)}`);
99
+ await client.query("ROLLBACK");
154
100
  throw error;
155
101
  }
156
- }
157
- async getPrimaryKeyField(schemaName, tableName) {
158
- var _a;
159
- try {
160
- const result = await this.connections.targetPool.query(`
161
- SELECT kcu.column_name
162
- FROM information_schema.table_constraints tc
163
- JOIN information_schema.key_column_usage kcu
164
- ON tc.constraint_name = kcu.constraint_name
165
- AND tc.table_schema = kcu.table_schema
166
- WHERE tc.constraint_type = 'PRIMARY KEY'
167
- AND tc.table_schema = $1
168
- AND tc.table_name = $2
169
- `, [schemaName, tableName]);
170
- return ((_a = result.rows[0]) === null || _a === void 0 ? void 0 : _a.column_name) || null;
171
- }
172
- catch (error) {
173
- this.logger.error(`Error getting primary key for ${schemaName}.${tableName}: ${error.message}`);
174
- return null;
102
+ finally {
103
+ client.release();
175
104
  }
176
105
  }
177
- async processRecords(prisma, targetSchema, tableName, idField, records, sourceSchema, targetSchemaInfo) {
178
- if (!idField) {
179
- this.logger.error(`Cannot process records for ${tableName}: idField is missing in configuration.`);
180
- return;
181
- }
182
- for (const record of records) {
183
- let recordId = record[idField];
184
- try {
185
- this.logger.debug(`Processing record ${recordId !== null && recordId !== void 0 ? recordId : "(no id found)"} for ${targetSchema}.${tableName}`);
186
- if (!record || Object.keys(record).length === 0) {
187
- this.logger.warn(`Empty record found for ${tableName}, skipping`);
188
- continue;
189
- }
190
- if (!recordId) {
191
- this.logger.warn(`Record missing configured ID field '${idField}' in source data, skipping: ${JSON.stringify(record)}`);
192
- continue;
193
- }
194
- const transformedData = await this.dataTransformer.transformRecord(record, sourceSchema, targetSchemaInfo, targetSchema);
195
- const processedData = Object.entries(transformedData).reduce((acc, [key, value]) => {
196
- const columnSchema = targetSchemaInfo.find((col) => col.column_name === key);
197
- if (!columnSchema)
198
- return acc;
199
- const columnName = `"${columnSchema.column_name}"`;
200
- const escapeValue = (val) => {
201
- if (val === null || val === undefined)
202
- return "NULL";
203
- if (typeof val === "boolean")
204
- return val ? "TRUE" : "FALSE";
205
- if (typeof val === "number")
206
- return String(val);
207
- return String(val).replace(/'/g, "''").replace(/\\/g, "");
208
- };
209
- if (value === null || value === undefined) {
210
- acc[columnName] = "NULL";
211
- return acc;
212
- }
213
- if (typeof value === "object" &&
214
- value !== null &&
215
- value["needsEnumCast"]) {
216
- const enumValue = value;
217
- const schemaPrefix = targetSchema === "public" ? '"public".' : `"${targetSchema}".`;
218
- const quotedEnumType = `"${enumValue.enumType}"`;
219
- const escapedEnumValue = escapeValue(enumValue.value);
220
- acc[columnName] = `CAST(E'${escapedEnumValue}' AS ${schemaPrefix}${quotedEnumType})`;
221
- return acc;
222
- }
223
- let targetType = columnSchema.data_type.toLowerCase();
224
- let udtName = columnSchema.udt_name;
225
- let sqlValue;
226
- let requiresQuotes = false;
227
- if ([
228
- "text",
229
- "varchar",
230
- "character varying",
231
- "char",
232
- "timestamp with time zone",
233
- "timestamptz",
234
- "timestamp without time zone",
235
- "timestamp",
236
- "date",
237
- "uuid",
238
- "json",
239
- "jsonb",
240
- ].includes(targetType) ||
241
- targetType.includes("enum") ||
242
- (targetType === "user-defined" && (udtName === null || udtName === void 0 ? void 0 : udtName.startsWith("enum_")))) {
243
- requiresQuotes = true;
244
- }
245
- const escaped = escapeValue(value);
246
- if (escaped === "NULL") {
247
- sqlValue = "NULL";
248
- }
249
- else if (requiresQuotes) {
250
- sqlValue = `E'${escaped}'`;
251
- }
252
- else {
253
- sqlValue = escaped;
254
- }
255
- let castExpression = "";
256
- if (targetType.includes("timestamp"))
257
- castExpression = "::timestamp with time zone";
258
- else if (targetType === "date")
259
- castExpression = "::date";
260
- else if (targetType === "integer" ||
261
- targetType === "int" ||
262
- targetType === "int4")
263
- castExpression = "::integer";
264
- else if (targetType === "bigint" || targetType === "int8")
265
- castExpression = "::bigint";
266
- else if (targetType === "smallint" || targetType === "int2")
267
- castExpression = "::smallint";
268
- else if (targetType === "numeric" || targetType === "decimal")
269
- castExpression = "::numeric";
270
- else if (targetType === "real" || targetType === "float4")
271
- castExpression = "::real";
272
- else if (targetType === "double precision" ||
273
- targetType === "float8")
274
- castExpression = "::double precision";
275
- else if (targetType === "boolean" || targetType === "bool")
276
- castExpression = "::boolean";
277
- else if (targetType === "json" || targetType === "jsonb")
278
- castExpression = `::${targetType}`;
279
- else if (targetType === "uuid")
280
- castExpression = "::uuid";
281
- else if (targetType === "text" || targetType.includes("char"))
282
- castExpression = "::text";
283
- else if (targetType === "user-defined" &&
284
- (udtName === null || udtName === void 0 ? void 0 : udtName.startsWith("enum_"))) {
285
- const schemaPrefix = targetSchema === "public" ? '"public".' : `"${targetSchema}".`;
286
- castExpression = `::${schemaPrefix}"${udtName}"`;
287
- }
288
- acc[columnName] = `${sqlValue}${castExpression}`;
289
- return acc;
290
- }, {});
291
- const validProcessedData = Object.entries(processedData).reduce((acc, [key, val]) => {
292
- if (val !== undefined &&
293
- val !== "NULL" &&
294
- val !== "E''" &&
295
- val !== "E'undefined'" &&
296
- val !== "E'null'") {
297
- acc[key] = val;
298
- }
299
- return acc;
300
- }, {});
301
- const columns = Object.keys(validProcessedData);
302
- const valuesString = Object.values(validProcessedData).join(", ");
303
- if (columns.length === 0) {
304
- this.logger.warn(`Record ${recordId} for ${tableName} resulted in no valid columns to insert/update after processing. Skipping.`);
305
- continue;
306
- }
307
- const updateSetClauses = columns
308
- .filter((col) => col !== `"${idField}"`)
309
- .map((col) => `${col} = EXCLUDED.${col}`)
310
- .join(", ");
311
- const quotedSchemaTable = `"${targetSchema}"."${tableName}"`;
312
- const quotedIdField = `"${idField}"`;
313
- const conflictClause = updateSetClauses
314
- ? `ON CONFLICT (${quotedIdField}) DO UPDATE SET ${updateSetClauses}`
315
- : `ON CONFLICT (${quotedIdField}) DO NOTHING`;
316
- const query = `
317
- INSERT INTO ${quotedSchemaTable} (${columns.join(", ")})
318
- VALUES (${valuesString})
319
- ${conflictClause}
320
- `;
321
- this.logger.debug(`Executing Upsert: ${query.replace(/\s\s+/g, " ")}`);
322
- await this.connections.targetPool.query(query);
323
- }
324
- catch (error) {
325
- this.logger.error(`Error processing record ID '${recordId !== null && recordId !== void 0 ? recordId : "(unknown)"}' for ${targetSchema}.${tableName}: ${error.message}`);
326
- this.logger.error(`Record data: ${JSON.stringify(record)}`);
327
- throw error;
106
+ async transformRecord(record, sourceColumns, targetColumns, tenantId) {
107
+ const transformedRecord = {};
108
+ for (const targetColumn of targetColumns) {
109
+ const sourceColumn = sourceColumns.find((col) => col.column_name === targetColumn.column_name);
110
+ if (!sourceColumn) {
111
+ transformedRecord[targetColumn.column_name] = null;
112
+ continue;
328
113
  }
114
+ const value = record[targetColumn.column_name];
115
+ transformedRecord[targetColumn.column_name] =
116
+ await this.dataTransformer.transformColumnValue(value, targetColumn.column_name, Object.assign(Object.assign({}, targetColumn), { source_type: sourceColumn.data_type }), tenantId);
329
117
  }
118
+ return transformedRecord;
119
+ }
120
+ async insertRecord(client, schema, table, record) {
121
+ const columns = Object.keys(record);
122
+ const values = Object.values(record);
123
+ const placeholders = values.map((_, i) => `$${i + 1}`).join(", ");
124
+ const query = `
125
+ INSERT INTO "${schema}"."${table}"
126
+ (${columns.map((col) => `"${col}"`).join(", ")})
127
+ VALUES (${placeholders})
128
+ ON CONFLICT DO NOTHING
129
+ `;
130
+ await client.query(query, values);
330
131
  }
331
132
  }
332
133
  exports.BatchMigrator = BatchMigrator;
@@ -1 +1 @@
1
- {"version":3,"file":"batch-migrator.js","sourceRoot":"","sources":["../../../src/scripts/data-migration/batch-migrator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"batch-migrator.js","sourceRoot":"","sources":["../../../src/scripts/data-migration/batch-migrator.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,26 @@
1
1
  import { ColumnSchema, EnumCastValue } from "./types";
2
2
  import { SchemaUtils } from "./schema-utils";
3
+ import { DatabaseConnections } from "./types";
3
4
  export declare class DataTransformer {
4
- readonly schemaUtils: SchemaUtils;
5
5
  private readonly logger;
6
- private enumValuesCache;
7
- private columnValuesCache;
8
- constructor(schemaUtils: SchemaUtils);
9
- validateEnumValue(schemaName: string, enumType: string, value: string): Promise<string | null>;
6
+ private readonly schemaUtils;
7
+ private readonly sourceConnection;
8
+ private connections;
9
+ private migrationConfig;
10
+ private options;
11
+ private foreignKeyManager;
12
+ private readonly typecastManager;
13
+ constructor(schemaUtils: SchemaUtils, sourceConnection: any, connections: DatabaseConnections);
14
+ validateEnumValue(tableName: string, columnName: string, value: string | null, isNullable?: boolean): Promise<string | null>;
15
+ private getEnumTypeName;
10
16
  transformToNumeric(value: any): number | null;
11
17
  private getDefaultEnumValue;
12
18
  prepareEnumValue(tenantId: string, enumType: string, value: string): Promise<EnumCastValue | null>;
13
- transformColumnValue(value: any, columnName: string, targetColumn: ColumnSchema, tenantId: string): Promise<any>;
19
+ transformColumnValue(value: any, columnName: string, targetColumn: ColumnSchema & {
20
+ source_type?: string;
21
+ }, tenantId: string): Promise<any>;
22
+ private getDefaultValue;
14
23
  private extractEnumValueFromObject;
15
- private getDefaultValueForType;
24
+ private handleEnumType;
16
25
  transformRecord(record: any, sourceSchema: ColumnSchema[], targetSchema: ColumnSchema[], tenantId: string): Promise<any>;
17
26
  }