@manticore-labs/nest 0.0.71 → 0.0.73

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 (236) hide show
  1. package/.circleci/config.yml +47 -47
  2. package/.idea/codeStyles/Project.xml +37 -37
  3. package/.idea/codeStyles/codeStyleConfig.xml +4 -4
  4. package/.idea/encodings.xml +3 -3
  5. package/.idea/inspectionProfiles/Project_Default.xml +5 -5
  6. package/.idea/manticore-labs-nest.iml +11 -11
  7. package/.idea/misc.xml +5 -5
  8. package/.idea/modules.xml +7 -7
  9. package/.idea/vcs.xml +5 -5
  10. package/.idea/workspace.xml +77 -399
  11. package/LICENSE +8 -8
  12. package/README.1.md +116 -116
  13. package/README.md +1 -1
  14. package/build/main/index.d.ts +42 -42
  15. package/build/main/index.js +25 -25
  16. package/build/main/lib/auth0/actualizar-usuario-cuenta-dto/actualizar-usuario-cuenta-dto.d.ts +5 -5
  17. package/build/main/lib/auth0/actualizar-usuario-cuenta-dto/actualizar-usuario-cuenta-dto.js +24 -24
  18. package/build/main/lib/auth0/actualizar-usuario-dto/actualizar-usuario-dto.d.ts +5 -5
  19. package/build/main/lib/auth0/actualizar-usuario-dto/actualizar-usuario-dto.js +24 -24
  20. package/build/main/lib/auth0/auth0.controller.d.ts +40 -40
  21. package/build/main/lib/auth0/auth0.controller.js +537 -537
  22. package/build/main/lib/auth0/auth0.service.d.ts +69 -69
  23. package/build/main/lib/auth0/auth0.service.js +604 -604
  24. package/build/main/lib/auth0/crear-usuario-dto/crear-usuario-dto.d.ts +5 -5
  25. package/build/main/lib/auth0/crear-usuario-dto/crear-usuario-dto.js +25 -25
  26. package/build/main/lib/auth0/interfaces/busqueda-nombre.d.ts +3 -3
  27. package/build/main/lib/auth0/interfaces/busqueda-nombre.js +2 -2
  28. package/build/main/lib/auth0/interfaces/funciones-seguridad.d.ts +10 -10
  29. package/build/main/lib/auth0/interfaces/funciones-seguridad.js +2 -2
  30. package/build/main/lib/auth0/interfaces/mensajes-controlador.d.ts +5 -5
  31. package/build/main/lib/auth0/interfaces/mensajes-controlador.js +2 -2
  32. package/build/main/lib/auth0/seguridad-jwt-moviles/check-jwt.d.ts +2 -2
  33. package/build/main/lib/auth0/seguridad-jwt-moviles/check-jwt.js +7 -7
  34. package/build/main/lib/expresiones-regulares/letras-espacios-tildes-enie.d.ts +1 -1
  35. package/build/main/lib/expresiones-regulares/letras-espacios-tildes-enie.js +3 -3
  36. package/build/main/lib/funciones-util/buscar-registro.d.ts +1 -1
  37. package/build/main/lib/funciones-util/buscar-registro.js +492 -351
  38. package/build/main/lib/funciones-util/buscar-un-registro-por-id.d.ts +1 -1
  39. package/build/main/lib/funciones-util/buscar-un-registro-por-id.js +25 -25
  40. package/build/main/lib/funciones-util/buscar-where-or.d.ts +1 -1
  41. package/build/main/lib/funciones-util/buscar-where-or.js +33 -33
  42. package/build/main/lib/funciones-util/contar-registros.d.ts +1 -1
  43. package/build/main/lib/funciones-util/contar-registros.js +41 -41
  44. package/build/main/lib/funciones-util/crear-un-registro.d.ts +1 -1
  45. package/build/main/lib/funciones-util/crear-un-registro.js +24 -24
  46. package/build/main/lib/funciones-util/editar-un-registro.d.ts +1 -1
  47. package/build/main/lib/funciones-util/editar-un-registro.js +24 -24
  48. package/build/main/lib/funciones-util/eliminar-uno.d.ts +1 -1
  49. package/build/main/lib/funciones-util/eliminar-uno.js +35 -35
  50. package/build/main/lib/funciones-util/typeorm/valor-esta-dentro-del-arreglo.d.ts +2 -2
  51. package/build/main/lib/funciones-util/typeorm/valor-esta-dentro-del-arreglo.js +21 -21
  52. package/build/main/lib/interfaces-util/arreglo-funciones-booleanas.d.ts +4 -4
  53. package/build/main/lib/interfaces-util/arreglo-funciones-booleanas.js +2 -2
  54. package/build/main/lib/interfaces-util/broadcast-join.gateway.d.ts +14 -14
  55. package/build/main/lib/interfaces-util/broadcast-join.gateway.js +2 -2
  56. package/build/main/lib/interfaces-util/campos-a-buscar.d.ts +9 -9
  57. package/build/main/lib/interfaces-util/campos-a-buscar.js +9 -9
  58. package/build/main/lib/interfaces-util/delete-service.d.ts +12 -12
  59. package/build/main/lib/interfaces-util/delete-service.js +2 -2
  60. package/build/main/lib/interfaces-util/dto.d.ts +4 -4
  61. package/build/main/lib/interfaces-util/dto.js +2 -2
  62. package/build/main/lib/interfaces-util/find-where-relations.d.ts +9 -9
  63. package/build/main/lib/interfaces-util/find-where-relations.js +2 -2
  64. package/build/main/lib/interfaces-util/funciones-seguridad.d.ts +13 -13
  65. package/build/main/lib/interfaces-util/funciones-seguridad.js +2 -2
  66. package/build/main/lib/interfaces-util/funciones.gateway.d.ts +5 -5
  67. package/build/main/lib/interfaces-util/funciones.gateway.js +2 -2
  68. package/build/main/lib/interfaces-util/mensajes-controller.d.ts +6 -6
  69. package/build/main/lib/interfaces-util/mensajes-controller.js +2 -2
  70. package/build/main/lib/interfaces-util/politicas-de-seguridad.d.ts +17 -17
  71. package/build/main/lib/interfaces-util/politicas-de-seguridad.js +2 -2
  72. package/build/main/lib/interfaces-util/respuesta-general.gateway.d.ts +5 -5
  73. package/build/main/lib/interfaces-util/respuesta-general.gateway.js +2 -2
  74. package/build/main/lib/menu/entities/menu-entity.d.ts +13 -13
  75. package/build/main/lib/menu/entities/menu-entity.js +93 -93
  76. package/build/main/lib/one-signal/interfaces/funciones-seguridad.d.ts +9 -9
  77. package/build/main/lib/one-signal/interfaces/funciones-seguridad.js +2 -2
  78. package/build/main/lib/one-signal/interfaces/one-signal-device.d.ts +19 -19
  79. package/build/main/lib/one-signal/interfaces/one-signal-device.js +2 -2
  80. package/build/main/lib/one-signal/interfaces/one-signal-notification.d.ts +15 -15
  81. package/build/main/lib/one-signal/interfaces/one-signal-notification.js +2 -2
  82. package/build/main/lib/one-signal/interfaces/one-signal-notifications.d.ts +7 -7
  83. package/build/main/lib/one-signal/interfaces/one-signal-notifications.js +2 -2
  84. package/build/main/lib/one-signal/interfaces/one-signal-ok-create-notification-no-players.d.ts +5 -5
  85. package/build/main/lib/one-signal/interfaces/one-signal-ok-create-notification-no-players.js +2 -2
  86. package/build/main/lib/one-signal/interfaces/one-signal-ok-create-notification.d.ts +4 -4
  87. package/build/main/lib/one-signal/interfaces/one-signal-ok-create-notification.js +2 -2
  88. package/build/main/lib/one-signal/interfaces/one-signal-success.d.ts +3 -3
  89. package/build/main/lib/one-signal/interfaces/one-signal-success.js +2 -2
  90. package/build/main/lib/one-signal/interfaces/one-signal-tags.d.ts +3 -3
  91. package/build/main/lib/one-signal/interfaces/one-signal-tags.js +2 -2
  92. package/build/main/lib/one-signal/interfaces/one-signal-view-devices.d.ts +7 -7
  93. package/build/main/lib/one-signal/interfaces/one-signal-view-devices.js +2 -2
  94. package/build/main/lib/one-signal/one-signal.controller.d.ts +15 -15
  95. package/build/main/lib/one-signal/one-signal.controller.js +250 -250
  96. package/build/main/lib/one-signal/one-signal.service.d.ts +32 -32
  97. package/build/main/lib/one-signal/one-signal.service.js +84 -84
  98. package/build/main/lib/politicas/revisar-si-tiene-nombre-permiso.d.ts +1 -1
  99. package/build/main/lib/politicas/revisar-si-tiene-nombre-permiso.js +9 -9
  100. package/build/main/lib/politicas/revisar-si-tiene-rol.d.ts +1 -1
  101. package/build/main/lib/politicas/revisar-si-tiene-rol.js +9 -9
  102. package/build/main/lib/principal.controller.d.ts +20 -20
  103. package/build/main/lib/principal.controller.js +309 -309
  104. package/build/main/lib/principal.dto.d.ts +5 -5
  105. package/build/main/lib/principal.dto.js +21 -21
  106. package/build/main/lib/principal.entity.d.ts +7 -7
  107. package/build/main/lib/principal.entity.js +42 -42
  108. package/build/main/lib/principal.find-many-options.d.ts +14 -14
  109. package/build/main/lib/principal.find-many-options.js +48 -48
  110. package/build/main/lib/principal.find-many-where-or.d.ts +10 -10
  111. package/build/main/lib/principal.find-many-where-or.js +28 -28
  112. package/build/main/lib/principal.gateway.d.ts +35 -35
  113. package/build/main/lib/principal.gateway.js +399 -399
  114. package/build/main/lib/principal.id.d.ts +3 -3
  115. package/build/main/lib/principal.id.js +16 -16
  116. package/build/main/lib/principal.resolver.d.ts +21 -21
  117. package/build/main/lib/principal.resolver.js +343 -343
  118. package/build/main/lib/principal.service.d.ts +38 -38
  119. package/build/main/lib/principal.service.js +261 -256
  120. package/build/main/lib/seguridad/aplicar-politicas-de-seguridad.d.ts +4 -4
  121. package/build/main/lib/seguridad/aplicar-politicas-de-seguridad.js +16 -16
  122. package/build/main/lib/seguridad/funciones/convertir-arreglo-en-arreglo-de-observables.d.ts +3 -3
  123. package/build/main/lib/seguridad/funciones/convertir-arreglo-en-arreglo-de-observables.js +30 -30
  124. package/build/main/lib/seguridad/funciones/index.d.ts +6 -6
  125. package/build/main/lib/seguridad/funciones/index.js +12 -12
  126. package/build/main/lib/seguridad/funciones/obtener-reflector-seguridad.d.ts +1 -1
  127. package/build/main/lib/seguridad/funciones/obtener-reflector-seguridad.js +6 -6
  128. package/build/main/lib/seguridad/funciones/obtener-request.d.ts +1 -1
  129. package/build/main/lib/seguridad/funciones/obtener-request.js +6 -6
  130. package/build/main/lib/seguridad/funciones/obtener-response.d.ts +1 -1
  131. package/build/main/lib/seguridad/funciones/obtener-response.js +6 -6
  132. package/build/main/lib/seguridad/funciones/tiene-acceso-permitido.d.ts +2 -2
  133. package/build/main/lib/seguridad/funciones/tiene-acceso-permitido.js +13 -13
  134. package/build/main/lib/seguridad/seguridad.decorator.d.ts +1 -1
  135. package/build/main/lib/seguridad/seguridad.decorator.js +4 -4
  136. package/build/module/index.d.ts +42 -42
  137. package/build/module/index.js +20 -20
  138. package/build/module/lib/auth0/actualizar-usuario-cuenta-dto/actualizar-usuario-cuenta-dto.d.ts +5 -5
  139. package/build/module/lib/auth0/actualizar-usuario-cuenta-dto/actualizar-usuario-cuenta-dto.js +21 -21
  140. package/build/module/lib/auth0/actualizar-usuario-dto/actualizar-usuario-dto.d.ts +5 -5
  141. package/build/module/lib/auth0/actualizar-usuario-dto/actualizar-usuario-dto.js +21 -21
  142. package/build/module/lib/auth0/auth0.controller.d.ts +40 -40
  143. package/build/module/lib/auth0/auth0.controller.js +535 -535
  144. package/build/module/lib/auth0/auth0.service.d.ts +69 -69
  145. package/build/module/lib/auth0/auth0.service.js +603 -603
  146. package/build/module/lib/auth0/crear-usuario-dto/crear-usuario-dto.d.ts +5 -5
  147. package/build/module/lib/auth0/crear-usuario-dto/crear-usuario-dto.js +22 -22
  148. package/build/module/lib/auth0/interfaces/busqueda-nombre.d.ts +3 -3
  149. package/build/module/lib/auth0/interfaces/funciones-seguridad.d.ts +10 -10
  150. package/build/module/lib/auth0/interfaces/mensajes-controlador.d.ts +5 -5
  151. package/build/module/lib/auth0/seguridad-jwt-moviles/check-jwt.d.ts +2 -2
  152. package/build/module/lib/auth0/seguridad-jwt-moviles/check-jwt.js +4 -4
  153. package/build/module/lib/expresiones-regulares/letras-espacios-tildes-enie.d.ts +1 -1
  154. package/build/module/lib/expresiones-regulares/letras-espacios-tildes-enie.js +1 -1
  155. package/build/module/lib/funciones-util/buscar-registro.d.ts +1 -1
  156. package/build/module/lib/funciones-util/buscar-registro.js +489 -348
  157. package/build/module/lib/funciones-util/buscar-un-registro-por-id.d.ts +1 -1
  158. package/build/module/lib/funciones-util/buscar-un-registro-por-id.js +22 -22
  159. package/build/module/lib/funciones-util/buscar-where-or.d.ts +1 -1
  160. package/build/module/lib/funciones-util/buscar-where-or.js +30 -30
  161. package/build/module/lib/funciones-util/contar-registros.d.ts +1 -1
  162. package/build/module/lib/funciones-util/contar-registros.js +38 -38
  163. package/build/module/lib/funciones-util/crear-un-registro.d.ts +1 -1
  164. package/build/module/lib/funciones-util/crear-un-registro.js +21 -21
  165. package/build/module/lib/funciones-util/editar-un-registro.d.ts +1 -1
  166. package/build/module/lib/funciones-util/editar-un-registro.js +21 -21
  167. package/build/module/lib/funciones-util/eliminar-uno.d.ts +1 -1
  168. package/build/module/lib/funciones-util/eliminar-uno.js +32 -32
  169. package/build/module/lib/funciones-util/typeorm/valor-esta-dentro-del-arreglo.d.ts +2 -2
  170. package/build/module/lib/funciones-util/typeorm/valor-esta-dentro-del-arreglo.js +18 -18
  171. package/build/module/lib/interfaces-util/arreglo-funciones-booleanas.d.ts +4 -4
  172. package/build/module/lib/interfaces-util/broadcast-join.gateway.d.ts +14 -14
  173. package/build/module/lib/interfaces-util/campos-a-buscar.d.ts +9 -9
  174. package/build/module/lib/interfaces-util/campos-a-buscar.js +6 -6
  175. package/build/module/lib/interfaces-util/delete-service.d.ts +12 -12
  176. package/build/module/lib/interfaces-util/dto.d.ts +4 -4
  177. package/build/module/lib/interfaces-util/find-where-relations.d.ts +9 -9
  178. package/build/module/lib/interfaces-util/funciones-seguridad.d.ts +13 -13
  179. package/build/module/lib/interfaces-util/funciones.gateway.d.ts +5 -5
  180. package/build/module/lib/interfaces-util/mensajes-controller.d.ts +6 -6
  181. package/build/module/lib/interfaces-util/politicas-de-seguridad.d.ts +17 -17
  182. package/build/module/lib/interfaces-util/respuesta-general.gateway.d.ts +5 -5
  183. package/build/module/lib/menu/entities/menu-entity.d.ts +13 -13
  184. package/build/module/lib/menu/entities/menu-entity.js +90 -90
  185. package/build/module/lib/one-signal/interfaces/funciones-seguridad.d.ts +9 -9
  186. package/build/module/lib/one-signal/interfaces/one-signal-device.d.ts +19 -19
  187. package/build/module/lib/one-signal/interfaces/one-signal-notification.d.ts +15 -15
  188. package/build/module/lib/one-signal/interfaces/one-signal-notifications.d.ts +7 -7
  189. package/build/module/lib/one-signal/interfaces/one-signal-ok-create-notification-no-players.d.ts +5 -5
  190. package/build/module/lib/one-signal/interfaces/one-signal-ok-create-notification.d.ts +4 -4
  191. package/build/module/lib/one-signal/interfaces/one-signal-success.d.ts +3 -3
  192. package/build/module/lib/one-signal/interfaces/one-signal-tags.d.ts +3 -3
  193. package/build/module/lib/one-signal/interfaces/one-signal-view-devices.d.ts +7 -7
  194. package/build/module/lib/one-signal/one-signal.controller.d.ts +15 -15
  195. package/build/module/lib/one-signal/one-signal.controller.js +248 -248
  196. package/build/module/lib/one-signal/one-signal.service.d.ts +32 -32
  197. package/build/module/lib/one-signal/one-signal.service.js +82 -82
  198. package/build/module/lib/politicas/revisar-si-tiene-nombre-permiso.d.ts +1 -1
  199. package/build/module/lib/politicas/revisar-si-tiene-nombre-permiso.js +6 -6
  200. package/build/module/lib/politicas/revisar-si-tiene-rol.d.ts +1 -1
  201. package/build/module/lib/politicas/revisar-si-tiene-rol.js +6 -6
  202. package/build/module/lib/principal.controller.d.ts +20 -20
  203. package/build/module/lib/principal.controller.js +306 -306
  204. package/build/module/lib/principal.dto.d.ts +5 -5
  205. package/build/module/lib/principal.dto.js +18 -18
  206. package/build/module/lib/principal.entity.d.ts +7 -7
  207. package/build/module/lib/principal.entity.js +39 -39
  208. package/build/module/lib/principal.find-many-options.d.ts +14 -14
  209. package/build/module/lib/principal.find-many-options.js +45 -45
  210. package/build/module/lib/principal.find-many-where-or.d.ts +10 -10
  211. package/build/module/lib/principal.find-many-where-or.js +25 -25
  212. package/build/module/lib/principal.gateway.d.ts +35 -35
  213. package/build/module/lib/principal.gateway.js +396 -396
  214. package/build/module/lib/principal.id.d.ts +3 -3
  215. package/build/module/lib/principal.id.js +13 -13
  216. package/build/module/lib/principal.resolver.d.ts +21 -21
  217. package/build/module/lib/principal.resolver.js +340 -340
  218. package/build/module/lib/principal.service.d.ts +38 -38
  219. package/build/module/lib/principal.service.js +258 -253
  220. package/build/module/lib/seguridad/aplicar-politicas-de-seguridad.d.ts +4 -4
  221. package/build/module/lib/seguridad/aplicar-politicas-de-seguridad.js +13 -13
  222. package/build/module/lib/seguridad/funciones/convertir-arreglo-en-arreglo-de-observables.d.ts +3 -3
  223. package/build/module/lib/seguridad/funciones/convertir-arreglo-en-arreglo-de-observables.js +27 -27
  224. package/build/module/lib/seguridad/funciones/index.d.ts +6 -6
  225. package/build/module/lib/seguridad/funciones/index.js +6 -6
  226. package/build/module/lib/seguridad/funciones/obtener-reflector-seguridad.d.ts +1 -1
  227. package/build/module/lib/seguridad/funciones/obtener-reflector-seguridad.js +3 -3
  228. package/build/module/lib/seguridad/funciones/obtener-request.d.ts +1 -1
  229. package/build/module/lib/seguridad/funciones/obtener-request.js +3 -3
  230. package/build/module/lib/seguridad/funciones/obtener-response.d.ts +1 -1
  231. package/build/module/lib/seguridad/funciones/obtener-response.js +3 -3
  232. package/build/module/lib/seguridad/funciones/tiene-acceso-permitido.d.ts +2 -2
  233. package/build/module/lib/seguridad/funciones/tiene-acceso-permitido.js +10 -10
  234. package/build/module/lib/seguridad/seguridad.decorator.d.ts +1 -1
  235. package/build/module/lib/seguridad/seguridad.decorator.js +2 -2
  236. package/package.json +117 -116
