apacuana-sdk-core 0.1.0 → 0.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.
Files changed (35) hide show
  1. package/README.md +117 -46
  2. package/coverage/clover.xml +205 -91
  3. package/coverage/coverage-final.json +9 -6
  4. package/coverage/lcov-report/index.html +48 -33
  5. package/coverage/lcov-report/src/api/certs.js.html +74 -83
  6. package/coverage/lcov-report/src/api/index.html +36 -21
  7. package/coverage/lcov-report/src/api/revocations.js.html +1 -1
  8. package/coverage/lcov-report/src/api/signatures.js.html +528 -81
  9. package/coverage/lcov-report/src/api/users.js.html +5 -2
  10. package/coverage/lcov-report/src/config/index.html +21 -21
  11. package/coverage/lcov-report/src/config/index.js.html +65 -32
  12. package/coverage/lcov-report/src/errors/index.html +5 -5
  13. package/coverage/lcov-report/src/errors/index.js.html +13 -10
  14. package/coverage/lcov-report/src/index.html +1 -1
  15. package/coverage/lcov-report/src/index.js.html +13 -4
  16. package/coverage/lcov-report/src/utils/constant.js.html +4 -4
  17. package/coverage/lcov-report/src/utils/helpers.js.html +268 -145
  18. package/coverage/lcov-report/src/utils/httpClient.js.html +646 -0
  19. package/coverage/lcov-report/src/utils/index.html +32 -17
  20. package/coverage/lcov.info +429 -167
  21. package/dist/index.js +390 -150
  22. package/dist/index.js.map +1 -1
  23. package/dist/index.mjs +390 -150
  24. package/dist/index.mjs.map +1 -1
  25. package/package.json +1 -1
  26. package/src/api/certs.js +27 -30
  27. package/src/api/signatures.js +205 -50
  28. package/src/api/users.js +1 -0
  29. package/src/errors/index.js +1 -0
  30. package/src/index.js +4 -1
  31. package/src/utils/helpers.js +140 -99
  32. package/tests/api/certs.test.js +126 -4
  33. package/tests/api/signatures.test.js +207 -4
  34. package/tests/api/users.test.js +1 -0
  35. package/src/auth/index.js +0 -24
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">11.53% </span>
26
+ <span class="strong">95.83% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>3/26</span>
28
+ <span class='fraction'>23/24</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">0% </span>
33
+ <span class="strong">72.72% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>0/8</span>
35
+ <span class='fraction'>8/11</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">0% </span>
40
+ <span class="strong">100% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>0/3</span>
42
+ <span class='fraction'>3/3</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">11.53% </span>
47
+ <span class="strong">95.83% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>3/26</span>
49
+ <span class='fraction'>23/24</span>
50
50
  </div>
51
51
 
52
52
 
@@ -61,7 +61,7 @@
61
61
  </div>
62
62
  </template>
63
63
  </div>
64
- <div class='status-line low'></div>
64
+ <div class='status-line high'></div>
65
65
  <pre><table class="coverage">
66
66
  <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
67
  <a name='L2'></a><a href='#L2'>2</a>
@@ -130,147 +130,138 @@
130
130
  <a name='L65'></a><a href='#L65'>65</a>
131
131
  <a name='L66'></a><a href='#L66'>66</a>
132
132
  <a name='L67'></a><a href='#L67'>67</a>
133
- <a name='L68'></a><a href='#L68'>68</a>
134
- <a name='L69'></a><a href='#L69'>69</a>
135
- <a name='L70'></a><a href='#L70'>70</a>
136
- <a name='L71'></a><a href='#L71'>71</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
133
+ <a name='L68'></a><a href='#L68'>68</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
137
134
  <span class="cline-any cline-neutral">&nbsp;</span>
138
135
  <span class="cline-any cline-neutral">&nbsp;</span>
139
136
  <span class="cline-any cline-neutral">&nbsp;</span>
140
137
  <span class="cline-any cline-neutral">&nbsp;</span>
141
138
  <span class="cline-any cline-neutral">&nbsp;</span>
139
+ <span class="cline-any cline-yes">2x</span>
140
+ <span class="cline-any cline-yes">2x</span>
141
+ <span class="cline-any cline-yes">2x</span>
142
142
  <span class="cline-any cline-neutral">&nbsp;</span>
