@manticore-labs/nest 0.0.31 → 0.0.33

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.
@@ -0,0 +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, function (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, function (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
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aDAuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvYXV0aDAvYXV0aDAuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLDJDQUEwQztBQUUxQyxpQ0FBcUQ7QUFDckQsK0JBQTBCO0FBRzFCLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGdCQUFnQixDQUFDO0FBRzNELElBQXNCLHFCQUFxQixHQUEzQztJQUlJLFlBQTZCLFlBQVksRUFDWixnQkFBd0IsSUFBSSxFQUM1QixPQUFlLGVBQWUsRUFDOUIsUUFBaUIsSUFBSTtRQUhyQixpQkFBWSxHQUFaLFlBQVksQ0FBQTtRQUNaLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLFNBQUksR0FBSixJQUFJLENBQTBCO1FBQzlCLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQzlDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLGdCQUFnQixDQUFDO1lBQ3pDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxZQUFZO1lBQy9DLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFO1lBQzFDLFlBQVksRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFO1lBQzNDLEtBQUssRUFBRSwyREFBMkQ7U0FDckUsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksNEJBQW9CLENBQUM7WUFDakQsTUFBTSxFQUFFLEdBQUcsWUFBWSxDQUFDLE1BQU0sWUFBWTtZQUMxQyxRQUFRLEVBQUUsR0FBRyxZQUFZLENBQUMsU0FBUyxFQUFFO1NBQ3hDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQXNDO1FBRWhELElBQUksRUFBRSxFQUFFO1lBQ0osT0FBTyxNQUFNLElBQUks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
@@ -1,3 +1,7 @@
1
+ export * from './lib/auth0/auth0.controller';
2
+ export * from './lib/auth0/auth0.service';
3
+ export * from './lib/auth0/actualizar-usuario-cuenta-dto/actualizar-usuario-cuenta-dto';
4
+ export * from './lib/auth0/actualizar-usuario-dto/actualizar-usuario-dto';
1
5
  export * from './lib/principal.entity';
2
6
  export * from './lib/principal.service';
3
7
  export * from './lib/principal.dto';
@@ -1,3 +1,7 @@
1
+ export * from './lib/auth0/auth0.controller';
2
+ export * from './lib/auth0/auth0.service';
3
+ export * from './lib/auth0/actualizar-usuario-cuenta-dto/actualizar-usuario-cuenta-dto';
4
+ export * from './lib/auth0/actualizar-usuario-dto/actualizar-usuario-dto';
1
5
  export * from './lib/principal.entity';
2
6
  export * from './lib/principal.service';
3
7
  export * from './lib/principal.dto';
@@ -5,4 +9,4 @@ export * from './lib/principal.controller';
5
9
  export * from './lib/principal.resolver';
6
10
  export * from './lib/principal.gateway';
7
11
  export * from './lib/funciones-util/typeorm/valor-esta-dentro-del-arreglo';
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMseUJBQXlCLENBQUM7QUFjeEMsY0FBYyw0REFBNEQsQ0FBQyJ9
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyw4QkFBOEIsQ0FBQztBQUM3QyxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMseUVBQXlFLENBQUM7QUFDeEYsY0FBYywyREFBMkQsQ0FBQztBQUUxRSxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYyx5QkFBeUIsQ0FBQztBQWN4QyxjQUFjLDREQUE0RCxDQUFDIn0=
@@ -0,0 +1,5 @@
1
+ export declare class ActualizarUsuarioCuentaDto {
2
+ email: string;
3
+ name?: string;
4
+ user_id: string;
5
+ }
@@ -0,0 +1,22 @@
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 { IsEmail, IsNotEmpty, IsOptional, IsString } from 'class-validator';
8
+ export class ActualizarUsuarioCuentaDto {
9
+ }
10
+ __decorate([
11
+ IsOptional(),
12
+ IsEmail()
13
+ ], ActualizarUsuarioCuentaDto.prototype, "email", void 0);
14
+ __decorate([
15
+ IsOptional(),
16
+ IsString()
17
+ ], ActualizarUsuarioCuentaDto.prototype, "name", void 0);
18
+ __decorate([
19
+ IsNotEmpty(),
20
+ IsString()
21
+ ], ActualizarUsuarioCuentaDto.prototype, "user_id", void 0);
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0dWFsaXphci11c3VhcmlvLWN1ZW50YS1kdG8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2F1dGgwL2FjdHVhbGl6YXItdXN1YXJpby1jdWVudGEtZHRvL2FjdHVhbGl6YXItdXN1YXJpby1jdWVudGEtZHRvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLE9BQU8sRUFBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUUxRSxNQUFNO0NBWUw7QUFURztJQUZDLFVBQVUsRUFBRTtJQUNaLE9BQU8sRUFBRTt5REFDSTtBQUlkO0lBRkMsVUFBVSxFQUFFO0lBQ1osUUFBUSxFQUFFO3dEQUNHO0FBSWQ7SUFGQyxVQUFVLEVBQUU7SUFDWixRQUFRLEVBQUU7MkRBQ0sifQ==
@@ -0,0 +1,5 @@
1
+ export declare class ActualizarUsuarioDto {
2
+ email: string;
3
+ name?: string;
4
+ user_id: string;
5
+ }
@@ -0,0 +1,22 @@
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 { IsEmail, IsNotEmpty, IsString } from 'class-validator';
8
+ export class ActualizarUsuarioDto {
9
+ }
10
+ __decorate([
11
+ IsNotEmpty(),
12
+ IsEmail()
13
+ ], ActualizarUsuarioDto.prototype, "email", void 0);
14
+ __decorate([
15
+ IsNotEmpty(),
16
+ IsString()
17
+ ], ActualizarUsuarioDto.prototype, "name", void 0);
18
+ __decorate([
19
+ IsNotEmpty(),
20
+ IsString()
21
+ ], ActualizarUsuarioDto.prototype, "user_id", void 0);
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0dWFsaXphci11c3VhcmlvLWR0by5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvYXV0aDAvYWN0dWFsaXphci11c3VhcmlvLWR0by9hY3R1YWxpemFyLXVzdWFyaW8tZHRvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLE9BQU8sRUFBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRTlELE1BQU07Q0FZTDtBQVRHO0lBRkMsVUFBVSxFQUFFO0lBQ1osT0FBTyxFQUFFO21EQUNJO0FBSWQ7SUFGQyxVQUFVLEVBQUU7SUFDWixRQUFRLEVBQUU7a0RBQ0c7QUFJZDtJQUZDLFVBQVUsRUFBRTtJQUNaLFFBQVEsRUFBRTtxREFDSyJ9
@@ -0,0 +1,12 @@
1
+ import { InternalServerErrorException } from '@nestjs/common';
2
+ import { PrincipalAuth0Service } from './auth0.service';
3
+ export declare abstract class PrincipalAuth0Controller {
4
+ private readonly _auth0Service;
5
+ constructor(_auth0Service: PrincipalAuth0Service);
6
+ actualizarUsuarioPorPrimeraVez(email: any, name: any, user_id: any): Promise<InternalServerErrorException | {
7
+ mensaje: string;
8
+ }>;
9
+ actualizarCuenta(email: any, name: any, user_id: any): Promise<InternalServerErrorException | {
10
+ mensaje: string;
11
+ }>;
12
+ }
@@ -0,0 +1,121 @@
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
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
8
+ return function (target, key) { decorator(target, key, paramIndex); }
9
+ };
10
+ import { ActualizarUsuarioCuentaDto } from './actualizar-usuario-cuenta-dto/actualizar-usuario-cuenta-dto';
11
+ import { BadRequestException, Body, Controller, HttpCode, Post, InternalServerErrorException } from '@nestjs/common';
12
+ import { validate } from 'class-validator';
13
+ import { ActualizarUsuarioDto } from './actualizar-usuario-dto/actualizar-usuario-dto';
14
+ let PrincipalAuth0Controller = class PrincipalAuth0Controller {
15
+ constructor(_auth0Service) {
16
+ this._auth0Service = _auth0Service;
17
+ }
18
+ async actualizarUsuarioPorPrimeraVez(email, name, user_id) {
19
+ const actualizacionUsuario = new ActualizarUsuarioDto();
20
+ actualizacionUsuario.name = name;
21
+ actualizacionUsuario.email = email;
22
+ actualizacionUsuario.user_id = user_id;
23
+ const errores = await validate(actualizacionUsuario);
24
+ const hayErrores = errores.length > 0;
25
+ if (hayErrores) {
26
+ throw new BadRequestException('No envia parametros');
27
+ }
28
+ else {
29
+ const objetoActualizar = {
30
+ email: actualizacionUsuario.email,
31
+ };
32
+ objetoActualizar.user_metadata = {
33
+ name: actualizacionUsuario.name,
34
+ roles: [1]
35
+ };
36
+ const respuestaUsuarioActualizado = await this._auth0Service
37
+ .findOneByIdAndUpdate(actualizacionUsuario.user_id, objetoActualizar);
38
+ if (respuestaUsuarioActualizado.error) {
39
+ return new InternalServerErrorException({ error: 500, mensaje: 'Error del servidor' });
40
+ }
41
+ else {
42
+ const respuestaEmailVerification = await this._auth0Service
43
+ .sendEmailVerification(actualizacionUsuario.user_id);
44
+ if (!respuestaEmailVerification.error) {
45
+ const respuestaCambioPassword = await this._auth0Service
46
+ .changePassword(actualizacionUsuario.email);
47
+ if (respuestaCambioPassword.error) {
48
+ return new InternalServerErrorException({ error: 500, mensaje: 'Error del servidor' });
49
+ }
50
+ else {
51
+ return { mensaje: 'Proceso inicial completado exitosamente.' };
52
+ }
53
+ }
54
+ else {
55
+ return new InternalServerErrorException({ error: 500, mensaje: 'Error del servidor' });
56
+ }
57
+ }
58
+ }
59
+ }
60
+ async actualizarCuenta(email, name, user_id) {
61
+ const actualizacionUsuario = new ActualizarUsuarioCuentaDto();
62
+ actualizacionUsuario.name = name;
63
+ actualizacionUsuario.email = email;
64
+ actualizacionUsuario.user_id = user_id;
65
+ const errores = await validate(actualizacionUsuario);
66
+ const hayErrores = errores.length > 0;
67
+ if (hayErrores) {
68
+ throw new BadRequestException('No envia parametros');
69
+ }
70
+ else {
71
+ const objetoActualizar = {};
72
+ if (actualizacionUsuario.email) {
73
+ objetoActualizar.email = actualizacionUsuario.email;
74
+ }
75
+ if (actualizacionUsuario.name) {
76
+ objetoActualizar.user_metadata = {
77
+ name: actualizacionUsuario.name,
78
+ };
79
+ }
80
+ const respuestaUsuarioActualizado = await this._auth0Service
81
+ .findOneByIdAndUpdate(actualizacionUsuario.user_id, objetoActualizar);
82
+ if (respuestaUsuarioActualizado.error) {
83
+ return new InternalServerErrorException({ error: 500, mensaje: 'Error del servidor' });
84
+ }
85
+ else {
86
+ if (objetoActualizar.email) {
87
+ const respuestaEmailVerification = await this._auth0Service
88
+ .sendEmailVerification(actualizacionUsuario.user_id);
89
+ if (respuestaEmailVerification.error) {
90
+ return new InternalServerErrorException({ error: 500, mensaje: 'Error del servidor' });
91
+ }
92
+ else {
93
+ return { mensaje: 'Cuenta actualizada. Revise su correo para confirmar su email.' };
94
+ }
95
+ }
96
+ else {
97
+ return { mensaje: 'Cuenta actualizada.' };
98
+ }
99
+ }
100
+ }
101
+ }
102
+ };
103
+ __decorate([
104
+ HttpCode(200),
105
+ Post('actualizarUsuarioPorPrimeraVez'),
106
+ __param(0, Body('email')),
107
+ __param(1, Body('name')),
108
+ __param(2, Body('user_id'))
109
+ ], PrincipalAuth0Controller.prototype, "actualizarUsuarioPorPrimeraVez", null);
110
+ __decorate([
111
+ HttpCode(200),
112
+ Post('actualizarCuenta'),
113
+ __param(0, Body('email')),
114
+ __param(1, Body('name')),
115
+ __param(2, Body('user_id'))
116
+ ], PrincipalAuth0Controller.prototype, "actualizarCuenta", null);
117
+ PrincipalAuth0Controller = __decorate([
118
+ Controller('auth0')
119
+ ], PrincipalAuth0Controller);
120
+ export { PrincipalAuth0Controller };
121
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aDAuY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvYXV0aDAvYXV0aDAuY29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSwrREFBK0QsQ0FBQztBQUN6RyxPQUFPLEVBQ0gsbUJBQW1CLEVBQ25CLElBQUksRUFDSixVQUFVLEVBQ1YsUUFBUSxFQUNSLElBQUksRUFDSiw0QkFBNEIsRUFDL0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0saURBQWlELENBQUM7QUFHckYsSUFBc0Isd0JBQXdCLEdBQTlDO0lBQ0ksWUFBNkIsYUFBb0M7UUFBcEMsa0JBQWEsR0FBYixhQUFhLENBQXVCO0lBQ2pFLENBQUM7SUFJRCxLQUFLLENBQUMsOEJBQThCLENBQWdCLEtBQUssRUFDTixJQUFJLEVBQ0QsT0FBTztRQUN6RCxNQUFNLG9CQUFvQixHQUF5QixJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDOUUsb0JBQW9CLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQyxvQkFBb0IsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25DLG9CQUFvQixDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkMsTUFBTSxPQUFPLEdBQUcsTUFBTSxRQUFRLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNyRCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUN0QyxJQUFJLFVBQVUsRUFBRTtZQUNaLE1BQU0sSUFBSSxtQkFBbUIsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1NBQ3hEO2FBQU07WUFDSCxNQUFNLGdCQUFnQixHQUFRO2dCQUMxQixLQUFLLEVBQUUsb0JBQW9C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