@manticore-labs/nest 0.0.35 → 0.0.37

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 (179) hide show
  1. package/.circleci/config.yml +47 -47
  2. package/.idea/codeStyles/Project.xml +38 -0
  3. package/.idea/codeStyles/codeStyleConfig.xml +5 -0
  4. package/.idea/encodings.xml +4 -0
  5. package/.idea/inspectionProfiles/Project_Default.xml +5 -5
  6. package/.idea/manticore-labs-nest.iml +11 -11
  7. package/.idea/misc.xml +6 -0
  8. package/.idea/modules.xml +7 -7
  9. package/.idea/vcs.xml +5 -5
  10. package/.idea/workspace.xml +341 -493
  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 +22 -22
  15. package/build/main/index.js +16 -16
  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 +31 -11
  21. package/build/main/lib/auth0/auth0.controller.js +376 -123
  22. package/build/main/lib/auth0/auth0.service.d.ts +35 -35
  23. package/build/main/lib/auth0/auth0.service.js +393 -393
  24. package/build/main/lib/auth0/crear-usuario-dto/crear-usuario-dto.d.ts +5 -0
  25. package/build/main/lib/auth0/crear-usuario-dto/crear-usuario-dto.js +26 -0
  26. package/build/main/lib/auth0/interfaces/funciones-seguridad.d.ts +8 -0
  27. package/build/main/lib/auth0/interfaces/funciones-seguridad.js +3 -0
  28. package/build/main/lib/auth0/interfaces/mensajes-controlador.d.ts +5 -0
  29. package/build/main/lib/auth0/interfaces/mensajes-controlador.js +3 -0
  30. package/build/main/lib/funciones-util/buscar-registro.d.ts +1 -1
  31. package/build/main/lib/funciones-util/buscar-registro.js +147 -147
  32. package/build/main/lib/funciones-util/buscar-un-registro-por-id.d.ts +1 -1
  33. package/build/main/lib/funciones-util/buscar-un-registro-por-id.js +25 -25
  34. package/build/main/lib/funciones-util/buscar-where-or.d.ts +1 -1
  35. package/build/main/lib/funciones-util/buscar-where-or.js +33 -33
  36. package/build/main/lib/funciones-util/contar-registros.d.ts +1 -1
  37. package/build/main/lib/funciones-util/contar-registros.js +41 -41
  38. package/build/main/lib/funciones-util/crear-un-registro.d.ts +1 -1
  39. package/build/main/lib/funciones-util/crear-un-registro.js +24 -24
  40. package/build/main/lib/funciones-util/editar-un-registro.d.ts +1 -1
  41. package/build/main/lib/funciones-util/editar-un-registro.js +24 -24
  42. package/build/main/lib/funciones-util/eliminar-uno.d.ts +1 -1
  43. package/build/main/lib/funciones-util/eliminar-uno.js +35 -35
  44. package/build/main/lib/funciones-util/typeorm/valor-esta-dentro-del-arreglo.d.ts +2 -2
  45. package/build/main/lib/funciones-util/typeorm/valor-esta-dentro-del-arreglo.js +21 -21
  46. package/build/main/lib/interfaces-util/arreglo-funciones-booleanas.d.ts +4 -4
  47. package/build/main/lib/interfaces-util/arreglo-funciones-booleanas.js +2 -2
  48. package/build/main/lib/interfaces-util/broadcast-join.gateway.d.ts +14 -14
  49. package/build/main/lib/interfaces-util/broadcast-join.gateway.js +2 -2
  50. package/build/main/lib/interfaces-util/campos-a-buscar.d.ts +4 -4
  51. package/build/main/lib/interfaces-util/campos-a-buscar.js +2 -2
  52. package/build/main/lib/interfaces-util/delete-service.d.ts +12 -12
  53. package/build/main/lib/interfaces-util/delete-service.js +2 -2
  54. package/build/main/lib/interfaces-util/dto.d.ts +4 -4
  55. package/build/main/lib/interfaces-util/dto.js +2 -2
  56. package/build/main/lib/interfaces-util/find-where-relations.d.ts +9 -9
  57. package/build/main/lib/interfaces-util/find-where-relations.js +2 -2
  58. package/build/main/lib/interfaces-util/funciones-seguridad.d.ts +13 -13
  59. package/build/main/lib/interfaces-util/funciones-seguridad.js +2 -2
  60. package/build/main/lib/interfaces-util/funciones.gateway.d.ts +5 -5
  61. package/build/main/lib/interfaces-util/funciones.gateway.js +2 -2
  62. package/build/main/lib/interfaces-util/mensajes-controller.d.ts +6 -6
  63. package/build/main/lib/interfaces-util/mensajes-controller.js +2 -2
  64. package/build/main/lib/interfaces-util/politicas-de-seguridad.d.ts +17 -17
  65. package/build/main/lib/interfaces-util/politicas-de-seguridad.js +2 -2
  66. package/build/main/lib/interfaces-util/respuesta-general.gateway.d.ts +5 -5
  67. package/build/main/lib/interfaces-util/respuesta-general.gateway.js +2 -2
  68. package/build/main/lib/principal.controller.d.ts +20 -20
  69. package/build/main/lib/principal.controller.js +310 -310
  70. package/build/main/lib/principal.dto.d.ts +5 -5
  71. package/build/main/lib/principal.dto.js +21 -21
  72. package/build/main/lib/principal.entity.d.ts +7 -7
  73. package/build/main/lib/principal.entity.js +42 -42
  74. package/build/main/lib/principal.find-many-options.d.ts +14 -14
  75. package/build/main/lib/principal.find-many-options.js +48 -48
  76. package/build/main/lib/principal.find-many-where-or.d.ts +10 -10
  77. package/build/main/lib/principal.find-many-where-or.js +28 -28
  78. package/build/main/lib/principal.gateway.d.ts +35 -35
  79. package/build/main/lib/principal.gateway.js +399 -399
  80. package/build/main/lib/principal.id.d.ts +3 -3
  81. package/build/main/lib/principal.id.js +16 -16
  82. package/build/main/lib/principal.resolver.d.ts +21 -21
  83. package/build/main/lib/principal.resolver.js +343 -343
  84. package/build/main/lib/principal.service.d.ts +38 -38
  85. package/build/main/lib/principal.service.js +255 -255
  86. package/build/main/lib/seguridad/aplicar-politicas-de-seguridad.d.ts +4 -4
  87. package/build/main/lib/seguridad/aplicar-politicas-de-seguridad.js +16 -16
  88. package/build/main/lib/seguridad/funciones/convertir-arreglo-en-arreglo-de-observables.d.ts +3 -3
  89. package/build/main/lib/seguridad/funciones/convertir-arreglo-en-arreglo-de-observables.js +26 -26
  90. package/build/main/lib/seguridad/funciones/index.d.ts +6 -6
  91. package/build/main/lib/seguridad/funciones/index.js +12 -12
  92. package/build/main/lib/seguridad/funciones/obtener-reflector-seguridad.d.ts +1 -1
  93. package/build/main/lib/seguridad/funciones/obtener-reflector-seguridad.js +6 -6
  94. package/build/main/lib/seguridad/funciones/obtener-request.d.ts +1 -1
  95. package/build/main/lib/seguridad/funciones/obtener-request.js +6 -6
  96. package/build/main/lib/seguridad/funciones/obtener-response.d.ts +1 -1
  97. package/build/main/lib/seguridad/funciones/obtener-response.js +6 -6
  98. package/build/main/lib/seguridad/funciones/tiene-acceso-permitido.d.ts +2 -2
  99. package/build/main/lib/seguridad/funciones/tiene-acceso-permitido.js +13 -13
  100. package/build/main/lib/seguridad/seguridad.decorator.d.ts +1 -1
  101. package/build/main/lib/seguridad/seguridad.decorator.js +4 -4
  102. package/build/module/index.d.ts +22 -22
  103. package/build/module/index.js +11 -11
  104. package/build/module/lib/auth0/actualizar-usuario-cuenta-dto/actualizar-usuario-cuenta-dto.d.ts +5 -5
  105. package/build/module/lib/auth0/actualizar-usuario-cuenta-dto/actualizar-usuario-cuenta-dto.js +21 -21
  106. package/build/module/lib/auth0/actualizar-usuario-dto/actualizar-usuario-dto.d.ts +5 -5
  107. package/build/module/lib/auth0/actualizar-usuario-dto/actualizar-usuario-dto.js +21 -21
  108. package/build/module/lib/auth0/auth0.controller.d.ts +31 -11
  109. package/build/module/lib/auth0/auth0.controller.js +374 -121
  110. package/build/module/lib/auth0/auth0.service.d.ts +35 -35
  111. package/build/module/lib/auth0/auth0.service.js +391 -391
  112. package/build/module/lib/auth0/crear-usuario-dto/crear-usuario-dto.d.ts +5 -0
  113. package/build/module/lib/auth0/crear-usuario-dto/crear-usuario-dto.js +23 -0
  114. package/build/module/lib/auth0/interfaces/funciones-seguridad.d.ts +8 -0
  115. package/build/module/lib/auth0/interfaces/funciones-seguridad.js +1 -0
  116. package/build/module/lib/auth0/interfaces/mensajes-controlador.d.ts +5 -0
  117. package/build/module/lib/auth0/interfaces/mensajes-controlador.js +1 -0
  118. package/build/module/lib/funciones-util/buscar-registro.d.ts +1 -1
  119. package/build/module/lib/funciones-util/buscar-registro.js +144 -144
  120. package/build/module/lib/funciones-util/buscar-un-registro-por-id.d.ts +1 -1
  121. package/build/module/lib/funciones-util/buscar-un-registro-por-id.js +22 -22
  122. package/build/module/lib/funciones-util/buscar-where-or.d.ts +1 -1
  123. package/build/module/lib/funciones-util/buscar-where-or.js +30 -30
  124. package/build/module/lib/funciones-util/contar-registros.d.ts +1 -1
  125. package/build/module/lib/funciones-util/contar-registros.js +38 -38
  126. package/build/module/lib/funciones-util/crear-un-registro.d.ts +1 -1
  127. package/build/module/lib/funciones-util/crear-un-registro.js +21 -21
  128. package/build/module/lib/funciones-util/editar-un-registro.d.ts +1 -1
  129. package/build/module/lib/funciones-util/editar-un-registro.js +21 -21
  130. package/build/module/lib/funciones-util/eliminar-uno.d.ts +1 -1
  131. package/build/module/lib/funciones-util/eliminar-uno.js +32 -32
  132. package/build/module/lib/funciones-util/typeorm/valor-esta-dentro-del-arreglo.d.ts +2 -2
  133. package/build/module/lib/funciones-util/typeorm/valor-esta-dentro-del-arreglo.js +18 -18
  134. package/build/module/lib/interfaces-util/arreglo-funciones-booleanas.d.ts +4 -4
  135. package/build/module/lib/interfaces-util/broadcast-join.gateway.d.ts +14 -14
  136. package/build/module/lib/interfaces-util/campos-a-buscar.d.ts +4 -4
  137. package/build/module/lib/interfaces-util/delete-service.d.ts +12 -12
  138. package/build/module/lib/interfaces-util/dto.d.ts +4 -4
  139. package/build/module/lib/interfaces-util/find-where-relations.d.ts +9 -9
  140. package/build/module/lib/interfaces-util/funciones-seguridad.d.ts +13 -13
  141. package/build/module/lib/interfaces-util/funciones.gateway.d.ts +5 -5
  142. package/build/module/lib/interfaces-util/mensajes-controller.d.ts +6 -6
  143. package/build/module/lib/interfaces-util/politicas-de-seguridad.d.ts +17 -17
  144. package/build/module/lib/interfaces-util/respuesta-general.gateway.d.ts +5 -5
  145. package/build/module/lib/principal.controller.d.ts +20 -20
  146. package/build/module/lib/principal.controller.js +307 -307
  147. package/build/module/lib/principal.dto.d.ts +5 -5
  148. package/build/module/lib/principal.dto.js +18 -18
  149. package/build/module/lib/principal.entity.d.ts +7 -7
  150. package/build/module/lib/principal.entity.js +39 -39
  151. package/build/module/lib/principal.find-many-options.d.ts +14 -14
  152. package/build/module/lib/principal.find-many-options.js +45 -45
  153. package/build/module/lib/principal.find-many-where-or.d.ts +10 -10
  154. package/build/module/lib/principal.find-many-where-or.js +25 -25
  155. package/build/module/lib/principal.gateway.d.ts +35 -35
  156. package/build/module/lib/principal.gateway.js +396 -396
  157. package/build/module/lib/principal.id.d.ts +3 -3
  158. package/build/module/lib/principal.id.js +13 -13
  159. package/build/module/lib/principal.resolver.d.ts +21 -21
  160. package/build/module/lib/principal.resolver.js +340 -340
  161. package/build/module/lib/principal.service.d.ts +38 -38
  162. package/build/module/lib/principal.service.js +252 -252
  163. package/build/module/lib/seguridad/aplicar-politicas-de-seguridad.d.ts +4 -4
  164. package/build/module/lib/seguridad/aplicar-politicas-de-seguridad.js +13 -13
  165. package/build/module/lib/seguridad/funciones/convertir-arreglo-en-arreglo-de-observables.d.ts +3 -3
  166. package/build/module/lib/seguridad/funciones/convertir-arreglo-en-arreglo-de-observables.js +23 -23
  167. package/build/module/lib/seguridad/funciones/index.d.ts +6 -6
  168. package/build/module/lib/seguridad/funciones/index.js +6 -6
  169. package/build/module/lib/seguridad/funciones/obtener-reflector-seguridad.d.ts +1 -1
  170. package/build/module/lib/seguridad/funciones/obtener-reflector-seguridad.js +3 -3
  171. package/build/module/lib/seguridad/funciones/obtener-request.d.ts +1 -1
  172. package/build/module/lib/seguridad/funciones/obtener-request.js +3 -3
  173. package/build/module/lib/seguridad/funciones/obtener-response.d.ts +1 -1
  174. package/build/module/lib/seguridad/funciones/obtener-response.js +3 -3
  175. package/build/module/lib/seguridad/funciones/tiene-acceso-permitido.d.ts +2 -2
  176. package/build/module/lib/seguridad/funciones/tiene-acceso-permitido.js +10 -10
  177. package/build/module/lib/seguridad/seguridad.decorator.d.ts +1 -1
  178. package/build/module/lib/seguridad/seguridad.decorator.js +2 -2
  179. package/package.json +1 -1