143
- <span class="cline-any cline-yes">1x</span>
144
- <span class="cline-any cline-no">&nbsp;</span>
145
- <span class="cline-any cline-no">&nbsp;</span>
146
- <span class="cline-any cline-no">&nbsp;</span>
147
- <span class="cline-any cline-no">&nbsp;</span>
148
- <span class="cline-any cline-no">&nbsp;</span>
149
- <span class="cline-any cline-neutral">&nbsp;</span>
150
- <span class="cline-any cline-no">&nbsp;</span>
143
+ <span class="cline-any cline-yes">2x</span>
151
144
  <span class="cline-any cline-neutral">&nbsp;</span>
152
145
  <span class="cline-any cline-neutral">&nbsp;</span>
153
146
  <span class="cline-any cline-neutral">&nbsp;</span>
154
147
  <span class="cline-any cline-neutral">&nbsp;</span>
148
+ <span class="cline-any cline-yes">2x</span>
149
+ <span class="cline-any cline-yes">2x</span>
150
+ <span class="cline-any cline-yes">1x</span>
155
151
  <span class="cline-any cline-neutral">&nbsp;</span>
156
152
  <span class="cline-any cline-neutral">&nbsp;</span>
157
- <span class="cline-any cline-no">&nbsp;</span>
158
153
  <span class="cline-any cline-neutral">&nbsp;</span>
159
154
  <span class="cline-any cline-neutral">&nbsp;</span>
160
155
  <span class="cline-any cline-neutral">&nbsp;</span>
161
156
  <span class="cline-any cline-neutral">&nbsp;</span>
157
+ <span class="cline-any cline-yes">1x</span>
162
158
  <span class="cline-any cline-neutral">&nbsp;</span>
163
- <span class="cline-any cline-no">&nbsp;</span>
164
- <span class="cline-any cline-no">&nbsp;</span>
165
- <span class="cline-any cline-no">&nbsp;</span>
166
159
  <span class="cline-any cline-neutral">&nbsp;</span>
160
+ <span class="cline-any cline-yes">1x</span>
161
+ <span class="cline-any cline-yes">1x</span>
167
162
  <span class="cline-any cline-neutral">&nbsp;</span>
163
+ <span class="cline-any cline-no">&nbsp;</span>
168
164
  <span class="cline-any cline-neutral">&nbsp;</span>
169
165
  <span class="cline-any cline-neutral">&nbsp;</span>
170
166
  <span class="cline-any cline-neutral">&nbsp;</span>
167
+ <span class="cline-any cline-yes">2x</span>
168
+ <span class="cline-any cline-yes">7x</span>
169
+ <span class="cline-any cline-yes">7x</span>
170
+ <span class="cline-any cline-yes">4x</span>
171
+ <span class="cline-any cline-yes">2x</span>
171
172
  <span class="cline-any cline-neutral">&nbsp;</span>
172
- <span class="cline-any cline-no">&nbsp;</span>
173
+ <span class="cline-any cline-yes">2x</span>
173
174
  <span class="cline-any cline-neutral">&nbsp;</span>
175
+ <span class="cline-any cline-yes">1x</span>
174
176
  <span class="cline-any cline-neutral">&nbsp;</span>
175
177
  <span class="cline-any cline-neutral">&nbsp;</span>
176
- <span class="cline-any cline-no">&nbsp;</span>
178
+ <span class="cline-any cline-yes">1x</span>
177
179
  <span class="cline-any cline-neutral">&nbsp;</span>
178
180
  <span class="cline-any cline-neutral">&nbsp;</span>
179
- <span class="cline-any cline-no">&nbsp;</span>
180
- <span class="cline-any cline-no">&nbsp;</span>
181
- <span class="cline-any cline-neutral">&nbsp;</span>
182
- <span class="cline-any cline-no">&nbsp;</span>
183
181
  <span class="cline-any cline-neutral">&nbsp;</span>
182
+ <span class="cline-any cline-yes">1x</span>
184
183
  <span class="cline-any cline-neutral">&nbsp;</span>
185
184
  <span class="cline-any cline-neutral">&nbsp;</span>
186
- <span class="cline-any cline-yes">1x</span>
187
- <span class="cline-any cline-no">&nbsp;</span>
188
185
  <span class="cline-any cline-neutral">&nbsp;</span>
