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