@@ -1,392 +1,392 @@
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 { from } from "rxjs";
10
- const ManagementClient = require('auth0').ManagementClient;
11
- let PrincipalAuth0Service = class PrincipalAuth0Service {
12
- constructor(AUTH0_CONFIG, search_engine = 'v3', sort = 'created_at:-1', debug = true) {
13
- this.AUTH0_CONFIG = AUTH0_CONFIG;
14
- this.search_engine = search_engine;
15
- this.sort = sort;
16
- this.debug = debug;
17
- this.managementClient = new ManagementClient({
18
- domain: `${this.AUTH0_CONFIG.CUENTA}.auth0.com`,
19
- clientId: `${this.AUTH0_CONFIG.CLIENT_ID}`,
20
- clientSecret: `${this.AUTH0_CONFIG.SECRET}`,
21
- scope: 'read:users update:users create:users read:user_idp_tokens'
22
- });
23
- this.authenticationClient = new AuthenticationClient({
24
- domain: `${AUTH0_CONFIG.CUENTA}.auth0.com`,
25
- clientId: `${AUTH0_CONFIG.CLIENT_ID}`
26
- });
27
- }
28
- async findOne(id) {
29
- if (id) {
30
- return await new Promise((resolve) => {
31
- const idUsuario = { id };
32
- this.managementClient
33
- .users
34
- .get(idUsuario, (err, usuarioEncontrado) => {
35
- if (err) {
36
- if (this.debug) {
37
- console.error('Error: ', err);
38
- }
39
- let error = 500;
40
- let mensaje = 'Error buscando usuario';
41
- if (err.statusCode === 404) {
42
- error = err.statusCode;
43
- mensaje = 'No existe usuario';
44
- }
45
- resolve({ error, mensaje });
46
- }
47
- else {
48
- resolve(usuarioEncontrado);
49
- }
50
- });
51
- });
52
- }
53
- else {
54
- return await new Promise((res) => res({ mensaje: 'No envia id', error: 400 }));
55
- }
56
- }
57
- async create(registro) {
58
- return await new Promise((resolve) => {
59
- this.managementClient
60
- .users
61
- .create(registro, (err, nuevoRegistro) => {
62
- if (err) {
63
- if (this.debug) {
64
- console.error('Error: ', err);
65
- }
66
- let error = 500;
67
- let mensaje = 'Error creando usuario';
68
- if (err.statusCode === 409) {
69
- error = err.statusCode;
70
- mensaje = 'Ya existe ese usuario';
71
- }
72
- if (err.statusCode === 400) {
73
- error = err.statusCode;
74
- mensaje = 'Usuario inválido';
75
- }
76
- resolve({ error, mensaje });
77
- }
78
- else {
79
- resolve(nuevoRegistro);
80
- }
81
- });
82
- });
83
- }
84
- async find(criterioBusqueda) {
85
- return await new Promise((resolve) => {
86
- let params;
87
- if (criterioBusqueda) {
88
- if (this.debug) {
89
- console.log('Hay criterio', criterioBusqueda);
90
- }
91
- const sort = obtenerPrimerOrder(criterioBusqueda.order);
92
- params = {
93
- per_page: criterioBusqueda.take ? criterioBusqueda.take : 30,
94
- page: criterioBusqueda.skip ? criterioBusqueda.skip : 0,
95
- search_engine: this.search_engine,
96
- include_totals: true,
97
- sort
98
- };
99
- if (criterioBusqueda.where) {
100
- params.q = criterioBusqueda.where;
101
- }
102
- if (criterioBusqueda.select) {
103
- params.fields = obtenerCamposSeparadosPorComa(criterioBusqueda.select);
104
- }
105
- }
106
- else {
107
- params = {
108
- per_page: 30,
109
- page: 0,
110
- search_engine: this.search_engine,
111
- include_totals: true,
112
- sort: this.sort,
113
- };
114
- }
115
- if (this.debug) {
116
- console.log('Parametros: ', params);
117
- }
118
- this.managementClient
119
- .users
120
- .get(params, (err, usuarioEncontrado) => {
121
- if (err) {
122
- if (this.debug) {
123
- console.error('Error: ', err);
124
- }
125
- let error = 500;
126
- let mensaje = 'Error buscando usuarios';
127
- if (err.statusCode === 404) {
128
- error = err.statusCode;
129
- mensaje = 'No existen usuarios';
130
- }
131
- resolve({ error, mensaje });
132
- }
133
- else {
134
- resolve(usuarioEncontrado.users);
135
- }
136
- });
137
- });
138
- // }
139
- }
140
- async findBy(arregloCamposABuscar, busqueda) {
141
- return new Promise((resolve) => {
142
- let params = {
143
- q: ''
144
- };
145
- let query = '';
146
- arregloCamposABuscar
147
- .forEach((campo) => {
148
- if (query === '') {
149
- query = `${campo}="${busqueda}"`;
150
- }
151
- else {
152
- query = query + ` OR ${campo}="${busqueda}"`;
153
- }
154
- });
155
- params.q = query;
156
- if (this.debug) {
157
- console.log('Parametros: ', params);
158
- }
159
- this.managementClient
160
- .users
161
- .get(params, (err, usuariosEncontrados) => {
162
- if (err) {
163
- if (this.debug) {
164
- console.error('Error: ', err);
165
- }
166
- let error = 500;
167
- let mensaje = 'Error buscando usuarios';
168
- if (err.statusCode === 404) {
169
- error = err.statusCode;
170
- mensaje = 'No existen usuarios';
171
- }
172
- resolve({ error, mensaje });
173
- }
174
- else {
175
- resolve(usuariosEncontrados);
176
- }
177
- });
178
- });
179
- }
180
- async findOneByIdAndUpdate(id, datosAActualizar) {
181
- const usuario = await this.findOne(id);
182
- if (this.debug) {
183
- console.log('Usuario encontrado: ', usuario);
184
- }
185
- return await new Promise((resolve) => {
186
- if (usuario.error) {
187
- if (this.debug) {
188
- console.log('Error encontrando usuario: ', usuario);
189
- }
190
- resolve(usuario);
191
- }
192
- if (datosAActualizar.user_metadata) {
193
- datosAActualizar.user_metadata = elaborarUserMetadataAActualizar(usuario.user_metadata, datosAActualizar.user_metadata);
194
- }
195
- this.managementClient
196
- .users
197
- .update({ id }, datosAActualizar, (err, registroActualizado) => {
198
- if (err) {
199
- if (this.debug) {
200
- console.error('Error: ', err);
201
- }
202
- let error = 500;
203
- let mensaje = 'Error actualizando usuario';
204
- if (err.statusCode === 400) {
205
- error = err.statusCode;
206
- mensaje = 'Usuario inválido';
207
- }
208
- if (err.statusCode === 404) {
209
- error = err.statusCode;
210
- mensaje = 'Usuario no encontrado';
211
- }
212
- resolve({ error, mensaje });
213
- }
214
- else {
215
- resolve(registroActualizado);
216
- }
217
- });
218
- });
219
- }
220
- sendEmailVerification(id) {
221
- return new Promise((resolve) => {
222
- this.managementClient
223
- .sendEmailVerification({
224
- user_id: id
225
- })
226
- .then((r) => {
227
- if (this.debug) {
228
- console.error('Peticion: ', r);
229
- }
230
- resolve({ mensaje: 'Peticion enviada' });
231
- })
232
- .catch((err) => {
233
- if (this.debug) {
234
- console.error('Error: ', err);
235
- }
236
- resolve({ error: 500, mensaje: 'Error enviando peticion' });
237
- });
238
- });
239
- }
240
- changePassword(email, connection = 'Username-Password-Authentication') {
241
- return new Promise((resolve) => {
242
- this.authenticationClient
243
- .requestChangePasswordEmail({
244
- email,
245
- connection
246
- })
247
- .then((r) => {
248
- if (this.debug) {
249
- console.error('Peticion: ', r);
250
- }
251
- resolve({ mensaje: 'Cambio de password realizado' });
252
- })
253
- .catch((err) => {
254
- if (this.debug) {
255
- console.error('Error: ', err);
256
- }
257
- resolve({ error: 500, mensaje: 'Error enviando peticion' });
258
- });
259
- });
260
- }
261
- delete(id) {
262
- return from(new Promise((resolve) => {
263
- this.managementClient
264
- .users
265
- .delete({ id: id }, (err) => {
266
- if (err) {
267
- if (this.debug) {
268
- console.error('Error: ', err);
269
- }
270
- let error = 500;
271
- let mensaje = 'Error borrando usuario';
272
- if (err.statusCode === 400) {
273
- error = err.statusCode;
274
- mensaje = 'Usuario inválido';
275
- }
276
- if (err.statusCode === 404) {
277
- error = err.statusCode;
278
- mensaje = 'Usuario no encontrado';
279
- }
280
- resolve({ error, mensaje });
281
- }
282
- else {
283
- resolve({ mensaje: `Registro con id: ${id} eliminado` });
284
- }
285
- });
286
- }));
287
- }
288
- async createMany(nuevosRegistros) {
289
- return new Promise((resolve) => {
290
- let terminado = 0;
291
- let numeroDeRegistros = 0;
292
- const registrosCreados = [];
293
- while (terminado < nuevosRegistros.length) {
294
- const contadorAuxiliar = terminado;
295
- const tiempoEnCrearse = 10000 * (terminado + 1);
296
- setTimeout(() => {
297
- this.create(nuevosRegistros[contadorAuxiliar])
298
- .then((registroCreado) => {
299
- if (this.debug) {
300
- console.log('Registro creado', registroCreado);
301
- console.log('nuevosRegistros.length', nuevosRegistros.length);
302
- console.log('numeroDeRegistros', numeroDeRegistros);
303
- }
304
- if (registroCreado.error === 409 || registroCreado.error === 400) {
305
- if (this.debug) {
306
- console.log('Usuario ya existe o bad request', nuevosRegistros[contadorAuxiliar]);
307
- }
308
- this.find({ where: `username:${nuevosRegistros[contadorAuxiliar].username}` })
309
- .then((usuario) => {
310
- numeroDeRegistros++;
311
- registrosCreados.push(usuario[0]);
312
- if (numeroDeRegistros === nuevosRegistros.length) {
313
- resolve(registrosCreados);
314
- }
315
- })
316
- .catch((e) => {
317
- numeroDeRegistros++;
318
- registrosCreados.push(e);
319
- if (numeroDeRegistros === nuevosRegistros.length) {
320
- resolve(registrosCreados);
321
- }
322
- });
323
- }
324
- else {
325
- numeroDeRegistros++;
326
- registrosCreados.push(registroCreado);
327
- if (numeroDeRegistros === nuevosRegistros.length) {
328
- resolve(registrosCreados);
329
- }
330
- }
331
- })
332
- .catch((err) => {
333
- if (this.debug) {
334
- console.error('Error creando: ', err);
335
- }
336
- numeroDeRegistros++;
337
- registrosCreados.push(err);
338
- if (numeroDeRegistros === nuevosRegistros.length - 1) {
339
- resolve(registrosCreados);
340
- }
341
- });
342
- }, tiempoEnCrearse);
343
- terminado++;
344
- }
345
- });
346
- }
347
- };
348
- PrincipalAuth0Service = __decorate([
349
- Injectable()
350
- ], PrincipalAuth0Service);
351
- export { PrincipalAuth0Service };
352
- function obtenerPrimerOrder(order) {
353
- if (order) {
354
- const nombreCampo = Object.keys(order)[0];
355
- return `${nombreCampo}:${order[nombreCampo] === 'ASC' ? 1 : -1}`;
356
- }
357
- else {
358
- return undefined;
359
- }
360
- }
361
- function obtenerCamposSeparadosPorComa(select) {
362
- if (select) {
363
- let campos = '';
364
- select.forEach((nombreCampo) => {
365
- if (campos === '') {
366
- campos = nombreCampo;
367
- }
368
- else {
369
- campos = `${campos},${nombreCampo}`;
370
- }
371
- });
372
- return campos;
373
- }
374
- else {
375
- return undefined;
376
- }
377
- }
378
- function elaborarUserMetadataAActualizar(user_metadata, user_metadataAActualizar) {
379
- let user_metadataClonado = {};
380
- try {
381
- user_metadataClonado = JSON.parse(JSON.stringify(user_metadata));
382
- }
383
- catch (e) {
384
- }
385
- Object
386
- .keys(user_metadataAActualizar)
387
- .forEach((nombrePropiedad) => {
388
- user_metadataClonado[nombrePropiedad] = user_metadataAActualizar[nombrePropiedad];
389
- });
390
- return user_metadataClonado;
391
- }
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 { from } from "rxjs";
10
+ const ManagementClient = require('auth0').ManagementClient;
11
+ let PrincipalAuth0Service = class PrincipalAuth0Service {
12
+ constructor(AUTH0_CONFIG, search_engine = 'v3', sort = 'created_at:-1', debug = true) {
13
+ this.AUTH0_CONFIG = AUTH0_CONFIG;
14
+ this.search_engine = search_engine;
15
+ this.sort = sort;
16
+ this.debug = debug;
17
+ this.managementClient = new ManagementClient({
18
+ domain: `${this.AUTH0_CONFIG.CUENTA}.auth0.com`,
19
+ clientId: `${this.AUTH0_CONFIG.CLIENT_ID}`,
20
+ clientSecret: `${this.AUTH0_CONFIG.SECRET}`,
21
+ scope: 'read:users update:users create:users read:user_idp_tokens'
22
+ });
23
+ this.authenticationClient = new AuthenticationClient({
24
+ domain: `${AUTH0_CONFIG.CUENTA}.auth0.com`,
25
+ clientId: `${AUTH0_CONFIG.CLIENT_ID}`
26
+ });
27
+ }
28
+ async findOne(id) {
29
+ if (id) {
30
+ return await new Promise((resolve) => {
31
+ const idUsuario = { id };
32
+ this.managementClient
33
+ .users
34
+ .get(idUsuario, (err, usuarioEncontrado) => {
35
+ if (err) {
36
+ if (this.debug) {
37
+ console.error('Error: ', err);
38
+ }
39
+ let error = 500;
40
+ let mensaje = 'Error buscando usuario';
41
+ if (err.statusCode === 404) {
42
+ error = err.statusCode;
43
+ mensaje = 'No existe usuario';
44
+ }
45
+ resolve({ error, mensaje });
46
+ }
47
+ else {
48
+ resolve(usuarioEncontrado);
49
+ }
50
+ });
51
+ });
52
+ }
53
+ else {
54
+ return await new Promise((res) => res({ mensaje: 'No envia id', error: 400 }));
55
+ }
56
+ }
57
+ async create(registro) {
58
+ return await new Promise((resolve) => {
59
+ this.managementClient
60
+ .users
61
+ .create(registro, (err, nuevoRegistro) => {
62
+ if (err) {
63
+ if (this.debug) {
64
+ console.error('Error: ', err);
65
+ }
66
+ let error = 500;
67
+ let mensaje = 'Error creando usuario';
68
+ if (err.statusCode === 409) {
69
+ error = err.statusCode;
70
+ mensaje = 'Ya existe ese usuario';
71
+ }
72
+ if (err.statusCode === 400) {
73
+ error = err.statusCode;
74
+ mensaje = 'Usuario inválido';
75
+ }
76
+ resolve({ error, mensaje });
77
+ }
78
+ else {
79
+ resolve(nuevoRegistro);
80
+ }
81
+ });
82
+ });
83
+ }
84
+ async find(criterioBusqueda) {
85
+ return await new Promise((resolve) => {
86
+ let params;
87
+ if (criterioBusqueda) {
88
+ if (this.debug) {
89
+ console.log('Hay criterio', criterioBusqueda);
90
+ }
91
+ const sort = obtenerPrimerOrder(criterioBusqueda.order);
92
+ params = {
93
+ per_page: criterioBusqueda.take ? criterioBusqueda.take : 30,
94
+ page: criterioBusqueda.skip ? criterioBusqueda.skip : 0,
95
+ search_engine: this.search_engine,
96
+ include_totals: true,
97
+ sort
98
+ };
99
+ if (criterioBusqueda.where) {
100
+ params.q = criterioBusqueda.where;
101
+ }
102
+ if (criterioBusqueda.select) {
103
+ params.fields = obtenerCamposSeparadosPorComa(criterioBusqueda.select);
104
+ }
105
+ }
106
+ else {
107
+ params = {
108
+ per_page: 30,
109
+ page: 0,
110
+ search_engine: this.search_engine,
111
+ include_totals: true,
112
+ sort: this.sort,
113
+ };
114
+ }
115
+ if (this.debug) {
116
+ console.log('Parametros: ', params);
117
+ }
118
+ this.managementClient
119
+ .users
120
+ .get(params, (err, usuarioEncontrado) => {
121
+ if (err) {
122
+ if (this.debug) {
123
+ console.error('Error: ', err);
124
+ }
125
+ let error = 500;
126
+ let mensaje = 'Error buscando usuarios';
127
+ if (err.statusCode === 404) {
128
+ error = err.statusCode;
129
+ mensaje = 'No existen usuarios';
130
+ }
131
+ resolve({ error, mensaje });
132
+ }
133
+ else {
134
+ resolve(usuarioEncontrado.users);
135
+ }
136
+ });
137
+ });
138
+ // }
139
+ }
140
+ async findBy(arregloCamposABuscar, busqueda) {
141
+ return new Promise((resolve) => {
142
+ let params = {
143
+ q: ''
144
+ };
145
+ let query = '';
146
+ arregloCamposABuscar
147
+ .forEach((campo) => {
148
+ if (query === '') {
149
+ query = `${campo}="${busqueda}"`;
150
+ }
151
+ else {
152
+ query = query + ` OR ${campo}="${busqueda}"`;
153
+ }
154
+ });
155
+ params.q = query;
156
+ if (this.debug) {
157
+ console.log('Parametros: ', params);
158
+ }
159
+ this.managementClient
160
+ .users
161
+ .get(params, (err, usuariosEncontrados) => {
162
+ if (err) {
163
+ if (this.debug) {
164
+ console.error('Error: ', err);
165
+ }
166
+ let error = 500;
167
+ let mensaje = 'Error buscando usuarios';
168
+ if (err.statusCode === 404) {
169
+ error = err.statusCode;
170
+ mensaje = 'No existen usuarios';
171
+ }
172
+ resolve({ error, mensaje });
173
+ }
174
+ else {
175
+ resolve(usuariosEncontrados);
176
+ }
177
+ });
178
+ });
179
+ }
180
+ async findOneByIdAndUpdate(id, datosAActualizar) {
181
+ const usuario = await this.findOne(id);
182
+ if (this.debug) {
183
+ console.log('Usuario encontrado: ', usuario);
184
+ }
185
+ return await new Promise((resolve) => {
186
+ if (usuario.error) {
187
+ if (this.debug) {
188
+ console.log('Error encontrando usuario: ', usuario);
189
+ }
190
+ resolve(usuario);
191
+ }
192
+ if (datosAActualizar.user_metadata) {
193
+ datosAActualizar.user_metadata = elaborarUserMetadataAActualizar(usuario.user_metadata, datosAActualizar.user_metadata);
194
+ }
195
+ this.managementClient
196
+ .users
197
+ .update({ id }, datosAActualizar, (err, registroActualizado) => {
198
+ if (err) {
199
+ if (this.debug) {
200
+ console.error('Error: ', err);
201
+ }
202
+ let error = 500;
203
+ let mensaje = 'Error actualizando usuario';
204
+ if (err.statusCode === 400) {
205
+ error = err.statusCode;
206
+ mensaje = 'Usuario inválido';
207
+ }
208
+ if (err.statusCode === 404) {
209
+ error = err.statusCode;
210
+ mensaje = 'Usuario no encontrado';
211
+ }
212
+ resolve({ error, mensaje });
213
+ }
214
+ else {
215
+ resolve(registroActualizado);
216
+ }
217
+ });
218
+ });
219
+ }
220
+ sendEmailVerification(id) {
221
+ return new Promise((resolve) => {
222
+ this.managementClient
223
+ .sendEmailVerification({
224
+ user_id: id
225
+ })
226
+ .then((r) => {
227
+ if (this.debug) {
228
+ console.error('Peticion: ', r);
229
+ }
230
+ resolve({ mensaje: 'Peticion enviada' });
231
+ })
232
+ .catch((err) => {
233
+ if (this.debug) {
234
+ console.error('Error: ', err);
235
+ }
236
+ resolve({ error: 500, mensaje: 'Error enviando peticion' });
237
+ });
238
+ });
239
+ }
240
+ changePassword(email, connection = 'Username-Password-Authentication') {
241
+ return new Promise((resolve) => {
242
+ this.authenticationClient
243
+ .requestChangePasswordEmail({
244
+ email,
245
+ connection
246
+ })
247
+ .then((r) => {
248
+ if (this.debug) {
249
+ console.error('Peticion: ', r);
250
+ }
251
+ resolve({ mensaje: 'Cambio de password realizado' });
252
+ })
253
+ .catch((err) => {
254
+ if (this.debug) {
255
+ console.error('Error: ', err);
256
+ }
257
+ resolve({ error: 500, mensaje: 'Error enviando peticion' });
258
+ });
259
+ });
260
+ }
261
+ delete(id) {
262
+ return from(new Promise((resolve) => {
263
+ this.managementClient
264
+ .users
265
+ .delete({ id: id }, (err) => {
266
+ if (err) {
267
+ if (this.debug) {
268
+ console.error('Error: ', err);
269
+ }
270
+ let error = 500;
271
+ let mensaje = 'Error borrando usuario';
272
+ if (err.statusCode === 400) {
273
+ error = err.statusCode;
274
+ mensaje = 'Usuario inválido';
275
+ }
276
+ if (err.statusCode === 404) {
277
+ error = err.statusCode;
278
+ mensaje = 'Usuario no encontrado';
279
+ }
280
+ resolve({ error, mensaje });
281
+ }
282
+ else {
283
+ resolve({ mensaje: `Registro con id: ${id} eliminado` });
284
+ }
285
+ });
286
+ }));
287
+ }
288
+ async createMany(nuevosRegistros) {
289
+ return new Promise((resolve) => {
290
+ let terminado = 0;
291
+ let numeroDeRegistros = 0;
292
+ const registrosCreados = [];
293
+ while (terminado < nuevosRegistros.length) {
294
+ const contadorAuxiliar = terminado;
295
+ const tiempoEnCrearse = 10000 * (terminado + 1);
296
+ setTimeout(() => {
297
+ this.create(nuevosRegistros[contadorAuxiliar])
298
+ .then((registroCreado) => {
299
+ if (this.debug) {
300
+ console.log('Registro creado', registroCreado);
301
+ console.log('nuevosRegistros.length', nuevosRegistros.length);
302
+ console.log('numeroDeRegistros', numeroDeRegistros);
303
+ }
304
+ if (registroCreado.error === 409 || registroCreado.error === 400) {
305
+ if (this.debug) {
306
+ console.log('Usuario ya existe o bad request', nuevosRegistros[contadorAuxiliar]);
307
+ }
308
+ this.find({ where: `username:${nuevosRegistros[contadorAuxiliar].username}` })
309
+ .then((usuario) => {
310
+ numeroDeRegistros++;
311
+ registrosCreados.push(usuario[0]);
312
+ if (numeroDeRegistros === nuevosRegistros.length) {
313
+ resolve(registrosCreados);
314
+ }
315
+ })
316
+ .catch((e) => {
317
+ numeroDeRegistros++;
318
+ registrosCreados.push(e);
319
+ if (numeroDeRegistros === nuevosRegistros.length) {
320
+ resolve(registrosCreados);
321
+ }
322
+ });
323
+ }
324
+ else {
325
+ numeroDeRegistros++;
326
+ registrosCreados.push(registroCreado);
327
+ if (numeroDeRegistros === nuevosRegistros.length) {
328
+ resolve(registrosCreados);
329
+ }
330
+ }
331
+ })
332
+ .catch((err) => {
333
+ if (this.debug) {
334
+ console.error('Error creando: ', err);
335
+ }
336
+ numeroDeRegistros++;
337
+ registrosCreados.push(err);
338
+ if (numeroDeRegistros === nuevosRegistros.length - 1) {
339
+ resolve(registrosCreados);
340
+ }
341
+ });
342
+ }, tiempoEnCrearse);
343
+ terminado++;
344
+ }
345
+ });
346
+ }
347
+ };
348
+ PrincipalAuth0Service = __decorate([
349
+ Injectable()
350
+ ], PrincipalAuth0Service);
351
+ export { PrincipalAuth0Service };
352
+ function obtenerPrimerOrder(order) {
353
+ if (order) {
354
+ const nombreCampo = Object.keys(order)[0];
355
+ return `${nombreCampo}:${order[nombreCampo] === 'ASC' ? 1 : -1}`;
356
+ }
357
+ else {
358
+ return undefined;
359
+ }
360
+ }
361
+ function obtenerCamposSeparadosPorComa(select) {
362
+ if (select) {
363
+ let campos = '';
364
+ select.forEach((nombreCampo) => {
365
+ if (campos === '') {
366
+ campos = nombreCampo;
367
+ }
368
+ else {
369
+ campos = `${campos},${nombreCampo}`;
370
+ }
371
+ });
372
+ return campos;
373
+ }
374
+ else {
375
+ return undefined;
376
+ }
377
+ }
378
+ function elaborarUserMetadataAActualizar(user_metadata, user_metadataAActualizar) {
379
+ let user_metadataClonado = {};
380
+ try {
381
+ user_metadataClonado = JSON.parse(JSON.stringify(user_metadata));
382
+ }
383
+ catch (e) {
384
+ }
385
+ Object
386
+ .keys(user_metadataAActualizar)
387
+ .forEach((nombrePropiedad) => {
388
+ user_metadataClonado[nombrePropiedad] = user_metadataAActualizar[nombrePropiedad];
389
+ });
390
+ return user_metadataClonado;
391
+ }
392
392
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aDAuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvYXV0aDAvYXV0aDAuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFMUMsT0FBTyxFQUFXLG9CQUFvQixFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQ3JELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFHMUIsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsZ0JBQWdCLENBQUM7QUFHM0QsSUFBc0IscUJBQXFCLEdBQTNDO0lBSUksWUFBNkIsWUFBWSxFQUNaLGdCQUF3QixJQUFJLEVBQzVCLE9BQWUsZUFBZSxFQUM5QixRQUFpQixJQUFJO1FBSHJCLGlCQUFZLEdBQVosWUFBWSxDQUFBO1FBQ1osa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsU0FBSSxHQUFKLElBQUksQ0FBMEI7UUFDOUIsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUFDOUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksZ0JBQWdCLENBQUM7WUFDekMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLFlBQVk7WUFDL0MsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUU7WUFDMUMsWUFBWSxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUU7WUFDM0MsS0FBSyxFQUFFLDJEQUEyRDtTQUNyRSxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxvQkFBb0IsQ0FBQztZQUNqRCxNQUFNLEVBQUUsR0FBRyxZQUFZLENBQUMsTUFBTSxZQUFZO1lBQzFDLFFBQVEsRUFBRSxHQUFHLFlBQVksQ0FBQyxTQUFTLEVBQUU7U0FDeEMsQ0FBQyxD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