189
- <span class="cline-any cline-no">&nbsp;</span>
190
- <span class="cline-any cline-no">&nbsp;</span>
191
- <span class="cline-any cline-no">&nbsp;</span>
192
186
  <span class="cline-any cline-neutral">&nbsp;</span>
193
- <span class="cline-any cline-no">&nbsp;</span>
194
187
  <span class="cline-any cline-neutral">&nbsp;</span>
195
188
  <span class="cline-any cline-neutral">&nbsp;</span>
189
+ <span class="cline-any cline-yes">2x</span>
190
+ <span class="cline-any cline-yes">1x</span>
191
+ <span class="cline-any cline-yes">1x</span>
196
192
  <span class="cline-any cline-neutral">&nbsp;</span>
197
193
  <span class="cline-any cline-neutral">&nbsp;</span>
198
194
  <span class="cline-any cline-neutral">&nbsp;</span>
199
195
  <span class="cline-any cline-yes">1x</span>
200
- <span class="cline-any cline-no">&nbsp;</span>
201
- <span class="cline-any cline-no">&nbsp;</span>
202
- <span class="cline-any cline-no">&nbsp;</span>
203
196
  <span class="cline-any cline-neutral">&nbsp;</span>
204
197
  <span class="cline-any cline-neutral">&nbsp;</span>
205
198
  <span class="cline-any cline-neutral">&nbsp;</span>
206
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import CryptoJS from "crypto-js";
207
- import { getConfig } from "../config";
208
- import { INTEGRATION_TYPE } from "../utils/constant";
209
- import { helpers } from "../utils/helpers";
210
- import { ApacuanaAPIError } from "../errors/index";
199
+ <span class="cline-any cline-neutral">&nbsp;</span>
200
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { getConfig } from "../config/index";
211
201
  import { httpRequest } from "../utils/httpClient";
202
+ import helpers from "../utils/helpers";
203
+ import { ApacuanaAPIError } from "../errors";
204
+ import { INTEGRATION_TYPE } from "../utils/constant";
212
205
  &nbsp;
