@javalabs/prisma-client 1.0.0 → 1.0.1
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 +121 -72
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
# @
|
|
1
|
+
# @javalabs/prisma-client
|
|
2
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.
|
|
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
4
|
|
|
5
5
|
## Instalación
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
npm
|
|
8
|
+
npm i @javalabs/prisma-client
|
|
9
9
|
```
|
|
10
10
|
|
|
11
11
|
## Características
|
|
12
12
|
|
|
13
|
-
- **Cliente Prisma Singleton**: Implementación eficiente del cliente Prisma
|
|
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
|
|
17
|
-
- **Herramientas de Gestión de BD**: Scripts para crear,
|
|
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
18
|
|
|
19
19
|
## Diagramas
|
|
20
20
|
|
|
@@ -22,63 +22,66 @@ npm install @tupay/prisma-client
|
|
|
22
22
|
|
|
23
23
|
```mermaid
|
|
24
24
|
graph TD
|
|
25
|
-
A[Aplicación] --> B
|
|
26
|
-
B --> C
|
|
27
|
-
B --> D
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
G --> F
|
|
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)];
|
|
34
33
|
```
|
|
35
34
|
|
|
36
35
|
### Flujo de Migración de Datos
|
|
37
36
|
|
|
38
37
|
```mermaid
|
|
39
38
|
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
|
|
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)
|
|
43
42
|
|
|
44
43
|
M->>S: Consulta datos de origen
|
|
45
44
|
S-->>M: Retorna datos
|
|
46
|
-
M->>M: Procesa y transforma datos
|
|
47
|
-
M->>T: Migra datos a destino
|
|
45
|
+
M->>M: Procesa y transforma datos (considerando dependencias)
|
|
46
|
+
M->>T: Migra datos a esquemas de tenants en destino
|
|
48
47
|
T-->>M: Confirma migración
|
|
49
48
|
|
|
50
|
-
Note over M: Ordenamiento por dependencias
|
|
49
|
+
Note over M: Ordenamiento por dependencias (ForeignKeyManager)
|
|
51
50
|
Note over M: Manejo de tipos de datos
|
|
52
|
-
Note over M: Migración por fases
|
|
51
|
+
Note over M: Migración por fases (si aplica)
|
|
53
52
|
```
|
|
54
53
|
|
|
55
54
|
### Estructura del Proyecto
|
|
56
55
|
|
|
57
56
|
```mermaid
|
|
58
57
|
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
|
-
|
|
71
|
-
|
|
72
|
-
I --> O[
|
|
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];
|
|
73
74
|
```
|
|
74
75
|
|
|
75
76
|
## Uso Básico
|
|
76
77
|
|
|
77
78
|
### En aplicaciones NestJS
|
|
78
79
|
|
|
79
|
-
|
|
80
|
+
Importa el `PrismaModule` en tu módulo principal:
|
|
81
|
+
|
|
82
|
+
```typescript:/Users/alejandroperez/tupay/packages/prisma-client/README.md
|
|
80
83
|
import { Module } from "@nestjs/common";
|
|
81
|
-
import { PrismaModule } from "@
|
|
84
|
+
import { PrismaModule } from "@javalabs/prisma-client"; // <--- Updated import path
|
|
82
85
|
|
|
83
86
|
@Module({
|
|
84
87
|
imports: [PrismaModule],
|
|
@@ -86,121 +89,167 @@ import { PrismaModule } from "@tupay/prisma-client";
|
|
|
86
89
|
export class AppModule {}
|
|
87
90
|
```
|
|
88
91
|
|
|
89
|
-
Luego, inyecta
|
|
92
|
+
Luego, inyecta los servicios donde los necesites:
|
|
90
93
|
|
|
91
|
-
```typescript
|
|
94
|
+
```typescript:/Users/alejandroperez/tupay/packages/prisma-client/README.md
|
|
92
95
|
import { Injectable } from "@nestjs/common";
|
|
93
|
-
import { PrismaService, PrismaFactoryService } from "@
|
|
96
|
+
import { PrismaService, PrismaFactoryService } from "@javalabs/prisma-client"; // <--- Updated import path
|
|
94
97
|
|
|
95
98
|
@Injectable()
|
|
96
99
|
export class MyService {
|
|
97
100
|
constructor(
|
|
98
|
-
private prismaService: PrismaService,
|
|
99
|
-
private prismaFactoryService: PrismaFactoryService
|
|
101
|
+
private prismaService: PrismaService, // Cliente para el schema 'public'
|
|
102
|
+
private prismaFactoryService: PrismaFactoryService // Fábrica para clientes de tenants
|
|
100
103
|
) {}
|
|
101
104
|
|
|
102
105
|
// Usar el cliente principal (schema public)
|
|
103
|
-
async
|
|
104
|
-
|
|
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";
|
|
105
110
|
}
|
|
106
111
|
|
|
107
112
|
// Usar un cliente específico para un tenant
|
|
108
113
|
async findTenantUsers(tenantId: string) {
|
|
114
|
+
// tenantId suele ser la API Key que identifica al schema
|
|
109
115
|
const tenantClient = this.prismaFactoryService.getClient(tenantId);
|
|
116
|
+
// Asume que tienes un modelo 'users' en tu schema.prisma
|
|
110
117
|
return tenantClient.users.findMany();
|
|
111
118
|
}
|
|
112
119
|
}
|
|
113
120
|
```
|
|
114
121
|
|
|
115
|
-
### En aplicaciones no-NestJS
|
|
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.
|
|
116
125
|
|
|
117
|
-
```typescript
|
|
118
|
-
import { prisma } from "@
|
|
126
|
+
```typescript:/Users/alejandroperez/tupay/packages/prisma-client/README.md
|
|
127
|
+
import { prisma } from "@javalabs/prisma-client"; // <--- Updated import path
|
|
119
128
|
|
|
120
129
|
async function main() {
|
|
121
|
-
|
|
122
|
-
|
|
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");
|
|
123
134
|
}
|
|
124
135
|
|
|
125
136
|
main()
|
|
126
137
|
.catch(console.error)
|
|
127
|
-
.finally(() =>
|
|
138
|
+
.finally(async () => {
|
|
139
|
+
await prisma.$disconnect();
|
|
140
|
+
});
|
|
141
|
+
|
|
128
142
|
```
|
|
129
143
|
|
|
130
144
|
## Scripts de Utilidad
|
|
131
145
|
|
|
132
|
-
|
|
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`).
|
|
133
147
|
|
|
134
148
|
### Migración de Datos
|
|
135
149
|
|
|
150
|
+
Migra datos desde `SOURCE_DATABASE_URL` a los esquemas de tenants en `DATABASE_URL`.
|
|
151
|
+
|
|
136
152
|
```bash
|
|
137
|
-
# Migrar datos
|
|
153
|
+
# Migrar datos (requiere confirmación)
|
|
138
154
|
npm run migrate:data
|
|
139
155
|
|
|
140
|
-
# Migrar datos forzando la operación
|
|
156
|
+
# Migrar datos forzando la operación (sin confirmación)
|
|
141
157
|
npm run migrate:data:force
|
|
142
158
|
|
|
143
|
-
# Migrar datos con confirmación automática
|
|
159
|
+
# Migrar datos con confirmación automática 'yes'
|
|
144
160
|
npm run migrate:data:yes
|
|
145
161
|
```
|
|
146
162
|
|
|
147
|
-
### Gestión de Esquemas
|
|
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".
|
|
148
166
|
|
|
149
167
|
```bash
|
|
150
|
-
# Generar cliente Prisma
|
|
168
|
+
# Generar cliente Prisma basado en schema.prisma
|
|
151
169
|
npm run generate
|
|
152
170
|
|
|
153
|
-
#
|
|
171
|
+
# Crear una nueva migración SQL basada en cambios al schema.prisma (desarrollo)
|
|
154
172
|
npm run migrate:dev
|
|
155
173
|
|
|
156
|
-
#
|
|
174
|
+
# Aplicar migraciones pendientes a la base de datos (producción/despliegue)
|
|
157
175
|
npm run migrate:deploy
|
|
158
176
|
```
|
|
159
177
|
|
|
160
178
|
## Scripts Avanzados
|
|
161
179
|
|
|
162
|
-
|
|
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`.
|
|
163
181
|
|
|
164
182
|
### Creación de Esquemas para Tenants
|
|
165
183
|
|
|
184
|
+
Crea los esquemas de base de datos para cada tenant (basado en API Keys encontradas en `SOURCE_DATABASE_URL`).
|
|
185
|
+
|
|
166
186
|
```bash
|
|
167
|
-
# Compilar el proyecto
|
|
187
|
+
# Compilar el proyecto si no está compilado
|
|
168
188
|
npm run build
|
|
169
189
|
|
|
170
190
|
# Ejecutar el script para crear esquemas de tenant
|
|
171
191
|
node dist/scripts/create-tenant-schemas.js
|
|
172
192
|
```
|
|
173
193
|
|
|
174
|
-
### Migración de Estructura de Esquemas
|
|
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.
|
|
175
197
|
|
|
176
198
|
```bash
|
|
177
|
-
#
|
|
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
|
|
178
203
|
node dist/scripts/migrate-schema-structure.js
|
|
179
204
|
```
|
|
180
205
|
|
|
181
206
|
### Sincronización de Esquemas
|
|
182
207
|
|
|
208
|
+
Genera un script SQL para sincronizar esquemas (potencialmente entre `public` y tenants, o entre tenants). Revisa el script antes de aplicarlo.
|
|
209
|
+
|
|
183
210
|
```bash
|
|
184
|
-
#
|
|
211
|
+
# Compilar el proyecto si no está compilado
|
|
212
|
+
npm run build
|
|
213
|
+
|
|
214
|
+
# Generar el script SQL de sincronización
|
|
185
215
|
node dist/scripts/schema-sync.js
|
|
186
216
|
```
|
|
187
217
|
|
|
188
218
|
### Reseteo de Base de Datos
|
|
189
219
|
|
|
220
|
+
Resetea la base de datos (¡CUIDADO: Borra datos!).
|
|
221
|
+
|
|
190
222
|
```bash
|
|
191
|
-
#
|
|
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)
|
|
192
227
|
node dist/scripts/reset-database.js
|
|
193
228
|
|
|
194
229
|
# Resetear y recrear la base de datos
|
|
195
230
|
node dist/scripts/reset-database.js --recreate
|
|
196
231
|
```
|
|
197
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
|
+
|
|
198
245
|
## Variables de Entorno
|
|
199
246
|
|
|
200
|
-
El paquete
|
|
247
|
+
El paquete y sus scripts dependen de las siguientes variables de entorno (generalmente definidas en un archivo `.env`):
|
|
201
248
|
|
|
202
|
-
- `DATABASE_URL`: URL de conexión a la base de datos principal
|
|
203
|
-
- `
|
|
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`
|
|
204
253
|
|
|
205
254
|
## Desarrollo
|
|
206
255
|
|
|
@@ -208,10 +257,10 @@ El paquete requiere las siguientes variables de entorno:
|
|
|
208
257
|
# Instalar dependencias
|
|
209
258
|
npm install
|
|
210
259
|
|
|
211
|
-
# Compilar el proyecto
|
|
260
|
+
# Compilar el proyecto (genera archivos en dist/)
|
|
212
261
|
npm run build
|
|
213
262
|
|
|
214
|
-
# Generar cliente Prisma
|
|
263
|
+
# Generar cliente Prisma (después de cambios en schema.prisma)
|
|
215
264
|
npm run generate
|
|
216
265
|
```
|
|
217
266
|
|