@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.
Files changed (150) hide show
  1. package/README.md +220 -0
  2. package/dist/index.d.ts +7 -0
  3. package/dist/index.js +34 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/prisma-factory.service.d.ts +9 -0
  6. package/dist/prisma-factory.service.js +47 -0
  7. package/dist/prisma-factory.service.js.map +1 -0
  8. package/dist/prisma.module.d.ts +2 -0
  9. package/dist/prisma.module.js +23 -0
  10. package/dist/prisma.module.js.map +1 -0
  11. package/dist/prisma.service.d.ts +6 -0
  12. package/dist/prisma.service.js +27 -0
  13. package/dist/prisma.service.js.map +1 -0
  14. package/dist/scripts/create-tenant-schemas.d.ts +1 -0
  15. package/dist/scripts/create-tenant-schemas.js +117 -0
  16. package/dist/scripts/create-tenant-schemas.js.map +1 -0
  17. package/dist/scripts/data-migration/batch-migrator.d.ts +25 -0
  18. package/dist/scripts/data-migration/batch-migrator.js +333 -0
  19. package/dist/scripts/data-migration/batch-migrator.js.map +1 -0
  20. package/dist/scripts/data-migration/data-transformer.d.ts +17 -0
  21. package/dist/scripts/data-migration/data-transformer.js +242 -0
  22. package/dist/scripts/data-migration/data-transformer.js.map +1 -0
  23. package/dist/scripts/data-migration/db-connector.d.ts +7 -0
  24. package/dist/scripts/data-migration/db-connector.js +58 -0
  25. package/dist/scripts/data-migration/db-connector.js.map +1 -0
  26. package/dist/scripts/data-migration/dependency-manager.d.ts +9 -0
  27. package/dist/scripts/data-migration/dependency-manager.js +86 -0
  28. package/dist/scripts/data-migration/dependency-manager.js.map +1 -0
  29. package/dist/scripts/data-migration/dependency-resolver.d.ts +18 -0
  30. package/dist/scripts/data-migration/dependency-resolver.js +251 -0
  31. package/dist/scripts/data-migration/dependency-resolver.js.map +1 -0
  32. package/dist/scripts/data-migration/entity-discovery.d.ts +11 -0
  33. package/dist/scripts/data-migration/entity-discovery.js +152 -0
  34. package/dist/scripts/data-migration/entity-discovery.js.map +1 -0
  35. package/dist/scripts/data-migration/foreign-key-manager.d.ts +17 -0
  36. package/dist/scripts/data-migration/foreign-key-manager.js +70 -0
  37. package/dist/scripts/data-migration/foreign-key-manager.js.map +1 -0
  38. package/dist/scripts/data-migration/migration-phases.d.ts +5 -0
  39. package/dist/scripts/data-migration/migration-phases.js +55 -0
  40. package/dist/scripts/data-migration/migration-phases.js.map +1 -0
  41. package/dist/scripts/data-migration/migration-tool.d.ts +29 -0
  42. package/dist/scripts/data-migration/migration-tool.js +250 -0
  43. package/dist/scripts/data-migration/migration-tool.js.map +1 -0
  44. package/dist/scripts/data-migration/phase-generator.d.ts +15 -0
  45. package/dist/scripts/data-migration/phase-generator.js +187 -0
  46. package/dist/scripts/data-migration/phase-generator.js.map +1 -0
  47. package/dist/scripts/data-migration/schema-utils.d.ts +18 -0
  48. package/dist/scripts/data-migration/schema-utils.js +164 -0
  49. package/dist/scripts/data-migration/schema-utils.js.map +1 -0
  50. package/dist/scripts/data-migration/tenant-migrator.d.ts +15 -0
  51. package/dist/scripts/data-migration/tenant-migrator.js +110 -0
  52. package/dist/scripts/data-migration/tenant-migrator.js.map +1 -0
  53. package/dist/scripts/data-migration/typecast-manager.d.ts +5 -0
  54. package/dist/scripts/data-migration/typecast-manager.js +35 -0
  55. package/dist/scripts/data-migration/typecast-manager.js.map +1 -0
  56. package/dist/scripts/data-migration/types.d.ts +34 -0
  57. package/dist/scripts/data-migration/types.js +3 -0
  58. package/dist/scripts/data-migration/types.js.map +1 -0
  59. package/dist/scripts/data-migration.d.ts +22 -0
  60. package/dist/scripts/data-migration.js +593 -0
  61. package/dist/scripts/data-migration.js.map +1 -0
  62. package/dist/scripts/drop-database.d.ts +10 -0
  63. package/dist/scripts/drop-database.js +81 -0
  64. package/dist/scripts/drop-database.js.map +1 -0
  65. package/dist/scripts/error-handler.d.ts +12 -0
  66. package/dist/scripts/error-handler.js +82 -0
  67. package/dist/scripts/error-handler.js.map +1 -0
  68. package/dist/scripts/fix-data-types.d.ts +10 -0
  69. package/dist/scripts/fix-data-types.js +185 -0
  70. package/dist/scripts/fix-data-types.js.map +1 -0
  71. package/dist/scripts/fix-enum-values.d.ts +17 -0
  72. package/dist/scripts/fix-enum-values.js +234 -0
  73. package/dist/scripts/fix-enum-values.js.map +1 -0
  74. package/dist/scripts/fix-schema-discrepancies.d.ts +21 -0
  75. package/dist/scripts/fix-schema-discrepancies.js +240 -0
  76. package/dist/scripts/fix-schema-discrepancies.js.map +1 -0
  77. package/dist/scripts/migrate-schema-structure.d.ts +1 -0
  78. package/dist/scripts/migrate-schema-structure.js +76 -0
  79. package/dist/scripts/migrate-schema-structure.js.map +1 -0
  80. package/dist/scripts/post-migration-validator.d.ts +21 -0
  81. package/dist/scripts/post-migration-validator.js +341 -0
  82. package/dist/scripts/post-migration-validator.js.map +1 -0
  83. package/dist/scripts/pre-migration-validator.d.ts +25 -0
  84. package/dist/scripts/pre-migration-validator.js +491 -0
  85. package/dist/scripts/pre-migration-validator.js.map +1 -0
  86. package/dist/scripts/reset-database.d.ts +17 -0
  87. package/dist/scripts/reset-database.js +202 -0
  88. package/dist/scripts/reset-database.js.map +1 -0
  89. package/dist/scripts/retry-failed-migrations.d.ts +14 -0
  90. package/dist/scripts/retry-failed-migrations.js +301 -0
  91. package/dist/scripts/retry-failed-migrations.js.map +1 -0
  92. package/dist/scripts/run-migration.d.ts +1 -0
  93. package/dist/scripts/run-migration.js +525 -0
  94. package/dist/scripts/run-migration.js.map +1 -0
  95. package/dist/scripts/schema-sync.d.ts +1 -0
  96. package/dist/scripts/schema-sync.js +85 -0
  97. package/dist/scripts/schema-sync.js.map +1 -0
  98. package/dist/scripts/sync-enum-types.d.ts +13 -0
  99. package/dist/scripts/sync-enum-types.js +139 -0
  100. package/dist/scripts/sync-enum-types.js.map +1 -0
  101. package/dist/scripts/sync-enum-values.d.ts +20 -0
  102. package/dist/scripts/sync-enum-values.js +336 -0
  103. package/dist/scripts/sync-enum-values.js.map +1 -0
  104. package/dist/scripts/truncate-database.d.ts +10 -0
  105. package/dist/scripts/truncate-database.js +100 -0
  106. package/dist/scripts/truncate-database.js.map +1 -0
  107. package/dist/scripts/verify-migration-setup.d.ts +11 -0
  108. package/dist/scripts/verify-migration-setup.js +120 -0
  109. package/dist/scripts/verify-migration-setup.js.map +1 -0
  110. package/dist/tsconfig.tsbuildinfo +1 -0
  111. package/migration-config-public.json +95 -0
  112. package/migration-config.json +95 -0
  113. package/package.json +33 -0
  114. package/prisma/migrations/migration_lock.toml +3 -0
  115. package/prisma/schema.prisma +360 -0
  116. package/src/index.ts +23 -0
  117. package/src/prisma-factory.service.ts +41 -0
  118. package/src/prisma.module.ts +10 -0
  119. package/src/prisma.service.ts +17 -0
  120. package/src/scripts/create-tenant-schemas.ts +146 -0
  121. package/src/scripts/data-migration/batch-migrator.ts +569 -0
  122. package/src/scripts/data-migration/data-transformer.ts +377 -0
  123. package/src/scripts/data-migration/db-connector.ts +67 -0
  124. package/src/scripts/data-migration/dependency-resolver.ts +319 -0
  125. package/src/scripts/data-migration/entity-discovery.ts +197 -0
  126. package/src/scripts/data-migration/foreign-key-manager.ts +95 -0
  127. package/src/scripts/data-migration/migration-tool.ts +357 -0
  128. package/src/scripts/data-migration/schema-utils.ts +186 -0
  129. package/src/scripts/data-migration/tenant-migrator.ts +194 -0
  130. package/src/scripts/data-migration/typecast-manager.ts +38 -0
  131. package/src/scripts/data-migration/types.ts +40 -0
  132. package/src/scripts/drop-database.ts +105 -0
  133. package/src/scripts/dump-source-db.sh +62 -0
  134. package/src/scripts/dumps/source_dump_20250413_112626.sql +1527 -0
  135. package/src/scripts/error-handler.ts +118 -0
  136. package/src/scripts/fix-data-types.ts +242 -0
  137. package/src/scripts/fix-enum-values.ts +357 -0
  138. package/src/scripts/fix-schema-discrepancies.ts +318 -0
  139. package/src/scripts/migrate-schema-structure.ts +90 -0
  140. package/src/scripts/post-migration-validator.ts +427 -0
  141. package/src/scripts/pre-migration-validator.ts +611 -0
  142. package/src/scripts/reset-database.ts +264 -0
  143. package/src/scripts/retry-failed-migrations.ts +416 -0
  144. package/src/scripts/run-migration.ts +691 -0
  145. package/src/scripts/schema-sync.ts +129 -0
  146. package/src/scripts/sync-enum-types.ts +171 -0
  147. package/src/scripts/sync-enum-values.ts +563 -0
  148. package/src/scripts/truncate-database.ts +124 -0
  149. package/src/scripts/verify-migration-setup.ts +136 -0
  150. package/tsconfig.json +18 -0