213
- const generateCertOnBoarding = <span class="fstat-no" title="function not covered" >as</span>ync () =&gt; {
214
- <span class="cstat-no" title="statement not covered" > try {</span>
215
- const config = <span class="cstat-no" title="statement not covered" >getConfig();</span>
216
- const { userData } = <span class="cstat-no" title="statement not covered" >config;</span>
217
- const keyPair = <span class="cstat-no" title="statement not covered" >await helpers.generateKeyPair();</span>
218
- const { csrBase64 } = <span class="cstat-no" title="statement not covered" >await helpers.generateCSR(keyPair, userData);</span>
219
- &nbsp;
220
- const body = <span class="cstat-no" title="statement not covered" >{</span>
221
- csr: CryptoJS.AES.encrypt(csrBase64, config.secretKey, {
222
- mode: CryptoJS.mode.ECB,
223
- padding: CryptoJS.pad.Pkcs7,
224
- }).toString(),
225
- };
206
+ const generateCertOnBoarding = async (csr = <span class="branch-0 cbranch-no" title="branch not covered" >undefined)</span> =&gt; {
207
+ try {
208
+ const encryptedCSR = helpers.encryptedCsr(csr);
226
209
  &nbsp;
227
- const response = <span class="cstat-no" title="statement not covered" >await httpRequest(</span>
210
+ const response = await httpRequest(
228
211
  "services/api/register/certificate",
229
- body,
212
+ encryptedCSR,
230
213
  "POST"
231
214
  );
232
- &nbsp;
233
- const { cert } = <span class="cstat-no" title="statement not covered" >response;</span>
234
- <span class="cstat-no" title="statement not covered" > if (!cert) {</span>
235
- <span class="cstat-no" title="statement not covered" > throw new ApacuanaAPIError(</span>
215
+ const { cert } = response;
216
+ if (!cert) {
217
+ throw new ApacuanaAPIError(
236
218
  "La respuesta de la API no contiene el certificado.",
237
219
  response.status,
238
220
  "INVALID_API_RESPONSE"
239
221
  );
240
222
  }
241
223
  &nbsp;
242
- const exportedPrivateKey = <span class="cstat-no" title="statement not covered" >await helpers.exportPrivateKey(</span>
243
- keyPair.privateKey
244
- );
245
- &nbsp;
246
- <span class="cstat-no" title="statement not covered" > return { cert, privateKey: exportedPrivateKey };</span>
224
+ return { cert, success: true };
247
225
  } catch (error) {
248
226
  // Se lanza el error capturado, que ya será de tipo ApacuanaAPIError o un Error nativo.
249
- <span class="cstat-no" title="statement not covered" > if (error instanceof ApacuanaAPIError) {</span>
250
- <span class="cstat-no" title="statement not covered" > throw error;</span>
227
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (error instanceof ApacuanaAPIError) {
228
+ throw error;
251
229
  }
252
230
  <span class="cstat-no" title="statement not covered" > throw new Error(`Fallo en la generación del certificado: ${error.message}`);</span>
253
231
  }
254
232
  };
255
233
  &nbsp;
256
- export const generateCert = <span class="fstat-no" title="function not covered" >as</span>ync () =&gt; {
257
- const { integrationType } = <span class="cstat-no" title="statement not covered" >getConfig();</span>
258
- &nbsp;
259
- <span class="cstat-no" title="statement not covered" > if (integrationType === INTEGRATION_TYPE.ONBOARDING) {</span>
260
- <span class="cstat-no" title="statement not covered" > await generateCertOnBoarding();</span>
261
- } else <span class="cstat-no" title="statement not covered" >if (integrationType === INTEGRATION_TYPE.ONPREMISE) {</span>
234
+ export const generateCert = async (csr = undefined) =&gt; {
235
+ const { integrationType } = getConfig();
236
+ helpers.validateCsr(csr);
237
+ if (integrationType === INTEGRATION_TYPE.ONBOARDING) {
238
+ return generateCertOnBoarding(csr);
239
+ }
240
+ if (integrationType === INTEGRATION_TYPE.ONPREMISE) {
262
241
  // eslint-disable-next-line no-console
263
- <span class="cstat-no" title="statement not covered" > console.log("-&gt; Lógica para On-premise");</span>
242
+ console.log("-&gt; Lógica para On-premise");
264
243
  // Aquí iría la llamada a httpRequest para el endpoint de on-premise
265
244
  // return httpRequest('/certs/generate-onpremise', data);
245
+ return Promise.resolve(); // Retornar una promesa resuelta para consistencia
266
246
  }
247
+ &nbsp;
248
+ // Lanzar un error si el tipo de integración no es soportado
249
+ throw new ApacuanaAPIError(
250
+ `Tipo de integración no soportado: ${integrationType}`,
251
+ 400,
252
+ "UNSUPPORTED_INTEGRATION_TYPE"
253
+ );
267
254
  };
268
255
  &nbsp;
269
- export const getCertStatus = <span class="fstat-no" title="function not covered" >()</span> =&gt; {
270
- const config = <span class="cstat-no" title="statement not covered" >getConfig();</span>
271
- const status = <span class="cstat-no" title="statement not covered" >helpers.getCertificateStatus(config.userData, false);</span>
272
- <span class="cstat-no" title="statement not covered" > return {</span>
256
+ export const getCertStatus = (isCertificateInDevice = <span class="branch-0 cbranch-no" title="branch not covered" >false)</span> =&gt; {
257
+ const config = getConfig();
258
+ const status = helpers.getCertificateStatus(
259
+ config.userData,
260
+ isCertificateInDevice
261
+ );
262
+ return {
273
263
  status,
264
+ success: true,
274
265
  };
275
266
  };
276
267
  &nbsp;</pre></td></tr></table></pre>
@@ -280,7 +271,7 @@ export const getCertStatus = <span class="fstat-no" title="function not covered"
280
271
  <div class='footer quiet pad2 space-top1 center small'>
281
272
  Code coverage generated by
282
273
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
283
- at 2025-08-15T20:05:10.802Z
274
+ at 2025-08-22T15:34:11.195Z
284
275
  </div>
285
276
  <script src="../../prettify.js"></script>
286
277
  <script>
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">38.18% </span>
26
+ <span class="strong">79.56% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>21/55</span>
28
+ <span class='fraction'>74/93</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">41.37% </span>
33
+ <span class="strong">66.66% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>12/29</span>
35
+ <span class='fraction'>34/51</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">20% </span>
40
+ <span class="strong">90.9% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>1/5</span>
42
+ <span class='fraction'>10/11</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">38.18% </span>
47
+ <span class="strong">79.56% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>21/55</span>
49
+ <span class='fraction'>74/93</span>
50
50
  </div>
51
51
 
52
52
 
@@ -61,7 +61,7 @@
61
61
  </div>
62
62
  </template>
63
63
  </div>
64
- <div class='status-line low'></div>
64
+ <div class='status-line medium'></div>
65
65
  <div class="pad1">
66
66
  <table class="coverage-summary">
67
67
  <thead>
@@ -79,18 +79,18 @@
79
79
  </tr>
80
80
  </thead>
81
81
  <tbody><tr>
82
- <td class="file low" data-value="certs.js"><a href="certs.js.html">certs.js</a></td>
83
- <td data-value="11.53" class="pic low">
84
- <div class="chart"><div class="cover-fill" style="width: 11%"></div><div class="cover-empty" style="width: 89%"></div></div>
82
+ <td class="file high" data-value="certs.js"><a href="certs.js.html">certs.js</a></td>
83
+ <td data-value="95.83" class="pic high">
84
+ <div class="chart"><div class="cover-fill" style="width: 95%"></div><div class="cover-empty" style="width: 5%"></div></div>
85
85
  </td>
86
- <td data-value="11.53" class="pct low">11.53%</td>
87
- <td data-value="26" class="abs low">3/26</td>
88
- <td data-value="0" class="pct low">0%</td>
89
- <td data-value="8" class="abs low">0/8</td>
90
- <td data-value="0" class="pct low">0%</td>
91
- <td data-value="3" class="abs low">0/3</td>
92
- <td data-value="11.53" class="pct low">11.53%</td>
93
- <td data-value="26" class="abs low">3/26</td>
86
+ <td data-value="95.83" class="pct high">95.83%</td>
87
+ <td data-value="24" class="abs high">23/24</td>
88
+ <td data-value="72.72" class="pct medium">72.72%</td>
89
+ <td data-value="11" class="abs medium">8/11</td>
90
+ <td data-value="100" class="pct high">100%</td>
91
+ <td data-value="3" class="abs high">3/3</td>
92
+ <td data-value="95.83" class="pct high">95.83%</td>
93
+ <td data-value="24" class="abs high">23/24</td>
94
94
  </tr>
95
95
 
96
96
  <tr>
@@ -108,6 +108,21 @@
108
108
  <td data-value="12" class="abs low">1/12</td>
109
109
  </tr>
110
110
 
111
+ <tr>
112
+ <td class="file high" data-value="signatures.js"><a href="signatures.js.html">signatures.js</a></td>
113
+ <td data-value="82.5" class="pic high">
114
+ <div class="chart"><div class="cover-fill" style="width: 82%"></div><div class="cover-empty" style="width: 18%"></div></div>
115
+ </td>
116
+ <td data-value="82.5" class="pct high">82.5%</td>
117
+ <td data-value="40" class="abs high">33/40</td>
118
+ <td data-value="73.68" class="pct medium">73.68%</td>
119
+ <td data-value="19" class="abs medium">14/19</td>
120
+ <td data-value="100" class="pct high">100%</td>
121
+ <td data-value="6" class="abs high">6/6</td>
122
+ <td data-value="82.5" class="pct high">82.5%</td>
123
+ <td data-value="40" class="abs high">33/40</td>
124
+ </tr>
125
+
111
126
  <tr>
112
127
  <td class="file high" data-value="users.js"><a href="users.js.html">users.js</a></td>
113
128
  <td data-value="100" class="pic high">
@@ -131,7 +146,7 @@
131
146
  <div class='footer quiet pad2 space-top1 center small'>
132
147
  Code coverage generated by
133
148
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
134
- at 2025-08-15T20:05:10.802Z
149
+ at 2025-08-22T15:34:11.195Z
135
150
  </div>
136
151
  <script src="../../prettify.js"></script>
137
152
  <script>
@@ -199,7 +199,7 @@ export default requestRevocation;
199
199
  <div class='footer quiet pad2 space-top1 center small'>
200
200
  Code coverage generated by
201
201
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
202
- at 2025-08-15T20:05:10.802Z
202
+ at 2025-08-22T15:34:11.195Z
203
203
  </div>
204
204
  <script src="../../prettify.js"></script>
205
205
  <script>