@gzl10/nexus-plugin-compliance 0.14.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.
@@ -0,0 +1,593 @@
1
+ // src/compliance.entity.ts
2
+ import { useIdField, useLocalizedField, useTextField, useEmailField, useTextareaField, useCheckboxField, useSelectField, useDatetimeField, useJsonField } from "@gzl10/nexus-sdk/fields";
3
+ var CONSENT_EVENT_TYPES = ["accepted", "revoked", "updated"];
4
+ var CONSENT_EVENT_TYPE_OPTIONS = CONSENT_EVENT_TYPES.map((t) => {
5
+ const labelMap = {
6
+ accepted: { en: "Accepted", es: "Aceptado" },
7
+ revoked: { en: "Revoked", es: "Revocado" },
8
+ updated: { en: "Updated", es: "Actualizado" }
9
+ };
10
+ return {
11
+ value: t,
12
+ label: labelMap[t]
13
+ };
14
+ });
15
+ var legalSettingsEntity = {
16
+ type: "single",
17
+ key: "legal_settings",
18
+ label: { en: "Legal Settings", es: "Configuraci\xF3n legal" },
19
+ routePrefix: "/settings",
20
+ defaults: {
21
+ app_name: "Nexus App",
22
+ company_name: "Your Company Name",
23
+ contact_email: "contact@example.com",
24
+ dpo_email: null,
25
+ address: null
26
+ },
27
+ fields: {
28
+ app_name: useTextField({
29
+ label: { en: "App Name", es: "Nombre de la aplicaci\xF3n" },
30
+ hint: { en: "Name of your application (used in legal documents)", es: "Nombre de tu aplicaci\xF3n (usado en documentos legales)" },
31
+ required: true,
32
+ size: 100,
33
+ validation: { min: 1, max: 100 }
34
+ }),
35
+ company_name: useTextField({
36
+ label: { en: "Company Name", es: "Nombre de la empresa" },
37
+ hint: { en: "Legal name of your company", es: "Nombre legal de tu empresa" },
38
+ required: true,
39
+ size: 200,
40
+ validation: { min: 1, max: 200 }
41
+ }),
42
+ contact_email: useEmailField({
43
+ label: { en: "Contact Email", es: "Email de contacto" },
44
+ hint: { en: "General contact email for legal inquiries", es: "Email de contacto general para consultas legales" },
45
+ required: true
46
+ }),
47
+ dpo_email: useEmailField({
48
+ label: { en: "DPO Email", es: "Email del DPO" },
49
+ hint: { en: "Data Protection Officer email (GDPR requirement)", es: "Email del Responsable de Protecci\xF3n de Datos (requisito RGPD)" },
50
+ nullable: true
51
+ }),
52
+ address: useTextareaField({
53
+ label: { en: "Company Address", es: "Direcci\xF3n de la empresa" },
54
+ hint: { en: "Legal address for correspondence", es: "Direcci\xF3n legal para correspondencia" },
55
+ nullable: true
56
+ })
57
+ },
58
+ casl: {
59
+ subject: "LegalSettings",
60
+ permissions: {
61
+ ADMIN: { actions: ["read", "update"] }
62
+ }
63
+ }
64
+ };
65
+ var termsOfServiceEntity = {
66
+ type: "collection",
67
+ table: "terms_of_service",
68
+ label: { en: "Terms of Service", es: "T\xE9rminos de servicio" },
69
+ labelPlural: { en: "Terms of Service", es: "T\xE9rminos de servicio" },
70
+ labelField: "title",
71
+ routePrefix: "/terms-versions",
72
+ timestamps: true,
73
+ fields: {
74
+ id: useIdField(),
75
+ version: useTextField({
76
+ label: { en: "Version", es: "Versi\xF3n" },
77
+ hint: { en: "Semantic version (e.g., 1.0, 1.1, 2.0)", es: "Versi\xF3n sem\xE1ntica (ej: 1.0, 1.1, 2.0)" },
78
+ required: true,
79
+ size: 20,
80
+ unique: true,
81
+ validation: { pattern: "^\\d+\\.\\d+(\\.\\d+)?$" },
82
+ meta: { searchable: true, sortable: true }
83
+ }),
84
+ title: useLocalizedField({
85
+ label: { en: "Title", es: "T\xEDtulo" },
86
+ hint: { en: 'Localized title { en: "...", es: "..." }', es: 'T\xEDtulo localizado { en: "...", es: "..." }' }
87
+ }),
88
+ content: {
89
+ label: { en: "Content", es: "Contenido" },
90
+ input: "markdown",
91
+ hint: { en: "Full terms in markdown. Use {{APP_NAME}}, {{COMPANY_NAME}}, {{CONTACT_EMAIL}}", es: "T\xE9rminos completos en markdown. Usa {{APP_NAME}}, {{COMPANY_NAME}}, {{CONTACT_EMAIL}}" },
92
+ required: true,
93
+ db: { type: "json" }
94
+ },
95
+ effective_date: {
96
+ label: { en: "Effective Date", es: "Fecha efectiva" },
97
+ input: "date",
98
+ hint: { en: "Date when this version becomes effective", es: "Fecha cuando esta versi\xF3n entra en vigor" },
99
+ required: true,
100
+ db: { type: "date" },
101
+ meta: { sortable: true }
102
+ },
103
+ is_active: useCheckboxField({
104
+ label: { en: "Active", es: "Activo" },
105
+ hint: { en: "Only one version can be active at a time", es: "Solo una versi\xF3n puede estar activa a la vez" },
106
+ meta: { searchable: true }
107
+ })
108
+ },
109
+ casl: {
110
+ subject: "TermsOfService",
111
+ permissions: {
112
+ "*": { actions: ["read"] },
113
+ ADMIN: { actions: ["manage"] }
114
+ }
115
+ }
116
+ };
117
+ var privacyPolicyEntity = {
118
+ type: "single",
119
+ key: "privacy_policy",
120
+ label: { en: "Privacy Policy", es: "Pol\xEDtica de privacidad" },
121
+ routePrefix: "/privacy-policy",
122
+ defaults: {
123
+ title: { en: "Privacy Policy", es: "Pol\xEDtica de Privacidad" },
124
+ content: {
125
+ en: `# Privacy Policy
126
+
127
+ **Effective Date:** {{EFFECTIVE_DATE}}
128
+
129
+ {{COMPANY_NAME}} ("we", "us", or "our") operates {{APP_NAME}} (the "Service"). This page informs you of our policies regarding the collection, use, and disclosure of personal data when you use our Service.
130
+
131
+ ## 1. Information We Collect
132
+
133
+ ### 1.1 Account Information
134
+ When you create an account, we collect:
135
+ - Email address
136
+ - Name
137
+ - Password (stored securely using bcrypt hashing)
138
+
139
+ ### 1.2 Usage Data
140
+ We automatically collect:
141
+ - IP address
142
+ - Browser type and version (user agent)
143
+ - Device information
144
+ - Login timestamps
145
+ - Pages visited within the Service
146
+
147
+ ### 1.3 Cookies
148
+ We use cookies for authentication purposes. See our [Cookie Policy](/cookies) for details.
149
+
150
+ ## 2. How We Use Your Information
151
+
152
+ We use your personal data to:
153
+ - Provide and maintain the Service
154
+ - Authenticate your identity
155
+ - Send important notifications about the Service
156
+ - Detect and prevent security issues
157
+
158
+ ## 3. Data Retention
159
+
160
+ | Data Type | Retention Period |
161
+ |-----------|------------------|
162
+ | Account data | Until you delete your account |
163
+ | Authentication logs | 90 days |
164
+ | Session tokens | 7 days |
165
+
166
+ ## 4. Your Rights (GDPR/CCPA/LGPD)
167
+
168
+ You have the right to:
169
+
170
+ ### 4.1 Access Your Data
171
+ You can export all your personal data at any time through Settings > Privacy > Export My Data.
172
+
173
+ ### 4.2 Delete Your Account
174
+ You can permanently delete your account and all associated data through Settings > Privacy > Delete Account.
175
+
176
+ ### 4.3 Rectification
177
+ You can update your personal information through your account settings.
178
+
179
+ ### 4.4 Data Portability
180
+ Your data export is provided in JSON format, which is machine-readable and can be transferred to other services.
181
+
182
+ ### 4.5 Withdraw Consent
183
+ You can withdraw consent for marketing communications at any time through your account settings.
184
+
185
+ ## 5. Data Security
186
+
187
+ We implement industry-standard security measures:
188
+ - Passwords are hashed using bcrypt
189
+ - All data transmitted over HTTPS
190
+ - Session tokens are stored in HTTP-only cookies
191
+ - Rate limiting on authentication endpoints
192
+
193
+ ## 6. Third-Party Services
194
+
195
+ We may use third-party services for:
196
+ - Error monitoring (optional, configurable)
197
+ - Analytics (optional, requires consent)
198
+
199
+ ## 7. Children's Privacy
200
+
201
+ Our Service is not intended for children under 13. We do not knowingly collect personal data from children.
202
+
203
+ ## 8. Changes to This Policy
204
+
205
+ We may update this Privacy Policy from time to time. We will notify you of any changes by posting the new policy on this page and updating the "Effective Date".
206
+
207
+ ## 9. Contact Us
208
+
209
+ If you have questions about this Privacy Policy, please contact us at:
210
+
211
+ **Email:** {{CONTACT_EMAIL}}`,
212
+ es: `# Pol\xEDtica de Privacidad
213
+
214
+ **Fecha de vigencia:** {{EFFECTIVE_DATE}}
215
+
216
+ {{COMPANY_NAME}} ("nosotros", "nos" o "nuestro") opera {{APP_NAME}} (el "Servicio"). Esta p\xE1gina le informa sobre nuestras pol\xEDticas respecto a la recopilaci\xF3n, uso y divulgaci\xF3n de datos personales cuando utiliza nuestro Servicio.
217
+
218
+ ## 1. Informaci\xF3n que Recopilamos
219
+
220
+ ### 1.1 Informaci\xF3n de Cuenta
221
+ Cuando crea una cuenta, recopilamos:
222
+ - Direcci\xF3n de correo electr\xF3nico
223
+ - Nombre
224
+ - Contrase\xF1a (almacenada de forma segura usando hash bcrypt)
225
+
226
+ ### 1.2 Datos de Uso
227
+ Recopilamos autom\xE1ticamente:
228
+ - Direcci\xF3n IP
229
+ - Tipo y versi\xF3n del navegador (user agent)
230
+ - Informaci\xF3n del dispositivo
231
+ - Marcas de tiempo de inicio de sesi\xF3n
232
+ - P\xE1ginas visitadas dentro del Servicio
233
+
234
+ ### 1.3 Cookies
235
+ Utilizamos cookies con fines de autenticaci\xF3n. Consulte nuestra [Pol\xEDtica de Cookies](/cookies) para m\xE1s detalles.
236
+
237
+ ## 2. C\xF3mo Usamos su Informaci\xF3n
238
+
239
+ Utilizamos sus datos personales para:
240
+ - Proporcionar y mantener el Servicio
241
+ - Autenticar su identidad
242
+ - Enviar notificaciones importantes sobre el Servicio
243
+ - Detectar y prevenir problemas de seguridad
244
+
245
+ ## 3. Retenci\xF3n de Datos
246
+
247
+ | Tipo de Dato | Per\xEDodo de Retenci\xF3n |
248
+ |--------------|---------------------|
249
+ | Datos de cuenta | Hasta que elimine su cuenta |
250
+ | Registros de autenticaci\xF3n | 90 d\xEDas |
251
+ | Tokens de sesi\xF3n | 7 d\xEDas |
252
+
253
+ ## 4. Sus Derechos (RGPD/CCPA/LGPD)
254
+
255
+ Usted tiene derecho a:
256
+
257
+ ### 4.1 Acceder a sus Datos
258
+ Puede exportar todos sus datos personales en cualquier momento a trav\xE9s de Configuraci\xF3n > Privacidad > Exportar Mis Datos.
259
+
260
+ ### 4.2 Eliminar su Cuenta
261
+ Puede eliminar permanentemente su cuenta y todos los datos asociados a trav\xE9s de Configuraci\xF3n > Privacidad > Eliminar Cuenta.
262
+
263
+ ### 4.3 Rectificaci\xF3n
264
+ Puede actualizar su informaci\xF3n personal a trav\xE9s de la configuraci\xF3n de su cuenta.
265
+
266
+ ### 4.4 Portabilidad de Datos
267
+ Su exportaci\xF3n de datos se proporciona en formato JSON, que es legible por m\xE1quina y puede transferirse a otros servicios.
268
+
269
+ ### 4.5 Retirar el Consentimiento
270
+ Puede retirar el consentimiento para comunicaciones de marketing en cualquier momento a trav\xE9s de la configuraci\xF3n de su cuenta.
271
+
272
+ ## 5. Seguridad de los Datos
273
+
274
+ Implementamos medidas de seguridad est\xE1ndar de la industria:
275
+ - Las contrase\xF1as se almacenan con hash usando bcrypt
276
+ - Todos los datos se transmiten sobre HTTPS
277
+ - Los tokens de sesi\xF3n se almacenan en cookies HTTP-only
278
+ - Limitaci\xF3n de tasa en endpoints de autenticaci\xF3n
279
+
280
+ ## 6. Servicios de Terceros
281
+
282
+ Podemos usar servicios de terceros para:
283
+ - Monitoreo de errores (opcional, configurable)
284
+ - Anal\xEDticas (opcional, requiere consentimiento)
285
+
286
+ ## 7. Privacidad de Menores
287
+
288
+ Nuestro Servicio no est\xE1 dirigido a menores de 13 a\xF1os. No recopilamos intencionalmente datos personales de menores.
289
+
290
+ ## 8. Cambios a esta Pol\xEDtica
291
+
292
+ Podemos actualizar esta Pol\xEDtica de Privacidad de vez en cuando. Le notificaremos de cualquier cambio publicando la nueva pol\xEDtica en esta p\xE1gina y actualizando la "Fecha de vigencia".
293
+
294
+ ## 9. Cont\xE1ctenos
295
+
296
+ Si tiene preguntas sobre esta Pol\xEDtica de Privacidad, cont\xE1ctenos en:
297
+
298
+ **Email:** {{CONTACT_EMAIL}}`
299
+ }
300
+ },
301
+ fields: {
302
+ title: useJsonField({
303
+ label: { en: "Title", es: "T\xEDtulo" },
304
+ hint: { en: 'Localized title { en: "...", es: "..." }', es: 'T\xEDtulo localizado { en: "...", es: "..." }' },
305
+ required: true
306
+ }),
307
+ content: useJsonField({
308
+ label: { en: "Content", es: "Contenido" },
309
+ hint: { en: 'Localized markdown content { en: "...", es: "..." }. Use {{APP_NAME}}, {{COMPANY_NAME}}, {{CONTACT_EMAIL}}, {{DPO_EMAIL}}', es: 'Contenido markdown localizado { en: "...", es: "..." }. Usa {{APP_NAME}}, {{COMPANY_NAME}}, {{CONTACT_EMAIL}}, {{DPO_EMAIL}}' },
310
+ required: true
311
+ })
312
+ },
313
+ casl: {
314
+ subject: "PrivacyPolicy",
315
+ permissions: {
316
+ ADMIN: { actions: ["read", "update"] }
317
+ }
318
+ }
319
+ };
320
+ var cookiePolicyEntity = {
321
+ type: "single",
322
+ key: "cookie_policy",
323
+ label: { en: "Cookie Policy", es: "Pol\xEDtica de cookies" },
324
+ routePrefix: "/cookie-policy",
325
+ defaults: {
326
+ title: { en: "Cookie Policy", es: "Pol\xEDtica de Cookies" },
327
+ content: {
328
+ en: `# Cookie Policy
329
+
330
+ **Effective Date:** {{EFFECTIVE_DATE}}
331
+
332
+ This Cookie Policy explains how {{COMPANY_NAME}} ("we", "us", or "our") uses cookies and similar technologies when you use {{APP_NAME}} (the "Service").
333
+
334
+ ## 1. What Are Cookies?
335
+
336
+ Cookies are small text files stored on your device when you visit a website. They help the website remember your preferences and improve your experience.
337
+
338
+ ## 2. Types of Cookies We Use
339
+
340
+ ### 2.1 Strictly Necessary Cookies
341
+
342
+ These cookies are essential for the Service to function. They cannot be disabled.
343
+
344
+ | Cookie Name | Purpose | Duration |
345
+ |-------------|---------|----------|
346
+ | refreshToken | Authentication session | 7 days |
347
+
348
+ **Legal Basis:** Legitimate interest (necessary for service operation)
349
+
350
+ ### 2.2 Functional Cookies
351
+
352
+ These cookies remember your preferences to enhance your experience.
353
+
354
+ | Cookie Name | Purpose | Duration |
355
+ |-------------|---------|----------|
356
+ | theme | Light/dark mode preference | 1 year |
357
+ | locale | Language preference | 1 year |
358
+ | cookieConsent | Your cookie preferences | 1 year |
359
+
360
+ **Legal Basis:** Consent
361
+
362
+ ### 2.3 Analytics Cookies (Optional)
363
+
364
+ If enabled, these cookies help us understand how visitors use the Service.
365
+
366
+ **Legal Basis:** Consent (opt-in required)
367
+
368
+ ### 2.4 Marketing Cookies (Optional)
369
+
370
+ If enabled, these cookies track your activity for advertising purposes.
371
+
372
+ **Legal Basis:** Consent (opt-in required)
373
+
374
+ ## 3. Managing Your Cookie Preferences
375
+
376
+ ### 3.1 Through Our Service
377
+ You can manage your cookie preferences at any time through the cookie banner or Settings > Privacy > Cookie Preferences.
378
+
379
+ ### 3.2 Through Your Browser
380
+ Most browsers allow you to:
381
+ - View cookies stored on your device
382
+ - Delete cookies
383
+ - Block cookies from specific or all websites
384
+
385
+ **Note:** Blocking strictly necessary cookies may prevent you from using the Service.
386
+
387
+ ## 4. Third-Party Cookies
388
+
389
+ We may allow third-party services to set cookies on your device. These third parties have their own privacy policies.
390
+
391
+ ## 5. Do Not Track
392
+
393
+ Some browsers have a "Do Not Track" feature. We currently do not respond to Do Not Track signals.
394
+
395
+ ## 6. Cookie Consent
396
+
397
+ Under GDPR, LGPD, and similar regulations:
398
+ - **Strictly necessary cookies** do not require consent
399
+ - **All other cookies** require your explicit consent before being set
400
+ - You can withdraw consent at any time
401
+
402
+ ## 7. Updates to This Policy
403
+
404
+ We may update this Cookie Policy from time to time. Changes will be posted on this page with an updated "Effective Date".
405
+
406
+ ## 8. Contact Us
407
+
408
+ If you have questions about our use of cookies, please contact us at:
409
+
410
+ **Email:** {{CONTACT_EMAIL}}`,
411
+ es: `# Pol\xEDtica de Cookies
412
+
413
+ **Fecha de vigencia:** {{EFFECTIVE_DATE}}
414
+
415
+ Esta Pol\xEDtica de Cookies explica c\xF3mo {{COMPANY_NAME}} ("nosotros", "nos" o "nuestro") utiliza cookies y tecnolog\xEDas similares cuando usa {{APP_NAME}} (el "Servicio").
416
+
417
+ ## 1. \xBFQu\xE9 son las Cookies?
418
+
419
+ Las cookies son peque\xF1os archivos de texto almacenados en su dispositivo cuando visita un sitio web. Ayudan al sitio web a recordar sus preferencias y mejorar su experiencia.
420
+
421
+ ## 2. Tipos de Cookies que Usamos
422
+
423
+ ### 2.1 Cookies Estrictamente Necesarias
424
+
425
+ Estas cookies son esenciales para que el Servicio funcione. No se pueden desactivar.
426
+
427
+ | Nombre | Prop\xF3sito | Duraci\xF3n |
428
+ |--------|-----------|----------|
429
+ | refreshToken | Sesi\xF3n de autenticaci\xF3n | 7 d\xEDas |
430
+
431
+ **Base Legal:** Inter\xE9s leg\xEDtimo (necesario para la operaci\xF3n del servicio)
432
+
433
+ ### 2.2 Cookies Funcionales
434
+
435
+ Estas cookies recuerdan sus preferencias para mejorar su experiencia.
436
+
437
+ | Nombre | Prop\xF3sito | Duraci\xF3n |
438
+ |--------|-----------|----------|
439
+ | theme | Preferencia modo claro/oscuro | 1 a\xF1o |
440
+ | locale | Preferencia de idioma | 1 a\xF1o |
441
+ | cookieConsent | Sus preferencias de cookies | 1 a\xF1o |
442
+
443
+ **Base Legal:** Consentimiento
444
+
445
+ ### 2.3 Cookies de Anal\xEDticas (Opcional)
446
+
447
+ Si est\xE1n habilitadas, estas cookies nos ayudan a entender c\xF3mo los visitantes usan el Servicio.
448
+
449
+ **Base Legal:** Consentimiento (requiere opt-in)
450
+
451
+ ### 2.4 Cookies de Marketing (Opcional)
452
+
453
+ Si est\xE1n habilitadas, estas cookies rastrean su actividad con fines publicitarios.
454
+
455
+ **Base Legal:** Consentimiento (requiere opt-in)
456
+
457
+ ## 3. Gestionar sus Preferencias de Cookies
458
+
459
+ ### 3.1 A trav\xE9s de Nuestro Servicio
460
+ Puede gestionar sus preferencias de cookies en cualquier momento a trav\xE9s del banner de cookies o en Configuraci\xF3n > Privacidad > Preferencias de Cookies.
461
+
462
+ ### 3.2 A trav\xE9s de su Navegador
463
+ La mayor\xEDa de navegadores le permiten:
464
+ - Ver las cookies almacenadas en su dispositivo
465
+ - Eliminar cookies
466
+ - Bloquear cookies de sitios espec\xEDficos o de todos los sitios
467
+
468
+ **Nota:** Bloquear las cookies estrictamente necesarias puede impedirle usar el Servicio.
469
+
470
+ ## 4. Cookies de Terceros
471
+
472
+ Podemos permitir que servicios de terceros coloquen cookies en su dispositivo. Estos terceros tienen sus propias pol\xEDticas de privacidad.
473
+
474
+ ## 5. No Rastrear
475
+
476
+ Algunos navegadores tienen una funci\xF3n "No Rastrear". Actualmente no respondemos a se\xF1ales de No Rastrear.
477
+
478
+ ## 6. Consentimiento de Cookies
479
+
480
+ Seg\xFAn el RGPD, LGPD y regulaciones similares:
481
+ - **Las cookies estrictamente necesarias** no requieren consentimiento
482
+ - **Todas las dem\xE1s cookies** requieren su consentimiento expl\xEDcito antes de ser colocadas
483
+ - Puede retirar el consentimiento en cualquier momento
484
+
485
+ ## 7. Actualizaciones de esta Pol\xEDtica
486
+
487
+ Podemos actualizar esta Pol\xEDtica de Cookies de vez en cuando. Los cambios se publicar\xE1n en esta p\xE1gina con una "Fecha de vigencia" actualizada.
488
+
489
+ ## 8. Cont\xE1ctenos
490
+
491
+ Si tiene preguntas sobre nuestro uso de cookies, cont\xE1ctenos en:
492
+
493
+ **Email:** {{CONTACT_EMAIL}}`
494
+ }
495
+ },
496
+ fields: {
497
+ title: useJsonField({
498
+ label: { en: "Title", es: "T\xEDtulo" },
499
+ hint: { en: 'Localized title { en: "...", es: "..." }', es: 'T\xEDtulo localizado { en: "...", es: "..." }' },
500
+ required: true
501
+ }),
502
+ content: useJsonField({
503
+ label: { en: "Content", es: "Contenido" },
504
+ hint: { en: 'Localized markdown content { en: "...", es: "..." }. Use {{APP_NAME}}, {{COMPANY_NAME}}, {{CONTACT_EMAIL}}', es: 'Contenido markdown localizado { en: "...", es: "..." }. Usa {{APP_NAME}}, {{COMPANY_NAME}}, {{CONTACT_EMAIL}}' },
505
+ required: true
506
+ })
507
+ },
508
+ casl: {
509
+ subject: "CookiePolicy",
510
+ permissions: {
511
+ ADMIN: { actions: ["read", "update"] }
512
+ }
513
+ }
514
+ };
515
+ var consentAuditLogEntity = {
516
+ type: "event",
517
+ immutable: true,
518
+ table: "consent_audit",
519
+ label: { en: "Consent Audit Log", es: "Registro de auditor\xEDa de consentimiento" },
520
+ labelField: "event_type",
521
+ routePrefix: "/audit-log",
522
+ retention: { days: 1825 },
523
+ // 5 years
524
+ fields: {
525
+ id: useIdField(),
526
+ user_id: useSelectField({
527
+ label: { en: "User ID", es: "ID de usuario" },
528
+ hint: { en: "User ID (nullable if user was deleted)", es: "ID de usuario (nulo si el usuario fue eliminado)" },
529
+ table: "users",
530
+ column: "id",
531
+ endpoint: "/users",
532
+ onDelete: "SET NULL",
533
+ nullable: true,
534
+ index: true,
535
+ meta: { searchable: true }
536
+ }),
537
+ user_email: useEmailField({
538
+ label: { en: "User Email", es: "Email del usuario" },
539
+ hint: { en: "Copy of email at time of consent (for audit trail)", es: "Copia del email en el momento del consentimiento (para auditor\xEDa)" },
540
+ nullable: false,
541
+ meta: { searchable: true }
542
+ }),
543
+ event_type: useSelectField({
544
+ label: { en: "Event Type", es: "Tipo de evento" },
545
+ options: [...CONSENT_EVENT_TYPE_OPTIONS],
546
+ nullable: false,
547
+ meta: { searchable: true }
548
+ }),
549
+ terms_version: useTextField({
550
+ label: { en: "Terms Version", es: "Versi\xF3n de t\xE9rminos" },
551
+ hint: { en: "Version of terms accepted/revoked", es: "Versi\xF3n de t\xE9rminos aceptados/revocados" },
552
+ size: 20,
553
+ nullable: false,
554
+ meta: { searchable: true }
555
+ }),
556
+ marketing_opt_in: useCheckboxField({
557
+ label: { en: "Marketing Opt-in", es: "Aceptaci\xF3n de marketing" }
558
+ }),
559
+ ip_address: useTextField({
560
+ label: { en: "IP Address", es: "Direcci\xF3n IP" },
561
+ size: 45,
562
+ nullable: true,
563
+ meta: { exportable: false }
564
+ }),
565
+ user_agent: useTextareaField({
566
+ label: { en: "User Agent", es: "Agente de usuario" },
567
+ nullable: true,
568
+ meta: { exportable: false }
569
+ }),
570
+ created_at: useDatetimeField({
571
+ label: { en: "Timestamp", es: "Marca de tiempo" },
572
+ disabled: true,
573
+ nullable: false,
574
+ meta: { sortable: true }
575
+ })
576
+ },
577
+ casl: {
578
+ subject: "ConsentAuditLog",
579
+ permissions: {
580
+ AUDITOR: { actions: ["read"] }
581
+ }
582
+ }
583
+ };
584
+
585
+ export {
586
+ CONSENT_EVENT_TYPES,
587
+ legalSettingsEntity,
588
+ termsOfServiceEntity,
589
+ privacyPolicyEntity,
590
+ cookiePolicyEntity,
591
+ consentAuditLogEntity
592
+ };
593
+ //# sourceMappingURL=chunk-6SAWMG7Y.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/compliance.entity.ts"],"sourcesContent":["import type {\n SingleEntityDefinition,\n CollectionEntityDefinition,\n EventEntityDefinition\n} from '@gzl10/nexus-sdk'\nimport { useIdField, useLocalizedField, useTextField, useEmailField, useTextareaField, useCheckboxField, useSelectField, useDatetimeField, useJsonField } from '@gzl10/nexus-sdk/fields'\n\n// ============================================================================\n// CONSENT EVENT TYPES\n// ============================================================================\n\nexport const CONSENT_EVENT_TYPES = ['accepted', 'revoked', 'updated'] as const\nexport type ConsentEventType = typeof CONSENT_EVENT_TYPES[number]\n\nexport const CONSENT_EVENT_TYPE_OPTIONS = CONSENT_EVENT_TYPES.map(t => {\n const labelMap: Record<ConsentEventType, { en: string; es: string }> = {\n accepted: { en: 'Accepted', es: 'Aceptado' },\n revoked: { en: 'Revoked', es: 'Revocado' },\n updated: { en: 'Updated', es: 'Actualizado' }\n }\n return {\n value: t,\n label: labelMap[t]\n }\n})\n\n// ============================================================================\n// LEGAL SETTINGS (SingleEntity)\n// ============================================================================\n\n/**\n * Legal Settings - Global configuration for legal content placeholders.\n * Used to replace {{APP_NAME}}, {{COMPANY_NAME}}, etc. in legal documents.\n */\nexport const legalSettingsEntity: SingleEntityDefinition = {\n type: 'single',\n key: 'legal_settings',\n label: { en: 'Legal Settings', es: 'Configuración legal' },\n routePrefix: '/settings',\n\n defaults: {\n app_name: 'Nexus App',\n company_name: 'Your Company Name',\n contact_email: 'contact@example.com',\n dpo_email: null,\n address: null\n },\n\n fields: {\n app_name: useTextField({\n label: { en: 'App Name', es: 'Nombre de la aplicación' },\n hint: { en: 'Name of your application (used in legal documents)', es: 'Nombre de tu aplicación (usado en documentos legales)' },\n required: true,\n size: 100,\n validation: { min: 1, max: 100 }\n }),\n company_name: useTextField({\n label: { en: 'Company Name', es: 'Nombre de la empresa' },\n hint: { en: 'Legal name of your company', es: 'Nombre legal de tu empresa' },\n required: true,\n size: 200,\n validation: { min: 1, max: 200 }\n }),\n contact_email: useEmailField({\n label: { en: 'Contact Email', es: 'Email de contacto' },\n hint: { en: 'General contact email for legal inquiries', es: 'Email de contacto general para consultas legales' },\n required: true\n }),\n dpo_email: useEmailField({\n label: { en: 'DPO Email', es: 'Email del DPO' },\n hint: { en: 'Data Protection Officer email (GDPR requirement)', es: 'Email del Responsable de Protección de Datos (requisito RGPD)' },\n nullable: true\n }),\n address: useTextareaField({\n label: { en: 'Company Address', es: 'Dirección de la empresa' },\n hint: { en: 'Legal address for correspondence', es: 'Dirección legal para correspondencia' },\n nullable: true\n })\n },\n\n casl: {\n subject: 'LegalSettings',\n permissions: {\n ADMIN: { actions: ['read', 'update'] }\n }\n }\n}\n\n// ============================================================================\n// TERMS OF SERVICE (CollectionEntity)\n// ============================================================================\n\n/**\n * Terms of Service versions.\n * Only one version can be active at a time.\n * Content supports markdown with placeholders: {{APP_NAME}}, {{COMPANY_NAME}}, etc.\n */\nexport const termsOfServiceEntity: CollectionEntityDefinition = {\n type: 'collection',\n table: 'terms_of_service',\n label: { en: 'Terms of Service', es: 'Términos de servicio' },\n labelPlural: { en: 'Terms of Service', es: 'Términos de servicio' },\n labelField: 'title',\n routePrefix: '/terms-versions',\n timestamps: true,\n\n fields: {\n id: useIdField(),\n version: useTextField({\n label: { en: 'Version', es: 'Versión' },\n hint: { en: 'Semantic version (e.g., 1.0, 1.1, 2.0)', es: 'Versión semántica (ej: 1.0, 1.1, 2.0)' },\n required: true,\n size: 20,\n unique: true,\n validation: { pattern: '^\\\\d+\\\\.\\\\d+(\\\\.\\\\d+)?$' },\n meta: { searchable: true, sortable: true }\n }),\n title: useLocalizedField({\n label: { en: 'Title', es: 'Título' },\n hint: { en: 'Localized title { en: \"...\", es: \"...\" }', es: 'Título localizado { en: \"...\", es: \"...\" }' }\n }),\n content: {\n label: { en: 'Content', es: 'Contenido' },\n input: 'markdown',\n hint: { en: 'Full terms in markdown. Use {{APP_NAME}}, {{COMPANY_NAME}}, {{CONTACT_EMAIL}}', es: 'Términos completos en markdown. Usa {{APP_NAME}}, {{COMPANY_NAME}}, {{CONTACT_EMAIL}}' },\n required: true,\n db: { type: 'json' }\n },\n effective_date: {\n label: { en: 'Effective Date', es: 'Fecha efectiva' },\n input: 'date',\n hint: { en: 'Date when this version becomes effective', es: 'Fecha cuando esta versión entra en vigor' },\n required: true,\n db: { type: 'date' },\n meta: { sortable: true }\n },\n is_active: useCheckboxField({\n label: { en: 'Active', es: 'Activo' },\n hint: { en: 'Only one version can be active at a time', es: 'Solo una versión puede estar activa a la vez' },\n meta: { searchable: true }\n })\n },\n\n casl: {\n subject: 'TermsOfService',\n permissions: {\n '*': { actions: ['read'] },\n ADMIN: { actions: ['manage'] }\n }\n }\n}\n\n// ============================================================================\n// PRIVACY POLICY (SingleEntity)\n// ============================================================================\n\n/**\n * Privacy Policy - Single editable document.\n * Content supports markdown with placeholders.\n */\nexport const privacyPolicyEntity: SingleEntityDefinition = {\n type: 'single',\n key: 'privacy_policy',\n label: { en: 'Privacy Policy', es: 'Política de privacidad' },\n routePrefix: '/privacy-policy',\n\n defaults: {\n title: { en: 'Privacy Policy', es: 'Política de Privacidad' },\n content: {\n en: `# Privacy Policy\n\n**Effective Date:** {{EFFECTIVE_DATE}}\n\n{{COMPANY_NAME}} (\"we\", \"us\", or \"our\") operates {{APP_NAME}} (the \"Service\"). This page informs you of our policies regarding the collection, use, and disclosure of personal data when you use our Service.\n\n## 1. Information We Collect\n\n### 1.1 Account Information\nWhen you create an account, we collect:\n- Email address\n- Name\n- Password (stored securely using bcrypt hashing)\n\n### 1.2 Usage Data\nWe automatically collect:\n- IP address\n- Browser type and version (user agent)\n- Device information\n- Login timestamps\n- Pages visited within the Service\n\n### 1.3 Cookies\nWe use cookies for authentication purposes. See our [Cookie Policy](/cookies) for details.\n\n## 2. How We Use Your Information\n\nWe use your personal data to:\n- Provide and maintain the Service\n- Authenticate your identity\n- Send important notifications about the Service\n- Detect and prevent security issues\n\n## 3. Data Retention\n\n| Data Type | Retention Period |\n|-----------|------------------|\n| Account data | Until you delete your account |\n| Authentication logs | 90 days |\n| Session tokens | 7 days |\n\n## 4. Your Rights (GDPR/CCPA/LGPD)\n\nYou have the right to:\n\n### 4.1 Access Your Data\nYou can export all your personal data at any time through Settings > Privacy > Export My Data.\n\n### 4.2 Delete Your Account\nYou can permanently delete your account and all associated data through Settings > Privacy > Delete Account.\n\n### 4.3 Rectification\nYou can update your personal information through your account settings.\n\n### 4.4 Data Portability\nYour data export is provided in JSON format, which is machine-readable and can be transferred to other services.\n\n### 4.5 Withdraw Consent\nYou can withdraw consent for marketing communications at any time through your account settings.\n\n## 5. Data Security\n\nWe implement industry-standard security measures:\n- Passwords are hashed using bcrypt\n- All data transmitted over HTTPS\n- Session tokens are stored in HTTP-only cookies\n- Rate limiting on authentication endpoints\n\n## 6. Third-Party Services\n\nWe may use third-party services for:\n- Error monitoring (optional, configurable)\n- Analytics (optional, requires consent)\n\n## 7. Children's Privacy\n\nOur Service is not intended for children under 13. We do not knowingly collect personal data from children.\n\n## 8. Changes to This Policy\n\nWe may update this Privacy Policy from time to time. We will notify you of any changes by posting the new policy on this page and updating the \"Effective Date\".\n\n## 9. Contact Us\n\nIf you have questions about this Privacy Policy, please contact us at:\n\n**Email:** {{CONTACT_EMAIL}}`,\n es: `# Política de Privacidad\n\n**Fecha de vigencia:** {{EFFECTIVE_DATE}}\n\n{{COMPANY_NAME}} (\"nosotros\", \"nos\" o \"nuestro\") opera {{APP_NAME}} (el \"Servicio\"). Esta página le informa sobre nuestras políticas respecto a la recopilación, uso y divulgación de datos personales cuando utiliza nuestro Servicio.\n\n## 1. Información que Recopilamos\n\n### 1.1 Información de Cuenta\nCuando crea una cuenta, recopilamos:\n- Dirección de correo electrónico\n- Nombre\n- Contraseña (almacenada de forma segura usando hash bcrypt)\n\n### 1.2 Datos de Uso\nRecopilamos automáticamente:\n- Dirección IP\n- Tipo y versión del navegador (user agent)\n- Información del dispositivo\n- Marcas de tiempo de inicio de sesión\n- Páginas visitadas dentro del Servicio\n\n### 1.3 Cookies\nUtilizamos cookies con fines de autenticación. Consulte nuestra [Política de Cookies](/cookies) para más detalles.\n\n## 2. Cómo Usamos su Información\n\nUtilizamos sus datos personales para:\n- Proporcionar y mantener el Servicio\n- Autenticar su identidad\n- Enviar notificaciones importantes sobre el Servicio\n- Detectar y prevenir problemas de seguridad\n\n## 3. Retención de Datos\n\n| Tipo de Dato | Período de Retención |\n|--------------|---------------------|\n| Datos de cuenta | Hasta que elimine su cuenta |\n| Registros de autenticación | 90 días |\n| Tokens de sesión | 7 días |\n\n## 4. Sus Derechos (RGPD/CCPA/LGPD)\n\nUsted tiene derecho a:\n\n### 4.1 Acceder a sus Datos\nPuede exportar todos sus datos personales en cualquier momento a través de Configuración > Privacidad > Exportar Mis Datos.\n\n### 4.2 Eliminar su Cuenta\nPuede eliminar permanentemente su cuenta y todos los datos asociados a través de Configuración > Privacidad > Eliminar Cuenta.\n\n### 4.3 Rectificación\nPuede actualizar su información personal a través de la configuración de su cuenta.\n\n### 4.4 Portabilidad de Datos\nSu exportación de datos se proporciona en formato JSON, que es legible por máquina y puede transferirse a otros servicios.\n\n### 4.5 Retirar el Consentimiento\nPuede retirar el consentimiento para comunicaciones de marketing en cualquier momento a través de la configuración de su cuenta.\n\n## 5. Seguridad de los Datos\n\nImplementamos medidas de seguridad estándar de la industria:\n- Las contraseñas se almacenan con hash usando bcrypt\n- Todos los datos se transmiten sobre HTTPS\n- Los tokens de sesión se almacenan en cookies HTTP-only\n- Limitación de tasa en endpoints de autenticación\n\n## 6. Servicios de Terceros\n\nPodemos usar servicios de terceros para:\n- Monitoreo de errores (opcional, configurable)\n- Analíticas (opcional, requiere consentimiento)\n\n## 7. Privacidad de Menores\n\nNuestro Servicio no está dirigido a menores de 13 años. No recopilamos intencionalmente datos personales de menores.\n\n## 8. Cambios a esta Política\n\nPodemos actualizar esta Política de Privacidad de vez en cuando. Le notificaremos de cualquier cambio publicando la nueva política en esta página y actualizando la \"Fecha de vigencia\".\n\n## 9. Contáctenos\n\nSi tiene preguntas sobre esta Política de Privacidad, contáctenos en:\n\n**Email:** {{CONTACT_EMAIL}}`\n }\n },\n\n fields: {\n title: useJsonField({\n label: { en: 'Title', es: 'Título' },\n hint: { en: 'Localized title { en: \"...\", es: \"...\" }', es: 'Título localizado { en: \"...\", es: \"...\" }' },\n required: true\n }),\n content: useJsonField({\n label: { en: 'Content', es: 'Contenido' },\n hint: { en: 'Localized markdown content { en: \"...\", es: \"...\" }. Use {{APP_NAME}}, {{COMPANY_NAME}}, {{CONTACT_EMAIL}}, {{DPO_EMAIL}}', es: 'Contenido markdown localizado { en: \"...\", es: \"...\" }. Usa {{APP_NAME}}, {{COMPANY_NAME}}, {{CONTACT_EMAIL}}, {{DPO_EMAIL}}' },\n required: true\n })\n },\n\n casl: {\n subject: 'PrivacyPolicy',\n permissions: {\n ADMIN: { actions: ['read', 'update'] }\n }\n }\n}\n\n// ============================================================================\n// COOKIE POLICY (SingleEntity)\n// ============================================================================\n\n/**\n * Cookie Policy - Single editable document.\n * Content supports markdown with placeholders.\n */\nexport const cookiePolicyEntity: SingleEntityDefinition = {\n type: 'single',\n key: 'cookie_policy',\n label: { en: 'Cookie Policy', es: 'Política de cookies' },\n routePrefix: '/cookie-policy',\n\n defaults: {\n title: { en: 'Cookie Policy', es: 'Política de Cookies' },\n content: {\n en: `# Cookie Policy\n\n**Effective Date:** {{EFFECTIVE_DATE}}\n\nThis Cookie Policy explains how {{COMPANY_NAME}} (\"we\", \"us\", or \"our\") uses cookies and similar technologies when you use {{APP_NAME}} (the \"Service\").\n\n## 1. What Are Cookies?\n\nCookies are small text files stored on your device when you visit a website. They help the website remember your preferences and improve your experience.\n\n## 2. Types of Cookies We Use\n\n### 2.1 Strictly Necessary Cookies\n\nThese cookies are essential for the Service to function. They cannot be disabled.\n\n| Cookie Name | Purpose | Duration |\n|-------------|---------|----------|\n| refreshToken | Authentication session | 7 days |\n\n**Legal Basis:** Legitimate interest (necessary for service operation)\n\n### 2.2 Functional Cookies\n\nThese cookies remember your preferences to enhance your experience.\n\n| Cookie Name | Purpose | Duration |\n|-------------|---------|----------|\n| theme | Light/dark mode preference | 1 year |\n| locale | Language preference | 1 year |\n| cookieConsent | Your cookie preferences | 1 year |\n\n**Legal Basis:** Consent\n\n### 2.3 Analytics Cookies (Optional)\n\nIf enabled, these cookies help us understand how visitors use the Service.\n\n**Legal Basis:** Consent (opt-in required)\n\n### 2.4 Marketing Cookies (Optional)\n\nIf enabled, these cookies track your activity for advertising purposes.\n\n**Legal Basis:** Consent (opt-in required)\n\n## 3. Managing Your Cookie Preferences\n\n### 3.1 Through Our Service\nYou can manage your cookie preferences at any time through the cookie banner or Settings > Privacy > Cookie Preferences.\n\n### 3.2 Through Your Browser\nMost browsers allow you to:\n- View cookies stored on your device\n- Delete cookies\n- Block cookies from specific or all websites\n\n**Note:** Blocking strictly necessary cookies may prevent you from using the Service.\n\n## 4. Third-Party Cookies\n\nWe may allow third-party services to set cookies on your device. These third parties have their own privacy policies.\n\n## 5. Do Not Track\n\nSome browsers have a \"Do Not Track\" feature. We currently do not respond to Do Not Track signals.\n\n## 6. Cookie Consent\n\nUnder GDPR, LGPD, and similar regulations:\n- **Strictly necessary cookies** do not require consent\n- **All other cookies** require your explicit consent before being set\n- You can withdraw consent at any time\n\n## 7. Updates to This Policy\n\nWe may update this Cookie Policy from time to time. Changes will be posted on this page with an updated \"Effective Date\".\n\n## 8. Contact Us\n\nIf you have questions about our use of cookies, please contact us at:\n\n**Email:** {{CONTACT_EMAIL}}`,\n es: `# Política de Cookies\n\n**Fecha de vigencia:** {{EFFECTIVE_DATE}}\n\nEsta Política de Cookies explica cómo {{COMPANY_NAME}} (\"nosotros\", \"nos\" o \"nuestro\") utiliza cookies y tecnologías similares cuando usa {{APP_NAME}} (el \"Servicio\").\n\n## 1. ¿Qué son las Cookies?\n\nLas cookies son pequeños archivos de texto almacenados en su dispositivo cuando visita un sitio web. Ayudan al sitio web a recordar sus preferencias y mejorar su experiencia.\n\n## 2. Tipos de Cookies que Usamos\n\n### 2.1 Cookies Estrictamente Necesarias\n\nEstas cookies son esenciales para que el Servicio funcione. No se pueden desactivar.\n\n| Nombre | Propósito | Duración |\n|--------|-----------|----------|\n| refreshToken | Sesión de autenticación | 7 días |\n\n**Base Legal:** Interés legítimo (necesario para la operación del servicio)\n\n### 2.2 Cookies Funcionales\n\nEstas cookies recuerdan sus preferencias para mejorar su experiencia.\n\n| Nombre | Propósito | Duración |\n|--------|-----------|----------|\n| theme | Preferencia modo claro/oscuro | 1 año |\n| locale | Preferencia de idioma | 1 año |\n| cookieConsent | Sus preferencias de cookies | 1 año |\n\n**Base Legal:** Consentimiento\n\n### 2.3 Cookies de Analíticas (Opcional)\n\nSi están habilitadas, estas cookies nos ayudan a entender cómo los visitantes usan el Servicio.\n\n**Base Legal:** Consentimiento (requiere opt-in)\n\n### 2.4 Cookies de Marketing (Opcional)\n\nSi están habilitadas, estas cookies rastrean su actividad con fines publicitarios.\n\n**Base Legal:** Consentimiento (requiere opt-in)\n\n## 3. Gestionar sus Preferencias de Cookies\n\n### 3.1 A través de Nuestro Servicio\nPuede gestionar sus preferencias de cookies en cualquier momento a través del banner de cookies o en Configuración > Privacidad > Preferencias de Cookies.\n\n### 3.2 A través de su Navegador\nLa mayoría de navegadores le permiten:\n- Ver las cookies almacenadas en su dispositivo\n- Eliminar cookies\n- Bloquear cookies de sitios específicos o de todos los sitios\n\n**Nota:** Bloquear las cookies estrictamente necesarias puede impedirle usar el Servicio.\n\n## 4. Cookies de Terceros\n\nPodemos permitir que servicios de terceros coloquen cookies en su dispositivo. Estos terceros tienen sus propias políticas de privacidad.\n\n## 5. No Rastrear\n\nAlgunos navegadores tienen una función \"No Rastrear\". Actualmente no respondemos a señales de No Rastrear.\n\n## 6. Consentimiento de Cookies\n\nSegún el RGPD, LGPD y regulaciones similares:\n- **Las cookies estrictamente necesarias** no requieren consentimiento\n- **Todas las demás cookies** requieren su consentimiento explícito antes de ser colocadas\n- Puede retirar el consentimiento en cualquier momento\n\n## 7. Actualizaciones de esta Política\n\nPodemos actualizar esta Política de Cookies de vez en cuando. Los cambios se publicarán en esta página con una \"Fecha de vigencia\" actualizada.\n\n## 8. Contáctenos\n\nSi tiene preguntas sobre nuestro uso de cookies, contáctenos en:\n\n**Email:** {{CONTACT_EMAIL}}`\n }\n },\n\n fields: {\n title: useJsonField({\n label: { en: 'Title', es: 'Título' },\n hint: { en: 'Localized title { en: \"...\", es: \"...\" }', es: 'Título localizado { en: \"...\", es: \"...\" }' },\n required: true\n }),\n content: useJsonField({\n label: { en: 'Content', es: 'Contenido' },\n hint: { en: 'Localized markdown content { en: \"...\", es: \"...\" }. Use {{APP_NAME}}, {{COMPANY_NAME}}, {{CONTACT_EMAIL}}', es: 'Contenido markdown localizado { en: \"...\", es: \"...\" }. Usa {{APP_NAME}}, {{COMPANY_NAME}}, {{CONTACT_EMAIL}}' },\n required: true\n })\n },\n\n casl: {\n subject: 'CookiePolicy',\n permissions: {\n ADMIN: { actions: ['read', 'update'] }\n }\n }\n}\n\n// ============================================================================\n// CONSENT AUDIT LOG (EventEntity)\n// ============================================================================\n\n/**\n * Consent Audit Log - Immutable record of consent changes.\n * Append-only, no update/delete allowed.\n * Retention: 5 years (GDPR requirement for audit trails).\n */\nexport const consentAuditLogEntity: EventEntityDefinition = {\n type: 'event',\n immutable: true,\n table: 'consent_audit',\n label: { en: 'Consent Audit Log', es: 'Registro de auditoría de consentimiento' },\n labelField: 'event_type',\n routePrefix: '/audit-log',\n retention: { days: 1825 }, // 5 years\n\n fields: {\n id: useIdField(),\n user_id: useSelectField({\n label: { en: 'User ID', es: 'ID de usuario' },\n hint: { en: 'User ID (nullable if user was deleted)', es: 'ID de usuario (nulo si el usuario fue eliminado)' },\n table: 'users',\n column: 'id',\n endpoint: '/users',\n onDelete: 'SET NULL',\n nullable: true,\n index: true,\n meta: { searchable: true }\n }),\n user_email: useEmailField({\n label: { en: 'User Email', es: 'Email del usuario' },\n hint: { en: 'Copy of email at time of consent (for audit trail)', es: 'Copia del email en el momento del consentimiento (para auditoría)' },\n nullable: false,\n meta: { searchable: true }\n }),\n event_type: useSelectField({\n label: { en: 'Event Type', es: 'Tipo de evento' },\n options: [...CONSENT_EVENT_TYPE_OPTIONS],\n nullable: false,\n meta: { searchable: true }\n }),\n terms_version: useTextField({\n label: { en: 'Terms Version', es: 'Versión de términos' },\n hint: { en: 'Version of terms accepted/revoked', es: 'Versión de términos aceptados/revocados' },\n size: 20,\n nullable: false,\n meta: { searchable: true }\n }),\n marketing_opt_in: useCheckboxField({\n label: { en: 'Marketing Opt-in', es: 'Aceptación de marketing' }\n }),\n ip_address: useTextField({\n label: { en: 'IP Address', es: 'Dirección IP' },\n size: 45,\n nullable: true,\n meta: { exportable: false }\n }),\n user_agent: useTextareaField({\n label: { en: 'User Agent', es: 'Agente de usuario' },\n nullable: true,\n meta: { exportable: false }\n }),\n created_at: useDatetimeField({\n label: { en: 'Timestamp', es: 'Marca de tiempo' },\n disabled: true,\n nullable: false,\n meta: { sortable: true }\n })\n },\n\n casl: {\n subject: 'ConsentAuditLog',\n permissions: {\n AUDITOR: { actions: ['read'] }\n }\n }\n}\n"],"mappings":"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","names":[]}