@@ -1,604 +1,604 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
6
- };
7
- import { Injectable } from '@nestjs/common';
8
- import { AuthenticationClient } from 'auth0';
9
- import { buscarVariosRegistros } from '../funciones-util/buscar-registro';
10
- import { PrincipalFindManyOptions } from '../principal.find-many-options';
11
- import axio from 'axios';
12
- const axios = axio;
13
- const ManagementClient = require('auth0').ManagementClient;
14
- let PrincipalAuth0Service = class PrincipalAuth0Service {
15
- constructor(AUTH0_CONFIG, _datosUsuarioService, datosUsuarioDto, AUTH0_CONFIG_PASSWORD, search_engine = 'v3', sort = 'created_at:-1', debug = true) {
16
- this.AUTH0_CONFIG = AUTH0_CONFIG;
17
- this._datosUsuarioService = _datosUsuarioService;
18
- this.datosUsuarioDto = datosUsuarioDto;
19
- this.AUTH0_CONFIG_PASSWORD = AUTH0_CONFIG_PASSWORD;
20
- this.search_engine = search_engine;
21
- this.sort = sort;
22
- this.debug = debug;
23
- this.managementClient = new ManagementClient({
24
- domain: `${this.AUTH0_CONFIG.CUENTA}.auth0.com`,
25
- clientId: `${this.AUTH0_CONFIG.CLIENT_ID}`,
26
- clientSecret: `${this.AUTH0_CONFIG.SECRET}`,
27
- scope: 'read:users update:users create:users read:user_idp_tokens'
28
- });
29
- this.authenticationClient = new AuthenticationClient({
30
- domain: `${AUTH0_CONFIG.CUENTA}.auth0.com`,
31
- clientId: `${AUTH0_CONFIG.CLIENT_ID}`
32
- });
33
- }
34
- async findOne(id) {
35
- if (id) {
36
- return await new Promise((resolve) => {
37
- const idUsuario = { id };
38
- this.managementClient
39
- .users
40
- .get(idUsuario, (err, usuarioEncontrado) => {
41
- if (err) {
42
- if (this.debug) {
43
- console.error('Error: ', err);
44
- }
45
- let error = 500;
46
- let mensaje = 'Error buscando usuario';
47
- if (err.statusCode === 404) {
48
- error = err.statusCode;
49
- mensaje = 'No existe usuario';
50
- }
51
- resolve({ error, mensaje });
52
- }
53
- else {
54
- resolve(usuarioEncontrado);
55
- }
56
- });
57
- });
58
- }
59
- else {
60
- return await new Promise((res) => res({ mensaje: 'No envia id', error: 400 }));
61
- }
62
- }
63
- async create(registro) {
64
- return await new Promise((resolve) => {
65
- this.managementClient
66
- .users
67
- .create(registro, (err, nuevoRegistro) => {
68
- if (err) {
69
- if (this.debug) {
70
- console.error('Error: ', err);
71
- }
72
- let error = 500;
73
- let mensaje = 'Error creando usuario';
74
- if (err.statusCode === 409) {
75
- error = err.statusCode;
76
- mensaje = 'Ya existe ese usuario';
77
- }
78
- if (err.statusCode === 400) {
79
- error = err.statusCode;
80
- mensaje = 'Usuario inválido';
81
- }
82
- resolve({ error, mensaje });
83
- }
84
- else {
85
- resolve(nuevoRegistro);
86
- }
87
- });
88
- });
89
- }
90
- async find(criterioBusqueda) {
91
- return await new Promise((resolve) => {
92
- let params;
93
- if (criterioBusqueda) {
94
- if (this.debug) {
95
- console.log('Hay criterio', criterioBusqueda);
96
- }
97
- const sort = obtenerPrimerOrder(criterioBusqueda.order);
98
- params = {
99
- per_page: criterioBusqueda.take ? criterioBusqueda.take : 30,
100
- page: criterioBusqueda.skip ? criterioBusqueda.skip : 0,
101
- search_engine: this.search_engine,
102
- include_totals: true,
103
- sort
104
- };
105
- if (criterioBusqueda.where) {
106
- params.q = criterioBusqueda.where;
107
- }
108
- if (criterioBusqueda.select) {
109
- params.fields = obtenerCamposSeparadosPorComa(criterioBusqueda.select);
110
- }
111
- }
112
- else {
113
- params = {
114
- per_page: 30,
115
- page: 0,
116
- search_engine: this.search_engine,
117
- include_totals: true,
118
- sort: this.sort
119
- };
120
- }
121
- if (this.debug) {
122
- console.log('Parametros: ', params);
123
- }
124
- this.managementClient
125
- .users
126
- .get(params, (err, usuarioEncontrado) => {
127
- if (err) {
128
- if (this.debug) {
129
- console.error('Error: ', err);
130
- }
131
- let error = 500;
132
- let mensaje = 'Error buscando usuarios';
133
- if (err.statusCode === 404) {
134
- error = err.statusCode;
135
- mensaje = 'No existen usuarios';
136
- }
137
- resolve({ error, mensaje });
138
- }
139
- else {
140
- resolve(usuarioEncontrado.users);
141
- }
142
- });
143
- });
144
- // }
145
- }
146
- async findBy(arregloCamposABuscar, busqueda) {
147
- return new Promise((resolve) => {
148
- let params = {
149
- q: ''
150
- };
151
- let query = '';
152
- arregloCamposABuscar
153
- .forEach((campo) => {
154
- if (query === '') {
155
- query = `${campo}="${busqueda}"`;
156
- }
157
- else {
158
- query = query + ` OR ${campo}="${busqueda}"`;
159
- }
160
- });
161
- params.q = query;
162
- if (this.debug) {
163
- console.log('Parametros: ', params);
164
- }
165
- this.managementClient
166
- .users
167
- .get(params, (err, usuariosEncontrados) => {
168
- if (err) {
169
- if (this.debug) {
170
- console.error('Error: ', err);
171
- }
172
- let error = 500;
173
- let mensaje = 'Error buscando usuarios';
174
- if (err.statusCode === 404) {
175
- error = err.statusCode;
176
- mensaje = 'No existen usuarios';
177
- }
178
- resolve({ error, mensaje });
179
- }
180
- else {
181
- resolve(usuariosEncontrados);
182
- }
183
- });
184
- });
185
- }
186
- async findOneByIdAndUpdate(id, datosAActualizar) {
187
- const usuario = await this.findOne(id);
188
- if (this.debug) {
189
- console.log('Usuario encontrado: ', usuario);
190
- }
191
- return await new Promise((resolve) => {
192
- if (usuario.error) {
193
- if (this.debug) {
194
- console.log('Error encontrando usuario: ', usuario);
195
- }
196
- resolve(usuario);
197
- }
198
- if (datosAActualizar.user_metadata) {
199
- datosAActualizar.user_metadata = elaborarUserMetadataAActualizar(usuario.user_metadata, datosAActualizar.user_metadata);
200
- }
201
- this.managementClient
202
- .users
203
- .update({ id }, datosAActualizar, (err, registroActualizado) => {
204
- if (err) {
205
- if (this.debug) {
206
- console.error('Error: ', err);
207
- }
208
- let error = 500;
209
- let mensaje = 'Error actualizando usuario';
210
- if (err.statusCode === 400) {
211
- error = err.statusCode;
212
- mensaje = 'Usuario inválido';
213
- }
214
- if (err.statusCode === 404) {
215
- error = err.statusCode;
216
- mensaje = 'Usuario no encontrado';
217
- }
218
- resolve({ error, mensaje });
219
- }
220
- else {
221
- resolve(registroActualizado);
222
- }
223
- });
224
- });
225
- }
226
- sendEmailVerification(id) {
227
- return new Promise((resolve) => {
228
- this.managementClient
229
- .sendEmailVerification({
230
- user_id: id
231
- })
232
- .then((r) => {
233
- if (this.debug) {
234
- console.error('Peticion: ', r);
235
- }
236
- resolve({ mensaje: 'Peticion enviada' });
237
- })
238
- .catch((err) => {
239
- if (this.debug) {
240
- console.error('Error: ', err);
241
- }
242
- resolve({ error: 500, mensaje: 'Error enviando peticion' });
243
- });
244
- });
245
- }
246
- refreshToken(refreshToken) {
247
- return new Promise((resolve) => {
248
- const data = {
249
- refresh_token: refreshToken
250
- };
251
- this.authenticationClient
252
- .refreshToken(data, (err, userData) => {
253
- if (err) {
254
- if (this.debug) {
255
- console.error('Error: ', err);
256
- }
257
- resolve({ error: 500, mensaje: 'Error enviando peticion' });
258
- }
259
- else {
260
- resolve({ data: userData });
261
- }
262
- });
263
- });
264
- }
265
- changePassword(email, connection = 'Username-Password-Authentication') {
266
- return new Promise((resolve) => {
267
- this.authenticationClient
268
- .requestChangePasswordEmail({
269
- email,
270
- connection
271
- })
272
- .then((r) => {
273
- if (this.debug) {
274
- console.error('Peticion: ', r);
275
- }
276
- resolve({ mensaje: 'Cambio de password realizado' });
277
- })
278
- .catch((err) => {
279
- if (this.debug) {
280
- console.error('Error: ', err);
281
- }
282
- resolve({ error: 500, mensaje: 'Error enviando peticion' });
283
- });
284
- });
285
- }
286
- delete(id) {
287
- return new Promise((resolve) => {
288
- this.managementClient
289
- .users
290
- .delete({ id: id }, (err) => {
291
- if (err) {
292
- if (this.debug) {
293
- console.error('Error: ', err);
294
- }
295
- let error = 500;
296
- let mensaje = 'Error borrando usuario';
297
- if (err.statusCode === 400) {
298
- error = err.statusCode;
299
- mensaje = 'Usuario inválido';
300
- }
301
- if (err.statusCode === 404) {
302
- error = err.statusCode;
303
- mensaje = 'Usuario no encontrado';
304
- }
305
- resolve({ error, mensaje });
306
- }
307
- else {
308
- resolve({ mensaje: `Registro con id: ${id} eliminado` });
309
- }
310
- });
311
- });
312
- }
313
- async createMany(nuevosRegistros) {
314
- return new Promise((resolve) => {
315
- let terminado = 0;
316
- let numeroDeRegistros = 0;
317
- const registrosCreados = [];
318
- while (terminado < nuevosRegistros.length) {
319
- const contadorAuxiliar = terminado;
320
- const tiempoEnCrearse = 10000 * (terminado + 1);
321
- setTimeout(() => {
322
- this.create(nuevosRegistros[contadorAuxiliar])
323
- .then((registroCreado) => {
324
- if (this.debug) {
325
- console.log('Registro creado', registroCreado);
326
- console.log('nuevosRegistros.length', nuevosRegistros.length);
327
- console.log('numeroDeRegistros', numeroDeRegistros);
328
- }
329
- if (registroCreado.error === 409 || registroCreado.error === 400) {
330
- if (this.debug) {
331
- console.log('Usuario ya existe o bad request', nuevosRegistros[contadorAuxiliar]);
332
- }
333
- this.find({ where: `username:${nuevosRegistros[contadorAuxiliar].username}` })
334
- .then((usuario) => {
335
- numeroDeRegistros++;
336
- registrosCreados.push(usuario[0]);
337
- if (numeroDeRegistros === nuevosRegistros.length) {
338
- resolve(registrosCreados);
339
- }
340
- })
341
- .catch((e) => {
342
- numeroDeRegistros++;
343
- registrosCreados.push(e);
344
- if (numeroDeRegistros === nuevosRegistros.length) {
345
- resolve(registrosCreados);
346
- }
347
- });
348
- }
349
- else {
350
- numeroDeRegistros++;
351
- registrosCreados.push(registroCreado);
352
- if (numeroDeRegistros === nuevosRegistros.length) {
353
- resolve(registrosCreados);
354
- }
355
- }
356
- })
357
- .catch((err) => {
358
- if (this.debug) {
359
- console.error('Error creando: ', err);
360
- }
361
- numeroDeRegistros++;
362
- registrosCreados.push(err);
363
- if (numeroDeRegistros === nuevosRegistros.length - 1) {
364
- resolve(registrosCreados);
365
- }
366
- });
367
- }, tiempoEnCrearse);
368
- terminado++;
369
- }
370
- });
371
- }
372
- async findWhereOr(camposABuscar, skip = 0, take = 10) {
373
- if (this._datosUsuarioService) {
374
- if (this.debug) {
375
- console.info('Consulta: ', camposABuscar);
376
- }
377
- const usuariosEncontrados = await this._datosUsuarioService
378
- .findWhereOr(camposABuscar, skip, take);
379
- if (this.debug) {
380
- console.info('UsuariosEncontrados: ', usuariosEncontrados);
381
- }
382
- let consulta = '';
383
- const hayUsuarios = usuariosEncontrados[0].length > 0;
384
- if (hayUsuarios) {
385
- usuariosEncontrados[0]
386
- .forEach((datosUsuario) => {
387
- if (consulta === '') {
388
- consulta = consulta + datosUsuario.user_id;
389
- }
390
- else {
391
- consulta = consulta + ' OR ' + datosUsuario.user_id;
392
- }
393
- });
394
- if (this.debug) {
395
- console.info('Consulta de usuarios: ', consulta);
396
- }
397
- const respuesta = await this.find({
398
- where: consulta
399
- });
400
- if (respuesta.error) {
401
- const error = respuesta;
402
- return { error: error.error, mensaje: error.mensaje };
403
- }
404
- else {
405
- let usuariosAuth0 = respuesta;
406
- usuariosAuth0 = usuariosAuth0
407
- .map((usuarioAuth0) => {
408
- usuarioAuth0.usuario = usuariosEncontrados[0]
409
- .find((usuario) => {
410
- return usuario.user_id === usuarioAuth0.user_id;
411
- });
412
- return usuarioAuth0;
413
- });
414
- return [usuariosAuth0, usuariosAuth0.length];
415
- }
416
- }
417
- else {
418
- if (this.debug) {
419
- console.info('No se encontraron usuarios');
420
- }
421
- return { error: 404, mensaje: 'No se encontro ningun usuario' };
422
- }
423
- }
424
- else {
425
- if (this.debug) {
426
- console.info('No existe el servicio, añada como dependencia en el constructor el _datosUsuarioService');
427
- }
428
- return { error: 400, mensaje: 'No existe el servicio DatosUsuarioService' };
429
- }
430
- }
431
- async findAll(criterioBusqueda, skip, take) {
432
- if (this._datosUsuarioService) {
433
- if (this.debug) {
434
- console.info('Consulta: ', criterioBusqueda);
435
- }
436
- const usuariosEncontrados = await buscarVariosRegistros(criterioBusqueda, PrincipalFindManyOptions, skip, take, this._datosUsuarioService);
437
- if (this.debug) {
438
- console.info('UsuariosEncontrados: ', usuariosEncontrados);
439
- }
440
- let consulta = '';
441
- const hayUsuarios = usuariosEncontrados[0].length > 0;
442
- if (hayUsuarios) {
443
- usuariosEncontrados[0]
444
- .forEach((datosUsuario) => {
445
- if (consulta === '') {
446
- consulta = consulta + datosUsuario.user_id;
447
- }
448
- else {
449
- consulta = consulta + ' OR ' + datosUsuario.user_id;
450
- }
451
- });
452
- if (this.debug) {
453
- console.info('Consulta de usuarios: ', consulta);
454
- }
455
- const respuesta = await this.find({
456
- where: consulta
457
- });
458
- if (respuesta.error) {
459
- const error = respuesta;
460
- return { error: error.error, mensaje: error.mensaje };
461
- }
462
- else {
463
- let usuariosAuth0 = respuesta;
464
- usuariosAuth0 = usuariosAuth0
465
- .map((usuarioAuth0) => {
466
- usuarioAuth0.usuario = usuariosEncontrados[0]
467
- .find((usuario) => {
468
- return usuario.user_id === usuarioAuth0.user_id;
469
- });
470
- return usuarioAuth0;
471
- });
472
- return [usuariosAuth0, usuariosAuth0.length];
473
- }
474
- }
475
- else {
476
- if (this.debug) {
477
- console.info('No se encontraron usuarios');
478
- }
479
- return { error: 404, mensaje: 'No se encontro ningun usuario' };
480
- }
481
- }
482
- else {
483
- if (this.debug) {
484
- console.info('No existe el servicio, añada como dependencia en el constructor el _datosUsuarioService');
485
- }
486
- return { error: 400, mensaje: 'No existe el servicio DatosUsuarioService' };
487
- }
488
- }
489
- login(username, password) {
490
- return new Promise(async (res, rej) => {
491
- try {
492
- const urlBase = `https://${this.AUTH0_CONFIG.CUENTA}.auth0.com`;
493
- const scopeAuth0 = 'openid profile email read:users user_id id offline_access';
494
- if (this.debug) {
495
- console.log({
496
- mensaje: 'URL base',
497
- datos: {
498
- urlBase
499
- }
500
- });
501
- }
502
- const configuracionObtenerToken = {
503
- method: 'post',
504
- url: urlBase + '/oauth/token',
505
- data: {
506
- username,
507
- password,
508
- grant_type: 'password',
509
- connection: 'Username-Password-Authentication',
510
- realm: 'Username-Password-Authentication',
511
- scope: scopeAuth0,
512
- client_id: this.AUTH0_CONFIG_PASSWORD.client_id,
513
- client_secret: this.AUTH0_CONFIG_PASSWORD.client_secret
514
- }
515
- };
516
- const respuestaAxios = await axios(configuracionObtenerToken);
517
- const configuracionUserInfo = {
518
- method: 'get',
519
- url: urlBase + '/userinfo',
520
- headers: {
521
- 'Authorization': 'Bearer ' + respuestaAxios.data.access_token,
522
- 'Content-Type': 'application/json'
523
- }
524
- };
525
- const respuestaUsuario = await axios(configuracionUserInfo);
526
- res({
527
- usuario: {
528
- ...respuestaUsuario.data
529
- },
530
- token: {
531
- ...respuestaAxios.data
532
- }
533
- });
534
- }
535
- catch (e) {
536
- console.error(e);
537
- rej({ error: 500, mensaje: 'Error en login' });
538
- }
539
- });
540
- }
541
- requestChangePasswordByEmail(email, connection = 'Username-Password-Authentication') {
542
- return new Promise((res, rej) => {
543
- const data = {
544
- email,
545
- connection
546
- };
547
- this.authenticationClient
548
- .requestChangePasswordEmail(data, (err) => {
549
- if (err) {
550
- console.error(err);
551
- rej({ mensaje: 'Error solicitando password', error: 500 });
552
- }
553
- res({
554
- mensaje: 'Si tu correo ha sido confirmado, recibiras un link para resetear tu password. Revisa tu correo.'
555
- });
556
- });
557
- });
558
- }
559
- };
560
- PrincipalAuth0Service = __decorate([
561
- Injectable()
562
- ], PrincipalAuth0Service);
563
- export { PrincipalAuth0Service };
564
- function obtenerPrimerOrder(order) {
565
- if (order) {
566
- const nombreCampo = Object.keys(order)[0];
567
- return `${nombreCampo}:${order[nombreCampo] === 'ASC' ? 1 : -1}`;
568
- }
569
- else {
570
- return undefined;
571
- }
572
- }
573
- function obtenerCamposSeparadosPorComa(select) {
574
- if (select) {
575
- let campos = '';
576
- select.forEach((nombreCampo) => {
577
- if (campos === '') {
578
- campos = nombreCampo;
579
- }
580
- else {
581
- campos = `${campos},${nombreCampo}`;
582
- }
583
- });
584
- return campos;
585
- }
586
- else {
587
- return undefined;
588
- }
589
- }
590
- function elaborarUserMetadataAActualizar(user_metadata, user_metadataAActualizar) {
591
- let user_metadataClonado = {};
592
- try {
593
- user_metadataClonado = JSON.parse(JSON.stringify(user_metadata));
594
- }
595
- catch (e) {
596
- }
597
- Object
598
- .keys(user_metadataAActualizar)
599
- .forEach((nombrePropiedad) => {
600
- user_metadataClonado[nombrePropiedad] = user_metadataAActualizar[nombrePropiedad];
601
- });
602
- return user_metadataClonado;
603
- }
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { Injectable } from '@nestjs/common';
8
+ import { AuthenticationClient } from 'auth0';
9
+ import { buscarVariosRegistros } from '../funciones-util/buscar-registro';
10
+ import { PrincipalFindManyOptions } from '../principal.find-many-options';
11
+ import axio from 'axios';
12
+ const axios = axio;
13
+ const ManagementClient = require('auth0').ManagementClient;
14
+ let PrincipalAuth0Service = class PrincipalAuth0Service {
15
+ constructor(AUTH0_CONFIG, _datosUsuarioService, datosUsuarioDto, AUTH0_CONFIG_PASSWORD, search_engine = 'v3', sort = 'created_at:-1', debug = true) {
16
+ this.AUTH0_CONFIG = AUTH0_CONFIG;
17
+ this._datosUsuarioService = _datosUsuarioService;
18
+ this.datosUsuarioDto = datosUsuarioDto;
19
+ this.AUTH0_CONFIG_PASSWORD = AUTH0_CONFIG_PASSWORD;
20
+ this.search_engine = search_engine;
21
+ this.sort = sort;
22
+ this.debug = debug;
23
+ this.managementClient = new ManagementClient({
24
+ domain: `${this.AUTH0_CONFIG.CUENTA}.auth0.com`,
25
+ clientId: `${this.AUTH0_CONFIG.CLIENT_ID}`,
26
+ clientSecret: `${this.AUTH0_CONFIG.SECRET}`,
27
+ scope: 'read:users update:users create:users read:user_idp_tokens'
28
+ });
29
+ this.authenticationClient = new AuthenticationClient({
30
+ domain: `${AUTH0_CONFIG.CUENTA}.auth0.com`,
31
+ clientId: `${AUTH0_CONFIG.CLIENT_ID}`
32
+ });
33
+ }
34
+ async findOne(id) {
35
+ if (id) {
36
+ return await new Promise((resolve) => {
37
+ const idUsuario = { id };
38
+ this.managementClient
39
+ .users
40
+ .get(idUsuario, (err, usuarioEncontrado) => {
41
+ if (err) {
42
+ if (this.debug) {
43
+ console.error('Error: ', err);
44
+ }
45
+ let error = 500;
46
+ let mensaje = 'Error buscando usuario';
47
+ if (err.statusCode === 404) {
48
+ error = err.statusCode;
49
+ mensaje = 'No existe usuario';
50
+ }
51
+ resolve({ error, mensaje });
52
+ }
53
+ else {
54
+ resolve(usuarioEncontrado);
55
+ }
56
+ });
57
+ });
58
+ }
59
+ else {
60
+ return await new Promise((res) => res({ mensaje: 'No envia id', error: 400 }));
61
+ }
62
+ }
63
+ async create(registro) {
64
+ return await new Promise((resolve) => {
65
+ this.managementClient
66
+ .users
67
+ .create(registro, (err, nuevoRegistro) => {
68
+ if (err) {
69
+ if (this.debug) {
70
+ console.error('Error: ', err);
71
+ }
72
+ let error = 500;
73
+ let mensaje = 'Error creando usuario';
74
+ if (err.statusCode === 409) {
75
+ error = err.statusCode;
76
+ mensaje = 'Ya existe ese usuario';
77
+ }
78
+ if (err.statusCode === 400) {
79
+ error = err.statusCode;
80
+ mensaje = 'Usuario inválido';
81
+ }
82
+ resolve({ error, mensaje });
83
+ }
84
+ else {
85
+ resolve(nuevoRegistro);
86
+ }
87
+ });
88
+ });
89
+ }
90
+ async find(criterioBusqueda) {
91
+ return await new Promise((resolve) => {
92
+ let params;
93
+ if (criterioBusqueda) {
94
+ if (this.debug) {
95
+ console.log('Hay criterio', criterioBusqueda);
96
+ }
97
+ const sort = obtenerPrimerOrder(criterioBusqueda.order);
98
+ params = {
99
+ per_page: criterioBusqueda.take ? criterioBusqueda.take : 30,
100
+ page: criterioBusqueda.skip ? criterioBusqueda.skip : 0,
101
+ search_engine: this.search_engine,
102
+ include_totals: true,
103
+ sort
104
+ };
105
+ if (criterioBusqueda.where) {
106
+ params.q = criterioBusqueda.where;
107
+ }
108
+ if (criterioBusqueda.select) {
109
+ params.fields = obtenerCamposSeparadosPorComa(criterioBusqueda.select);
110
+ }
111
+ }
112
+ else {
113
+ params = {
114
+ per_page: 30,
115
+ page: 0,
116
+ search_engine: this.search_engine,
117
+ include_totals: true,
118
+ sort: this.sort
119
+ };
120
+ }
121
+ if (this.debug) {
122
+ console.log('Parametros: ', params);
123
+ }
124
+ this.managementClient
125
+ .users
126
+ .get(params, (err, usuarioEncontrado) => {
127
+ if (err) {
128
+ if (this.debug) {
129
+ console.error('Error: ', err);
130
+ }
131
+ let error = 500;
132
+ let mensaje = 'Error buscando usuarios';
133
+ if (err.statusCode === 404) {
134
+ error = err.statusCode;
135
+ mensaje = 'No existen usuarios';
136
+ }
137
+ resolve({ error, mensaje });
138
+ }
139
+ else {
140
+ resolve(usuarioEncontrado.users);
141
+ }
142
+ });
143
+ });
144
+ // }
145
+ }
146
+ async findBy(arregloCamposABuscar, busqueda) {
147
+ return new Promise((resolve) => {
148
+ let params = {
149
+ q: ''
150
+ };
151
+ let query = '';
152
+ arregloCamposABuscar
153
+ .forEach((campo) => {
154
+ if (query === '') {
155
+ query = `${campo}="${busqueda}"`;
156
+ }
157
+ else {
158
+ query = query + ` OR ${campo}="${busqueda}"`;
159
+ }
160
+ });
161
+ params.q = query;
162
+ if (this.debug) {
163
+ console.log('Parametros: ', params);
164
+ }
165
+ this.managementClient
166
+ .users
167
+ .get(params, (err, usuariosEncontrados) => {
168
+ if (err) {
169
+ if (this.debug) {
170
+ console.error('Error: ', err);
171
+ }
172
+ let error = 500;
173
+ let mensaje = 'Error buscando usuarios';
174
+ if (err.statusCode === 404) {
175
+ error = err.statusCode;
176
+ mensaje = 'No existen usuarios';
177
+ }
178
+ resolve({ error, mensaje });
179
+ }
180
+ else {
181
+ resolve(usuariosEncontrados);
182
+ }
183
+ });
184
+ });
185
+ }
186
+ async findOneByIdAndUpdate(id, datosAActualizar) {
187
+ const usuario = await this.findOne(id);
188
+ if (this.debug) {
189
+ console.log('Usuario encontrado: ', usuario);
190
+ }
191
+ return await new Promise((resolve) => {
192
+ if (usuario.error) {
193
+ if (this.debug) {
194
+ console.log('Error encontrando usuario: ', usuario);
195
+ }
196
+ resolve(usuario);
197
+ }
198
+ if (datosAActualizar.user_metadata) {
199
+ datosAActualizar.user_metadata = elaborarUserMetadataAActualizar(usuario.user_metadata, datosAActualizar.user_metadata);
200
+ }
201
+ this.managementClient
202
+ .users
203
+ .update({ id }, datosAActualizar, (err, registroActualizado) => {
204
+ if (err) {
205
+ if (this.debug) {
206
+ console.error('Error: ', err);
207
+ }
208
+ let error = 500;
209
+ let mensaje = 'Error actualizando usuario';
210
+ if (err.statusCode === 400) {
211
+ error = err.statusCode;
212
+ mensaje = 'Usuario inválido';
213
+ }
214
+ if (err.statusCode === 404) {
215
+ error = err.statusCode;
216
+ mensaje = 'Usuario no encontrado';
217
+ }
218
+ resolve({ error, mensaje });
219
+ }
220
+ else {
221
+ resolve(registroActualizado);
222
+ }
223
+ });
224
+ });
225
+ }
226
+ sendEmailVerification(id) {
227
+ return new Promise((resolve) => {
228
+ this.managementClient
229
+ .sendEmailVerification({
230
+ user_id: id
231
+ })
232
+ .then((r) => {
233
+ if (this.debug) {
234
+ console.error('Peticion: ', r);
235
+ }
236
+ resolve({ mensaje: 'Peticion enviada' });
237
+ })
238
+ .catch((err) => {
239
+ if (this.debug) {
240
+ console.error('Error: ', err);
241
+ }
242
+ resolve({ error: 500, mensaje: 'Error enviando peticion' });
243
+ });
244
+ });
245
+ }
246
+ refreshToken(refreshToken) {
247
+ return new Promise((resolve) => {
248
+ const data = {
249
+ refresh_token: refreshToken
250
+ };
251
+ this.authenticationClient
252
+ .refreshToken(data, (err, userData) => {
253
+ if (err) {
254
+ if (this.debug) {
255
+ console.error('Error: ', err);
256
+ }
257
+ resolve({ error: 500, mensaje: 'Error enviando peticion' });
258
+ }
259
+ else {
260
+ resolve({ data: userData });
261
+ }
262
+ });
263
+ });
264
+ }
265
+ changePassword(email, connection = 'Username-Password-Authentication') {
266
+ return new Promise((resolve) => {
267
+ this.authenticationClient
268
+ .requestChangePasswordEmail({
269
+ email,
270
+ connection
271
+ })
272
+ .then((r) => {
273
+ if (this.debug) {
274
+ console.error('Peticion: ', r);
275
+ }
276
+ resolve({ mensaje: 'Cambio de password realizado' });
277
+ })
278
+ .catch((err) => {
279
+ if (this.debug) {
280
+ console.error('Error: ', err);
281
+ }
282
+ resolve({ error: 500, mensaje: 'Error enviando peticion' });
283
+ });
284
+ });
285
+ }
286
+ delete(id) {
287
+ return new Promise((resolve) => {
288
+ this.managementClient
289
+ .users
290
+ .delete({ id: id }, (err) => {
291
+ if (err) {
292
+ if (this.debug) {
293
+ console.error('Error: ', err);
294
+ }
295
+ let error = 500;
296
+ let mensaje = 'Error borrando usuario';
297
+ if (err.statusCode === 400) {
298
+ error = err.statusCode;
299
+ mensaje = 'Usuario inválido';
300
+ }
301
+ if (err.statusCode === 404) {
302
+ error = err.statusCode;
303
+ mensaje = 'Usuario no encontrado';
304
+ }
305
+ resolve({ error, mensaje });
306
+ }
307
+ else {
308
+ resolve({ mensaje: `Registro con id: ${id} eliminado` });
309
+ }
310
+ });
311
+ });
312
+ }
313
+ async createMany(nuevosRegistros) {
314
+ return new Promise((resolve) => {
315
+ let terminado = 0;
316
+ let numeroDeRegistros = 0;
317
+ const registrosCreados = [];
318
+ while (terminado < nuevosRegistros.length) {
319
+ const contadorAuxiliar = terminado;
320
+ const tiempoEnCrearse = 10000 * (terminado + 1);
321
+ setTimeout(() => {
322
+ this.create(nuevosRegistros[contadorAuxiliar])
323
+ .then((registroCreado) => {
324
+ if (this.debug) {
325
+ console.log('Registro creado', registroCreado);
326
+ console.log('nuevosRegistros.length', nuevosRegistros.length);
327
+ console.log('numeroDeRegistros', numeroDeRegistros);
328
+ }
329
+ if (registroCreado.error === 409 || registroCreado.error === 400) {
330
+ if (this.debug) {
331
+ console.log('Usuario ya existe o bad request', nuevosRegistros[contadorAuxiliar]);
332
+ }
333
+ this.find({ where: `username:${nuevosRegistros[contadorAuxiliar].username}` })
334
+ .then((usuario) => {
335
+ numeroDeRegistros++;
336
+ registrosCreados.push(usuario[0]);
337
+ if (numeroDeRegistros === nuevosRegistros.length) {
338
+ resolve(registrosCreados);
339
+ }
340
+ })
341
+ .catch((e) => {
342
+ numeroDeRegistros++;
343
+ registrosCreados.push(e);
344
+ if (numeroDeRegistros === nuevosRegistros.length) {
345
+ resolve(registrosCreados);
346
+ }
347
+ });
348
+ }
349
+ else {
350
+ numeroDeRegistros++;
351
+ registrosCreados.push(registroCreado);
352
+ if (numeroDeRegistros === nuevosRegistros.length) {
353
+ resolve(registrosCreados);
354
+ }
355
+ }
356
+ })
357
+ .catch((err) => {
358
+ if (this.debug) {
359
+ console.error('Error creando: ', err);
360
+ }
361
+ numeroDeRegistros++;
362
+ registrosCreados.push(err);
363
+ if (numeroDeRegistros === nuevosRegistros.length - 1) {
364
+ resolve(registrosCreados);
365
+ }
366
+ });
367
+ }, tiempoEnCrearse);
368
+ terminado++;
369
+ }
370
+ });
371
+ }
372
+ async findWhereOr(camposABuscar, skip = 0, take = 10) {
373
+ if (this._datosUsuarioService) {
374
+ if (this.debug) {
375
+ console.info('Consulta: ', camposABuscar);
376
+ }
377
+ const usuariosEncontrados = await this._datosUsuarioService
378
+ .findWhereOr(camposABuscar, skip, take);
379
+ if (this.debug) {
380
+ console.info('UsuariosEncontrados: ', usuariosEncontrados);
381
+ }
382
+ let consulta = '';
383
+ const hayUsuarios = usuariosEncontrados[0].length > 0;
384
+ if (hayUsuarios) {
385
+ usuariosEncontrados[0]
386
+ .forEach((datosUsuario) => {
387
+ if (consulta === '') {
388
+ consulta = consulta + datosUsuario.user_id;
389
+ }
390
+ else {
391
+ consulta = consulta + ' OR ' + datosUsuario.user_id;
392
+ }
393
+ });
394
+ if (this.debug) {
395
+ console.info('Consulta de usuarios: ', consulta);
396
+ }
397
+ const respuesta = await this.find({
398
+ where: consulta
399
+ });
400
+ if (respuesta.error) {
401
+ const error = respuesta;
402
+ return { error: error.error, mensaje: error.mensaje };
403
+ }
404
+ else {
405
+ let usuariosAuth0 = respuesta;
406
+ usuariosAuth0 = usuariosAuth0
407
+ .map((usuarioAuth0) => {
408
+ usuarioAuth0.usuario = usuariosEncontrados[0]
409
+ .find((usuario) => {
410
+ return usuario.user_id === usuarioAuth0.user_id;
411
+ });
412
+ return usuarioAuth0;
413
+ });
414
+ return [usuariosAuth0, usuariosAuth0.length];
415
+ }
416
+ }
417
+ else {
418
+ if (this.debug) {
419
+ console.info('No se encontraron usuarios');
420
+ }
421
+ return { error: 404, mensaje: 'No se encontro ningun usuario' };
422
+ }
423
+ }
424
+ else {
425
+ if (this.debug) {
426
+ console.info('No existe el servicio, añada como dependencia en el constructor el _datosUsuarioService');
427
+ }
428
+ return { error: 400, mensaje: 'No existe el servicio DatosUsuarioService' };
429
+ }
430
+ }
431
+ async findAll(criterioBusqueda, skip, take) {
432
+ if (this._datosUsuarioService) {
433
+ if (this.debug) {
434
+ console.info('Consulta: ', criterioBusqueda);
435
+ }
436
+ const usuariosEncontrados = await buscarVariosRegistros(criterioBusqueda, PrincipalFindManyOptions, skip, take, this._datosUsuarioService);
437
+ if (this.debug) {
438
+ console.info('UsuariosEncontrados: ', usuariosEncontrados);
439
+ }
440
+ let consulta = '';
441
+ const hayUsuarios = usuariosEncontrados[0].length > 0;
442
+ if (hayUsuarios) {
443
+ usuariosEncontrados[0]
444
+ .forEach((datosUsuario) => {
445
+ if (consulta === '') {
446
+ consulta = consulta + datosUsuario.user_id;
447
+ }
448
+ else {
449
+ consulta = consulta + ' OR ' + datosUsuario.user_id;
450
+ }
451
+ });
452
+ if (this.debug) {
453
+ console.info('Consulta de usuarios: ', consulta);
454
+ }
455
+ const respuesta = await this.find({
456
+ where: consulta
457
+ });
458
+ if (respuesta.error) {
459
+ const error = respuesta;
460
+ return { error: error.error, mensaje: error.mensaje };
461
+ }
462
+ else {
463
+ let usuariosAuth0 = respuesta;
464
+ usuariosAuth0 = usuariosAuth0
465
+ .map((usuarioAuth0) => {
466
+ usuarioAuth0.usuario = usuariosEncontrados[0]
467
+ .find((usuario) => {
468
+ return usuario.user_id === usuarioAuth0.user_id;
469
+ });
470
+ return usuarioAuth0;
471
+ });
472
+ return [usuariosAuth0, usuariosAuth0.length];
473
+ }
474
+ }
475
+ else {
476
+ if (this.debug) {
477
+ console.info('No se encontraron usuarios');
478
+ }
479
+ return { error: 404, mensaje: 'No se encontro ningun usuario' };
480
+ }
481
+ }
482
+ else {
483
+ if (this.debug) {
484
+ console.info('No existe el servicio, añada como dependencia en el constructor el _datosUsuarioService');
485
+ }
486
+ return { error: 400, mensaje: 'No existe el servicio DatosUsuarioService' };
487
+ }
488
+ }
489
+ login(username, password) {
490
+ return new Promise(async (res, rej) => {
491
+ try {
492
+ const urlBase = `https://${this.AUTH0_CONFIG.CUENTA}.auth0.com`;
493
+ const scopeAuth0 = 'openid profile email read:users user_id id offline_access';
494
+ if (this.debug) {
495
+ console.log({
496
+ mensaje: 'URL base',
497
+ datos: {
498
+ urlBase
499
+ }
500
+ });
501
+ }
502
+ const configuracionObtenerToken = {
503
+ method: 'post',
504
+ url: urlBase + '/oauth/token',
505
+ data: {
506
+ username,
507
+ password,
508
+ grant_type: 'password',
509
+ connection: 'Username-Password-Authentication',
510
+ realm: 'Username-Password-Authentication',
511
+ scope: scopeAuth0,
512
+ client_id: this.AUTH0_CONFIG_PASSWORD.client_id,
513
+ client_secret: this.AUTH0_CONFIG_PASSWORD.client_secret
514
+ }
515
+ };
516
+ const respuestaAxios = await axios(configuracionObtenerToken);
517
+ const configuracionUserInfo = {
518
+ method: 'get',
519
+ url: urlBase + '/userinfo',
520
+ headers: {
521
+ 'Authorization': 'Bearer ' + respuestaAxios.data.access_token,
522
+ 'Content-Type': 'application/json'
523
+ }
524
+ };
525
+ const respuestaUsuario = await axios(configuracionUserInfo);
526
+ res({
527
+ usuario: {
528
+ ...respuestaUsuario.data
529
+ },
530
+ token: {
531
+ ...respuestaAxios.data
532
+ }
533
+ });
534
+ }
535
+ catch (e) {
536
+ console.error(e);
537
+ rej({ error: 500, mensaje: 'Error en login' });
538
+ }
539
+ });
540
+ }
541
+ requestChangePasswordByEmail(email, connection = 'Username-Password-Authentication') {
542
+ return new Promise((res, rej) => {
543
+ const data = {
544
+ email,
545
+ connection
546
+ };
547
+ this.authenticationClient
548
+ .requestChangePasswordEmail(data, (err) => {
549
+ if (err) {
550
+ console.error(err);
551
+ rej({ mensaje: 'Error solicitando password', error: 500 });
552
+ }
553
+ res({
554
+ mensaje: 'Si tu correo ha sido confirmado, recibiras un link para resetear tu password. Revisa tu correo.'
555
+ });
556
+ });
557
+ });
558
+ }
559
+ };
560
+ PrincipalAuth0Service = __decorate([
561
+ Injectable()
562
+ ], PrincipalAuth0Service);
563
+ export { PrincipalAuth0Service };
564
+ function obtenerPrimerOrder(order) {
565
+ if (order) {
566
+ const nombreCampo = Object.keys(order)[0];
567
+ return `${nombreCampo}:${order[nombreCampo] === 'ASC' ? 1 : -1}`;
568
+ }
569
+ else {
570
+ return undefined;
571
+ }
572
+ }
573
+ function obtenerCamposSeparadosPorComa(select) {
574
+ if (select) {
575
+ let campos = '';
576
+ select.forEach((nombreCampo) => {
577
+ if (campos === '') {
578
+ campos = nombreCampo;
579
+ }
580
+ else {
581
+ campos = `${campos},${nombreCampo}`;
582
+ }
583
+ });
584
+ return campos;
585
+ }
586
+ else {
587
+ return undefined;
588
+ }
589
+ }
590
+ function elaborarUserMetadataAActualizar(user_metadata, user_metadataAActualizar) {
591
+ let user_metadataClonado = {};
592
+ try {
593
+ user_metadataClonado = JSON.parse(JSON.stringify(user_metadata));
594
+ }
595
+ catch (e) {
596
+ }
597
+ Object
598
+ .keys(user_metadataAActualizar)
599
+ .forEach((nombrePropiedad) => {
600
+ user_metadataClonado[nombrePropiedad] = user_metadataAActualizar[nombrePropiedad];
601
+ });
602
+ return user_metadataClonado;
603
+ }
604
604
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aDAuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvYXV0aDAvYXV0aDAuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFNUMsT0FBTyxFQUFZLG9CQUFvQixFQUFFLE1BQU0sT0FBTyxDQUFDO0FBR3ZELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzFFLE9BQU8sSUFBSSxNQUFNLE9BQU8sQ0FBQztBQUV6QixNQUFNLEtBQUssR0FBUSxJQUFJLENBQUM7QUFDeEIsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsZ0JBQWdCLENBQUM7QUFHM0QsSUFBc0IscUJBQXFCLEdBQTNDO0lBSUUsWUFBNkIsWUFBWSxFQUNiLG9CQUEwQixFQUMxQixlQUFxQixFQUNwQixxQkFBMkIsRUFDM0IsZ0JBQXdCLElBQUksRUFDNUIsT0FBZSxlQUFlLEVBQzlCLFFBQWlCLElBQUk7UUFOckIsaUJBQVksR0FBWixZQUFZLENBQUE7UUFDYix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQU07UUFDMUIsb0JBQWUsR0FBZixlQUFlLENBQU07UUFDcEIsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUFNO1FBQzNCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLFNBQUksR0FBSixJQUFJLENBQTBCO1FBQzlCLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ2hELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLGdCQUFnQixDQUFDO1lBQzNDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxZQUFZO1lBQy9DLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMs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