apacuana-sdk-core 0.14.0 → 0.16.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.
package/README.md CHANGED
@@ -1,9 +1,11 @@
1
1
  # Apacuana SDK Core
2
2
 
3
3
  ## Descripción
4
+
4
5
  `Apacuana SDK Core` es una biblioteca de JavaScript que proporciona una interfaz para interactuar con los servicios de Apacuana, permitiendo la generación de certificados digitales, firma de documentos, y otras operaciones relacionadas con la identidad digital.
5
6
 
6
7
  ## Tabla de Contenidos
8
+
7
9
  - [Instalación](#instalación)
8
10
  - [Inicialización](#inicialización)
9
11
  - [Conceptos Clave](#conceptos-clave)
@@ -12,11 +14,13 @@
12
14
  - [Licencia](#licencia)
13
15
 
14
16
  ## Instalación
17
+
15
18
  ```bash
16
19
  npm install apacuana-sdk-core
17
20
  ```
18
21
 
19
22
  ## Inicialización
23
+
20
24
  Antes de utilizar el SDK, debes inicializarlo con tu configuración.
21
25
 
22
26
  ```javascript
@@ -40,7 +44,9 @@ try {
40
44
  ```
41
45
 
42
46
  ## Conceptos Clave
47
+
43
48
  ### Tipos de Integración
49
+
44
50
  El SDK soporta dos tipos de integración (`integrationType`) que determinan cómo se interactúa con la plataforma de Apacuana:
45
51
 
46
52
  - **`ONBOARDING`**: En este modo, Apacuana gestiona la mayor parte del proceso, como el registro de usuarios y la generación de certificados. Es el modo recomendado y soportado para la mayoría de las integraciones.
@@ -49,272 +55,475 @@ El SDK soporta dos tipos de integración (`integrationType`) que determinan cóm
49
55
 
50
56
  La elección del `integrationType` en la `init` es fundamental, ya que afecta a la disponibilidad y el comportamiento de muchos de los métodos del SDK.
51
57
 
58
+ ### Inicialización y acceso a funciones públicas/privadas
59
+
60
+ El SDK puede inicializarse sin el parámetro `customerId`, lo que permite el acceso únicamente a las funciones públicas. Para acceder a las funciones privadas, es necesario inicializar el SDK incluyendo el `customerId` en la configuración.
61
+
62
+ **Funciones públicas disponibles sin `customerId`:**
63
+
64
+ - `getConfig()`
65
+ - `getCertTypes()`
66
+ - `getRequerimentsByTypeUser(params)`
67
+ - `createApacuanaUser(params)`
68
+
69
+ **Funciones privadas (requieren `customerId`):**
70
+
71
+ - `getCustomer()`
72
+ - `generateCert(params)`
73
+ - `getCertStatus(params)`
74
+ - `addSigner(params)`
75
+ - `getDocs(params)`
76
+ - `getDigest(params)`
77
+ - `signDocument(params)`
78
+ - `uploadSignatureVariant(params)`
79
+ - `getSignatureVariant()`
80
+ - `deleteSignatureVariant()`
81
+ - `createFaceLivenessSession()`
82
+ - `validateFaceLiveness({ sessionId })`
83
+ - `requestRevocation(params)`
84
+ - `getRevocationReasons()`
85
+
86
+ El SDK valida automáticamente si tienes acceso a cada función según la configuración actual, y lanzará un error si intentas acceder a una función privada sin haber inicializado correctamente con el `customerId`.
87
+
52
88
  ## Interfaz Pública
89
+
53
90
  Todas las funciones asíncronas devuelven una instancia de `ApacuanaSuccess` si tienen éxito, o lanzan una `ApacuanaAPIError` si fallan.
54
91
 
55
92
  ### `init(config)`
93
+
56
94
  Inicializa el SDK.
57
95
 
58
- - `config`: Objeto de configuración.
96
+ #### Parámetros requeridos en `config`:
97
+
98
+ | Propiedad | Tipo | Descripción |
99
+ | ----------------- | ------ | ------------------------------------------------------------------------ |
100
+ | `apiUrl` | String | URL base de la API de Apacuana. |
101
+ | `secretKey` | String | Clave secreta proporcionada por Apacuana. |
102
+ | `apiKey` | String | API Key proporcionada por Apacuana. |
103
+ | `verificationId` | String | Identificador de verificación del cliente. |
104
+ | `integrationType` | String | Tipo de integración. Valores permitidos: `ONBOARDING`, `ONPREMISE`. |
105
+ | `customerId` | String | (Opcional) Identificador del usuario. Requerido para funciones privadas. |
106
+
107
+ #### Comportamiento:
108
+
109
+ - Si se inicializa **sin** `customerId`, el SDK solo permite el uso de funciones públicas.
110
+ - Si se inicializa **con** `customerId`, el SDK obtiene el token y los datos del usuario, permitiendo el acceso a funciones privadas.
111
+ - Si falta algún campo obligatorio o el `integrationType` no es válido, se lanzará un error.
112
+
113
+ #### Ejemplo:
114
+
115
+ ```javascript
116
+ import apacuana from "apacuana-sdk-core";
117
+
118
+ const config = {
119
+ apiUrl: "https://api.url",
120
+ secretKey: "tu-secret-key",
121
+ apiKey: "tu-api-key",
122
+ verificationId: "tu-verification-id",
123
+ integrationType: "ONBOARDING", // o "ONPREMISE"
124
+ customerId: "tu-customer-id", // Opcional
125
+ };
126
+
127
+ try {
128
+ await apacuana.init(config);
129
+ console.log("SDK inicializado correctamente.");
130
+ } catch (error) {
131
+ console.error("Error al inicializar el SDK:", error);
132
+ }
133
+ ```
59
134
 
60
135
  ### `close()`
136
+
61
137
  Cierra la sesión del SDK y limpia la configuración.
62
138
 
63
139
  **Ejemplo:**
140
+
64
141
  ```javascript
65
142
  apacuana.close();
66
143
  console.log("Sesión del SDK cerrada.");
67
144
  ```
68
145
 
69
146
  ### `getConfig()`
147
+
70
148
  Devuelve la configuración actual.
71
149
 
72
150
  **Ejemplo:**
151
+
73
152
  ```javascript
74
153
  const currentConfig = apacuana.getConfig();
75
154
  console.log("Configuración actual:", currentConfig);
76
155
  ```
77
156
 
78
157
  ### `getCustomer()`
79
- Obtiene los datos del cliente. Este método es el punto de entrada para iniciar una sesión y obtener el token y la información del usuario.
80
158
 
81
- **Ejemplo:**
82
- ```javascript
83
- try {
84
- const response = await apacuana.getCustomer();
85
- console.log("Datos del cliente:", response.data);
86
- } catch (error) {
87
- console.error("Error al obtener el cliente:", error.message);
88
- }
159
+ Obtiene los datos del usuario autenticado (customer) y su token de sesión. Este método solo está disponible si el SDK fue inicializado con customerId. No requiere parámetros de entrada. El resultado vendrá en el objeto `data` del response, incluyendo información relevante del usuario y el token de autenticación.
160
+
161
+ **Ejemplo de uso:**
162
+
163
+ ```js
164
+ const result = await apacuana.getCustomer();
165
+ // result.data contendrá los datos del usuario y el token
89
166
  ```
90
167
 
91
- ### `generateCert(encryptedCSR)`
168
+ ### `generateCert(params)`
169
+
92
170
  Genera un nuevo certificado digital.
93
171
 
94
- - `encryptedCSR`: Objeto con la CSR encriptada.
95
- - `csr` (String): El Certificate Signing Request encriptado.
172
+ #### Parámetros:
173
+
174
+ - `params`: Objeto con la propiedad obligatoria:
175
+ - `csr` (String): Certificate Signing Request encriptado (por ejemplo, en formato Base64).
176
+
177
+ #### Comportamiento:
178
+
179
+ - Solo disponible para `integrationType: ONBOARDING`. Si se usa con `ONPREMISE`, lanzará un error `NOT_IMPLEMENTED`.
180
+ - Realiza una solicitud a la API y devuelve una instancia de `ApacuanaSuccess`.
181
+
182
+ #### Respuesta:
183
+
184
+ ```js
185
+ {
186
+ success: true,
187
+ data: {
188
+ cert: "...", // Certificado generado en formato string
189
+ certifiedid: "..." // ID del certificado generado
190
+ }
191
+ }
192
+ ```
193
+
194
+ #### Ejemplo:
96
195
 
97
- **Ejemplo:**
98
196
  ```javascript
99
197
  try {
100
198
  const csr = { csr: "MIIC...==" }; // CSR en formato Base64
101
199
  const response = await apacuana.generateCert(csr);
102
- console.log("Certificado generado:", response.data);
200
+ console.log("Certificado generado:", response.data.cert);
201
+ console.log("ID del certificado:", response.data.certifiedid);
103
202
  } catch (error) {
104
203
  console.error("Error al generar el certificado:", error.message);
105
204
  }
106
205
  ```
107
206
 
108
- ### `getCertStatus(isCertificateInDevice)`
207
+ ### `getCertStatus(params)`
208
+
109
209
  Obtiene el estado del certificado del usuario.
110
210
 
111
- - `isCertificateInDevice` (Boolean): Indica si el certificado ya está almacenado localmente.
211
+ #### Parámetros:
212
+
213
+ - `params` (Boolean): Indica si el certificado ya está almacenado localmente en el dispositivo.
214
+
215
+ #### Respuesta:
216
+
217
+ ```js
218
+ {
219
+ success: true,
220
+ data: {
221
+ status: {
222
+ text: "...", // Estado legible del certificado
223
+ descriptionText: "..." // Descripción adicional (puede ser undefined)
224
+ }
225
+ }
226
+ }
227
+ ```
228
+
229
+ Los posibles valores de `text` incluyen:
230
+
231
+ - "Por verificar"
232
+ - "En revisión"
233
+ - "Por generar"
234
+ - "Vigente"
235
+ - "Por revocar"
236
+ - "Revocado"
237
+ - "Verificado"
238
+ - "Certificado expirado"
239
+
240
+ #### Ejemplo:
112
241
 
113
- **Ejemplo:**
114
242
  ```javascript
115
243
  try {
116
244
  const response = await apacuana.getCertStatus(false);
117
- console.log("Estado del certificado:", response.data);
245
+ console.log("Estado del certificado:", response.data.status.text);
246
+ if (response.data.status.descriptionText) {
247
+ console.log("Descripción:", response.data.status.descriptionText);
248
+ }
118
249
  } catch (error) {
119
250
  console.error("Error al obtener el estado del certificado:", error.message);
120
251
  }
121
252
  ```
122
253
 
123
254
  ### `getCertTypes()`
255
+
124
256
  Obtiene los tipos de certificados disponibles.
125
257
 
126
- **Ejemplo:**
258
+ #### Comportamiento:
259
+
260
+ - Solo disponible para `integrationType: ONBOARDING`. Si se usa con `ONPREMISE`, lanzará un error `NOT_IMPLEMENTED`.
261
+ - Devuelve una instancia de `ApacuanaSuccess` con la propiedad `types`, que es un array de tipos de certificado.
262
+
263
+ #### Respuesta:
264
+
265
+ ```js
266
+ {
267
+ success: true,
268
+ data: {
269
+ types: [
270
+ { ... },
271
+ // ...otros tipos de certificado
272
+ ]
273
+ }
274
+ }
275
+ ```
276
+
277
+ #### Ejemplo:
278
+
127
279
  ```javascript
128
280
  try {
129
281
  const response = await apacuana.getCertTypes();
130
- console.log("Tipos de certificados:", response.data);
282
+ console.log("Tipos de certificados:", response.data.types);
131
283
  } catch (error) {
132
284
  console.error("Error al obtener los tipos de certificado:", error.message);
133
285
  }
134
286
  ```
135
287
 
136
288
  ### `getRequerimentsByTypeUser(params)`
289
+
137
290
  Obtiene los requisitos para un tipo de certificado y usuario.
138
291
 
139
- - `params`: Objeto con los parámetros de la consulta.
292
+ #### Parámetros:
293
+
294
+ - `params`: Objeto con la propiedad obligatoria:
140
295
  - `type` (Number): El tipo de certificado.
141
296
 
142
- **Ejemplo:**
297
+ #### Comportamiento:
298
+
299
+ - Solo disponible para `integrationType: ONBOARDING`. Si se usa con `ONPREMISE`, lanzará un error `NOT_IMPLEMENTED`.
300
+ - Devuelve una instancia de `ApacuanaSuccess`
301
+
302
+ #### Respuesta:
303
+
304
+ ```js
305
+ {
306
+ success: true,
307
+ data: {
308
+ ...
309
+ }
310
+ }
311
+ ```
312
+
313
+ #### Ejemplo:
314
+
143
315
  ```javascript
144
316
  try {
145
317
  const response = await apacuana.getRequerimentsByTypeUser({ type: 1 });
146
- console.log("Requisitos:", response.data);
318
+ console.log("Requisitos:", response.data.requirements);
147
319
  } catch (error) {
148
320
  console.error("Error al obtener los requisitos:", error.message);
149
321
  }
150
322
  ```
151
323
 
152
- ### `addSigner(signerData)`
153
-
154
- Añade un firmante a un documento. El comportamiento de esta función y sus campos obligatorios dependen del `integrationType` configurado durante la inicialización.
155
-
156
- - **Para `integrationType: 'ONBOARDING'`**:
157
- Esta integración requiere que el documento se envíe como un archivo (`File` object). La validación de los datos se realiza a través de un helper que exige los siguientes campos:
158
-
159
- - **`signerData`**: Objeto con los datos del firmante y el documento.
160
- - `name` (String, **obligatorio**): Nombre del documento.
161
- - `document` (File, **obligatorio**): El archivo del documento a firmar (ej. un PDF). No se puede usar junto con `reference`.
162
- - `reference` (String, **obligatorio**): Referencia única para un documento ya existente en la plataforma. No se puede usar junto con `document`.
163
- - `typedoc` (String, **obligatorio**): Tipo de documento de identidad del firmante. Valores permitidos: `"V"`, `"P"`, `"E"`.
164
- - `doc` (String, **obligatorio**): Número de documento de identidad del firmante.
165
- - `signature` (Array, **obligatorio**): Un array de objetos que definen la posición de la firma. Debe contener al menos un objeto con:
166
- - `page` (Number, **obligatorio**): Página donde se estampará la firma (entero positivo).
167
- - `x` (Number, **obligatorio**): Coordenada X (de 0 a 1).
168
- - `y` (Number, **obligatorio**): Coordenada Y (de 0 a 1).
169
-
170
- **Ejemplo (`ONBOARDING`):**
171
- ```javascript
172
- try {
173
- // documentFile debe ser una instancia de File
174
- const documentFile = new File(["contenido"], "contrato.pdf", { type: "application/pdf" });
175
-
176
- const signer = {
177
- name: "Contrato",
178
- document: documentFile,
179
- typedoc: "V",
180
- doc: "12345678",
181
- signature: [{ page: 1, x: 0.5, y: 0.5 }],
182
- };
183
- const response = await apacuana.addSigner(signer);
184
- console.log("Firmante añadido:", response.data);
185
- } catch (error) {
186
- console.error("Error al añadir firmante:", error.message);
187
- }
188
- ```
189
-
190
- - **Para `integrationType: 'onpremise'`**:
191
- En esta integración, el `signerData` se envía como un objeto JSON. El documento no se envía como un archivo. La validación es más flexible en el lado del cliente.
192
-
193
- - **`signerData`**: Objeto con los datos del firmante.
194
- - `name` (String): Nombre del documento.
195
- - `reference` (String): Referencia única para el documento.
196
- - `typedoc` (String): Tipo de documento de identidad del firmante.
197
- - `doc` (String): Número de documento de identidad del firmante.
198
- - `signature` (Array): Posición de la firma.
199
-
200
- **Ejemplo (`onpremise`):**
201
- ```javascript
202
- try {
203
- const signer = {
204
- name: "Contrato",
205
- reference: "REF-001",
206
- typedoc: "V",
207
- doc: "12345678",
208
- signature: [{ page: 1, x: 0.5, y: 0.5 }],
209
- };
210
- const response = await apacuana.addSigner(signer);
211
- console.log("Firmante añadido:", response.data);
212
- } catch (error) {
213
- console.error("Error al añadir firmante:", error.message);
214
- }
215
- ```
324
+ ### `addSigner(params)`
216
325
 
217
- ### `getDocs(data)`
218
- Obtiene una lista paginada de documentos.
326
+ Añade un firmante a un documento. El comportamiento y los campos obligatorios dependen del `integrationType` configurado durante la inicialización.
219
327
 
220
- - `data`: Objeto con parámetros de paginación (`page`, `size`) y filtro (`status`).
328
+ #### Parámetros:
221
329
 
222
- **Ejemplo:**
223
- ```javascript
224
- try {
225
- const params = { page: 1, size: 10, status: 0 };
226
- const response = await apacuana.getDocs(params);
227
- console.log("Documentos:", response.data);
228
- } catch (error) {
229
- console.error("Error al obtener los documentos:", error.message);
230
- }
231
- ```
330
+ - **`params`**: Objeto con los datos del firmante y el documento.
331
+ - `name` (String, **obligatorio**): Nombre del documento.
332
+ - `document` (File, **opcional**): El archivo del documento a firmar (ej. un PDF). No puede coexistir con `reference`.
333
+ - `reference` (String, **opcional**): Referencia única para un documento ya existente en la plataforma. No puede coexistir con `document`.
334
+ - `typedoc` (String, **obligatorio**): Tipo de documento de identidad del firmante. Valores permitidos: "V", "P", "E".
335
+ - `doc` (String, **obligatorio**): Número de documento de identidad del firmante.
336
+ - `signature` (Array, **obligatorio**): Un array de objetos que definen la posición de la firma. Debe contener al menos un objeto con:
337
+ - `page` (Number, **obligatorio**): Página donde se estampará la firma (entero positivo).
338
+ - `x` (Number, **obligatorio**): Coordenada X (de 0 a 1, porcentual respecto al ancho del PDF).
339
+ - `y` (Number, **obligatorio**): Coordenada Y (de 0 a 1, porcentual respecto al alto del PDF).
232
340
 
233
- ### `getDigest(signData)`
234
- Obtiene el digest de un documento para ser firmado. Un helper valida que se incluyan los siguientes campos obligatorios:
341
+ **Notas sobre `document` y `reference`:**
235
342
 
236
- - **`signData`**: Objeto con los siguientes datos:
237
- - `cert` (String, **obligatorio**): El certificado en formato Base64.
238
- - `signatureId` (String, **obligatorio**): El ID de la firma que se está procesando.
343
+ - Solo uno de estos parámetros debe ser enviado. Si el cliente tiene integración con el gestor documental de Apacuana, se debe usar `reference` para referenciar el documento existente en la plataforma.
344
+ - Si no existe integración documental, se debe enviar el archivo `document` (File). Este archivo será posteriormente solicitado para la firma del documento luego de ser asignado.
345
+
346
+ **Notas sobre posicionamiento:**
347
+
348
+ - Las coordenadas `x` e `y` son porcentuales y van de 0 a 1.
349
+ - El origen (0,0) está en la esquina superior izquierda del PDF.
350
+ - Ejemplos de posicionamiento:
351
+ - Esquina superior izquierda: `{ x: 0, y: 0 }`
352
+ - Esquina superior derecha: `{ x: 1, y: 0 }`
353
+ - Esquina inferior izquierda: `{ x: 0, y: 1 }`
354
+ - Centro de la página: `{ x: 0.5, y: 0.5 }`
355
+
356
+ #### Ejemplo:
239
357
 
240
- **Ejemplo:**
241
358
  ```javascript
242
359
  try {
243
- const params = {
244
- cert: "MIIC...==", // Certificado en Base64
245
- signatureId: "sig-123",
360
+ const signer = {
361
+ name: "Contrato",
362
+ document: documentFile, // Instancia de File
363
+ typedoc: "V",
364
+ doc: "12345678",
365
+ signature: [
366
+ { page: 1, x: 0, y: 0 }, // Esquina superior izquierda
367
+ { page: 1, x: 1, y: 0 }, // Esquina superior derecha
368
+ { page: 1, x: 0, y: 1 }, // Esquina inferior izquierda
369
+ { page: 1, x: 0.5, y: 0.5 }, // Centro de la página
370
+ ],
246
371
  };
247
- const response = await apacuana.getDigest(params);
248
- console.log("Digest del documento:", response.data);
372
+ const response = await apacuana.addSigner(signer);
373
+ console.log("Firmante añadido:", response.data);
249
374
  } catch (error) {
250
- console.error("Error al obtener el digest:", error.message);
375
+ console.error("Error al añadir firmante:", error.message);
251
376
  }
252
377
  ```
253
378
 
254
- ### `signDocument(signData)`
255
- Firma un documento utilizando el digest firmado. Un helper valida que se incluyan los siguientes campos obligatorios:
379
+ ### `getDocs(data)`
256
380
 
257
- - **`signData`**: Objeto con los siguientes datos:
258
- - `signature` (Object, **obligatorio**): Objeto que contiene el ID de la firma y las posiciones.
259
- - `id` (String, **obligatorio**): El ID de la firma.
260
- - `positions` (Array, **obligatorio**): Un array de objetos para ajustar la posición de la firma.
261
- - `cert` (String, **obligatorio**): El certificado en formato Base64.
262
- - `signedDigest` (String, **obligatorio**): El digest del documento ya firmado.
263
- - `document` (File, opcional): El archivo del documento, si es necesario para la integración.
381
+ Obtiene una lista paginada de documentos asociados al usuario autenticado, permitiendo aplicar filtros avanzados.
382
+
383
+ - `data`: Objeto con parámetros de paginación (`page`, `size`) y filtros opcionales (`status`). Puedes combinar estos filtros para obtener solo los documentos que cumplan con los criterios deseados.
384
+
385
+ - `filtros` : (`status`) 0 pendiente, 1 = completado/firmado, -1 rechazado
264
386
 
265
387
  **Ejemplo:**
388
+
266
389
  ```javascript
267
390
  try {
268
391
  const params = {
269
- signature: {
270
- id: "sig-123",
271
- positions: [{ page: 1, x: 0.5, y: 0.5, status: 1 }]
272
- },
273
- cert: "MIIC...==",
274
- signedDigest: "abc...",
392
+ page: 1,
393
+ size: 10,
394
+ status: 0, // Estado del documento
275
395
  };
276
- const response = await apacuana.signDocument(params);
277
- console.log("Documento firmado:", response.data);
396
+ const response = await apacuana.getDocs(params);
397
+ console.log("Documentos filtrados:", response.data);
278
398
  } catch (error) {
279
- console.error("Error al firmar el documento:", error.message);
399
+ console.error("Error al obtener los documentos:", error.message);
280
400
  }
281
401
  ```
282
402
 
283
- ### `uploadSignatureVariant(data)`
284
- Sube una imagen de firma.
403
+ **Notas:**
285
404
 
286
- - `data`: Objeto con la propiedad `file` (instancia de `File`, tipo `image/png`).
405
+ - Si no se especifican filtros, se devolverán todos los documentos paginados.
406
+ - Los filtros disponibles pueden variar según la integración y la versión de la API.
287
407
 
288
- **Ejemplo:**
289
- ```javascript
290
- // Este código se ejecutaría en un entorno de navegador
291
- const imageFile = new File(["..."], "firma.png", { type: "image/png" });
292
- try {
293
- const response = await apacuana.uploadSignatureVariant({ file: imageFile });
294
- console.log(response.data);
295
- } catch (error) {
296
- console.error("Error al subir la firma:", error.message);
297
- }
408
+ ### `getDigest(params)`
409
+
410
+ Obtiene el digest (resumen criptográfico) de un documento para el usuario autenticado. Este método requiere que el SDK esté inicializado con customerId.
411
+
412
+ El parámetro `params` debe incluir:
413
+
414
+ - `cert` (String, obligatorio): Certificado en formato Base64.
415
+ - `signatureId` (String, obligatorio): ID de la firma que se está procesando.
416
+ - `document` (File, opcional): Archivo del documento a firmar.
417
+
418
+ **Importante:**
419
+
420
+ - Si en el método `addSigner` se utilizó el parámetro `reference`, no es necesario incluir el archivo `document` al obtener el digest, ya que el documento está referenciado en la plataforma.
421
+ - Si en `addSigner` se utilizó el parámetro `document` (archivo), será necesario proporcionar nuevamente el archivo en este método para obtener el digest.
422
+
423
+ Ejemplo de uso:
424
+
425
+ ```js
426
+ // Caso con documento referenciado
427
+ const result = await apacuana.getDigest({
428
+ cert: "MIIC...==",
429
+ signatureId: "sig-123",
430
+ // No se requiere document
431
+ });
432
+
433
+ // Caso con documento por archivo
434
+ const result = await apacuana.getDigest({
435
+ cert: "MIIC...==",
436
+ signatureId: "sig-123",
437
+ document: documentFile, // Instancia de File
438
+ });
439
+ // result.data contendrá el digest y detalles para la firma
440
+ ```
441
+
442
+ ### `signDocument(params)`
443
+
444
+ Firma un documento utilizando el digest firmado y los datos de la firma. Este método requiere que el SDK esté inicializado con customerId.
445
+
446
+ El parámetro `params` debe incluir:
447
+
448
+ - `signature` (Object, obligatorio):
449
+ - `id` (String): ID de la firma.
450
+ - `positions` (Array): Posiciones de la firma en el documento.
451
+ - `cert` (String, obligatorio): Certificado en formato Base64.
452
+ - `signedDigest` (String, obligatorio): Digest firmado del documento.
453
+ - `document` (File, opcional): Archivo del documento a firmar.
454
+
455
+ **Importante:**
456
+
457
+ - El objeto `signature` debe ser obtenido directamente del array de documentos devuelto por el método `getDocsByCustomer`, específicamente del atributo `signaturedata` de dicho documento.
458
+
459
+ - Si en el método `addSigner` se utilizó el parámetro `reference`, no es necesario incluir el archivo `document` al firmar, ya que el documento está referenciado en la plataforma.
460
+ - Si en `addSigner` se utilizó el parámetro `document` (archivo), será necesario proporcionar nuevamente el archivo en este método para completar la firma.
461
+
462
+ Ejemplo de uso:
463
+
464
+ ```js
465
+ // Caso con documento referenciado
466
+ const result = await apacuana.signDocument({
467
+ signature: { id: "sig-123", positions: [{ page: 1, x: 0.5, y: 0.5 }] },
468
+ cert: "MIIC...==",
469
+ signedDigest: "abc...",
470
+ // No se requiere document
471
+ });
472
+
473
+ // Caso con documento por archivo
474
+ const result = await apacuana.signDocument({
475
+ signature: { id: "sig-123", positions: [{ page: 1, x: 0.5, y: 0.5 }] },
476
+ cert: "MIIC...==",
477
+ signedDigest: "abc...",
478
+ document: documentFile, // Instancia de File
479
+ });
480
+ // result.data contendrá la información del documento firmado
481
+ ```
482
+
483
+ ### `uploadSignatureVariant(params)`
484
+
485
+ Sube una imagen de variante de firma para el usuario autenticado. Este método requiere que el SDK esté inicializado con customerId.
486
+
487
+ El parámetro `params` debe incluir:
488
+
489
+ - `file` (File, obligatorio): Archivo de imagen en formato PNG (`image/png`).
490
+
491
+ **Notas importantes:**
492
+
493
+ - El archivo debe ser una instancia de `File` y tener el tipo MIME `image/png`.
494
+
495
+ Ejemplo de uso:
496
+
497
+ ```js
498
+ // En un entorno de navegador
499
+ const imageFile = new File(
500
+ [
501
+ /* datos */
502
+ ],
503
+ "firma.png",
504
+ { type: "image/png" }
505
+ );
506
+ const result = await apacuana.uploadSignatureVariant({ file: imageFile });
507
+ // result.data contendrá la información de la variante subida
298
508
  ```
299
509
 
300
510
  ### `getSignatureVariant()`
301
- Obtiene la imagen de la firma del usuario.
302
511
 
303
- **Ejemplo:**
304
- ```javascript
305
- try {
306
- const response = await apacuana.getSignatureVariant();
307
- // La imagen viene en Base64
308
- console.log("Firma obtenida (Base64):", response.data);
309
- } catch (error) {
310
- console.error("Error al obtener la firma:", error.message);
311
- }
512
+ Obtiene la imagen de la variante de firma registrada para el usuario autenticado. Este método solo está disponible si el SDK fue inicializado con customerId. No requiere parámetros de entrada. El resultado vendrá en el objeto `data` del response, normalmente como una cadena en formato Base64 que representa la imagen de la firma.
513
+
514
+ Ejemplo de uso:
515
+
516
+ ```js
517
+ const result = await apacuana.getSignatureVariant();
518
+ // result.data contendrá la imagen en Base64
312
519
  ```
313
520
 
314
521
  ### `deleteSignatureVariant()`
315
- Elimina la imagen de la firma del usuario.
522
+
523
+ Elimina la variante de firma almacenada para el usuario autenticado. Este método solo está disponible si el SDK fue inicializado con un customerId. No requiere parámetros de entrada. Si la operación es exitosa, el resultado vendrá en el objeto `data` del response. Si no existe una variante de firma registrada, la operación no tendrá efecto y el resultado indicará el estado actual.
316
524
 
317
525
  **Ejemplo:**
526
+
318
527
  ```javascript
319
528
  try {
320
529
  const response = await apacuana.deleteSignatureVariant();
@@ -325,27 +534,29 @@ try {
325
534
  ```
326
535
 
327
536
  ### `createFaceLivenessSession()`
328
- Crea una sesión de prueba de vida.
329
537
 
330
- **Ejemplo:**
331
- ```javascript
332
- try {
333
- const response = await apacuana.createFaceLivenessSession();
334
- console.log("ID de sesión de prueba de vida:", response.data);
335
- } catch (error) {
336
- console.error("Error al crear la sesión:", error.message);
337
- }
538
+ Crea una nueva sesión de prueba de vida (face liveness) para el usuario autenticado. Este método solo está disponible si el SDK fue inicializado con customerId. No requiere parámetros de entrada. El resultado vendrá en el objeto `data` del response, incluyendo el identificador único de la sesión creada.
539
+
540
+ Ejemplo de uso:
541
+
542
+ ```js
543
+ const result = await apacuana.createFaceLivenessSession();
544
+ // result.data contendrá el ID de la sesión de prueba de vida
338
545
  ```
339
546
 
340
547
  ### `validateFaceLiveness({ sessionId })`
548
+
341
549
  Valida el resultado de una sesión de prueba de vida.
342
550
 
343
551
  - `sessionId` (String, **obligatorio**): El ID de la sesión de prueba de vida que se va a validar.
344
552
 
345
553
  **Ejemplo:**
554
+
346
555
  ```javascript
347
556
  try {
348
- const response = await apacuana.validateFaceLiveness({ sessionId: "your-session-id" });
557
+ const response = await apacuana.validateFaceLiveness({
558
+ sessionId: "your-session-id",
559
+ });
349
560
  console.log("Resultado de la validación:", response.data);
350
561
  } catch (error) {
351
562
  console.error("Error al validar la sesión de prueba de vida:", error.message);
@@ -353,11 +564,35 @@ try {
353
564
  ```
354
565
 
355
566
  ### `requestRevocation(params)`
567
+
356
568
  Solicita la revocación de un certificado.
357
569
 
358
- - `params`: Objeto con la propiedad `reasonCode` (numérico).
570
+ Ejemplo de estructura de parámetros:
571
+
572
+ ```js
573
+ {
574
+ reasonCode: 1, // Código de la razón de revocación
575
+ }
576
+ ```
577
+
578
+ #### Comportamiento:
579
+
580
+ - Solo disponible para `integrationType: ONBOARDING`. Si se usa con `ONPREMISE`, lanzará un error `NOT_IMPLEMENTED`.
581
+ - Realiza una solicitud a la API y devuelve una instancia de `ApacuanaSuccess` con un mensaje de confirmación.
582
+
583
+ #### Respuesta:
584
+
585
+ ```js
586
+ {
587
+ success: true,
588
+ data: {
589
+ ...
590
+ }
591
+ }
592
+ ```
593
+
594
+ #### Ejemplo:
359
595
 
360
- **Ejemplo:**
361
596
  ```javascript
362
597
  try {
363
598
  const response = await apacuana.requestRevocation({ reasonCode: 1 });
@@ -368,39 +603,160 @@ try {
368
603
  ```
369
604
 
370
605
  ### `getRevocationReasons()`
371
- Obtiene la lista de razones para la revocación.
372
606
 
373
- **Ejemplo:**
607
+ Obtiene la lista de razones para la revocación de certificados.
608
+
609
+ #### Comportamiento:
610
+
611
+ - Solo disponible para `integrationType: ONBOARDING`. Si se usa con `ONPREMISE`, lanzará un error `NOT_IMPLEMENTED`.
612
+ - Devuelve una instancia de `ApacuanaSuccess` con un array de razones.
613
+
614
+ #### Respuesta:
615
+
616
+ ```js
617
+ {
618
+ success: true,
619
+ data: {
620
+ reasons: [ /* array de razones de revocación proporcionadas por la API */ ]
621
+ }
622
+ }
623
+ ```
624
+
625
+ #### Ejemplo:
626
+
374
627
  ```javascript
375
628
  try {
376
629
  const response = await apacuana.getRevocationReasons();
377
- console.log("Razones de revocación:", response.data);
630
+ console.log("Razones de revocación:", response.data.reasons);
378
631
  } catch (error) {
379
632
  console.error("Error al obtener las razones de revocación:", error.message);
380
633
  }
381
634
  ```
382
635
 
636
+ ### `createApacuanaUser(params)`
637
+
638
+ Crea un nuevo usuario en la plataforma de Apacuana. Este método puede llamarse varias veces para ir completando la información de forma parcial; no es necesario enviar todos los datos en una sola llamada. Sin embargo, en cada actualización es obligatorio enviar el número de documento de identidad (`kinddoc+doc`). El registro inicial debe incluir el documento de identidad.
639
+
640
+ Los documentos requeridos para el usuario se obtienen previamente usando el método `getRequerimentsByTypeUser` y deben enviarse bajo la estructura `{ file-ID: File }`, donde cada clave corresponde al identificador del documento y el valor es el archivo correspondiente.
641
+
642
+ El objeto completo de usuario que puede acompañar la solicitud es:
643
+
644
+ ```js
645
+ {
646
+ email: "usuario@correo.com",
647
+ typeuser: 1,
648
+ name: "Nombre",
649
+ lastname: "Apellido",
650
+ kinddoc: "V",
651
+ doc: 12345678,
652
+ birthdate: "1990-01-01",
653
+ kindrif: "V",
654
+ gender: "M",
655
+ rif: 12345678,
656
+ phone: 4121234567,
657
+ kindphone: "0424",
658
+ state: "Estado",
659
+ municipality: "Municipio",
660
+ parish: "Parroquia",
661
+ postalcode: "1010",
662
+ address: "Dirección",
663
+ fiscaladdress: "Dirección fiscal",
664
+ fiscalkindphone: "0424",
665
+ fiscalphone: 4121234567,
666
+ occupation: "Ocupación",
667
+ degree: "Título",
668
+ university: "Universidad",
669
+ graduationyear: "2010",
670
+ collegiatenumber: "12345",
671
+ collegiateyear: "2011",
672
+ companyname: "Empresa",
673
+ companykindrif: "J",
674
+ companyrif: "J12345678",
675
+ companystate: "Estado",
676
+ companymunicipality: "Municipio",
677
+ companyparish: "Parroquia",
678
+ companyaddress: "Dirección empresa",
679
+ companykindphone: "0212",
680
+ companyphone: "2121234567",
681
+ companypostalcode: "1010",
682
+ companywebpage: "https://empresa.com",
683
+ companycommercialregister: "Registro comercial",
684
+ companyregisterdate: "2015-01-01",
685
+ companyregisternumber: "123456",
686
+ companyconstitutiondate: "2015-01-01",
687
+ companypublishdate: "2015-01-01",
688
+ companyconstitutiondecree: "Decreto",
689
+ companynumberdecree: "123",
690
+ positionprivate: "Cargo privado",
691
+ departmentprivate: "Departamento privado",
692
+ authorizedprivate: "Autorizado privado",
693
+ functionsprivate: "Funciones privado",
694
+ publishprivate: "2015-01-01",
695
+ issuedateprivate: "2015-01-01",
696
+ kindphoneprivate: "0424",
697
+ phoneprivate: 4121234567,
698
+ positionpublic: "Cargo público",
699
+ departmentpublic: "Departamento público",
700
+ authorizedpublic: "Autorizado público",
701
+ functionspublic: "Funciones público",
702
+ publishpublic: "2015-01-01",
703
+ issuedatepublic: "2015-01-01",
704
+ kindphonepublic: "0424",
705
+ phonepublic: 4121234567,
706
+ companyid: "uuid-empresa"
707
+ }
708
+ ```
709
+
710
+ **Ejemplo:**
711
+
712
+ ```javascript
713
+ try {
714
+ const userData = {
715
+ usr: "usuario@correo.com",
716
+ pwd: "contraseñaSegura123",
717
+ kinddoc: "V",
718
+ doc: "12345678",
719
+ // ...otros campos opcionales
720
+ files: {
721
+ "file-1": file1, // Instancia de File
722
+ "file-2": file2,
723
+ // ...otros documentos según los requerimientos
724
+ },
725
+ };
726
+ const response = await apacuana.createApacuanaUser(userData);
727
+ console.log("Usuario creado:", response.data);
728
+ } catch (error) {
729
+ console.error("Error al crear el usuario:", error.message);
730
+ }
731
+ ```
732
+
383
733
  ## Manejo de Errores
734
+
384
735
  El SDK utiliza dos clases personalizadas para gestionar los resultados: `ApacuanaSuccess` para éxitos y `ApacuanaAPIError` para fallos.
385
736
 
386
737
  ### `ApacuanaSuccess`
738
+
387
739
  Cuando una operación se completa correctamente, la promesa se resuelve con una instancia de `ApacuanaSuccess`.
388
740
 
389
741
  **Propiedades:**
742
+
390
743
  - `success` (Boolean): Siempre `true`.
391
744
  - `statusCode` (Number): El código de estado HTTP de la respuesta (ej. `200`).
392
745
  - `data` (Object): El cuerpo de la respuesta de la API.
393
746
 
394
747
  ### `ApacuanaAPIError`
748
+
395
749
  Cuando la API devuelve un error, la promesa es rechazada con una instancia de `ApacuanaAPIError`.
396
750
 
397
751
  **Propiedades:**
752
+
398
753
  - `success` (Boolean): Siempre `false`.
399
754
  - `statusCode` (Number): El código de estado HTTP del error (ej. `400`, `404`, `500`).
400
755
  - `errorCode` (String): Un código de error específico de Apacuana (ej. `INVALID_PARAMS`).
401
756
  - `message` (String): Una descripción legible del error.
402
757
 
403
758
  **Ejemplo de manejo de errores:**
759
+
404
760
  ```javascript
405
761
  try {
406
762
  // Forzamos un error
@@ -419,19 +775,20 @@ try {
419
775
 
420
776
  ### Listado de Códigos de Error
421
777
 
422
- | `errorCode` | Descripción |
423
- | :--- | :--- |
424
- | `CONFIGURATION_ERROR` | Error en la configuración del SDK (ej. falta `apiKey`). |
425
- | `INVALID_API_RESPONSE` | La respuesta de la API no tiene el formato esperado. |
426
- | `INVALID_PARAMETER` | Uno o más parámetros de la función son inválidos. |
427
- | `INVALID_PARAMETER_FORMAT` | El formato de un parámetro es incorrecto. |
428
- | `LOGICAL_API_ERROR` | Error lógico devuelto por la API. |
429
- | `NETWORK_ERROR` | Error de red, CORS o timeout. |
430
- | `NOT_IMPLEMENTED` | La funcionalidad no está implementada para el `integrationType` actual. |
431
- | `UNSUPPORTED_HTTP_METHOD` | Se utilizó un método HTTP no soportado. |
432
- | `UNSUPPORTED_INTEGRATION_TYPE` | El `integrationType` no es válido. |
433
- | `UNKNOWN_REQUEST_ERROR` | Error desconocido durante la petición. |
434
- | `API_RESPONSE_ERROR` | La respuesta de la API contiene un error. |
778
+ | `errorCode` | Descripción |
779
+ | :----------------------------- | :---------------------------------------------------------------------- |
780
+ | `CONFIGURATION_ERROR` | Error en la configuración del SDK (ej. falta `apiKey`). |
781
+ | `INVALID_API_RESPONSE` | La respuesta de la API no tiene el formato esperado. |
782
+ | `INVALID_PARAMETER` | Uno o más parámetros de la función son inválidos. |
783
+ | `INVALID_PARAMETER_FORMAT` | El formato de un parámetro es incorrecto. |
784
+ | `LOGICAL_API_ERROR` | Error lógico devuelto por la API. |
785
+ | `NETWORK_ERROR` | Error de red, CORS o timeout. |
786
+ | `NOT_IMPLEMENTED` | La funcionalidad no está implementada para el `integrationType` actual. |
787
+ | `UNSUPPORTED_HTTP_METHOD` | Se utilizó un método HTTP no soportado. |
788
+ | `UNSUPPORTED_INTEGRATION_TYPE` | El `integrationType` no es válido. |
789
+ | `UNKNOWN_REQUEST_ERROR` | Error desconocido durante la petición. |
790
+ | `API_RESPONSE_ERROR` | La respuesta de la API contiene un error. |
435
791
 
436
792
  ## Licencia
793
+
437
794
  Este SDK está distribuido bajo una licencia propietaria. Para más detalles, contacte con el equipo de Apacuana.