apacuana-sdk-core 1.0.0 → 1.2.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/.eslintrc.cjs +22 -0
- package/CHANGELOG.md +1 -0
- package/README.md +794 -0
- package/babel.config.cjs +11 -0
- package/coverage/clover.xml +628 -0
- package/coverage/coverage-final.json +13 -0
- package/coverage/lcov-report/api/index.html +131 -0
- package/coverage/lcov-report/api/signatures.js.html +1093 -0
- package/coverage/lcov-report/api/users.js.html +292 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/certs.js.html +175 -0
- package/coverage/lcov-report/config/index.html +116 -0
- package/coverage/lcov-report/config/index.js.html +208 -0
- package/coverage/lcov-report/errors/index.html +116 -0
- package/coverage/lcov-report/errors/index.js.html +148 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +191 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +210 -0
- package/coverage/lcov-report/src/api/certs.js.html +856 -0
- package/coverage/lcov-report/src/api/faceLiveness.js.html +523 -0
- package/coverage/lcov-report/src/api/index.html +176 -0
- package/coverage/lcov-report/src/api/revocations.js.html +412 -0
- package/coverage/lcov-report/src/api/signatures.js.html +1420 -0
- package/coverage/lcov-report/src/api/users.js.html +466 -0
- package/coverage/lcov-report/src/config/index.html +116 -0
- package/coverage/lcov-report/src/config/index.js.html +256 -0
- package/coverage/lcov-report/src/errors/index.html +116 -0
- package/coverage/lcov-report/src/errors/index.js.html +148 -0
- package/coverage/lcov-report/src/index.html +116 -0
- package/coverage/lcov-report/src/index.js.html +592 -0
- package/coverage/lcov-report/src/success/index.html +116 -0
- package/coverage/lcov-report/src/success/index.js.html +106 -0
- package/coverage/lcov-report/src/utils/constant.js.html +256 -0
- package/coverage/lcov-report/src/utils/helpers.js.html +1195 -0
- package/coverage/lcov-report/src/utils/httpClient.js.html +622 -0
- package/coverage/lcov-report/src/utils/index.html +146 -0
- package/coverage/lcov-report/utils/constant.js.html +145 -0
- package/coverage/lcov-report/utils/httpClient.js.html +646 -0
- package/coverage/lcov-report/utils/index.html +131 -0
- package/coverage/lcov.info +1259 -0
- package/dist/api/certs.d.ts +15 -0
- package/dist/api/faceLiveness.d.ts +6 -0
- package/dist/api/revocations.d.ts +6 -0
- package/dist/api/signatures.d.ts +19 -0
- package/dist/api/users.d.ts +47 -0
- package/dist/config/index.d.ts +22 -0
- package/dist/errors/index.d.ts +10 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.js +34493 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +34491 -0
- package/dist/index.mjs.map +1 -0
- package/dist/success/index.d.ts +7 -0
- package/dist/types/certs.d.ts +83 -0
- package/dist/types/faceLiveness.d.ts +11 -0
- package/dist/types/revocations.d.ts +51 -0
- package/dist/types/signatures.d.ts +162 -0
- package/dist/types/users.d.ts +260 -0
- package/dist/utils/constant.d.ts +49 -0
- package/dist/utils/helpers.d.ts +25 -0
- package/dist/utils/httpClient.d.ts +3 -0
- package/jest.config.cjs +12 -0
- package/package.json +51 -9
- package/rollup.config.js +32 -0
- package/src/api/certs.js +257 -0
- package/src/api/faceLiveness.js +146 -0
- package/src/api/revocations.js +109 -0
- package/src/api/signatures.js +445 -0
- package/src/api/users.js +127 -0
- package/src/config/index.js +57 -0
- package/src/errors/index.js +21 -0
- package/src/index.js +169 -0
- package/src/success/index.js +8 -0
- package/src/types/certs.js +67 -0
- package/src/types/faceLiveness.js +16 -0
- package/src/types/revocations.js +45 -0
- package/src/types/signatures.js +96 -0
- package/src/types/users.js +73 -0
- package/src/utils/constant.js +57 -0
- package/src/utils/helpers.js +370 -0
- package/src/utils/httpClient.js +179 -0
- package/tests/api/certs.test.js +311 -0
- package/tests/api/faceLiveness.test.js +170 -0
- package/tests/api/revocations.test.js +119 -0
- package/tests/api/signatures.test.js +530 -0
- package/tests/api/users.test.js +117 -0
- package/tests/index.test.js +131 -0
- package/tsconfig.json +16 -0
package/README.md
ADDED
|
@@ -0,0 +1,794 @@
|
|
|
1
|
+
# Apacuana SDK Core
|
|
2
|
+
|
|
3
|
+
## Descripción
|
|
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.
|
|
6
|
+
|
|
7
|
+
## Tabla de Contenidos
|
|
8
|
+
|
|
9
|
+
- [Instalación](#instalación)
|
|
10
|
+
- [Inicialización](#inicialización)
|
|
11
|
+
- [Conceptos Clave](#conceptos-clave)
|
|
12
|
+
- [Interfaz Pública](#interfaz-pública)
|
|
13
|
+
- [Manejo de Errores](#manejo-de-errores)
|
|
14
|
+
- [Licencia](#licencia)
|
|
15
|
+
|
|
16
|
+
## Instalación
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm install apacuana-sdk-core
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Inicialización
|
|
23
|
+
|
|
24
|
+
Antes de utilizar el SDK, debes inicializarlo con tu configuración.
|
|
25
|
+
|
|
26
|
+
```javascript
|
|
27
|
+
import apacuana from "apacuana-sdk-core";
|
|
28
|
+
|
|
29
|
+
const config = {
|
|
30
|
+
apiUrl: "https://api.url",
|
|
31
|
+
secretKey: "tu-secret-key",
|
|
32
|
+
apiKey: "tu-api-key",
|
|
33
|
+
verificationId: "tu-verification-id",
|
|
34
|
+
customerId: "tu-customer-id",
|
|
35
|
+
integrationType: "ONBOARDING", // o "onpremise"
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
try {
|
|
39
|
+
await apacuana.init(config);
|
|
40
|
+
console.log("SDK inicializado correctamente.");
|
|
41
|
+
} catch (error) {
|
|
42
|
+
console.error("Error al inicializar el SDK:", error);
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Conceptos Clave
|
|
47
|
+
|
|
48
|
+
### Tipos de Integración
|
|
49
|
+
|
|
50
|
+
El SDK soporta dos tipos de integración (`integrationType`) que determinan cómo se interactúa con la plataforma de Apacuana:
|
|
51
|
+
|
|
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.
|
|
53
|
+
|
|
54
|
+
- **`onpremise`**: Este modo de integración no está soportado actualmente y se reserva para uso futuro. La mayoría de las operaciones del SDK lanzarán un error `NOT_IMPLEMENTED` si se utiliza este tipo.
|
|
55
|
+
|
|
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.
|
|
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
|
+
|
|
88
|
+
## Interfaz Pública
|
|
89
|
+
|
|
90
|
+
Todas las funciones asíncronas devuelven una instancia de `ApacuanaSuccess` si tienen éxito, o lanzan una `ApacuanaAPIError` si fallan.
|
|
91
|
+
|
|
92
|
+
### `init(config)`
|
|
93
|
+
|
|
94
|
+
Inicializa el SDK.
|
|
95
|
+
|
|
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
|
+
```
|
|
134
|
+
|
|
135
|
+
### `close()`
|
|
136
|
+
|
|
137
|
+
Cierra la sesión del SDK y limpia la configuración.
|
|
138
|
+
|
|
139
|
+
**Ejemplo:**
|
|
140
|
+
|
|
141
|
+
```javascript
|
|
142
|
+
apacuana.close();
|
|
143
|
+
console.log("Sesión del SDK cerrada.");
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### `getConfig()`
|
|
147
|
+
|
|
148
|
+
Devuelve la configuración actual.
|
|
149
|
+
|
|
150
|
+
**Ejemplo:**
|
|
151
|
+
|
|
152
|
+
```javascript
|
|
153
|
+
const currentConfig = apacuana.getConfig();
|
|
154
|
+
console.log("Configuración actual:", currentConfig);
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### `getCustomer()`
|
|
158
|
+
|
|
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
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### `generateCert(params)`
|
|
169
|
+
|
|
170
|
+
Genera un nuevo certificado digital.
|
|
171
|
+
|
|
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:
|
|
195
|
+
|
|
196
|
+
```javascript
|
|
197
|
+
try {
|
|
198
|
+
const csr = { csr: "MIIC...==" }; // CSR en formato Base64
|
|
199
|
+
const response = await apacuana.generateCert(csr);
|
|
200
|
+
console.log("Certificado generado:", response.data.cert);
|
|
201
|
+
console.log("ID del certificado:", response.data.certifiedid);
|
|
202
|
+
} catch (error) {
|
|
203
|
+
console.error("Error al generar el certificado:", error.message);
|
|
204
|
+
}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### `getCertStatus(params)`
|
|
208
|
+
|
|
209
|
+
Obtiene el estado del certificado del usuario.
|
|
210
|
+
|
|
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:
|
|
241
|
+
|
|
242
|
+
```javascript
|
|
243
|
+
try {
|
|
244
|
+
const response = await apacuana.getCertStatus(false);
|
|
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
|
+
}
|
|
249
|
+
} catch (error) {
|
|
250
|
+
console.error("Error al obtener el estado del certificado:", error.message);
|
|
251
|
+
}
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### `getCertTypes()`
|
|
255
|
+
|
|
256
|
+
Obtiene los tipos de certificados disponibles.
|
|
257
|
+
|
|
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
|
+
|
|
279
|
+
```javascript
|
|
280
|
+
try {
|
|
281
|
+
const response = await apacuana.getCertTypes();
|
|
282
|
+
console.log("Tipos de certificados:", response.data.types);
|
|
283
|
+
} catch (error) {
|
|
284
|
+
console.error("Error al obtener los tipos de certificado:", error.message);
|
|
285
|
+
}
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
### `getRequerimentsByTypeUser(params)`
|
|
289
|
+
|
|
290
|
+
Obtiene los requisitos para un tipo de certificado y usuario.
|
|
291
|
+
|
|
292
|
+
#### Parámetros:
|
|
293
|
+
|
|
294
|
+
- `params`: Objeto con la propiedad obligatoria:
|
|
295
|
+
- `type` (Number): El tipo de certificado.
|
|
296
|
+
|
|
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
|
+
|
|
315
|
+
```javascript
|
|
316
|
+
try {
|
|
317
|
+
const response = await apacuana.getRequerimentsByTypeUser({ type: 1 });
|
|
318
|
+
console.log("Requisitos:", response.data.requirements);
|
|
319
|
+
} catch (error) {
|
|
320
|
+
console.error("Error al obtener los requisitos:", error.message);
|
|
321
|
+
}
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
### `addSigner(params)`
|
|
325
|
+
|
|
326
|
+
Añade un firmante a un documento. El comportamiento y los campos obligatorios dependen del `integrationType` configurado durante la inicialización.
|
|
327
|
+
|
|
328
|
+
#### Parámetros:
|
|
329
|
+
|
|
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).
|
|
340
|
+
|
|
341
|
+
**Notas sobre `document` y `reference`:**
|
|
342
|
+
|
|
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:
|
|
357
|
+
|
|
358
|
+
```javascript
|
|
359
|
+
try {
|
|
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
|
+
],
|
|
371
|
+
};
|
|
372
|
+
const response = await apacuana.addSigner(signer);
|
|
373
|
+
console.log("Firmante añadido:", response.data);
|
|
374
|
+
} catch (error) {
|
|
375
|
+
console.error("Error al añadir firmante:", error.message);
|
|
376
|
+
}
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
### `getDocs(data)`
|
|
380
|
+
|
|
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
|
|
386
|
+
|
|
387
|
+
**Ejemplo:**
|
|
388
|
+
|
|
389
|
+
```javascript
|
|
390
|
+
try {
|
|
391
|
+
const params = {
|
|
392
|
+
page: 1,
|
|
393
|
+
size: 10,
|
|
394
|
+
status: 0, // Estado del documento
|
|
395
|
+
};
|
|
396
|
+
const response = await apacuana.getDocs(params);
|
|
397
|
+
console.log("Documentos filtrados:", response.data);
|
|
398
|
+
} catch (error) {
|
|
399
|
+
console.error("Error al obtener los documentos:", error.message);
|
|
400
|
+
}
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
**Notas:**
|
|
404
|
+
|
|
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.
|
|
407
|
+
|
|
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
|
|
508
|
+
```
|
|
509
|
+
|
|
510
|
+
### `getSignatureVariant()`
|
|
511
|
+
|
|
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
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
### `deleteSignatureVariant()`
|
|
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.
|
|
524
|
+
|
|
525
|
+
**Ejemplo:**
|
|
526
|
+
|
|
527
|
+
```javascript
|
|
528
|
+
try {
|
|
529
|
+
const response = await apacuana.deleteSignatureVariant();
|
|
530
|
+
console.log(response.data);
|
|
531
|
+
} catch (error) {
|
|
532
|
+
console.error("Error al eliminar la firma:", error.message);
|
|
533
|
+
}
|
|
534
|
+
```
|
|
535
|
+
|
|
536
|
+
### `createFaceLivenessSession()`
|
|
537
|
+
|
|
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
|
|
545
|
+
```
|
|
546
|
+
|
|
547
|
+
### `validateFaceLiveness({ sessionId })`
|
|
548
|
+
|
|
549
|
+
Valida el resultado de una sesión de prueba de vida.
|
|
550
|
+
|
|
551
|
+
- `sessionId` (String, **obligatorio**): El ID de la sesión de prueba de vida que se va a validar.
|
|
552
|
+
|
|
553
|
+
**Ejemplo:**
|
|
554
|
+
|
|
555
|
+
```javascript
|
|
556
|
+
try {
|
|
557
|
+
const response = await apacuana.validateFaceLiveness({
|
|
558
|
+
sessionId: "your-session-id",
|
|
559
|
+
});
|
|
560
|
+
console.log("Resultado de la validación:", response.data);
|
|
561
|
+
} catch (error) {
|
|
562
|
+
console.error("Error al validar la sesión de prueba de vida:", error.message);
|
|
563
|
+
}
|
|
564
|
+
```
|
|
565
|
+
|
|
566
|
+
### `requestRevocation(params)`
|
|
567
|
+
|
|
568
|
+
Solicita la revocación de un certificado.
|
|
569
|
+
|
|
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:
|
|
595
|
+
|
|
596
|
+
```javascript
|
|
597
|
+
try {
|
|
598
|
+
const response = await apacuana.requestRevocation({ reasonCode: 1 });
|
|
599
|
+
console.log("Solicitud de revocación enviada:", response.data);
|
|
600
|
+
} catch (error) {
|
|
601
|
+
console.error("Error al solicitar la revocación:", error.message);
|
|
602
|
+
}
|
|
603
|
+
```
|
|
604
|
+
|
|
605
|
+
### `getRevocationReasons()`
|
|
606
|
+
|
|
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
|
+
|
|
627
|
+
```javascript
|
|
628
|
+
try {
|
|
629
|
+
const response = await apacuana.getRevocationReasons();
|
|
630
|
+
console.log("Razones de revocación:", response.data.reasons);
|
|
631
|
+
} catch (error) {
|
|
632
|
+
console.error("Error al obtener las razones de revocación:", error.message);
|
|
633
|
+
}
|
|
634
|
+
```
|
|
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
|
+
|
|
733
|
+
## Manejo de Errores
|
|
734
|
+
|
|
735
|
+
El SDK utiliza dos clases personalizadas para gestionar los resultados: `ApacuanaSuccess` para éxitos y `ApacuanaAPIError` para fallos.
|
|
736
|
+
|
|
737
|
+
### `ApacuanaSuccess`
|
|
738
|
+
|
|
739
|
+
Cuando una operación se completa correctamente, la promesa se resuelve con una instancia de `ApacuanaSuccess`.
|
|
740
|
+
|
|
741
|
+
**Propiedades:**
|
|
742
|
+
|
|
743
|
+
- `success` (Boolean): Siempre `true`.
|
|
744
|
+
- `statusCode` (Number): El código de estado HTTP de la respuesta (ej. `200`).
|
|
745
|
+
- `data` (Object): El cuerpo de la respuesta de la API.
|
|
746
|
+
|
|
747
|
+
### `ApacuanaAPIError`
|
|
748
|
+
|
|
749
|
+
Cuando la API devuelve un error, la promesa es rechazada con una instancia de `ApacuanaAPIError`.
|
|
750
|
+
|
|
751
|
+
**Propiedades:**
|
|
752
|
+
|
|
753
|
+
- `success` (Boolean): Siempre `false`.
|
|
754
|
+
- `statusCode` (Number): El código de estado HTTP del error (ej. `400`, `404`, `500`).
|
|
755
|
+
- `errorCode` (String): Un código de error específico de Apacuana (ej. `INVALID_PARAMS`).
|
|
756
|
+
- `message` (String): Una descripción legible del error.
|
|
757
|
+
|
|
758
|
+
**Ejemplo de manejo de errores:**
|
|
759
|
+
|
|
760
|
+
```javascript
|
|
761
|
+
try {
|
|
762
|
+
// Forzamos un error
|
|
763
|
+
await apacuana.addSigner({ doc: null });
|
|
764
|
+
} catch (error) {
|
|
765
|
+
if (error.name === "ApacuanaAPIError") {
|
|
766
|
+
console.error("Ocurrió un error de la API de Apacuana:");
|
|
767
|
+
console.error("- Mensaje:", error.message);
|
|
768
|
+
console.error("- Código de estado HTTP:", error.statusCode);
|
|
769
|
+
console.error("- Código de error interno:", error.errorCode);
|
|
770
|
+
} else {
|
|
771
|
+
console.error("Ocurrió un error inesperado:", error);
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
```
|
|
775
|
+
|
|
776
|
+
### Listado de Códigos de Error
|
|
777
|
+
|
|
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. |
|
|
791
|
+
|
|
792
|
+
## Licencia
|
|
793
|
+
|
|
794
|
+
Este SDK está distribuido bajo una licencia propietaria. Para más detalles, contacte con el equipo de Apacuana.
|