@javalabs/prisma-client 1.0.18 → 1.0.20
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/.github/CODEOWNERS +1 -0
- package/README.md +269 -269
- package/dist/index.d.ts +1 -1
- package/dist/prisma.service.d.ts +1 -1
- package/dist/scripts/add-uuid-to-table.js +32 -32
- package/dist/scripts/data-migration/batch-migrator.js +12 -12
- package/dist/scripts/data-migration/data-transformer.js +14 -14
- package/dist/scripts/data-migration/dependency-resolver.js +23 -23
- package/dist/scripts/data-migration/entity-discovery.js +68 -68
- package/dist/scripts/data-migration/foreign-key-manager.js +23 -23
- package/dist/scripts/data-migration/migration-tool.js +5 -5
- package/dist/scripts/data-migration/schema-utils.js +74 -74
- package/dist/scripts/data-migration/typecast-manager.js +4 -4
- package/dist/scripts/database-initializer.js +5 -5
- package/dist/scripts/drop-database.js +5 -5
- package/dist/scripts/fix-data-types.js +53 -53
- package/dist/scripts/fix-enum-values.js +34 -34
- package/dist/scripts/fix-schema-discrepancies.js +40 -40
- package/dist/scripts/fix-table-indexes.js +81 -81
- package/dist/scripts/migrate-schema-structure.js +4 -4
- package/dist/scripts/migrate-uuid.js +19 -19
- package/dist/scripts/post-migration-validator.js +49 -49
- package/dist/scripts/pre-migration-validator.js +107 -107
- package/dist/scripts/reset-database.js +21 -21
- package/dist/scripts/retry-failed-migrations.js +28 -28
- package/dist/scripts/run-migration.js +5 -5
- package/dist/scripts/schema-sync.js +18 -18
- package/dist/scripts/sequence-sync-cli.js +55 -55
- package/dist/scripts/sequence-synchronizer.js +20 -20
- package/dist/scripts/sync-enum-types.js +30 -30
- package/dist/scripts/sync-enum-values.js +52 -52
- package/dist/scripts/truncate-database.js +10 -10
- package/dist/scripts/verify-migration-setup.js +10 -10
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/migration-config.json +63 -63
- package/migration-config.json.bk +95 -95
- package/migrations/add_reserved_amount.sql +8 -0
- package/package.json +44 -44
- package/prisma/migrations/add_uuid_to_transactions.sql +13 -13
- package/prisma/schema.prisma +601 -554
- package/src/index.ts +23 -23
- package/src/prisma-factory.service.ts +40 -40
- package/src/prisma.module.ts +9 -9
- package/src/prisma.service.ts +16 -16
- package/src/scripts/add-uuid-to-table.ts +138 -138
- package/src/scripts/create-tenant-schemas.ts +145 -145
- package/src/scripts/data-migration/batch-migrator.ts +248 -248
- package/src/scripts/data-migration/data-transformer.ts +426 -426
- package/src/scripts/data-migration/db-connector.ts +120 -120
- package/src/scripts/data-migration/dependency-resolver.ts +174 -174
- package/src/scripts/data-migration/entity-discovery.ts +196 -196
- package/src/scripts/data-migration/foreign-key-manager.ts +277 -277
- package/src/scripts/data-migration/migration-config.json +63 -63
- package/src/scripts/data-migration/migration-tool.ts +509 -509
- package/src/scripts/data-migration/schema-utils.ts +248 -248
- package/src/scripts/data-migration/tenant-migrator.ts +201 -201
- package/src/scripts/data-migration/typecast-manager.ts +193 -193
- package/src/scripts/data-migration/types.ts +113 -113
- package/src/scripts/database-initializer.ts +49 -49
- package/src/scripts/drop-database.ts +104 -104
- package/src/scripts/dump-source-db.sh +61 -61
- package/src/scripts/encrypt-user-passwords.ts +36 -36
- package/src/scripts/error-handler.ts +117 -117
- package/src/scripts/fix-data-types.ts +241 -241
- package/src/scripts/fix-enum-values.ts +357 -357
- package/src/scripts/fix-schema-discrepancies.ts +317 -317
- package/src/scripts/fix-table-indexes.ts +601 -601
- package/src/scripts/migrate-schema-structure.ts +90 -90
- package/src/scripts/migrate-uuid.ts +76 -76
- package/src/scripts/post-migration-validator.ts +526 -526
- package/src/scripts/pre-migration-validator.ts +610 -610
- package/src/scripts/reset-database.ts +263 -263
- package/src/scripts/retry-failed-migrations.ts +416 -416
- package/src/scripts/run-migration.ts +707 -707
- package/src/scripts/schema-sync.ts +128 -128
- package/src/scripts/sequence-sync-cli.ts +416 -416
- package/src/scripts/sequence-synchronizer.ts +127 -127
- package/src/scripts/sync-enum-types.ts +170 -170
- package/src/scripts/sync-enum-values.ts +563 -563
- package/src/scripts/truncate-database.ts +123 -123
- package/src/scripts/verify-migration-setup.ts +135 -135
- package/tsconfig.json +17 -17
- package/dist/scripts/data-migration/dependency-manager.d.ts +0 -9
- package/dist/scripts/data-migration/dependency-manager.js +0 -86
- package/dist/scripts/data-migration/dependency-manager.js.map +0 -1
- package/dist/scripts/data-migration/migration-config.json +0 -63
- package/dist/scripts/data-migration/migration-phases.d.ts +0 -5
- package/dist/scripts/data-migration/migration-phases.js +0 -55
- package/dist/scripts/data-migration/migration-phases.js.map +0 -1
- package/dist/scripts/data-migration/multi-source-migrator.d.ts +0 -17
- package/dist/scripts/data-migration/multi-source-migrator.js +0 -130
- package/dist/scripts/data-migration/multi-source-migrator.js.map +0 -1
- package/dist/scripts/data-migration/phase-generator.d.ts +0 -15
- package/dist/scripts/data-migration/phase-generator.js +0 -187
- package/dist/scripts/data-migration/phase-generator.js.map +0 -1
- package/dist/scripts/data-migration.d.ts +0 -22
- package/dist/scripts/data-migration.js +0 -593
- package/dist/scripts/data-migration.js.map +0 -1
- package/dist/scripts/multi-db-migration.d.ts +0 -1
- package/dist/scripts/multi-db-migration.js +0 -55
- package/dist/scripts/multi-db-migration.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
* @Tupay-project/Security
|
package/README.md
CHANGED
|
@@ -1,269 +1,269 @@
|
|
|
1
|
-
# @javalabs/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 (usando esquemas de base de datos separados por tenant) y utilidades de migración y gestión de base de datos.
|
|
4
|
-
|
|
5
|
-
## Instalación
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
npm i @javalabs/prisma-client
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
## Características
|
|
12
|
-
|
|
13
|
-
- **Cliente Prisma Singleton**: Implementación eficiente del cliente Prisma (<mcsymbol name="PrismaService" filename="prisma.service.ts" path="/Users/alejandroperez/tupay/packages/prisma-client/src/prisma.service.ts" startline="5" type="class">) para el esquema `public`.
|
|
14
|
-
- **Soporte Multi-tenant**: Conexión a diferentes esquemas de base de datos para diferentes inquilinos a través de <mcsymbol name="PrismaFactoryService" filename="prisma-factory.service.ts" path="/Users/alejandroperez/tupay/packages/prisma-client/src/prisma-factory.service.ts" startline="10" type="class">. Los tenants suelen identificarse por su API Key, que se usa como nombre del esquema.
|
|
15
|
-
- **Integración con NestJS**: Módulo global (<mcsymbol name="PrismaModule" filename="prisma.module.ts" path="/Users/alejandroperez/tupay/packages/prisma-client/src/prisma.module.ts" startline="6" type="class">) para facilitar la inyección en aplicaciones NestJS.
|
|
16
|
-
- **Utilidades de Migración**: Scripts para migración de esquemas y datos entre entornos.
|
|
17
|
-
- **Herramientas de Gestión de BD**: Scripts para crear esquemas de tenants, sincronizar estructuras, resetear bases de datos y corregir tipos de datos.
|
|
18
|
-
|
|
19
|
-
## Diagramas
|
|
20
|
-
|
|
21
|
-
### Arquitectura Multi-tenant
|
|
22
|
-
|
|
23
|
-
```mermaid
|
|
24
|
-
graph TD
|
|
25
|
-
A[Aplicación] --> B(PrismaFactoryService);
|
|
26
|
-
B -- Obtener cliente para Tenant X --> C{Cliente Prisma - Tenant X};
|
|
27
|
-
B -- Obtener cliente para Tenant Y --> D{Cliente Prisma - Tenant Y};
|
|
28
|
-
C --> E[(Base de Datos - Schema Tenant X)];
|
|
29
|
-
D --> F[(Base de Datos - Schema Tenant Y)];
|
|
30
|
-
A --> G(PrismaService);
|
|
31
|
-
G -- Cliente por defecto --> H{Cliente Prisma - Public};
|
|
32
|
-
H --> I[(Base de Datos - Schema Public)];
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
### Flujo de Migración de Datos
|
|
36
|
-
|
|
37
|
-
```mermaid
|
|
38
|
-
sequenceDiagram
|
|
39
|
-
participant S as Base de Datos Origen (SOURCE_DATABASE_URL)
|
|
40
|
-
participant M as Script de Migración (`migrate:data`)
|
|
41
|
-
participant T as Base de Datos Destino (DATABASE_URL - Tenants)
|
|
42
|
-
|
|
43
|
-
M->>S: Consulta datos de origen
|
|
44
|
-
S-->>M: Retorna datos
|
|
45
|
-
M->>M: Procesa y transforma datos (considerando dependencias)
|
|
46
|
-
M->>T: Migra datos a esquemas de tenants en destino
|
|
47
|
-
T-->>M: Confirma migración
|
|
48
|
-
|
|
49
|
-
Note over M: Ordenamiento por dependencias (ForeignKeyManager)
|
|
50
|
-
Note over M: Manejo de tipos de datos
|
|
51
|
-
Note over M: Migración por fases (si aplica)
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
### Estructura del Proyecto
|
|
55
|
-
|
|
56
|
-
```mermaid
|
|
57
|
-
graph LR
|
|
58
|
-
A[@javalabs/prisma-client] --> B[src];
|
|
59
|
-
A --> C[prisma];
|
|
60
|
-
B --> D[scripts];
|
|
61
|
-
B --> E[index.ts];
|
|
62
|
-
B --> F[prisma.module.ts];
|
|
63
|
-
B --> G[prisma.service.ts];
|
|
64
|
-
B --> H[prisma-factory.service.ts];
|
|
65
|
-
D --> I[data-migration];
|
|
66
|
-
D --> J[reset-database.ts];
|
|
67
|
-
D --> K[schema-sync.ts];
|
|
68
|
-
D --> L[create-tenant-schemas.ts];
|
|
69
|
-
D --> M[migrate-schema-structure.ts];
|
|
70
|
-
D --> N[fix-data-types.ts];
|
|
71
|
-
I --> O[dependency-manager.ts];
|
|
72
|
-
I --> P[schema-utils.ts];
|
|
73
|
-
I --> Q[migration-phases.ts];
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
## Uso Básico
|
|
77
|
-
|
|
78
|
-
### En aplicaciones NestJS
|
|
79
|
-
|
|
80
|
-
Importa el `PrismaModule` en tu módulo principal:
|
|
81
|
-
|
|
82
|
-
```typescript:/Users/alejandroperez/tupay/packages/prisma-client/README.md
|
|
83
|
-
import { Module } from "@nestjs/common";
|
|
84
|
-
import { PrismaModule } from "@javalabs/prisma-client"; // <--- Updated import path
|
|
85
|
-
|
|
86
|
-
@Module({
|
|
87
|
-
imports: [PrismaModule],
|
|
88
|
-
})
|
|
89
|
-
export class AppModule {}
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
Luego, inyecta los servicios donde los necesites:
|
|
93
|
-
|
|
94
|
-
```typescript:/Users/alejandroperez/tupay/packages/prisma-client/README.md
|
|
95
|
-
import { Injectable } from "@nestjs/common";
|
|
96
|
-
import { PrismaService, PrismaFactoryService } from "@javalabs/prisma-client"; // <--- Updated import path
|
|
97
|
-
|
|
98
|
-
@Injectable()
|
|
99
|
-
export class MyService {
|
|
100
|
-
constructor(
|
|
101
|
-
private prismaService: PrismaService, // Cliente para el schema 'public'
|
|
102
|
-
private prismaFactoryService: PrismaFactoryService // Fábrica para clientes de tenants
|
|
103
|
-
) {}
|
|
104
|
-
|
|
105
|
-
// Usar el cliente principal (schema public)
|
|
106
|
-
async findAllPublicData() {
|
|
107
|
-
// Asume que tienes un modelo 'PublicData' en tu schema.prisma
|
|
108
|
-
// return this.prismaService.client.publicData.findMany();
|
|
109
|
-
return "Ejemplo: Accediendo a datos públicos";
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
// Usar un cliente específico para un tenant
|
|
113
|
-
async findTenantUsers(tenantId: string) {
|
|
114
|
-
// tenantId suele ser la API Key que identifica al schema
|
|
115
|
-
const tenantClient = this.prismaFactoryService.getClient(tenantId);
|
|
116
|
-
// Asume que tienes un modelo 'users' en tu schema.prisma
|
|
117
|
-
return tenantClient.users.findMany();
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
### En aplicaciones no-NestJS (o scripts)
|
|
123
|
-
|
|
124
|
-
Puedes importar directamente la instancia `prisma` (cliente para el schema `public`). Para acceder a tenants, necesitarías instanciar `PrismaFactoryService` manualmente o usar los scripts proporcionados.
|
|
125
|
-
|
|
126
|
-
```typescript:/Users/alejandroperez/tupay/packages/prisma-client/README.md
|
|
127
|
-
import { prisma } from "@javalabs/prisma-client"; // <--- Updated import path
|
|
128
|
-
|
|
129
|
-
async function main() {
|
|
130
|
-
// Ejemplo: Acceder a datos del schema 'public'
|
|
131
|
-
// const publicData = await prisma.publicData.findMany();
|
|
132
|
-
// console.log(publicData);
|
|
133
|
-
console.log("Ejemplo: Accediendo a datos públicos desde script");
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
main()
|
|
137
|
-
.catch(console.error)
|
|
138
|
-
.finally(async () => {
|
|
139
|
-
await prisma.$disconnect();
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
## Scripts de Utilidad
|
|
145
|
-
|
|
146
|
-
Estos scripts se ejecutan generalmente con `npm run <script_name>` o `node dist/scripts/<script_file>.js` después de compilar (`npm run build`).
|
|
147
|
-
|
|
148
|
-
### Migración de Datos
|
|
149
|
-
|
|
150
|
-
Migra datos desde `SOURCE_DATABASE_URL` a los esquemas de tenants en `DATABASE_URL`.
|
|
151
|
-
|
|
152
|
-
```bash
|
|
153
|
-
# Migrar datos (requiere confirmación)
|
|
154
|
-
npm run migrate:data
|
|
155
|
-
|
|
156
|
-
# Migrar datos forzando la operación (sin confirmación)
|
|
157
|
-
npm run migrate:data:force
|
|
158
|
-
|
|
159
|
-
# Migrar datos con confirmación automática 'yes'
|
|
160
|
-
npm run migrate:data:yes
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
### Gestión de Esquemas (Prisma Migrate)
|
|
164
|
-
|
|
165
|
-
Gestiona la evolución del esquema de la base de datos usando Prisma Migrate. Estos comandos aplican los cambios definidos en `prisma/migrations` al schema `public`. Para aplicar a tenants, ver "Scripts Avanzados".
|
|
166
|
-
|
|
167
|
-
```bash
|
|
168
|
-
# Generar cliente Prisma basado en schema.prisma
|
|
169
|
-
npm run generate
|
|
170
|
-
|
|
171
|
-
# Crear una nueva migración SQL basada en cambios al schema.prisma (desarrollo)
|
|
172
|
-
npm run migrate:dev
|
|
173
|
-
|
|
174
|
-
# Aplicar migraciones pendientes a la base de datos (producción/despliegue)
|
|
175
|
-
npm run migrate:deploy
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
## Scripts Avanzados
|
|
179
|
-
|
|
180
|
-
Scripts para tareas más complejas de administración multi-tenant. Ejecutar con `node dist/scripts/<script_file>.js` después de `npm run build`.
|
|
181
|
-
|
|
182
|
-
### Creación de Esquemas para Tenants
|
|
183
|
-
|
|
184
|
-
Crea los esquemas de base de datos para cada tenant (basado en API Keys encontradas en `SOURCE_DATABASE_URL`).
|
|
185
|
-
|
|
186
|
-
```bash
|
|
187
|
-
# Compilar el proyecto si no está compilado
|
|
188
|
-
npm run build
|
|
189
|
-
|
|
190
|
-
# Ejecutar el script para crear esquemas de tenant
|
|
191
|
-
node dist/scripts/create-tenant-schemas.js
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
### Migración de Estructura de Esquemas (Tenants)
|
|
195
|
-
|
|
196
|
-
Aplica la estructura definida en `prisma/schema.prisma` a todos los esquemas de tenants existentes en `DATABASE_URL` usando `prisma db push`. Útil para asegurar que todos los tenants tengan la misma estructura base.
|
|
197
|
-
|
|
198
|
-
```bash
|
|
199
|
-
# Compilar el proyecto si no está compilado
|
|
200
|
-
npm run build
|
|
201
|
-
|
|
202
|
-
# Ejecutar el script para aplicar la estructura a los schemas de tenants
|
|
203
|
-
node dist/scripts/migrate-schema-structure.js
|
|
204
|
-
```
|
|
205
|
-
|
|
206
|
-
### Sincronización de Esquemas
|
|
207
|
-
|
|
208
|
-
Genera un script SQL para sincronizar esquemas (potencialmente entre `public` y tenants, o entre tenants). Revisa el script antes de aplicarlo.
|
|
209
|
-
|
|
210
|
-
```bash
|
|
211
|
-
# Compilar el proyecto si no está compilado
|
|
212
|
-
npm run build
|
|
213
|
-
|
|
214
|
-
# Generar el script SQL de sincronización
|
|
215
|
-
node dist/scripts/schema-sync.js
|
|
216
|
-
```
|
|
217
|
-
|
|
218
|
-
### Reseteo de Base de Datos
|
|
219
|
-
|
|
220
|
-
Resetea la base de datos (¡CUIDADO: Borra datos!).
|
|
221
|
-
|
|
222
|
-
```bash
|
|
223
|
-
# Compilar el proyecto si no está compilado
|
|
224
|
-
npm run build
|
|
225
|
-
|
|
226
|
-
# Resetear la base de datos (schema public y potencialmente tenants, revisar script)
|
|
227
|
-
node dist/scripts/reset-database.js
|
|
228
|
-
|
|
229
|
-
# Resetear y recrear la base de datos
|
|
230
|
-
node dist/scripts/reset-database.js --recreate
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
### Corrección de Tipos de Datos
|
|
234
|
-
|
|
235
|
-
Intenta corregir inconsistencias en tipos de datos (ej. numéricos almacenados como texto, valores de enums inválidos) en los esquemas de los tenants.
|
|
236
|
-
|
|
237
|
-
```bash
|
|
238
|
-
# Compilar el proyecto si no está compilado
|
|
239
|
-
npm run build
|
|
240
|
-
|
|
241
|
-
# Ejecutar el script para corregir tipos de datos
|
|
242
|
-
node dist/scripts/fix-data-types.js
|
|
243
|
-
```
|
|
244
|
-
|
|
245
|
-
## Variables de Entorno
|
|
246
|
-
|
|
247
|
-
El paquete y sus scripts dependen de las siguientes variables de entorno (generalmente definidas en un archivo `.env`):
|
|
248
|
-
|
|
249
|
-
- `DATABASE_URL`: URL de conexión a la base de datos principal (PostgreSQL) donde residen los esquemas `public` y de los tenants.
|
|
250
|
-
- Ejemplo: `postgresql://user:password@host:port/database`
|
|
251
|
-
- `SOURCE_DATABASE_URL`: URL de conexión a la base de datos de origen, utilizada principalmente por los scripts de migración de datos y creación de esquemas.
|
|
252
|
-
- Ejemplo: `postgresql://user:password@source_host:port/source_database`
|
|
253
|
-
|
|
254
|
-
## Desarrollo
|
|
255
|
-
|
|
256
|
-
```bash
|
|
257
|
-
# Instalar dependencias
|
|
258
|
-
npm install
|
|
259
|
-
|
|
260
|
-
# Compilar el proyecto (genera archivos en dist/)
|
|
261
|
-
npm run build
|
|
262
|
-
|
|
263
|
-
# Generar cliente Prisma (después de cambios en schema.prisma)
|
|
264
|
-
npm run generate
|
|
265
|
-
```
|
|
266
|
-
|
|
267
|
-
## Licencia
|
|
268
|
-
|
|
269
|
-
ISC
|
|
1
|
+
# @javalabs/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 (usando esquemas de base de datos separados por tenant) y utilidades de migración y gestión de base de datos.
|
|
4
|
+
|
|
5
|
+
## Instalación
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm i @javalabs/prisma-client
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Características
|
|
12
|
+
|
|
13
|
+
- **Cliente Prisma Singleton**: Implementación eficiente del cliente Prisma (<mcsymbol name="PrismaService" filename="prisma.service.ts" path="/Users/alejandroperez/tupay/packages/prisma-client/src/prisma.service.ts" startline="5" type="class">) para el esquema `public`.
|
|
14
|
+
- **Soporte Multi-tenant**: Conexión a diferentes esquemas de base de datos para diferentes inquilinos a través de <mcsymbol name="PrismaFactoryService" filename="prisma-factory.service.ts" path="/Users/alejandroperez/tupay/packages/prisma-client/src/prisma-factory.service.ts" startline="10" type="class">. Los tenants suelen identificarse por su API Key, que se usa como nombre del esquema.
|
|
15
|
+
- **Integración con NestJS**: Módulo global (<mcsymbol name="PrismaModule" filename="prisma.module.ts" path="/Users/alejandroperez/tupay/packages/prisma-client/src/prisma.module.ts" startline="6" type="class">) para facilitar la inyección en aplicaciones NestJS.
|
|
16
|
+
- **Utilidades de Migración**: Scripts para migración de esquemas y datos entre entornos.
|
|
17
|
+
- **Herramientas de Gestión de BD**: Scripts para crear esquemas de tenants, sincronizar estructuras, resetear bases de datos y corregir tipos de datos.
|
|
18
|
+
|
|
19
|
+
## Diagramas
|
|
20
|
+
|
|
21
|
+
### Arquitectura Multi-tenant
|
|
22
|
+
|
|
23
|
+
```mermaid
|
|
24
|
+
graph TD
|
|
25
|
+
A[Aplicación] --> B(PrismaFactoryService);
|
|
26
|
+
B -- Obtener cliente para Tenant X --> C{Cliente Prisma - Tenant X};
|
|
27
|
+
B -- Obtener cliente para Tenant Y --> D{Cliente Prisma - Tenant Y};
|
|
28
|
+
C --> E[(Base de Datos - Schema Tenant X)];
|
|
29
|
+
D --> F[(Base de Datos - Schema Tenant Y)];
|
|
30
|
+
A --> G(PrismaService);
|
|
31
|
+
G -- Cliente por defecto --> H{Cliente Prisma - Public};
|
|
32
|
+
H --> I[(Base de Datos - Schema Public)];
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Flujo de Migración de Datos
|
|
36
|
+
|
|
37
|
+
```mermaid
|
|
38
|
+
sequenceDiagram
|
|
39
|
+
participant S as Base de Datos Origen (SOURCE_DATABASE_URL)
|
|
40
|
+
participant M as Script de Migración (`migrate:data`)
|
|
41
|
+
participant T as Base de Datos Destino (DATABASE_URL - Tenants)
|
|
42
|
+
|
|
43
|
+
M->>S: Consulta datos de origen
|
|
44
|
+
S-->>M: Retorna datos
|
|
45
|
+
M->>M: Procesa y transforma datos (considerando dependencias)
|
|
46
|
+
M->>T: Migra datos a esquemas de tenants en destino
|
|
47
|
+
T-->>M: Confirma migración
|
|
48
|
+
|
|
49
|
+
Note over M: Ordenamiento por dependencias (ForeignKeyManager)
|
|
50
|
+
Note over M: Manejo de tipos de datos
|
|
51
|
+
Note over M: Migración por fases (si aplica)
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Estructura del Proyecto
|
|
55
|
+
|
|
56
|
+
```mermaid
|
|
57
|
+
graph LR
|
|
58
|
+
A[@javalabs/prisma-client] --> B[src];
|
|
59
|
+
A --> C[prisma];
|
|
60
|
+
B --> D[scripts];
|
|
61
|
+
B --> E[index.ts];
|
|
62
|
+
B --> F[prisma.module.ts];
|
|
63
|
+
B --> G[prisma.service.ts];
|
|
64
|
+
B --> H[prisma-factory.service.ts];
|
|
65
|
+
D --> I[data-migration];
|
|
66
|
+
D --> J[reset-database.ts];
|
|
67
|
+
D --> K[schema-sync.ts];
|
|
68
|
+
D --> L[create-tenant-schemas.ts];
|
|
69
|
+
D --> M[migrate-schema-structure.ts];
|
|
70
|
+
D --> N[fix-data-types.ts];
|
|
71
|
+
I --> O[dependency-manager.ts];
|
|
72
|
+
I --> P[schema-utils.ts];
|
|
73
|
+
I --> Q[migration-phases.ts];
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Uso Básico
|
|
77
|
+
|
|
78
|
+
### En aplicaciones NestJS
|
|
79
|
+
|
|
80
|
+
Importa el `PrismaModule` en tu módulo principal:
|
|
81
|
+
|
|
82
|
+
```typescript:/Users/alejandroperez/tupay/packages/prisma-client/README.md
|
|
83
|
+
import { Module } from "@nestjs/common";
|
|
84
|
+
import { PrismaModule } from "@javalabs/prisma-client"; // <--- Updated import path
|
|
85
|
+
|
|
86
|
+
@Module({
|
|
87
|
+
imports: [PrismaModule],
|
|
88
|
+
})
|
|
89
|
+
export class AppModule {}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Luego, inyecta los servicios donde los necesites:
|
|
93
|
+
|
|
94
|
+
```typescript:/Users/alejandroperez/tupay/packages/prisma-client/README.md
|
|
95
|
+
import { Injectable } from "@nestjs/common";
|
|
96
|
+
import { PrismaService, PrismaFactoryService } from "@javalabs/prisma-client"; // <--- Updated import path
|
|
97
|
+
|
|
98
|
+
@Injectable()
|
|
99
|
+
export class MyService {
|
|
100
|
+
constructor(
|
|
101
|
+
private prismaService: PrismaService, // Cliente para el schema 'public'
|
|
102
|
+
private prismaFactoryService: PrismaFactoryService // Fábrica para clientes de tenants
|
|
103
|
+
) {}
|
|
104
|
+
|
|
105
|
+
// Usar el cliente principal (schema public)
|
|
106
|
+
async findAllPublicData() {
|
|
107
|
+
// Asume que tienes un modelo 'PublicData' en tu schema.prisma
|
|
108
|
+
// return this.prismaService.client.publicData.findMany();
|
|
109
|
+
return "Ejemplo: Accediendo a datos públicos";
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Usar un cliente específico para un tenant
|
|
113
|
+
async findTenantUsers(tenantId: string) {
|
|
114
|
+
// tenantId suele ser la API Key que identifica al schema
|
|
115
|
+
const tenantClient = this.prismaFactoryService.getClient(tenantId);
|
|
116
|
+
// Asume que tienes un modelo 'users' en tu schema.prisma
|
|
117
|
+
return tenantClient.users.findMany();
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### En aplicaciones no-NestJS (o scripts)
|
|
123
|
+
|
|
124
|
+
Puedes importar directamente la instancia `prisma` (cliente para el schema `public`). Para acceder a tenants, necesitarías instanciar `PrismaFactoryService` manualmente o usar los scripts proporcionados.
|
|
125
|
+
|
|
126
|
+
```typescript:/Users/alejandroperez/tupay/packages/prisma-client/README.md
|
|
127
|
+
import { prisma } from "@javalabs/prisma-client"; // <--- Updated import path
|
|
128
|
+
|
|
129
|
+
async function main() {
|
|
130
|
+
// Ejemplo: Acceder a datos del schema 'public'
|
|
131
|
+
// const publicData = await prisma.publicData.findMany();
|
|
132
|
+
// console.log(publicData);
|
|
133
|
+
console.log("Ejemplo: Accediendo a datos públicos desde script");
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
main()
|
|
137
|
+
.catch(console.error)
|
|
138
|
+
.finally(async () => {
|
|
139
|
+
await prisma.$disconnect();
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## Scripts de Utilidad
|
|
145
|
+
|
|
146
|
+
Estos scripts se ejecutan generalmente con `npm run <script_name>` o `node dist/scripts/<script_file>.js` después de compilar (`npm run build`).
|
|
147
|
+
|
|
148
|
+
### Migración de Datos
|
|
149
|
+
|
|
150
|
+
Migra datos desde `SOURCE_DATABASE_URL` a los esquemas de tenants en `DATABASE_URL`.
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
# Migrar datos (requiere confirmación)
|
|
154
|
+
npm run migrate:data
|
|
155
|
+
|
|
156
|
+
# Migrar datos forzando la operación (sin confirmación)
|
|
157
|
+
npm run migrate:data:force
|
|
158
|
+
|
|
159
|
+
# Migrar datos con confirmación automática 'yes'
|
|
160
|
+
npm run migrate:data:yes
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Gestión de Esquemas (Prisma Migrate)
|
|
164
|
+
|
|
165
|
+
Gestiona la evolución del esquema de la base de datos usando Prisma Migrate. Estos comandos aplican los cambios definidos en `prisma/migrations` al schema `public`. Para aplicar a tenants, ver "Scripts Avanzados".
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
# Generar cliente Prisma basado en schema.prisma
|
|
169
|
+
npm run generate
|
|
170
|
+
|
|
171
|
+
# Crear una nueva migración SQL basada en cambios al schema.prisma (desarrollo)
|
|
172
|
+
npm run migrate:dev
|
|
173
|
+
|
|
174
|
+
# Aplicar migraciones pendientes a la base de datos (producción/despliegue)
|
|
175
|
+
npm run migrate:deploy
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## Scripts Avanzados
|
|
179
|
+
|
|
180
|
+
Scripts para tareas más complejas de administración multi-tenant. Ejecutar con `node dist/scripts/<script_file>.js` después de `npm run build`.
|
|
181
|
+
|
|
182
|
+
### Creación de Esquemas para Tenants
|
|
183
|
+
|
|
184
|
+
Crea los esquemas de base de datos para cada tenant (basado en API Keys encontradas en `SOURCE_DATABASE_URL`).
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
# Compilar el proyecto si no está compilado
|
|
188
|
+
npm run build
|
|
189
|
+
|
|
190
|
+
# Ejecutar el script para crear esquemas de tenant
|
|
191
|
+
node dist/scripts/create-tenant-schemas.js
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### Migración de Estructura de Esquemas (Tenants)
|
|
195
|
+
|
|
196
|
+
Aplica la estructura definida en `prisma/schema.prisma` a todos los esquemas de tenants existentes en `DATABASE_URL` usando `prisma db push`. Útil para asegurar que todos los tenants tengan la misma estructura base.
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
# Compilar el proyecto si no está compilado
|
|
200
|
+
npm run build
|
|
201
|
+
|
|
202
|
+
# Ejecutar el script para aplicar la estructura a los schemas de tenants
|
|
203
|
+
node dist/scripts/migrate-schema-structure.js
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### Sincronización de Esquemas
|
|
207
|
+
|
|
208
|
+
Genera un script SQL para sincronizar esquemas (potencialmente entre `public` y tenants, o entre tenants). Revisa el script antes de aplicarlo.
|
|
209
|
+
|
|
210
|
+
```bash
|
|
211
|
+
# Compilar el proyecto si no está compilado
|
|
212
|
+
npm run build
|
|
213
|
+
|
|
214
|
+
# Generar el script SQL de sincronización
|
|
215
|
+
node dist/scripts/schema-sync.js
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### Reseteo de Base de Datos
|
|
219
|
+
|
|
220
|
+
Resetea la base de datos (¡CUIDADO: Borra datos!).
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
# Compilar el proyecto si no está compilado
|
|
224
|
+
npm run build
|
|
225
|
+
|
|
226
|
+
# Resetear la base de datos (schema public y potencialmente tenants, revisar script)
|
|
227
|
+
node dist/scripts/reset-database.js
|
|
228
|
+
|
|
229
|
+
# Resetear y recrear la base de datos
|
|
230
|
+
node dist/scripts/reset-database.js --recreate
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### Corrección de Tipos de Datos
|
|
234
|
+
|
|
235
|
+
Intenta corregir inconsistencias en tipos de datos (ej. numéricos almacenados como texto, valores de enums inválidos) en los esquemas de los tenants.
|
|
236
|
+
|
|
237
|
+
```bash
|
|
238
|
+
# Compilar el proyecto si no está compilado
|
|
239
|
+
npm run build
|
|
240
|
+
|
|
241
|
+
# Ejecutar el script para corregir tipos de datos
|
|
242
|
+
node dist/scripts/fix-data-types.js
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
## Variables de Entorno
|
|
246
|
+
|
|
247
|
+
El paquete y sus scripts dependen de las siguientes variables de entorno (generalmente definidas en un archivo `.env`):
|
|
248
|
+
|
|
249
|
+
- `DATABASE_URL`: URL de conexión a la base de datos principal (PostgreSQL) donde residen los esquemas `public` y de los tenants.
|
|
250
|
+
- Ejemplo: `postgresql://user:password@host:port/database`
|
|
251
|
+
- `SOURCE_DATABASE_URL`: URL de conexión a la base de datos de origen, utilizada principalmente por los scripts de migración de datos y creación de esquemas.
|
|
252
|
+
- Ejemplo: `postgresql://user:password@source_host:port/source_database`
|
|
253
|
+
|
|
254
|
+
## Desarrollo
|
|
255
|
+
|
|
256
|
+
```bash
|
|
257
|
+
# Instalar dependencias
|
|
258
|
+
npm install
|
|
259
|
+
|
|
260
|
+
# Compilar el proyecto (genera archivos en dist/)
|
|
261
|
+
npm run build
|
|
262
|
+
|
|
263
|
+
# Generar cliente Prisma (después de cambios en schema.prisma)
|
|
264
|
+
npm run generate
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
## Licencia
|
|
268
|
+
|
|
269
|
+
ISC
|
package/dist/index.d.ts
CHANGED
|
@@ -2,6 +2,6 @@ import { PrismaClient } from "@prisma/client";
|
|
|
2
2
|
import { PrismaModule } from "./prisma.module";
|
|
3
3
|
import { PrismaService } from "./prisma.service";
|
|
4
4
|
import { PrismaFactoryService } from "./prisma-factory.service";
|
|
5
|
-
export declare const prisma: PrismaClient<import(".prisma/client").Prisma.PrismaClientOptions,
|
|
5
|
+
export declare const prisma: PrismaClient<import(".prisma/client").Prisma.PrismaClientOptions, import(".prisma/client").Prisma.LogLevel, import("@prisma/client/runtime/library").DefaultArgs>;
|
|
6
6
|
export { PrismaModule, PrismaService, PrismaFactoryService };
|
|
7
7
|
export * from "@prisma/client";
|
package/dist/prisma.service.d.ts
CHANGED
|
@@ -2,5 +2,5 @@ import { OnModuleInit, OnModuleDestroy } from '@nestjs/common';
|
|
|
2
2
|
export declare class PrismaService implements OnModuleInit, OnModuleDestroy {
|
|
3
3
|
onModuleInit(): Promise<void>;
|
|
4
4
|
onModuleDestroy(): Promise<void>;
|
|
5
|
-
get client(): import(".prisma/client").PrismaClient<import(".prisma/client").Prisma.PrismaClientOptions,
|
|
5
|
+
get client(): import(".prisma/client").PrismaClient<import(".prisma/client").Prisma.PrismaClientOptions, import(".prisma/client").Prisma.LogLevel, import("@prisma/client/runtime/library").DefaultArgs>;
|
|
6
6
|
}
|
|
@@ -9,21 +9,21 @@ const prisma = new client_1.PrismaClient();
|
|
|
9
9
|
async function addUuidToTable({ tableName, columnName = "uuid", makeRequired = false, addDefault = false, }) {
|
|
10
10
|
try {
|
|
11
11
|
console.log(`🚀 Iniciando proceso de añadir UUID a la tabla ${tableName}...`);
|
|
12
|
-
const tableExists = await prisma.$queryRaw `
|
|
13
|
-
SELECT EXISTS (
|
|
14
|
-
SELECT FROM information_schema.tables
|
|
15
|
-
WHERE table_name = ${tableName}
|
|
16
|
-
);
|
|
12
|
+
const tableExists = await prisma.$queryRaw `
|
|
13
|
+
SELECT EXISTS (
|
|
14
|
+
SELECT FROM information_schema.tables
|
|
15
|
+
WHERE table_name = ${tableName}
|
|
16
|
+
);
|
|
17
17
|
`;
|
|
18
18
|
if (!tableExists[0].exists) {
|
|
19
19
|
throw new Error(`La tabla ${tableName} no existe`);
|
|
20
20
|
}
|
|
21
|
-
const columnExists = await prisma.$queryRaw `
|
|
22
|
-
SELECT EXISTS (
|
|
23
|
-
SELECT FROM information_schema.columns
|
|
24
|
-
WHERE table_name = ${tableName}
|
|
25
|
-
AND column_name = ${columnName}
|
|
26
|
-
);
|
|
21
|
+
const columnExists = await prisma.$queryRaw `
|
|
22
|
+
SELECT EXISTS (
|
|
23
|
+
SELECT FROM information_schema.columns
|
|
24
|
+
WHERE table_name = ${tableName}
|
|
25
|
+
AND column_name = ${columnName}
|
|
26
|
+
);
|
|
27
27
|
`;
|
|
28
28
|
if (columnExists[0].exists) {
|
|
29
29
|
console.log(`⚠️ La columna ${columnName} ya existe en la tabla ${tableName}`);
|
|
@@ -32,40 +32,40 @@ async function addUuidToTable({ tableName, columnName = "uuid", makeRequired = f
|
|
|
32
32
|
console.log("📦 Habilitando extensión uuid-ossp...");
|
|
33
33
|
await prisma.$executeRaw `CREATE EXTENSION IF NOT EXISTS "uuid-ossp";`;
|
|
34
34
|
console.log(`📝 Añadiendo columna ${columnName}...`);
|
|
35
|
-
await prisma.$executeRaw `
|
|
36
|
-
ALTER TABLE ${tableName}
|
|
37
|
-
ADD COLUMN ${columnName} VARCHAR(255);
|
|
35
|
+
await prisma.$executeRaw `
|
|
36
|
+
ALTER TABLE ${tableName}
|
|
37
|
+
ADD COLUMN ${columnName} VARCHAR(255);
|
|
38
38
|
`;
|
|
39
39
|
console.log("🔄 Actualizando registros existentes con UUIDs...");
|
|
40
|
-
await prisma.$executeRaw `
|
|
41
|
-
UPDATE ${tableName}
|
|
42
|
-
SET ${columnName} = uuid_generate_v4()
|
|
43
|
-
WHERE ${columnName} IS NULL;
|
|
40
|
+
await prisma.$executeRaw `
|
|
41
|
+
UPDATE ${tableName}
|
|
42
|
+
SET ${columnName} = uuid_generate_v4()
|
|
43
|
+
WHERE ${columnName} IS NULL;
|
|
44
44
|
`;
|
|
45
45
|
console.log("📊 Creando índice...");
|
|
46
|
-
await prisma.$executeRaw `
|
|
47
|
-
CREATE INDEX idx_${tableName}_${columnName}
|
|
48
|
-
ON ${tableName}(${columnName});
|
|
46
|
+
await prisma.$executeRaw `
|
|
47
|
+
CREATE INDEX idx_${tableName}_${columnName}
|
|
48
|
+
ON ${tableName}(${columnName});
|
|
49
49
|
`;
|
|
50
50
|
console.log("🔒 Añadiendo restricción unique...");
|
|
51
|
-
await prisma.$executeRaw `
|
|
52
|
-
ALTER TABLE ${tableName}
|
|
53
|
-
ADD CONSTRAINT ${tableName}_${columnName}_key
|
|
54
|
-
UNIQUE (${columnName});
|
|
51
|
+
await prisma.$executeRaw `
|
|
52
|
+
ALTER TABLE ${tableName}
|
|
53
|
+
ADD CONSTRAINT ${tableName}_${columnName}_key
|
|
54
|
+
UNIQUE (${columnName});
|
|
55
55
|
`;
|
|
56
56
|
if (makeRequired) {
|
|
57
57
|
console.log("⚠️ Haciendo la columna NOT NULL...");
|
|
58
|
-
await prisma.$executeRaw `
|
|
59
|
-
ALTER TABLE ${tableName}
|
|
60
|
-
ALTER COLUMN ${columnName} SET NOT NULL;
|
|
58
|
+
await prisma.$executeRaw `
|
|
59
|
+
ALTER TABLE ${tableName}
|
|
60
|
+
ALTER COLUMN ${columnName} SET NOT NULL;
|
|
61
61
|
`;
|
|
62
62
|
}
|
|
63
63
|
if (addDefault) {
|
|
64
64
|
console.log("⚡ Añadiendo valor por defecto...");
|
|
65
|
-
await prisma.$executeRaw `
|
|
66
|
-
ALTER TABLE ${tableName}
|
|
67
|
-
ALTER COLUMN ${columnName}
|
|
68
|
-
SET DEFAULT uuid_generate_v4();
|
|
65
|
+
await prisma.$executeRaw `
|
|
66
|
+
ALTER TABLE ${tableName}
|
|
67
|
+
ALTER COLUMN ${columnName}
|
|
68
|
+
SET DEFAULT uuid_generate_v4();
|
|
69
69
|
`;
|
|
70
70
|
}
|
|
71
71
|
console.log(`✅ Proceso completado exitosamente para la tabla ${tableName}`);
|