@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
package/README.md ADDED
@@ -0,0 +1,220 @@
1
+ # @tupay/prisma-client
2
+
3
+ Cliente Prisma compartido para los microservicios de Tupay. Este paquete proporciona una capa de abstracción sobre Prisma ORM con soporte para multi-tenancy y utilidades de migración de datos.
4
+
5
+ ## Instalación
6
+
7
+ ```bash
8
+ npm install @tupay/prisma-client
9
+ ```
10
+
11
+ ## Características
12
+
13
+ - **Cliente Prisma Singleton**: Implementación eficiente del cliente Prisma como singleton
14
+ - **Soporte Multi-tenant**: Conexión a diferentes esquemas de base de datos para diferentes inquilinos
15
+ - **Integración con NestJS**: Módulo global para aplicaciones NestJS
16
+ - **Utilidades de Migración**: Scripts para migración de datos y esquemas
17
+ - **Herramientas de Gestión de BD**: Scripts para crear, eliminar y restablecer bases de datos
18
+
19
+ ## Diagramas
20
+
21
+ ### Arquitectura Multi-tenant
22
+
23
+ ```mermaid
24
+ graph TD
25
+ A[Aplicación] --> B[PrismaFactoryService]
26
+ B --> C[Cliente Prisma - Tenant 1]
27
+ B --> D[Cliente Prisma - Tenant 2]
28
+ B --> E[Cliente Prisma - Tenant N]
29
+ C --> F[(Base de Datos - Schema Tenant 1)]
30
+ D --> F
31
+ E --> F
32
+ B --> G[Cliente Prisma - Public]
33
+ G --> F
34
+ ```
35
+
36
+ ### Flujo de Migración de Datos
37
+
38
+ ```mermaid
39
+ sequenceDiagram
40
+ participant S as Base de Datos Origen
41
+ participant M as Script de Migración
42
+ participant T as Base de Datos Destino
43
+
44
+ M->>S: Consulta datos de origen
45
+ S-->>M: Retorna datos
46
+ M->>M: Procesa y transforma datos
47
+ M->>T: Migra datos a destino
48
+ T-->>M: Confirma migración
49
+
50
+ Note over M: Ordenamiento por dependencias
51
+ Note over M: Manejo de tipos de datos
52
+ Note over M: Migración por fases
53
+ ```
54
+
55
+ ### Estructura del Proyecto
56
+
57
+ ```mermaid
58
+ graph LR
59
+ A[prisma-client] --> B[src]
60
+ A --> C[prisma]
61
+ B --> D[scripts]
62
+ B --> E[index.ts]
63
+ B --> F[prisma.module.ts]
64
+ B --> G[prisma.service.ts]
65
+ B --> H[prisma-factory.service.ts]
66
+ D --> I[data-migration]
67
+ D --> J[reset-database.ts]
68
+ D --> K[schema-sync.ts]
69
+ D --> L[create-tenant-schemas.ts]
70
+ I --> M[dependency-manager.ts]
71
+ I --> N[schema-utils.ts]
72
+ I --> O[migration-phases.ts]
73
+ ```
74
+
75
+ ## Uso Básico
76
+
77
+ ### En aplicaciones NestJS
78
+
79
+ ```typescript
80
+ import { Module } from "@nestjs/common";
81
+ import { PrismaModule } from "@tupay/prisma-client";
82
+
83
+ @Module({
84
+ imports: [PrismaModule],
85
+ })
86
+ export class AppModule {}
87
+ ```
88
+
89
+ Luego, inyecta el servicio donde lo necesites:
90
+
91
+ ```typescript
92
+ import { Injectable } from "@nestjs/common";
93
+ import { PrismaService, PrismaFactoryService } from "@tupay/prisma-client";
94
+
95
+ @Injectable()
96
+ export class MyService {
97
+ constructor(
98
+ private prismaService: PrismaService,
99
+ private prismaFactoryService: PrismaFactoryService
100
+ ) {}
101
+
102
+ // Usar el cliente principal (schema public)
103
+ async findAllUsers() {
104
+ return this.prismaService.client.users.findMany();
105
+ }
106
+
107
+ // Usar un cliente específico para un tenant
108
+ async findTenantUsers(tenantId: string) {
109
+ const tenantClient = this.prismaFactoryService.getClient(tenantId);
110
+ return tenantClient.users.findMany();
111
+ }
112
+ }
113
+ ```
114
+
115
+ ### En aplicaciones no-NestJS
116
+
117
+ ```typescript
118
+ import { prisma } from "@tupay/prisma-client";
119
+
120
+ async function main() {
121
+ const users = await prisma.users.findMany();
122
+ console.log(users);
123
+ }
124
+
125
+ main()
126
+ .catch(console.error)
127
+ .finally(() => prisma.$disconnect());
128
+ ```
129
+
130
+ ## Scripts de Utilidad
131
+
132
+ Este paquete incluye varios scripts útiles para la gestión de bases de datos:
133
+
134
+ ### Migración de Datos
135
+
136
+ ```bash
137
+ # Migrar datos entre bases de datos
138
+ npm run migrate:data
139
+
140
+ # Migrar datos forzando la operación
141
+ npm run migrate:data:force
142
+
143
+ # Migrar datos con confirmación automática
144
+ npm run migrate:data:yes
145
+ ```
146
+
147
+ ### Gestión de Esquemas
148
+
149
+ ```bash
150
+ # Generar cliente Prisma
151
+ npm run generate
152
+
153
+ # Ejecutar migraciones de desarrollo
154
+ npm run migrate:dev
155
+
156
+ # Desplegar migraciones
157
+ npm run migrate:deploy
158
+ ```
159
+
160
+ ## Scripts Avanzados
161
+
162
+ El paquete también incluye scripts para casos de uso más avanzados:
163
+
164
+ ### Creación de Esquemas para Tenants
165
+
166
+ ```bash
167
+ # Compilar el proyecto
168
+ npm run build
169
+
170
+ # Ejecutar el script para crear esquemas de tenant
171
+ node dist/scripts/create-tenant-schemas.js
172
+ ```
173
+
174
+ ### Migración de Estructura de Esquemas
175
+
176
+ ```bash
177
+ # Migrar la estructura de esquemas entre bases de datos
178
+ node dist/scripts/migrate-schema-structure.js
179
+ ```
180
+
181
+ ### Sincronización de Esquemas
182
+
183
+ ```bash
184
+ # Generar un script SQL para sincronizar esquemas
185
+ node dist/scripts/schema-sync.js
186
+ ```
187
+
188
+ ### Reseteo de Base de Datos
189
+
190
+ ```bash
191
+ # Resetear la base de datos
192
+ node dist/scripts/reset-database.js
193
+
194
+ # Resetear y recrear la base de datos
195
+ node dist/scripts/reset-database.js --recreate
196
+ ```
197
+
198
+ ## Variables de Entorno
199
+
200
+ El paquete requiere las siguientes variables de entorno:
201
+
202
+ - `DATABASE_URL`: URL de conexión a la base de datos principal
203
+ - `SOURCE_DATABASE_URL`: URL de conexión a la base de datos de origen (para migraciones)
204
+
205
+ ## Desarrollo
206
+
207
+ ```bash
208
+ # Instalar dependencias
209
+ npm install
210
+
211
+ # Compilar el proyecto
212
+ npm run build
213
+
214
+ # Generar cliente Prisma
215
+ npm run generate
216
+ ```
217
+
218
+ ## Licencia
219
+
220
+ ISC
@@ -0,0 +1,7 @@
1
+ import { PrismaClient } from "@prisma/client";
2
+ import { PrismaModule } from "./prisma.module";
3
+ import { PrismaService } from "./prisma.service";
4
+ import { PrismaFactoryService } from "./prisma-factory.service";
5
+ export declare const prisma: PrismaClient<import(".prisma/client").Prisma.PrismaClientOptions, never, import("@prisma/client/runtime/library").DefaultArgs>;
6
+ export { PrismaModule, PrismaService, PrismaFactoryService };
7
+ export * from "@prisma/client";
package/dist/index.js ADDED
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ var _a;
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.PrismaFactoryService = exports.PrismaService = exports.PrismaModule = exports.prisma = void 0;
19
+ const client_1 = require("@prisma/client");
20
+ const prisma_module_1 = require("./prisma.module");
21
+ Object.defineProperty(exports, "PrismaModule", { enumerable: true, get: function () { return prisma_module_1.PrismaModule; } });
22
+ const prisma_service_1 = require("./prisma.service");
23
+ Object.defineProperty(exports, "PrismaService", { enumerable: true, get: function () { return prisma_service_1.PrismaService; } });
24
+ const prisma_factory_service_1 = require("./prisma-factory.service");
25
+ Object.defineProperty(exports, "PrismaFactoryService", { enumerable: true, get: function () { return prisma_factory_service_1.PrismaFactoryService; } });
26
+ const prismaClientSingleton = () => {
27
+ return new client_1.PrismaClient();
28
+ };
29
+ const globalForPrisma = globalThis;
30
+ exports.prisma = (_a = globalForPrisma.prisma) !== null && _a !== void 0 ? _a : prismaClientSingleton();
31
+ if (process.env.NODE_ENV !== "production")
32
+ globalForPrisma.prisma = exports.prisma;
33
+ __exportStar(require("@prisma/client"), exports);
34
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,2CAA8C;AAC9C,mDAA+C;AAoBtC,6FApBA,4BAAY,OAoBA;AAnBrB,qDAAiD;AAmB1B,8FAnBd,8BAAa,OAmBc;AAlBpC,qEAAgE;AAkB1B,qGAlB7B,6CAAoB,OAkB6B;AAf1D,MAAM,qBAAqB,GAAG,GAAG,EAAE;IACjC,OAAO,IAAI,qBAAY,EAAE,CAAC;AAC5B,CAAC,CAAC;AAIF,MAAM,eAAe,GAAG,UAEvB,CAAC;AAEW,QAAA,MAAM,GAAG,MAAA,eAAe,CAAC,MAAM,mCAAI,qBAAqB,EAAE,CAAC;AAExE,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;IAAE,eAAe,CAAC,MAAM,GAAG,cAAM,CAAC;AAI3E,iDAA+B"}
@@ -0,0 +1,9 @@
1
+ import { OnModuleDestroy } from '@nestjs/common';
2
+ import { PrismaClient } from '@prisma/client';
3
+ export declare class PrismaFactoryService implements OnModuleDestroy {
4
+ private clients;
5
+ private readonly logger;
6
+ getClient(tenantId: string): PrismaClient;
7
+ getMasterClient(): PrismaClient;
8
+ onModuleDestroy(): Promise<void>;
9
+ }
@@ -0,0 +1,47 @@
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 PrismaFactoryService_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.PrismaFactoryService = void 0;
11
+ const common_1 = require("@nestjs/common");
12
+ const client_1 = require("@prisma/client");
13
+ let PrismaFactoryService = PrismaFactoryService_1 = class PrismaFactoryService {
14
+ constructor() {
15
+ this.clients = new Map();
16
+ this.logger = new common_1.Logger(PrismaFactoryService_1.name);
17
+ }
18
+ getClient(tenantId) {
19
+ if (!this.clients.has(tenantId)) {
20
+ this.logger.log(`Creating new Prisma client for tenant: ${tenantId}`);
21
+ const client = new client_1.PrismaClient({
22
+ datasources: {
23
+ db: {
24
+ url: `${process.env.DATABASE_URL}?schema=${tenantId}`,
25
+ },
26
+ },
27
+ });
28
+ this.clients.set(tenantId, client);
29
+ }
30
+ return this.clients.get(tenantId);
31
+ }
32
+ getMasterClient() {
33
+ return this.getClient('public');
34
+ }
35
+ async onModuleDestroy() {
36
+ this.logger.log('Disconnecting all Prisma clients');
37
+ for (const [tenantId, client] of this.clients.entries()) {
38
+ this.logger.log(`Disconnecting client for tenant: ${tenantId}`);
39
+ await client.$disconnect();
40
+ }
41
+ }
42
+ };
43
+ exports.PrismaFactoryService = PrismaFactoryService;
44
+ exports.PrismaFactoryService = PrismaFactoryService = PrismaFactoryService_1 = __decorate([
45
+ (0, common_1.Injectable)()
46
+ ], PrismaFactoryService);
47
+ //# sourceMappingURL=prisma-factory.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma-factory.service.js","sourceRoot":"","sources":["../src/prisma-factory.service.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAqE;AACrE,2CAA8C;AAGvC,IAAM,oBAAoB,4BAA1B,MAAM,oBAAoB;IAA1B;QACG,YAAO,GAA8B,IAAI,GAAG,EAAE,CAAC;QACtC,WAAM,GAAG,IAAI,eAAM,CAAC,sBAAoB,CAAC,IAAI,CAAC,CAAC;IAkClE,CAAC;IAhCC,SAAS,CAAC,QAAgB;QACxB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,0CAA0C,QAAQ,EAAE,CAAC,CAAC;YAGtE,MAAM,MAAM,GAAG,IAAI,qBAAY,CAAC;gBAC9B,WAAW,EAAE;oBACX,EAAE,EAAE;wBACF,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,WAAW,QAAQ,EAAE;qBACtD;iBACF;aACF,CAAC,CAAC;YAEH,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACrC,CAAC;QAED,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAGD,eAAe;QACb,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAEpD,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YACxD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,oCAAoC,QAAQ,EAAE,CAAC,CAAC;YAChE,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;QAC7B,CAAC;IACH,CAAC;CACF,CAAA;AApCY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,mBAAU,GAAE;GACA,oBAAoB,CAoChC"}
@@ -0,0 +1,2 @@
1
+ export declare class PrismaModule {
2
+ }
@@ -0,0 +1,23 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.PrismaModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const prisma_service_1 = require("./prisma.service");
12
+ const prisma_factory_service_1 = require("./prisma-factory.service");
13
+ let PrismaModule = class PrismaModule {
14
+ };
15
+ exports.PrismaModule = PrismaModule;
16
+ exports.PrismaModule = PrismaModule = __decorate([
17
+ (0, common_1.Global)(),
18
+ (0, common_1.Module)({
19
+ providers: [prisma_service_1.PrismaService, prisma_factory_service_1.PrismaFactoryService],
20
+ exports: [prisma_service_1.PrismaService, prisma_factory_service_1.PrismaFactoryService],
21
+ })
22
+ ], PrismaModule);
23
+ //# sourceMappingURL=prisma.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma.module.js","sourceRoot":"","sources":["../src/prisma.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAgD;AAChD,qDAAiD;AACjD,qEAAgE;AAOzD,IAAM,YAAY,GAAlB,MAAM,YAAY;CAAG,CAAA;AAAf,oCAAY;uBAAZ,YAAY;IALxB,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACN,SAAS,EAAE,CAAC,8BAAa,EAAE,6CAAoB,CAAC;QAChD,OAAO,EAAE,CAAC,8BAAa,EAAE,6CAAoB,CAAC;KAC/C,CAAC;GACW,YAAY,CAAG"}
@@ -0,0 +1,6 @@
1
+ import { OnModuleInit, OnModuleDestroy } from '@nestjs/common';
2
+ export declare class PrismaService implements OnModuleInit, OnModuleDestroy {
3
+ onModuleInit(): Promise<void>;
4
+ onModuleDestroy(): Promise<void>;
5
+ get client(): import(".prisma/client").PrismaClient<import(".prisma/client").Prisma.PrismaClientOptions, never, import("@prisma/client/runtime/library").DefaultArgs>;
6
+ }
@@ -0,0 +1,27 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.PrismaService = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const index_1 = require("./index");
12
+ let PrismaService = class PrismaService {
13
+ async onModuleInit() {
14
+ await index_1.prisma.$connect();
15
+ }
16
+ async onModuleDestroy() {
17
+ await index_1.prisma.$disconnect();
18
+ }
19
+ get client() {
20
+ return index_1.prisma;
21
+ }
22
+ };
23
+ exports.PrismaService = PrismaService;
24
+ exports.PrismaService = PrismaService = __decorate([
25
+ (0, common_1.Injectable)()
26
+ ], PrismaService);
27
+ //# sourceMappingURL=prisma.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma.service.js","sourceRoot":"","sources":["../src/prisma.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA2E;AAC3E,mCAAiC;AAG1B,IAAM,aAAa,GAAnB,MAAM,aAAa;IACxB,KAAK,CAAC,YAAY;QAChB,MAAM,cAAM,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,MAAM,cAAM,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC;IAED,IAAI,MAAM;QACR,OAAO,cAAM,CAAC;IAChB,CAAC;CACF,CAAA;AAZY,sCAAa;wBAAb,aAAa;IADzB,IAAA,mBAAU,GAAE;GACA,aAAa,CAYzB"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const client_1 = require("@prisma/client");
4
+ const fs = require("fs");
5
+ const path = require("path");
6
+ const dotenv = require("dotenv");
7
+ dotenv.config();
8
+ async function createTenantSchemas() {
9
+ var _a;
10
+ const sourcePrisma = new client_1.PrismaClient({
11
+ datasources: {
12
+ db: {
13
+ url: process.env.SOURCE_DATABASE_URL,
14
+ },
15
+ },
16
+ });
17
+ const targetPrisma = new client_1.PrismaClient({
18
+ datasources: {
19
+ db: {
20
+ url: process.env.DATABASE_URL,
21
+ },
22
+ },
23
+ });
24
+ try {
25
+ console.log('Fetching API keys from source database to create tenant schemas...');
26
+ const apiKeys = await sourcePrisma.api_keys.findMany({
27
+ select: {
28
+ api_key: true,
29
+ providers: {
30
+ select: {
31
+ name: true,
32
+ },
33
+ },
34
+ },
35
+ });
36
+ console.log(`Found ${apiKeys.length} API keys to create schemas for.`);
37
+ const sqlCommands = [];
38
+ sqlCommands.push('CREATE SCHEMA IF NOT EXISTS public;');
39
+ for (const apiKey of apiKeys) {
40
+ const schemaName = apiKey.api_key;
41
+ const providerName = ((_a = apiKey.providers) === null || _a === void 0 ? void 0 : _a.name) || 'unknown';
42
+ console.log(`Creating schema for ${providerName} with key ${schemaName}`);
43
+ sqlCommands.push(`CREATE SCHEMA IF NOT EXISTS "${schemaName}";`);
44
+ try {
45
+ const existingApiKey = await targetPrisma.api_keys.findUnique({
46
+ where: { api_key: schemaName },
47
+ });
48
+ if (!existingApiKey) {
49
+ console.log(`Creating API key record in target database for ${schemaName}`);
50
+ const sourceApiKeyFull = await sourcePrisma.api_keys.findUnique({
51
+ where: { api_key: schemaName },
52
+ include: {
53
+ providers: true,
54
+ users: true,
55
+ },
56
+ });
57
+ if (sourceApiKeyFull) {
58
+ let providerId = null;
59
+ if (sourceApiKeyFull.provider_id) {
60
+ const existingProvider = await targetPrisma.providers.findUnique({
61
+ where: { provider_id: sourceApiKeyFull.provider_id },
62
+ });
63
+ if (!existingProvider && sourceApiKeyFull.providers) {
64
+ const newProvider = await targetPrisma.providers.create({
65
+ data: {
66
+ provider_id: sourceApiKeyFull.providers.provider_id,
67
+ name: sourceApiKeyFull.providers.name,
68
+ api_key: sourceApiKeyFull.providers.api_key,
69
+ country_id: sourceApiKeyFull.providers.country_id,
70
+ contact_email: sourceApiKeyFull.providers.contact_email,
71
+ is_active: sourceApiKeyFull.providers.is_active,
72
+ agreement: sourceApiKeyFull.providers.agreement,
73
+ image: sourceApiKeyFull.providers.image,
74
+ },
75
+ });
76
+ providerId = newProvider.provider_id;
77
+ }
78
+ else if (existingProvider) {
79
+ providerId = existingProvider.provider_id;
80
+ }
81
+ }
82
+ await targetPrisma.api_keys.create({
83
+ data: {
84
+ api_key: sourceApiKeyFull.api_key,
85
+ name: sourceApiKeyFull.name,
86
+ is_active: sourceApiKeyFull.is_active,
87
+ user_id: sourceApiKeyFull.user_id,
88
+ provider_id: providerId,
89
+ },
90
+ });
91
+ }
92
+ }
93
+ }
94
+ catch (error) {
95
+ console.error(`Error creating API key in target database for ${schemaName}:`, error);
96
+ }
97
+ }
98
+ const migrationsDir = path.join(__dirname, '../../../prisma/migrations');
99
+ if (!fs.existsSync(migrationsDir)) {
100
+ console.log(`Creating migrations directory: ${migrationsDir}`);
101
+ fs.mkdirSync(migrationsDir, { recursive: true });
102
+ }
103
+ const sqlFilePath = path.join(migrationsDir, 'tenant-schemas.sql');
104
+ fs.writeFileSync(sqlFilePath, sqlCommands.join('\n'));
105
+ console.log(`SQL commands written to ${path.resolve(sqlFilePath)}`);
106
+ console.log('Run this SQL file against your database to create the schemas.');
107
+ }
108
+ catch (error) {
109
+ console.error('Error creating tenant schemas:', error);
110
+ }
111
+ finally {
112
+ await sourcePrisma.$disconnect();
113
+ await targetPrisma.$disconnect();
114
+ }
115
+ }
116
+ createTenantSchemas().catch(console.error);
117
+ //# sourceMappingURL=create-tenant-schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-tenant-schemas.js","sourceRoot":"","sources":["../../src/scripts/create-tenant-schemas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { PrismaClient } from "@prisma/client";
2
+ import { EntityType, ColumnSchema } from "./types";
3
+ import { DataTransformer } from "./data-transformer";
4
+ import { SchemaUtils } from "./schema-utils";
5
+ import { DatabaseConnections } from "./types";
6
+ import { DependencyResolver } from "./dependency-resolver";
7
+ export declare class BatchMigrator {
8
+ private readonly dataTransformer;
9
+ private readonly schemaUtils;
10
+ private readonly connections;
11
+ private readonly dependencyResolver;
12
+ private readonly schemaCache;
13
+ private readonly targetSchemaCache;
14
+ 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;
25
+ }