@javalabs/prisma-client 1.0.0
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/README.md +220 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/prisma-factory.service.d.ts +9 -0
- package/dist/prisma-factory.service.js +47 -0
- package/dist/prisma-factory.service.js.map +1 -0
- package/dist/prisma.module.d.ts +2 -0
- package/dist/prisma.module.js +23 -0
- package/dist/prisma.module.js.map +1 -0
- package/dist/prisma.service.d.ts +6 -0
- package/dist/prisma.service.js +27 -0
- package/dist/prisma.service.js.map +1 -0
- package/dist/scripts/create-tenant-schemas.d.ts +1 -0
- package/dist/scripts/create-tenant-schemas.js +117 -0
- package/dist/scripts/create-tenant-schemas.js.map +1 -0
- package/dist/scripts/data-migration/batch-migrator.d.ts +25 -0
- package/dist/scripts/data-migration/batch-migrator.js +333 -0
- package/dist/scripts/data-migration/batch-migrator.js.map +1 -0
- package/dist/scripts/data-migration/data-transformer.d.ts +17 -0
- package/dist/scripts/data-migration/data-transformer.js +242 -0
- package/dist/scripts/data-migration/data-transformer.js.map +1 -0
- package/dist/scripts/data-migration/db-connector.d.ts +7 -0
- package/dist/scripts/data-migration/db-connector.js +58 -0
- package/dist/scripts/data-migration/db-connector.js.map +1 -0
- package/dist/scripts/data-migration/dependency-manager.d.ts +9 -0
- package/dist/scripts/data-migration/dependency-manager.js +86 -0
- package/dist/scripts/data-migration/dependency-manager.js.map +1 -0
- package/dist/scripts/data-migration/dependency-resolver.d.ts +18 -0
- package/dist/scripts/data-migration/dependency-resolver.js +251 -0
- package/dist/scripts/data-migration/dependency-resolver.js.map +1 -0
- package/dist/scripts/data-migration/entity-discovery.d.ts +11 -0
- package/dist/scripts/data-migration/entity-discovery.js +152 -0
- package/dist/scripts/data-migration/entity-discovery.js.map +1 -0
- package/dist/scripts/data-migration/foreign-key-manager.d.ts +17 -0
- package/dist/scripts/data-migration/foreign-key-manager.js +70 -0
- package/dist/scripts/data-migration/foreign-key-manager.js.map +1 -0
- package/dist/scripts/data-migration/migration-phases.d.ts +5 -0
- package/dist/scripts/data-migration/migration-phases.js +55 -0
- package/dist/scripts/data-migration/migration-phases.js.map +1 -0
- package/dist/scripts/data-migration/migration-tool.d.ts +29 -0
- package/dist/scripts/data-migration/migration-tool.js +250 -0
- package/dist/scripts/data-migration/migration-tool.js.map +1 -0
- package/dist/scripts/data-migration/phase-generator.d.ts +15 -0
- package/dist/scripts/data-migration/phase-generator.js +187 -0
- package/dist/scripts/data-migration/phase-generator.js.map +1 -0
- package/dist/scripts/data-migration/schema-utils.d.ts +18 -0
- package/dist/scripts/data-migration/schema-utils.js +164 -0
- package/dist/scripts/data-migration/schema-utils.js.map +1 -0
- package/dist/scripts/data-migration/tenant-migrator.d.ts +15 -0
- package/dist/scripts/data-migration/tenant-migrator.js +110 -0
- package/dist/scripts/data-migration/tenant-migrator.js.map +1 -0
- package/dist/scripts/data-migration/typecast-manager.d.ts +5 -0
- package/dist/scripts/data-migration/typecast-manager.js +35 -0
- package/dist/scripts/data-migration/typecast-manager.js.map +1 -0
- package/dist/scripts/data-migration/types.d.ts +34 -0
- package/dist/scripts/data-migration/types.js +3 -0
- package/dist/scripts/data-migration/types.js.map +1 -0
- package/dist/scripts/data-migration.d.ts +22 -0
- package/dist/scripts/data-migration.js +593 -0
- package/dist/scripts/data-migration.js.map +1 -0
- package/dist/scripts/drop-database.d.ts +10 -0
- package/dist/scripts/drop-database.js +81 -0
- package/dist/scripts/drop-database.js.map +1 -0
- package/dist/scripts/error-handler.d.ts +12 -0
- package/dist/scripts/error-handler.js +82 -0
- package/dist/scripts/error-handler.js.map +1 -0
- package/dist/scripts/fix-data-types.d.ts +10 -0
- package/dist/scripts/fix-data-types.js +185 -0
- package/dist/scripts/fix-data-types.js.map +1 -0
- package/dist/scripts/fix-enum-values.d.ts +17 -0
- package/dist/scripts/fix-enum-values.js +234 -0
- package/dist/scripts/fix-enum-values.js.map +1 -0
- package/dist/scripts/fix-schema-discrepancies.d.ts +21 -0
- package/dist/scripts/fix-schema-discrepancies.js +240 -0
- package/dist/scripts/fix-schema-discrepancies.js.map +1 -0
- package/dist/scripts/migrate-schema-structure.d.ts +1 -0
- package/dist/scripts/migrate-schema-structure.js +76 -0
- package/dist/scripts/migrate-schema-structure.js.map +1 -0
- package/dist/scripts/post-migration-validator.d.ts +21 -0
- package/dist/scripts/post-migration-validator.js +341 -0
- package/dist/scripts/post-migration-validator.js.map +1 -0
- package/dist/scripts/pre-migration-validator.d.ts +25 -0
- package/dist/scripts/pre-migration-validator.js +491 -0
- package/dist/scripts/pre-migration-validator.js.map +1 -0
- package/dist/scripts/reset-database.d.ts +17 -0
- package/dist/scripts/reset-database.js +202 -0
- package/dist/scripts/reset-database.js.map +1 -0
- package/dist/scripts/retry-failed-migrations.d.ts +14 -0
- package/dist/scripts/retry-failed-migrations.js +301 -0
- package/dist/scripts/retry-failed-migrations.js.map +1 -0
- package/dist/scripts/run-migration.d.ts +1 -0
- package/dist/scripts/run-migration.js +525 -0
- package/dist/scripts/run-migration.js.map +1 -0
- package/dist/scripts/schema-sync.d.ts +1 -0
- package/dist/scripts/schema-sync.js +85 -0
- package/dist/scripts/schema-sync.js.map +1 -0
- package/dist/scripts/sync-enum-types.d.ts +13 -0
- package/dist/scripts/sync-enum-types.js +139 -0
- package/dist/scripts/sync-enum-types.js.map +1 -0
- package/dist/scripts/sync-enum-values.d.ts +20 -0
- package/dist/scripts/sync-enum-values.js +336 -0
- package/dist/scripts/sync-enum-values.js.map +1 -0
- package/dist/scripts/truncate-database.d.ts +10 -0
- package/dist/scripts/truncate-database.js +100 -0
- package/dist/scripts/truncate-database.js.map +1 -0
- package/dist/scripts/verify-migration-setup.d.ts +11 -0
- package/dist/scripts/verify-migration-setup.js +120 -0
- package/dist/scripts/verify-migration-setup.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/migration-config-public.json +95 -0
- package/migration-config.json +95 -0
- package/package.json +33 -0
- package/prisma/migrations/migration_lock.toml +3 -0
- package/prisma/schema.prisma +360 -0
- package/src/index.ts +23 -0
- package/src/prisma-factory.service.ts +41 -0
- package/src/prisma.module.ts +10 -0
- package/src/prisma.service.ts +17 -0
- package/src/scripts/create-tenant-schemas.ts +146 -0
- package/src/scripts/data-migration/batch-migrator.ts +569 -0
- package/src/scripts/data-migration/data-transformer.ts +377 -0
- package/src/scripts/data-migration/db-connector.ts +67 -0
- package/src/scripts/data-migration/dependency-resolver.ts +319 -0
- package/src/scripts/data-migration/entity-discovery.ts +197 -0
- package/src/scripts/data-migration/foreign-key-manager.ts +95 -0
- package/src/scripts/data-migration/migration-tool.ts +357 -0
- package/src/scripts/data-migration/schema-utils.ts +186 -0
- package/src/scripts/data-migration/tenant-migrator.ts +194 -0
- package/src/scripts/data-migration/typecast-manager.ts +38 -0
- package/src/scripts/data-migration/types.ts +40 -0
- package/src/scripts/drop-database.ts +105 -0
- package/src/scripts/dump-source-db.sh +62 -0
- package/src/scripts/dumps/source_dump_20250413_112626.sql +1527 -0
- package/src/scripts/error-handler.ts +118 -0
- package/src/scripts/fix-data-types.ts +242 -0
- package/src/scripts/fix-enum-values.ts +357 -0
- package/src/scripts/fix-schema-discrepancies.ts +318 -0
- package/src/scripts/migrate-schema-structure.ts +90 -0
- package/src/scripts/post-migration-validator.ts +427 -0
- package/src/scripts/pre-migration-validator.ts +611 -0
- package/src/scripts/reset-database.ts +264 -0
- package/src/scripts/retry-failed-migrations.ts +416 -0
- package/src/scripts/run-migration.ts +691 -0
- package/src/scripts/schema-sync.ts +129 -0
- package/src/scripts/sync-enum-types.ts +171 -0
- package/src/scripts/sync-enum-values.ts +563 -0
- package/src/scripts/truncate-database.ts +124 -0
- package/src/scripts/verify-migration-setup.ts +136 -0
- package/tsconfig.json +18 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phase-generator.js","sourceRoot":"","sources":["../../../src/scripts/data-migration/phase-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ColumnSchema } from "./types";
|
|
2
|
+
export declare class SchemaUtils {
|
|
3
|
+
private readonly sourcePool;
|
|
4
|
+
private readonly targetPool;
|
|
5
|
+
private readonly logger;
|
|
6
|
+
constructor(sourcePool: any, targetPool: any);
|
|
7
|
+
getTableSchema(tableName: string, dbType: "source" | "target", schema?: string): Promise<ColumnSchema[]>;
|
|
8
|
+
checkSchemaExists(schemaName: string): Promise<boolean>;
|
|
9
|
+
getTargetTables(schemaName: string): Promise<string[]>;
|
|
10
|
+
getEnumValues(schemaName: string, enumName: string): Promise<string[]>;
|
|
11
|
+
executeQuery(query: string, params?: any[]): Promise<any>;
|
|
12
|
+
queryTargetDb(query: string, params: any[]): Promise<{
|
|
13
|
+
rows: any[];
|
|
14
|
+
}>;
|
|
15
|
+
createMissingColumns(tableName: string, schema: string, columns: ColumnSchema[]): Promise<void>;
|
|
16
|
+
createSchema(schemaName: string): Promise<void>;
|
|
17
|
+
private getPublicTables;
|
|
18
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SchemaUtils = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
class SchemaUtils {
|
|
6
|
+
constructor(sourcePool, targetPool) {
|
|
7
|
+
this.sourcePool = sourcePool;
|
|
8
|
+
this.targetPool = targetPool;
|
|
9
|
+
this.logger = new common_1.Logger("SchemaUtils");
|
|
10
|
+
}
|
|
11
|
+
async getTableSchema(tableName, dbType, schema = "public") {
|
|
12
|
+
const pool = dbType === "source" ? this.sourcePool : this.targetPool;
|
|
13
|
+
const query = `
|
|
14
|
+
SELECT
|
|
15
|
+
c.table_name,
|
|
16
|
+
c.column_name,
|
|
17
|
+
c.data_type,
|
|
18
|
+
c.udt_name,
|
|
19
|
+
c.character_maximum_length,
|
|
20
|
+
c.is_nullable,
|
|
21
|
+
c.column_default,
|
|
22
|
+
tc.constraint_type
|
|
23
|
+
FROM
|
|
24
|
+
information_schema.columns c
|
|
25
|
+
LEFT JOIN information_schema.constraint_column_usage ccu
|
|
26
|
+
ON c.column_name = ccu.column_name
|
|
27
|
+
AND c.table_name = ccu.table_name
|
|
28
|
+
LEFT JOIN information_schema.table_constraints tc
|
|
29
|
+
ON ccu.constraint_name = tc.constraint_name
|
|
30
|
+
WHERE
|
|
31
|
+
c.table_schema = $1
|
|
32
|
+
AND c.table_name = $2
|
|
33
|
+
ORDER BY
|
|
34
|
+
c.ordinal_position
|
|
35
|
+
`;
|
|
36
|
+
try {
|
|
37
|
+
const result = await pool.query(query, [schema, tableName]);
|
|
38
|
+
return result.rows;
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
this.logger.error(`Error getting schema for ${schema}.${tableName}: ${error.message}`);
|
|
42
|
+
return [];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async checkSchemaExists(schemaName) {
|
|
46
|
+
try {
|
|
47
|
+
const query = `
|
|
48
|
+
SELECT schema_name
|
|
49
|
+
FROM information_schema.schemata
|
|
50
|
+
WHERE schema_name = $1
|
|
51
|
+
`;
|
|
52
|
+
const result = await this.targetPool.query(query, [schemaName]);
|
|
53
|
+
return result.rows.length > 0;
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
this.logger.error(`Error checking if schema exists: ${error.message}`);
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async getTargetTables(schemaName) {
|
|
61
|
+
try {
|
|
62
|
+
const query = `
|
|
63
|
+
SELECT table_name
|
|
64
|
+
FROM information_schema.tables
|
|
65
|
+
WHERE table_schema = $1
|
|
66
|
+
AND table_type = 'BASE TABLE'
|
|
67
|
+
`;
|
|
68
|
+
const result = await this.targetPool.query(query, [schemaName]);
|
|
69
|
+
this.logger.log(`Found ${result.rows.length} tables in schema ${schemaName}`);
|
|
70
|
+
result.rows.forEach(row => {
|
|
71
|
+
this.logger.log(`Table in schema ${schemaName}: ${row.table_name}`);
|
|
72
|
+
});
|
|
73
|
+
return result.rows.map((row) => row.table_name);
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
this.logger.error(`Error getting target tables: ${error.message}`);
|
|
77
|
+
return [];
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
async getEnumValues(schemaName, enumName) {
|
|
81
|
+
try {
|
|
82
|
+
const query = `
|
|
83
|
+
SELECT e.enumlabel
|
|
84
|
+
FROM pg_type t
|
|
85
|
+
JOIN pg_enum e ON t.oid = e.enumtypid
|
|
86
|
+
JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
|
|
87
|
+
WHERE t.typname = $1
|
|
88
|
+
AND n.nspname = $2
|
|
89
|
+
`;
|
|
90
|
+
const result = await this.targetPool.query(query, [enumName, schemaName]);
|
|
91
|
+
return result.rows.map((row) => row.enumlabel);
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
this.logger.error(`Error getting enum values for ${enumName}: ${error.message}`);
|
|
95
|
+
return [];
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async executeQuery(query, params = []) {
|
|
99
|
+
return this.targetPool.query(query, params);
|
|
100
|
+
}
|
|
101
|
+
async queryTargetDb(query, params) {
|
|
102
|
+
return this.targetPool.query(query, params);
|
|
103
|
+
}
|
|
104
|
+
async createMissingColumns(tableName, schema, columns) {
|
|
105
|
+
for (const column of columns) {
|
|
106
|
+
try {
|
|
107
|
+
const query = `
|
|
108
|
+
ALTER TABLE "${schema}"."${tableName}"
|
|
109
|
+
ADD COLUMN IF NOT EXISTS "${column.column_name}" ${column.data_type}
|
|
110
|
+
${column.is_nullable === 'NO' ? 'NOT NULL' : ''}
|
|
111
|
+
${column.column_default ? `DEFAULT ${column.column_default}` : ''}
|
|
112
|
+
`;
|
|
113
|
+
await this.targetPool.query(query);
|
|
114
|
+
if (column.constraint_type === 'UNIQUE') {
|
|
115
|
+
const constraintName = `${tableName}_${column.column_name}_unique`;
|
|
116
|
+
const uniqueQuery = `
|
|
117
|
+
DO $$
|
|
118
|
+
BEGIN
|
|
119
|
+
IF NOT EXISTS (
|
|
120
|
+
SELECT 1 FROM pg_constraint WHERE conname = '${constraintName}'
|
|
121
|
+
) THEN
|
|
122
|
+
ALTER TABLE "${schema}"."${tableName}"
|
|
123
|
+
ADD CONSTRAINT "${constraintName}" UNIQUE ("${column.column_name}");
|
|
124
|
+
END IF;
|
|
125
|
+
END $$;
|
|
126
|
+
`;
|
|
127
|
+
await this.targetPool.query(uniqueQuery);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
this.logger.error(`Error creating column ${column.column_name}: ${error.message}`);
|
|
132
|
+
throw error;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
async createSchema(schemaName) {
|
|
137
|
+
try {
|
|
138
|
+
await this.targetPool.query(`CREATE SCHEMA IF NOT EXISTS "${schemaName}"`);
|
|
139
|
+
const tables = await this.getPublicTables();
|
|
140
|
+
for (const table of tables) {
|
|
141
|
+
await this.targetPool.query(`
|
|
142
|
+
CREATE TABLE IF NOT EXISTS "${schemaName}"."${table}" (
|
|
143
|
+
LIKE public."${table}" INCLUDING ALL
|
|
144
|
+
);
|
|
145
|
+
`);
|
|
146
|
+
}
|
|
147
|
+
this.logger.log(`Created schema ${schemaName} with all tables`);
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
this.logger.error(`Error creating schema ${schemaName}: ${error.message}`);
|
|
151
|
+
throw error;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
async getPublicTables() {
|
|
155
|
+
const result = await this.targetPool.query(`
|
|
156
|
+
SELECT tablename
|
|
157
|
+
FROM pg_tables
|
|
158
|
+
WHERE schemaname = 'public'
|
|
159
|
+
`);
|
|
160
|
+
return result.rows.map(row => row.tablename);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
exports.SchemaUtils = SchemaUtils;
|
|
164
|
+
//# sourceMappingURL=schema-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-utils.js","sourceRoot":"","sources":["../../../src/scripts/data-migration/schema-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { SchemaUtils } from "./schema-utils";
|
|
2
|
+
import { EntityDiscovery } from "./entity-discovery";
|
|
3
|
+
import { BatchMigrator } from "./batch-migrator";
|
|
4
|
+
import { DatabaseConnections } from "./types";
|
|
5
|
+
export declare class TenantMigrator {
|
|
6
|
+
private readonly schemaUtils;
|
|
7
|
+
private readonly entityDiscovery;
|
|
8
|
+
private readonly batchMigrator;
|
|
9
|
+
private readonly connections;
|
|
10
|
+
private readonly logger;
|
|
11
|
+
private readonly dependencyResolver;
|
|
12
|
+
constructor(schemaUtils: SchemaUtils, entityDiscovery: EntityDiscovery, batchMigrator: BatchMigrator, connections: DatabaseConnections);
|
|
13
|
+
verifyPhaseDependencies(tenantId: string, tables: string[]): Promise<boolean>;
|
|
14
|
+
migrateDataForTenant(tenantId: string, providerId: number, includeTables?: string[] | null, excludeTables?: string[] | null): Promise<void>;
|
|
15
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TenantMigrator = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
const client_1 = require("@prisma/client");
|
|
6
|
+
const dependency_resolver_1 = require("./dependency-resolver");
|
|
7
|
+
class TenantMigrator {
|
|
8
|
+
constructor(schemaUtils, entityDiscovery, batchMigrator, connections) {
|
|
9
|
+
this.schemaUtils = schemaUtils;
|
|
10
|
+
this.entityDiscovery = entityDiscovery;
|
|
11
|
+
this.batchMigrator = batchMigrator;
|
|
12
|
+
this.connections = connections;
|
|
13
|
+
this.logger = new common_1.Logger("TenantMigrator");
|
|
14
|
+
this.dependencyResolver = new dependency_resolver_1.DependencyResolver(connections.sourcePool, connections.targetPool);
|
|
15
|
+
}
|
|
16
|
+
async verifyPhaseDependencies(tenantId, tables) {
|
|
17
|
+
try {
|
|
18
|
+
for (const table of tables) {
|
|
19
|
+
const count = await this.connections.targetPrisma.$queryRawUnsafe(`SELECT COUNT(*) FROM "${tenantId}"."${table}"`);
|
|
20
|
+
if (!count || count[0].count === "0") {
|
|
21
|
+
this.logger.warn(`No data found in required table ${table} for tenant ${tenantId}`);
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
this.logger.error(`Error verifying phase dependencies: ${error.message}`);
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async migrateDataForTenant(tenantId, providerId, includeTables, excludeTables) {
|
|
33
|
+
this.logger.log(`Migrating data for tenant: ${tenantId} (Provider ID: ${providerId || "N/A"})`);
|
|
34
|
+
try {
|
|
35
|
+
let tenantExists = false;
|
|
36
|
+
try {
|
|
37
|
+
const result = await this.connections.sourcePrisma.api_keys.findFirst({
|
|
38
|
+
where: {
|
|
39
|
+
api_key: tenantId,
|
|
40
|
+
OR: [{ provider_id: providerId }, { provider_id: null }],
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
tenantExists = !!result;
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
this.logger.warn(`Error checking tenant existence, will assume using public schema: ${error.message}`);
|
|
47
|
+
tenantExists = true;
|
|
48
|
+
}
|
|
49
|
+
if (!tenantExists) {
|
|
50
|
+
this.logger.warn(`Tenant ${tenantId} does not exist or does not belong to provider ${providerId || "N/A"}. Using public schema as source.`);
|
|
51
|
+
}
|
|
52
|
+
this.logger.log(`Proceeding with migration for tenant ${tenantId}`);
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
this.logger.error(`Error verifying tenant ${tenantId} for provider ${providerId || "N/A"}: ${error.message}`);
|
|
56
|
+
this.logger.error(`Error details: ${JSON.stringify(error)}`);
|
|
57
|
+
}
|
|
58
|
+
const tenantPrisma = new client_1.PrismaClient({
|
|
59
|
+
datasources: {
|
|
60
|
+
db: {
|
|
61
|
+
url: `${process.env.DATABASE_URL}?schema=${tenantId}`,
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
transactionOptions: {
|
|
65
|
+
maxWait: 300000,
|
|
66
|
+
timeout: 300000,
|
|
67
|
+
},
|
|
68
|
+
log: ["query", "error", "warn"],
|
|
69
|
+
});
|
|
70
|
+
try {
|
|
71
|
+
const schemaExists = await this.schemaUtils.checkSchemaExists(tenantId);
|
|
72
|
+
if (!schemaExists) {
|
|
73
|
+
this.logger.error(`Schema ${tenantId} does not exist in target database. Skipping migration.`);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const targetTables = await this.schemaUtils.getTargetTables(tenantId);
|
|
77
|
+
let entityTypes = await this.entityDiscovery.discoverEntityTypes(tenantId, targetTables);
|
|
78
|
+
if (includeTables) {
|
|
79
|
+
entityTypes = entityTypes.filter((entity) => includeTables.includes(entity.name));
|
|
80
|
+
this.logger.log(`Filtered to include only: ${includeTables.join(", ")}`);
|
|
81
|
+
}
|
|
82
|
+
if (excludeTables) {
|
|
83
|
+
entityTypes = entityTypes.filter((entity) => !excludeTables.includes(entity.name));
|
|
84
|
+
this.logger.log(`Filtered to exclude: ${excludeTables.join(", ")}`);
|
|
85
|
+
}
|
|
86
|
+
const sortedTables = await this.dependencyResolver.analyzeDependencies();
|
|
87
|
+
const orderedEntities = entityTypes
|
|
88
|
+
.sort((a, b) => {
|
|
89
|
+
const aIndex = sortedTables.indexOf(a.name);
|
|
90
|
+
const bIndex = sortedTables.indexOf(b.name);
|
|
91
|
+
return aIndex - bIndex;
|
|
92
|
+
})
|
|
93
|
+
.filter(entity => sortedTables.includes(entity.name));
|
|
94
|
+
this.logger.log(`Migration order: ${orderedEntities.map((e) => e.name).join(" -> ")}`);
|
|
95
|
+
this.logger.log(`Discovered ${entityTypes.length} entity types for migration`);
|
|
96
|
+
for (const entity of orderedEntities) {
|
|
97
|
+
await this.batchMigrator.migrateEntityDataInBatches(tenantPrisma, entity, providerId, tenantId);
|
|
98
|
+
}
|
|
99
|
+
this.logger.log(`Completed migration for tenant ${tenantId}`);
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
this.logger.error(`Error migrating data for tenant ${tenantId}: ${error.message}`);
|
|
103
|
+
}
|
|
104
|
+
finally {
|
|
105
|
+
await tenantPrisma.$disconnect();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
exports.TenantMigrator = TenantMigrator;
|
|
110
|
+
//# sourceMappingURL=tenant-migrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant-migrator.js","sourceRoot":"","sources":["../../../src/scripts/data-migration/tenant-migrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TypecastManager = void 0;
|
|
4
|
+
class TypecastManager {
|
|
5
|
+
getTypecastForColumn(column) {
|
|
6
|
+
var _a;
|
|
7
|
+
switch (column.data_type.toLowerCase()) {
|
|
8
|
+
case "numeric":
|
|
9
|
+
case "decimal":
|
|
10
|
+
return "::numeric";
|
|
11
|
+
case "integer":
|
|
12
|
+
return "::integer";
|
|
13
|
+
case "bigint":
|
|
14
|
+
return "::bigint";
|
|
15
|
+
case "boolean":
|
|
16
|
+
return "::boolean";
|
|
17
|
+
case "timestamp":
|
|
18
|
+
return "::timestamp";
|
|
19
|
+
case "timestamptz":
|
|
20
|
+
return "::timestamptz";
|
|
21
|
+
case "user-defined":
|
|
22
|
+
if ((_a = column.udt_name) === null || _a === void 0 ? void 0 : _a.startsWith("enum_")) {
|
|
23
|
+
return `::${column.udt_name}`;
|
|
24
|
+
}
|
|
25
|
+
return "";
|
|
26
|
+
default:
|
|
27
|
+
return "";
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
getEnumCastExpression(schemaName, enumType, paramIndex) {
|
|
31
|
+
return `CAST($${paramIndex} AS "${schemaName}".${enumType})`;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.TypecastManager = TypecastManager;
|
|
35
|
+
//# sourceMappingURL=typecast-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typecast-manager.js","sourceRoot":"","sources":["../../../src/scripts/data-migration/typecast-manager.ts"],"names":[],"mappings":";;;AAEA,MAAa,eAAe;IAC1B,oBAAoB,CAAC,MAAoB;;QACvC,QAAQ,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;YACvC,KAAK,SAAS,CAAC;YACf,KAAK,SAAS;gBACZ,OAAO,WAAW,CAAC;YACrB,KAAK,SAAS;gBACZ,OAAO,WAAW,CAAC;YACrB,KAAK,QAAQ;gBACX,OAAO,UAAU,CAAC;YACpB,KAAK,SAAS;gBACZ,OAAO,WAAW,CAAC;YACrB,KAAK,WAAW;gBACd,OAAO,aAAa,CAAC;YACvB,KAAK,aAAa;gBAChB,OAAO,eAAe,CAAC;YACzB,KAAK,cAAc;gBAEjB,IAAI,MAAA,MAAM,CAAC,QAAQ,0CAAE,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;oBACzC,OAAO,KAAK,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAChC,CAAC;gBACD,OAAO,EAAE,CAAC;YACZ;gBACE,OAAO,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAGD,qBAAqB,CACnB,UAAkB,EAClB,QAAgB,EAChB,UAAkB;QAElB,OAAO,SAAS,UAAU,QAAQ,UAAU,KAAK,QAAQ,GAAG,CAAC;IAC/D,CAAC;CACF;AAnCD,0CAmCC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Pool } from "pg";
|
|
2
|
+
import { PrismaClient } from "@prisma/client";
|
|
3
|
+
export interface DatabaseConnections {
|
|
4
|
+
sourcePool: Pool;
|
|
5
|
+
targetPool: Pool;
|
|
6
|
+
sourcePrisma: PrismaClient;
|
|
7
|
+
targetPrisma: PrismaClient;
|
|
8
|
+
}
|
|
9
|
+
export interface ColumnSchema {
|
|
10
|
+
table_name: string;
|
|
11
|
+
column_name: string;
|
|
12
|
+
data_type: string;
|
|
13
|
+
udt_name: string;
|
|
14
|
+
character_maximum_length?: number;
|
|
15
|
+
is_nullable: string;
|
|
16
|
+
column_default?: string;
|
|
17
|
+
constraint_type?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface EntityType {
|
|
20
|
+
name: string;
|
|
21
|
+
idField: string;
|
|
22
|
+
filterColumn?: string;
|
|
23
|
+
filterVia?: string;
|
|
24
|
+
foreignKey?: string;
|
|
25
|
+
joinTable?: string;
|
|
26
|
+
joinField?: string;
|
|
27
|
+
joinForeignKey?: string;
|
|
28
|
+
directQuery?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface EnumCastValue {
|
|
31
|
+
needsEnumCast: boolean;
|
|
32
|
+
value: any;
|
|
33
|
+
enumType: string;
|
|
34
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/scripts/data-migration/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export declare class DataMigrationTool {
|
|
2
|
+
private readonly logger;
|
|
3
|
+
private readonly sourcePrisma;
|
|
4
|
+
private readonly targetPrisma;
|
|
5
|
+
private readonly sourcePool;
|
|
6
|
+
private readonly targetPool;
|
|
7
|
+
private schemaCache;
|
|
8
|
+
private targetSchemaCache;
|
|
9
|
+
private errorHandler;
|
|
10
|
+
constructor();
|
|
11
|
+
migrateData(): Promise<void>;
|
|
12
|
+
private migrateDataForTenant;
|
|
13
|
+
private getEnumValues;
|
|
14
|
+
private migrateEntityDataInBatches;
|
|
15
|
+
private discoverEntityTypes;
|
|
16
|
+
private checkSchemaExists;
|
|
17
|
+
private getTargetTables;
|
|
18
|
+
private upsertEntity;
|
|
19
|
+
private getTableSchema;
|
|
20
|
+
private cleanup;
|
|
21
|
+
private validateEnumValue;
|
|
22
|
+
}
|