@@ -0,0 +1,129 @@
1
+ import { Logger } from "@nestjs/common";
2
+ import { DatabaseConnector } from "./data-migration/db-connector";
3
+ import * as fs from "fs";
4
+ import * as path from "path";
5
+
6
+ async function main() {
7
+ const logger = new Logger("SchemaSyncTool");
8
+ logger.log("Starting schema synchronization");
9
+
10
+ // Crear conexiones a las bases de datos
11
+ const connections = DatabaseConnector.createConnections();
12
+
13
+ try {
14
+ // Obtener todas las tablas de la base de datos origen
15
+ const sourceTables = await getTablesFromDatabase(connections.sourcePool);
16
+ logger.log(`Found ${sourceTables.length} tables in source database`);
17
+
18
+ // Obtener todas las tablas de la base de datos destino
19
+ const targetTables = await getTablesFromDatabase(connections.targetPool);
20
+ logger.log(`Found ${targetTables.length} tables in target database`);
21
+
22
+ // Comparar esquemas y generar SQL para sincronizar
23
+ const syncScript = await generateSyncScript(
24
+ connections.sourcePool,
25
+ connections.targetPool,
26
+ sourceTables,
27
+ targetTables
28
+ );
29
+
30
+ // Guardar el script SQL
31
+ const timestamp = new Date().toISOString().replace(/:/g, "-").split(".")[0];
32
+ const filePath = path.join(
33
+ process.cwd(),
34
+ `schema-sync-${timestamp}.sql`
35
+ );
36
+ fs.writeFileSync(filePath, syncScript);
37
+
38
+ logger.log(`Schema synchronization script saved to ${filePath}`);
39
+ logger.log("Review the script and execute it manually to synchronize schemas");
40
+
41
+ } catch (error) {
42
+ logger.error(`Error in schema synchronization: ${error.message}`, error.stack);
43
+ } finally {
44
+ // Cerrar conexiones
45
+ await DatabaseConnector.cleanup(connections);
46
+ }
47
+ }
48
+
49
+ async function getTablesFromDatabase(pool: any): Promise<string[]> {
50
+ const query = `
51
+ SELECT table_name
52
+ FROM information_schema.tables
53
+ WHERE table_schema = 'public'
54
+ AND table_type = 'BASE TABLE'
55
+ `;
56
+
57
+ const result = await pool.query(query);
58
+ return result.rows.map(row => row.table_name);
59
+ }
60
+
61
+ async function generateSyncScript(
62
+ sourcePool: any,
63
+ targetPool: any,
64
+ sourceTables: string[],
65
+ targetTables: string[]
66
+ ): Promise<string> {
67
+ let script = "-- Schema synchronization script\n\n";
68
+
69
+ // Procesar cada tabla de la fuente
70
+ for (const table of sourceTables) {
71
+ // Obtener columnas de la tabla fuente
72
+ const sourceColumns = await getTableColumns(sourcePool, table);
73
+
74
+ if (targetTables.includes(table)) {
75
+ // La tabla existe en ambas bases de datos, comparar columnas
76
+ const targetColumns = await getTableColumns(targetPool, table);
77
+
78
+ // Encontrar columnas que faltan en el destino
79
+ const missingColumns = sourceColumns.filter(
80
+ sourceCol => !targetColumns.some(targetCol => targetCol.column_name === sourceCol.column_name)
81
+ );
82
+
83
+ // Generar SQL para agregar columnas faltantes
84
+ for (const column of missingColumns) {
85
+ script += `-- Adding missing column ${column.column_name} to table ${table}\n`;
86
+ script += `ALTER TABLE "${table}" ADD COLUMN "${column.column_name}" ${column.data_type}`;
87
+
88
+ // Agregar restricciones si es necesario
89
+ if (column.is_nullable === 'NO') {
90
+ script += " NOT NULL";
91
+ }
92
+
93
+ script += ";\n\n";
94
+ }
95
+ } else {
96
+ // La tabla no existe en el destino, generar SQL para crearla
97
+ script += `-- Table ${table} does not exist in target database\n`;
98
+ script += `-- Consider running a full schema migration instead\n\n`;
99
+ }
100
+ }
101
+
102
+ return script;
103
+ }
104
+
105
+ async function getTableColumns(pool: any, table: string): Promise<any[]> {
106
+ const query = `
107
+ SELECT
108
+ column_name,
109
+ data_type,
110
+ is_nullable,
111
+ column_default
112
+ FROM
113
+ information_schema.columns
114
+ WHERE
115
+ table_schema = 'public'
116
+ AND table_name = $1
117
+ ORDER BY
118
+ ordinal_position
119
+ `;
120
+
121
+ const result = await pool.query(query, [table]);
122
+ return result.rows;
123
+ }
124
+
125
+ // Ejecutar el script
126
+ main().catch(e => {
127
+ console.error(e);
128
+ process.exit(1);
129
+ });
@@ -0,0 +1,171 @@
1
+ import * as pg from 'pg';
2
+ import * as dotenv from 'dotenv';
3
+ import { Logger } from '@nestjs/common';
4
+
5
+ dotenv.config();
6
+
7
+ export class EnumSynchronizer {
8
+ private readonly logger = new Logger('EnumSynchronizer');
9
+ private readonly sourcePool: pg.Pool;
10
+ private readonly targetPool: pg.Pool;
11
+
12
+ constructor(
13
+ private readonly sourceUrl: string = process.env.SOURCE_DATABASE_URL,
14
+ private readonly targetUrl: string = process.env.DATABASE_URL
15
+ ) {
16
+ this.sourcePool = new pg.Pool({
17
+ connectionString: this.sourceUrl,
18
+ });
19
+
20
+ this.targetPool = new pg.Pool({
21
+ connectionString: this.targetUrl,
22
+ });
23
+ }
24
+
25
+ async synchronizeEnums() {
26
+ try {
27
+ this.logger.log('Starting enum synchronization');
28
+
29
+ // Obtener todos los tipos enum en la base de datos de origen
30
+ const sourceEnumsResult = await this.sourcePool.query(`
31
+ SELECT t.typname AS enum_name
32
+ FROM pg_type t
33
+ JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
34
+ WHERE t.typtype = 'e'
35
+ AND n.nspname = 'public'
36
+ `);
37
+
38
+ this.logger.log(`Found ${sourceEnumsResult.rows.length} enum types in source database`);
39
+
40
+ // Para cada tipo enum, sincronizar sus valores
41
+ for (const enumRow of sourceEnumsResult.rows) {
42
+ const enumName = enumRow.enum_name;
43
+ await this.synchronizeEnumType(enumName);
44
+ }
45
+
46
+ this.logger.log('Enum synchronization completed successfully');
47
+ } catch (error) {
48
+ this.logger.error(`Error during enum synchronization: ${error.message}`, error.stack);
49
+ } finally {
50
+ await this.cleanup();
51
+ }
52
+ }
53
+
54
+ private async synchronizeEnumType(enumName: string) {
55
+ this.logger.log(`Synchronizing enum type: ${enumName}`);
56
+
57
+ try {
58
+ // Obtener valores del enum en la base de datos de origen
59
+ const sourceEnumValuesResult = await this.sourcePool.query(`
60
+ SELECT e.enumlabel
61
+ FROM pg_enum e
62
+ JOIN pg_type t ON e.enumtypid = t.oid
63
+ WHERE t.typname = $1
64
+ ORDER BY e.enumsortorder
65
+ `, [enumName]);
66
+
67
+ const sourceEnumValues = sourceEnumValuesResult.rows.map(row => row.enumlabel);
68
+ this.logger.log(`Source enum ${enumName} has values: ${sourceEnumValues.join(', ')}`);
69
+
70
+ // Verificar si el enum existe en la base de datos de destino
71
+ const targetEnumExistsResult = await this.targetPool.query(`
72
+ SELECT 1
73
+ FROM pg_type t
74
+ JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
75
+ WHERE t.typtype = 'e'
76
+ AND t.typname = $1
77
+ AND n.nspname = 'public'
78
+ LIMIT 1
79
+ `, [enumName]);
80
+
81
+ if (targetEnumExistsResult.rows.length === 0) {
82
+ // Si el enum no existe en el destino, crearlo
83
+ await this.createEnumType(enumName, sourceEnumValues);
84
+ } else {
85
+ // Si el enum existe, actualizar sus valores
86
+ await this.updateEnumValues(enumName, sourceEnumValues);
87
+ }
88
+ } catch (error) {
89
+ this.logger.error(`Error synchronizing enum type ${enumName}: ${error.message}`);
90
+ }
91
+ }
92
+
93
+ private async createEnumType(enumName: string, values: string[]) {
94
+ this.logger.log(`Creating enum type ${enumName} in target database`);
95
+
96
+ try {
97
+ // Escapar los valores para la consulta SQL
98
+ const escapedValues = values.map(value => `'${value.replace(/'/g, "''")}'`).join(', ');
99
+
100
+ // Crear el tipo enum
101
+ await this.targetPool.query(`
102
+ CREATE TYPE ${enumName} AS ENUM (${escapedValues})
103
+ `);
104
+
105
+ this.logger.log(`Successfully created enum type ${enumName} with values: ${values.join(', ')}`);
106
+ } catch (error) {
107
+ this.logger.error(`Error creating enum type ${enumName}: ${error.message}`);
108
+ }
109
+ }
110
+
111
+ private async updateEnumValues(enumName: string, sourceValues: string[]) {
112
+ this.logger.log(`Updating enum type ${enumName} in target database`);
113
+
114
+ try {
115
+ // Obtener valores actuales del enum en la base de datos de destino
116
+ const targetEnumValuesResult = await this.targetPool.query(`
117
+ SELECT e.enumlabel
118
+ FROM pg_enum e
119
+ JOIN pg_type t ON e.enumtypid = t.oid
120
+ WHERE t.typname = $1
121
+ ORDER BY e.enumsortorder
122
+ `, [enumName]);
123
+
124
+ const targetEnumValues = targetEnumValuesResult.rows.map(row => row.enumlabel);
125
+ this.logger.log(`Target enum ${enumName} has values: ${targetEnumValues.join(', ')}`);
126
+
127
+ // Encontrar valores que están en el origen pero no en el destino
128
+ const missingValues = sourceValues.filter(value => !targetEnumValues.includes(value));
129
+
130
+ if (missingValues.length === 0) {
131
+ this.logger.log(`Enum type ${enumName} is already up to date`);
132
+ return;
133
+ }
134
+
135
+ this.logger.log(`Adding ${missingValues.length} new values to enum ${enumName}: ${missingValues.join(', ')}`);
136
+
137
+ // Agregar los valores faltantes al enum
138
+ for (const value of missingValues) {
139
+ await this.targetPool.query(`
140
+ ALTER TYPE ${enumName} ADD VALUE '${value.replace(/'/g, "''")}'
141
+ `);
142
+ }
143
+
144
+ this.logger.log(`Successfully updated enum type ${enumName}`);
145
+ } catch (error) {
146
+ this.logger.error(`Error updating enum type ${enumName}: ${error.message}`);
147
+ }
148
+ }
149
+
150
+ private async cleanup() {
151
+ this.logger.log('Cleaning up database connections');
152
+ await this.sourcePool.end();
153
+ await this.targetPool.end();
154
+ }
155
+ }
156
+
157
+ // Script para ejecutar desde línea de comandos
158
+ if (require.main === module) {
159
+ const run = async () => {
160
+ try {
161
+ const synchronizer = new EnumSynchronizer();
162
+ await synchronizer.synchronizeEnums();
163
+ process.exit(0);
164
+ } catch (error) {
165
+ console.error('Error:', error.message);
166
+ process.exit(1);
167
+ }
168
+ };
169
+
170
+ run();
171
+ }