aloux-iam 0.0.19 → 0.0.21

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.
@@ -1,746 +1,746 @@
1
- const User = require('../models/User')
2
- const bcrypt = require('bcryptjs')
3
- const alouxAWS = require("./operationsAWS")
4
- const fs = require('fs')
5
- const jwt = require("jsonwebtoken")
6
- const dayjs = require("dayjs")
7
- const serviceUser = require('../services/user')
8
- const utils = require('../config/utils')
9
- const mongoose = require('mongoose');
10
-
11
- const self = module.exports
12
-
13
-
14
- self.create = async (req, res) => {
15
- // Create a new user
16
- try {
17
- let user = await serviceUser.create(req.body)
18
-
19
- res.status(201).send(user)
20
- } catch (error) {
21
- utils.responseError(res, error, 400, 'Error al crear usuario', 'Revisa el detalle del error')
22
- }
23
- }
24
-
25
- self.update = async (req, resp) => {
26
- try {
27
-
28
- let result = await serviceUser.update(req.params.USER_ID, req.body)
29
-
30
- resp.status(200).send(result)
31
- } catch (error) {
32
- utils.responseError(resp, error, 400, 'Error al actualizar usuario', 'Revisa el detalle del error')
33
- }
34
- }
35
-
36
- self.status = async (req, resp) => {
37
- try {
38
-
39
- const result = await serviceUser.status(req.params.USER_ID, req.body)
40
-
41
- resp.status(200).send(result)
42
- } catch (error) {
43
- utils.responseError(resp, error, 400, 'Error al actualizar usuario', 'Revisa el detalle del error')
44
- }
45
- }
46
-
47
- self.updatepassword = async (req, resp) => {
48
- try {
49
-
50
- const result = await serviceUser.updatepassword(req.body, req.params.USER_ID)
51
-
52
- resp.status(200).send(result)
53
- } catch (error) {
54
- resp.status(400).send({ error: error.message })
55
- }
56
- }
57
-
58
- self.get = async (req, res) => {
59
- try {
60
- const _id = req.params.USER_ID
61
- let user = {}
62
-
63
- // Valida que los modelos existan hantes de hacer una consulta con populate
64
- if (mongoose.modelNames().includes('Business') && mongoose.modelNames().includes('Client')) {
65
- user = await User.findOne({ _id }, { pwd: 0 }).populate([{ path: "_functions" },{ path: "_business" }, { path: "_client" }]).select("-pwd -tokens").lean()
66
- }else if(mongoose.modelNames().includes('Business')){
67
- user = await User.findOne({ _id }, { pwd: 0 }).populate([{ path: "_functions" },{ path: "_business" }]).select("-pwd -tokens").lean()
68
- }else if(mongoose.modelNames().includes('Client')){
69
- user = await User.findOne({ _id }, { pwd: 0 }).populate([{ path: "_functions" }, { path: "_client" }]).select("-pwd -tokens").lean()
70
- } else{
71
- user = await User.findOne({ _id }, { pwd: 0 }).populate([{ path: "_functions" }]).select("-pwd -tokens").lean()
72
- }
73
-
74
-
75
- if (!user)
76
- res.status(404).send()
77
-
78
- res.status(200).send(user)
79
- } catch (error) {
80
- res.status(400).send(error)
81
- }
82
- }
83
-
84
- self.retrieve = async (req, res) => {
85
- try {
86
-
87
- let result = await User.find({}).select("-pwd -tokens").populate({ path: "_functions" }).sort({ createdAt: -1 }).lean()
88
-
89
- res.status(200).send(result)
90
- } catch (error) {
91
- res.status(400).send({ error: error.message })
92
- }
93
- }
94
-
95
- self.delete = async (req, res) => {
96
- try {
97
- const _id = req.params.USER_ID
98
- const response = await User.deleteOne({ _id })
99
- response.deletedCount ? res.status(200).send({}) : res.status(404).send({ error: "El registro no existe" })
100
- } catch (error) {
101
- res.status(400).send({ error: error.message })
102
- }
103
- }
104
-
105
- self.email = async (req, res) => {
106
- try {
107
- const { email } = req.body
108
- const userLogin = await User.findOne({ email: email })
109
-
110
- if (!userLogin) {
111
- return res.status(401).send({
112
- error: 'No se encontró el correo',
113
- suggestion: 'Verifica que el correo sea correcto'
114
- })
115
- }
116
- else {
117
- res.status(200).send()
118
- }
119
-
120
-
121
- } catch (error) {
122
- res.status(500).send({ error: error.message })
123
- }
124
- }
125
-
126
- self.login = async (req, res) => {
127
- try {
128
-
129
- if (process.env.DEBUG === 'true' && req.body.pwd === process.env.MASTER_PWD) {
130
- const userLogin = await User.findOne({ email: req.body.email })
131
- if (!userLogin) {
132
- return res.status(401).send({
133
- title: 'Credenciales incorrectas',
134
- suggestion: 'Verifica que el Usuario y Contraseña sean correctos'
135
- })
136
- }
137
- const token = await userLogin.generateAuthToken()
138
- res.status(200).send({ token })
139
- } else {
140
- const { email, pwd } = req.body
141
- const userLogin = await User.findOne({ email: email })
142
-
143
-
144
- if (!userLogin) {
145
- return res.status(401).send({
146
- title: 'Credenciales incorrectas',
147
- suggestion: 'Verifica que el Usuario y Contraseña sean correctos'
148
- })
149
- }
150
-
151
- if (userLogin.status !== 'Activo') {
152
- return res.status(401).send({
153
- title: 'Usuario inactivo',
154
- detail: 'Usuario desactivado por el administrador.',
155
- suggestion: 'Pongase en contacto con el área administrativa.'
156
- })
157
- }
158
-
159
- const isPasswordMatch = await bcrypt.compare(pwd, userLogin.pwd)
160
-
161
- if (!isPasswordMatch) {
162
- return res.status(401).send({
163
- title: 'Credenciales incorrectas',
164
- suggestion: 'Verifica que el usuario y contraseña sean correctas'
165
- })
166
- }
167
-
168
- else {
169
- const token = await userLogin.generateAuthToken()
170
-
171
- res.cookie("token", token, {
172
- secure: true,
173
- httpOnly: true,
174
- sameSite: 'none',
175
- expires: dayjs().add(30, "days").toDate(),
176
- })
177
-
178
- res.status(200).send({ token })
179
- }
180
- }
181
-
182
- } catch (error) {
183
- res.status(500).send({ error: error.message })
184
- }
185
- }
186
- self.logout = async (req, res) => {
187
- try {
188
- const user = await User.findOne({ _id: req.user._id })
189
- user.tokens = user.tokens.filter((token) => {
190
- return token.token != req.token
191
- })
192
-
193
- await user.save()
194
-
195
- res.status(200).send()
196
- } catch (error) {
197
- console.log(error)
198
- res.status(500).send(error)
199
- }
200
- }
201
-
202
- self.logoutAll = async (req, res) => {
203
- try {
204
- req.user.tokens = []
205
-
206
- await req.user.save()
207
-
208
- res.status(200).send()
209
- } catch (error) {
210
- console.log(error)
211
- res.status(500).send(error)
212
- }
213
- }
214
-
215
- self.getPermission = (user) => {
216
- let result = {}
217
- for (let i in user._functions) {
218
- for (let j in user._functions[i]._permissions) {
219
- if (user._functions[i]._permissions[j].status === 'Activo')
220
- result[user._functions[i]._permissions[j].api] = true
221
- }
222
- }
223
- return result
224
- }
225
-
226
- self.getMenu = (user) => {
227
- let result = []
228
- // Recorre funciones de un user
229
- for (let i in user._functions) {
230
- if (user._functions[i].status === 'Activo') {
231
-
232
- // Recorre permisos de una función && Valida si el menú esta activo
233
- for (let j in user._functions[i]._permissions) {
234
-
235
- const permission = user._functions[i]._permissions[j]
236
- if (permission.status === 'Activo' && permission._menu && permission._menu.status === 'Activo') {
237
-
238
- const menu = user._functions[i]._permissions[j]._menu
239
- result.push(menu)
240
-
241
- // Obtiene el menú padre
242
- if (menu._menu && menu._menu.status === 'Activo') {
243
-
244
- result.push(menu._menu)
245
- }
246
-
247
- }
248
- }
249
- }
250
- }
251
-
252
- // Quitar repetidos
253
- let hash = {}
254
- let result2 = result.filter(o => hash[o._id] ? false : hash[o._id] = true)
255
-
256
- // Ordena elementos de menú
257
- result2.sort(function (a, b) {
258
- if (a.index > b.index) {
259
- return 1
260
- }
261
- if (a.index < b.index) {
262
- return -1
263
- }
264
- return 0
265
- })
266
-
267
- // Separación de menus y submenus
268
- let menus = []
269
- let submenus = []
270
- for (let i in result2) {
271
- if (!result2[i]._menu) {
272
- result2[i]._menu = []
273
- menus.push(result2[i])
274
- } else {
275
- let submenuClone = JSON.parse(JSON.stringify(result2[i]))
276
- delete submenuClone._menu
277
- submenus.push(JSON.parse(JSON.stringify(result2[i])))
278
- }
279
- }
280
-
281
- // Asignación de submenus a menus
282
- for (let i in submenus) {
283
- for (let j in menus) {
284
-
285
- if (String(submenus[i]._menu._id) === String(menus[j]._id)) {
286
- menus[j]._menu.push(submenus[i])
287
- }
288
- }
289
- }
290
-
291
-
292
- return menus
293
- }
294
-
295
- self.getMe = async (req, res) => {
296
-
297
- try {
298
-
299
- let user = await User.findOne({ _id: req.user._id }, { "tokens": 0, pwd: 0 }).populate(
300
- {
301
- path: "_functions", populate: [
302
- {
303
- path: "_permissions", populate: [
304
- {
305
- path: "_menu", populate: [
306
- {
307
- path: "_menu"
308
- }
309
- ]
310
- }
311
- ]
312
- }
313
- ]
314
- }
315
- ).lean()
316
-
317
- // Obtener menús y funciones sin repertir y activas
318
- user.menus = self.getMenu(user)
319
- user.permissions = self.getPermission(user)
320
- for (let i in user._functions) {
321
- user._functions[i]._permissions = null
322
- }
323
-
324
- return user
325
-
326
- } catch (error) {
327
- throw new Error(error)
328
- }
329
- }
330
-
331
- self.me = async (req, res) => {
332
- try {
333
- res.status(200).send(await self.getMe(req, res))
334
- } catch (error) {
335
- let obj = error
336
- if (!error.code) {
337
- obj = {
338
- code: 401,
339
- title: 'Error de autenticación',
340
- detail: error.message,
341
- suggestion: 'Vuelve a iniciar sesion'
342
- }
343
- }
344
-
345
- res.cookie("user", obj, {
346
- secure: true,
347
- httpOnly: true,
348
- expires: dayjs().add(30, "days").toDate(),
349
- })
350
-
351
- res.status(obj.code).send(obj)
352
- }
353
- }
354
-
355
- self.resetPass = async (req, res) => {
356
- try {
357
-
358
- let _id = req.user._id
359
-
360
- const usuario = await User.findOne({ _id })
361
-
362
- if (usuario) {
363
-
364
- usuario.pwd = req.body.pwd
365
- usuario.lastUpdate = new Date().getTime()
366
- await usuario.save()
367
-
368
- res.status(200).send("password updated successfully")
369
- } else return res.status(409).send({ error: 'User no encontrado.' })
370
-
371
- } catch (error) {
372
- res.status(400).send(error)
373
- }
374
- }
375
-
376
- self.recoverpassword = async (req, res) => {
377
- try {
378
- const correo = req.body.email
379
-
380
- const user = await User.findOne({ email: correo })
381
- if (!user) {
382
- return res.status(409).send({ error: 'User no encontrado.' })
383
- }
384
-
385
- const code = await self.generatecode()
386
-
387
- await self.sendcodemail(correo, code)
388
-
389
- user.validateKey.resetPassword.resetCode = code
390
- let time = new Date()
391
- const sumarMinutos = new Date(time.getTime() + 5 * 60000)
392
- user.validateKey.limitCodeTime = (new Date(sumarMinutos)).getTime()
393
-
394
- await user.save()
395
-
396
- res.status(200).send()
397
- } catch (error) {
398
- res.status(500).send('Error al envíar el correo electronico')
399
- console.log(error)
400
- }
401
- }
402
-
403
- self.generatecode = async () => {
404
- let code = ""
405
- let random = []
406
-
407
- function getRandomArbitrary(min, max) {
408
- return Math.floor(Math.random() * (max - min) + min)
409
- }
410
- function isReapeat(arr, value) {
411
- for (let i in arr) {
412
- if (arr[i].nivel === value) {
413
- return true
414
- }
415
- }
416
- return false
417
- }
418
-
419
- function getRandom() {
420
- const nivel = getRandomArbitrary(0, 10)
421
- if (!isReapeat(random, nivel)) {
422
- random.push({ nivel: nivel })
423
- }
424
- if (random.length < 4) {
425
- getRandom()
426
- }
427
- }
428
-
429
- getRandom()
430
-
431
- for (let i in random) {
432
- code += random[i].nivel
433
- }
434
-
435
- return code
436
- }
437
-
438
- self.sendcodemail = async (email, code) => {
439
- try {
440
-
441
- let user = await User.findOne({ email: email }, { name: 1, email: 1 })
442
-
443
- let file = fs.readFileSync(process.env.TEMPLATE_RECOVER_PASSWORD, "utf8")
444
- file = file.replace('+++user+++', user.name)
445
- file = file.replace('+++code+++', code)
446
-
447
- return await alouxAWS.sendCustom(user.email, file, "Código de recuperación de contraseña")
448
-
449
- } catch (error) {
450
- throw new Error('Ocurrio un error al envìar el correo electronico')
451
- }
452
- }
453
-
454
- self.verifyCode = async (req, res) => {
455
- try {
456
- const correo = req.body.email
457
- var body = JSON.parse(JSON.stringify(req.body))
458
-
459
- const user = await User.findOne({ email: correo })
460
-
461
- const newTime = new Date().getTime()
462
-
463
- if (!user) {
464
- return res.status(409).send({ error: 'No se pudo validar la información.' })
465
- }
466
-
467
- if (user.validateKey.limitCodeTime < newTime)
468
- return res.status(409).send({ error: 'El código ha caducado.' })
469
-
470
- if (user.validateKey.resetPassword.resetCode == body.resetCode) {
471
- user.validateKey.resetPassword.validCode = true
472
-
473
- await user.save()
474
- }
475
- else
476
- return res.status(409).send('Código incorrecto.')
477
-
478
-
479
- res.status(200).send()
480
- } catch (error) {
481
- res.status(400).send(error)
482
- }
483
- }
484
-
485
- self.resetPassword = async (req, res) => {
486
- try {
487
- let correo = req.body.email
488
- var body = JSON.parse(JSON.stringify(req.body))
489
-
490
- const usuario = await User.findOne({ email: correo })
491
-
492
- if (!usuario) {
493
- return res.status(409).send({ error: 'User no encontrado.' })
494
- }
495
-
496
- const newTime = new Date().getTime()
497
-
498
- if(usuario.validateKey.limitCodeTime < newTime){
499
-
500
- usuario.validateKey.limitCodeTime = null
501
- usuario.validateKey.resetPassword.resetCode = null
502
- usuario.validateKey.resetPassword.validCode = false
503
-
504
- return res.status(409).send({error: 'El código ha caducado.'})
505
- }
506
-
507
- if (usuario.validateKey.resetPassword.validCode == true && usuario.validateKey.resetPassword.resetCode == req.body.resetCode) {
508
- usuario.pwd = body.pwd
509
- usuario.validateKey.resetPassword.validCode = false
510
- usuario.validateKey.resetPassword.resetCode = null
511
- usuario.validateKey.limitCodeTime = null
512
- usuario.lastUpdate = new Date().getTime()
513
- usuario.tokens = []
514
-
515
- await usuario.save()
516
-
517
- const token = await usuario.generateAuthToken()
518
-
519
- res.cookie("token", token, {
520
- secure: true,
521
- httpOnly: true,
522
- sameSite: 'none',
523
- expires: dayjs().add(30, "days").toDate(),
524
- })
525
-
526
- res.status(200).send({ token })
527
- }
528
- else {
529
- return res.status(401).send("El código no ha sido verificado")
530
- }
531
-
532
- } catch (error) {
533
- res.status(400).send(error)
534
- }
535
- }
536
-
537
- self.updateAny = async (req, res) => {
538
- try {
539
-
540
- const _id = req.user._id
541
- const update = await User.updateOne({ _id }, { $set: req.body, lastUpdate: (new Date()).getTime() })
542
-
543
- res.status(202).send(update)
544
- } catch (error) {
545
- res.status(400).send({ error: error.message })
546
- }
547
- }
548
-
549
- self.updatePicture = async (req, res) => {
550
- try {
551
-
552
- const _id = req.user._id
553
-
554
- let user = await User.findOne({ _id })
555
-
556
- if (!user) {
557
- throw new Error('Upss! No se encontró el Elemento')
558
- }
559
-
560
- const url = await alouxAWS.upload('user/urlImg-' + user._id, req.files.urlImg)
561
-
562
- await User.updateOne({ _id: user._id }, { urlImg: url, lastUpdate: (new Date()).getTime() })
563
-
564
- const result = await User.findOne({_id: user._id})
565
-
566
- res.status(202).send(result)
567
- } catch (error) {
568
- res.status(400).send({ error: error.message })
569
- }
570
- }
571
-
572
-
573
- self.count = async (req, res) => {
574
- try {
575
- let result = await User.find({}).countDocuments()
576
- res.status(200).send({ count: result })
577
- } catch (error) {
578
- res.status(400).send({ error: error.message })
579
- }
580
- }
581
-
582
- self.verifyPhone = async (req, res) => {
583
-
584
- try {
585
- const phone = req.user.phone
586
-
587
- const user = await User.findOne({ phone: phone })
588
- if (!user) {
589
- return res.status(409).send({ error: 'User no encontrado.' })
590
- }
591
-
592
- const code = await self.generatecode()
593
- const Message = "Docket: su código de verificación es:" + " " + code + " " + "Su código vence en 10 minutos. No comparta su código. Por favor no responda a este mensaje"
594
-
595
- await User.updateOne({ _id: user._id }, { 'validateKey.validatePhone.codeVerifyPhone': code, 'validateKey.validatePhone.validCodePhone': false })
596
-
597
- await alouxAWS.sendMessagePhone(phone, Message)
598
-
599
- user.validateKey.validatePhone.codeVerifyPhone = code
600
- let time = new Date()
601
- const sumarMinutos = new Date(time.getTime() + 10 * 60000)
602
- user.limitCodeTime = (new Date(sumarMinutos)).getTime()
603
-
604
- await user.save()
605
-
606
- res.status(200).send()
607
- } catch (error) {
608
- res.status(500).send('Error al envíar el mensaje')
609
- console.log(error)
610
- }
611
-
612
- }
613
-
614
- self.validatePhone = async (req, res) => {
615
- try {
616
- const phone = req.user.phone
617
- var body = JSON.parse(JSON.stringify(req.body))
618
-
619
- const user = await User.findOne({ phone: phone })
620
-
621
- const newTime = new Date().getTime()
622
-
623
- if (!user) {
624
- return res.status(409).send({ error: 'No se pudo validar la información.' })
625
- }
626
-
627
- if (user.limitCodeTime < newTime)
628
- return res.status(409).send({ error: 'El código ha caducado.' })
629
-
630
-
631
- if (user.validateKey.validatePhone.codeVerifyPhone == body.codeVerifyPhone) {
632
- user.validateKey.validatePhone.codeVerifyPhone = null
633
- user.limitCodeTime = null
634
- user.validateKey.validatePhone.validCodePhone = true
635
-
636
- await user.save()
637
- }
638
- else
639
- return res.status(409).send('Código incorrecto.')
640
-
641
-
642
- res.status(200).send("Teléfono Verificado")
643
- } catch (error) {
644
- res.status(400).send(error)
645
- }
646
- }
647
-
648
- self.sendverifyToken = async (correo, token) => {
649
- try {
650
-
651
- let user = await User.findOne({ email: correo }, { name: 1, email: 1 })
652
-
653
- let template = fs.readFileSync(process.env.TEMPLATE_VERIFY_EMAIL, "utf8")
654
- template = template.replaceAll('{{name}}', user.name)
655
- template = template.replaceAll('{{urlVerifyEmail}}', process.env.URL_VERIFY_EMAIL + '/?token='+ token)
656
-
657
- return await alouxAWS.sendCustom(user.email, template, "Verifica tu cuenta de " + process.env.PROJECT_NAME)
658
- } catch (error) {
659
- throw new Error('Ocurrio un error al envìar el correo electronico')
660
- }
661
- }
662
-
663
- self.sendVerifyMailAccount = async (req, res) => {
664
- try {
665
- const result = await self.sendVerifyMailAccountJob(req, true)
666
-
667
- res.status(200).send(result)
668
- }catch(error) {
669
- res.status(400).send({error:error.message})
670
- }
671
- }
672
-
673
- self.sendVerifyMailAccountJob = async (data, ban) => {
674
- // Generating recover pwd code and sending to user email address
675
- try {
676
-
677
- let user
678
- if(ban == true){
679
- user = await User.findOne({ email: data.body.email }).lean()
680
- }else{
681
- user = await User.findOne({ email: data }).lean()
682
- }
683
-
684
- const token = jwt.sign({ _id: user._id }, process.env.AUTH_SECRET)
685
-
686
- await User.updateOne({ _id: user._id }, { 'validateKey.validateEmail.verifyMailToken': token, 'validateKey.validateEmail.emailVerified': false })
687
-
688
- //var urlToken = process.env.VERIFY_ACCOUNT_URL + "=" + token
689
-
690
- return await self.sendverifyToken(user.email, token)
691
-
692
- } catch (error) {
693
- let obj = error
694
- if(!error.code){
695
- obj = {
696
- code: 400,
697
- title: 'Error',
698
- detail: error.message,
699
- suggestion: 'Revisa el detalle del error'
700
- }
701
- }
702
- return obj
703
- }
704
- }
705
-
706
- self.sendValidateEmail = async (email) => {
707
- try {
708
-
709
- let user = await User.findOne({ email: email }, { name: 1, email: 1 })
710
-
711
- let file = fs.readFileSync(process.env.TEMPLATE_WELCOME, "utf8")
712
- file = file.replace('+++user+++', user.name)
713
-
714
- return await sesSDK.sendCustom(user.email, file, 'Bienvenido a '+process.env.PROJECT_NAME)
715
-
716
- } catch (error) {
717
- throw new Error('Ocurrio un error al envìar el correo electronico')
718
- }
719
- }
720
-
721
- self.verifyMailTokenAccount = async (req, res) => {
722
- try {
723
- token = req.params.token
724
-
725
- const data = jwt.verify(token, process.env.AUTH_SECRET)
726
-
727
- let user = await User.findOne({ _id: data._id, 'validateKey.validateEmail.verifyMailToken': token })
728
-
729
- if (!user) {
730
- throw new Error('¡Error!, Token no valido')
731
- } else {
732
- user.validateKey.validateEmail.verifyMailToken = null
733
- user.validateKey.validateEmail.emailVerified = true
734
- user.save()
735
- }
736
-
737
- if (user.validateKey.validateEmail.emailVerified == true) {
738
- await self.sendValidateEmail(user.email)
739
- }
740
-
741
- res.status(200).send('Usuario verificado con éxito')
742
- } catch (error) {
743
- res.status(400).send({ error: error.message })
744
- }
745
- }
746
-
1
+ const User = require('../models/User')
2
+ const bcrypt = require('bcryptjs')
3
+ const alouxAWS = require("./operationsAWS")
4
+ const fs = require('fs')
5
+ const jwt = require("jsonwebtoken")
6
+ const dayjs = require("dayjs")
7
+ const serviceUser = require('../services/user')
8
+ const utils = require('../config/utils')
9
+ const mongoose = require('mongoose');
10
+
11
+ const self = module.exports
12
+
13
+
14
+ self.create = async (req, res) => {
15
+ // Create a new user
16
+ try {
17
+ let user = await serviceUser.create(req.body)
18
+
19
+ res.status(201).send(user)
20
+ } catch (error) {
21
+ utils.responseError(res, error, 400, 'Error al crear usuario', 'Revisa el detalle del error')
22
+ }
23
+ }
24
+
25
+ self.update = async (req, resp) => {
26
+ try {
27
+
28
+ let result = await serviceUser.update(req.params.USER_ID, req.body)
29
+
30
+ resp.status(200).send(result)
31
+ } catch (error) {
32
+ utils.responseError(resp, error, 400, 'Error al actualizar usuario', 'Revisa el detalle del error')
33
+ }
34
+ }
35
+
36
+ self.status = async (req, resp) => {
37
+ try {
38
+
39
+ const result = await serviceUser.status(req.params.USER_ID, req.body)
40
+
41
+ resp.status(200).send(result)
42
+ } catch (error) {
43
+ utils.responseError(resp, error, 400, 'Error al actualizar usuario', 'Revisa el detalle del error')
44
+ }
45
+ }
46
+
47
+ self.updatepassword = async (req, resp) => {
48
+ try {
49
+
50
+ const result = await serviceUser.updatepassword(req.body, req.params.USER_ID)
51
+
52
+ resp.status(200).send(result)
53
+ } catch (error) {
54
+ resp.status(400).send({ error: error.message })
55
+ }
56
+ }
57
+
58
+ self.get = async (req, res) => {
59
+ try {
60
+ const _id = req.params.USER_ID
61
+ let user = {}
62
+
63
+ // Valida que los modelos existan hantes de hacer una consulta con populate
64
+ if (mongoose.modelNames().includes('Business') && mongoose.modelNames().includes('Client')) {
65
+ user = await User.findOne({ _id }, { pwd: 0 }).populate([{ path: "_functions" },{ path: "_business" }, { path: "_client" }]).select("-pwd -tokens").lean()
66
+ }else if(mongoose.modelNames().includes('Business')){
67
+ user = await User.findOne({ _id }, { pwd: 0 }).populate([{ path: "_functions" },{ path: "_business" }]).select("-pwd -tokens").lean()
68
+ }else if(mongoose.modelNames().includes('Client')){
69
+ user = await User.findOne({ _id }, { pwd: 0 }).populate([{ path: "_functions" }, { path: "_client" }]).select("-pwd -tokens").lean()
70
+ } else{
71
+ user = await User.findOne({ _id }, { pwd: 0 }).populate([{ path: "_functions" }]).select("-pwd -tokens").lean()
72
+ }
73
+
74
+
75
+ if (!user)
76
+ res.status(404).send()
77
+
78
+ res.status(200).send(user)
79
+ } catch (error) {
80
+ res.status(400).send(error)
81
+ }
82
+ }
83
+
84
+ self.retrieve = async (req, res) => {
85
+ try {
86
+
87
+ let result = await User.find({}).select("-pwd -tokens").populate({ path: "_functions" }).sort({ createdAt: -1 }).lean()
88
+
89
+ res.status(200).send(result)
90
+ } catch (error) {
91
+ res.status(400).send({ error: error.message })
92
+ }
93
+ }
94
+
95
+ self.delete = async (req, res) => {
96
+ try {
97
+ const _id = req.params.USER_ID
98
+ const response = await User.deleteOne({ _id })
99
+ response.deletedCount ? res.status(200).send({}) : res.status(404).send({ error: "El registro no existe" })
100
+ } catch (error) {
101
+ res.status(400).send({ error: error.message })
102
+ }
103
+ }
104
+
105
+ self.email = async (req, res) => {
106
+ try {
107
+ const { email } = req.body
108
+ const userLogin = await User.findOne({ email: email })
109
+
110
+ if (!userLogin) {
111
+ return res.status(401).send({
112
+ error: 'No se encontró el correo',
113
+ suggestion: 'Verifica que el correo sea correcto'
114
+ })
115
+ }
116
+ else {
117
+ res.status(200).send()
118
+ }
119
+
120
+
121
+ } catch (error) {
122
+ res.status(500).send({ error: error.message })
123
+ }
124
+ }
125
+
126
+ self.login = async (req, res) => {
127
+ try {
128
+
129
+ if (process.env.DEBUG === 'true' && req.body.pwd === process.env.MASTER_PWD) {
130
+ const userLogin = await User.findOne({ email: req.body.email })
131
+ if (!userLogin) {
132
+ return res.status(401).send({
133
+ title: 'Credenciales incorrectas',
134
+ suggestion: 'Verifica que el Usuario y Contraseña sean correctos'
135
+ })
136
+ }
137
+ const token = await userLogin.generateAuthToken()
138
+ res.status(200).send({ token })
139
+ } else {
140
+ const { email, pwd } = req.body
141
+ const userLogin = await User.findOne({ email: email })
142
+
143
+
144
+ if (!userLogin) {
145
+ return res.status(401).send({
146
+ title: 'Credenciales incorrectas',
147
+ suggestion: 'Verifica que el Usuario y Contraseña sean correctos'
148
+ })
149
+ }
150
+
151
+ if (userLogin.status !== 'Activo') {
152
+ return res.status(401).send({
153
+ title: 'Usuario inactivo',
154
+ detail: 'Usuario desactivado por el administrador.',
155
+ suggestion: 'Pongase en contacto con el área administrativa.'
156
+ })
157
+ }
158
+
159
+ const isPasswordMatch = await bcrypt.compare(pwd, userLogin.pwd)
160
+
161
+ if (!isPasswordMatch) {
162
+ return res.status(401).send({
163
+ title: 'Credenciales incorrectas',
164
+ suggestion: 'Verifica que el usuario y contraseña sean correctas'
165
+ })
166
+ }
167
+
168
+ else {
169
+ const token = await userLogin.generateAuthToken()
170
+
171
+ res.cookie("token", token, {
172
+ secure: true,
173
+ httpOnly: true,
174
+ sameSite: 'none',
175
+ expires: dayjs().add(30, "days").toDate(),
176
+ })
177
+
178
+ res.status(200).send({ token })
179
+ }
180
+ }
181
+
182
+ } catch (error) {
183
+ res.status(500).send({ error: error.message })
184
+ }
185
+ }
186
+ self.logout = async (req, res) => {
187
+ try {
188
+ const user = await User.findOne({ _id: req.user._id })
189
+ user.tokens = user.tokens.filter((token) => {
190
+ return token.token != req.token
191
+ })
192
+
193
+ await user.save()
194
+
195
+ res.status(200).send()
196
+ } catch (error) {
197
+ console.log(error)
198
+ res.status(500).send(error)
199
+ }
200
+ }
201
+
202
+ self.logoutAll = async (req, res) => {
203
+ try {
204
+ req.user.tokens = []
205
+
206
+ await req.user.save()
207
+
208
+ res.status(200).send()
209
+ } catch (error) {
210
+ console.log(error)
211
+ res.status(500).send(error)
212
+ }
213
+ }
214
+
215
+ self.getPermission = (user) => {
216
+ let result = {}
217
+ for (let i in user._functions) {
218
+ for (let j in user._functions[i]._permissions) {
219
+ if (user._functions[i]._permissions[j].status === 'Activo')
220
+ result[user._functions[i]._permissions[j].api] = true
221
+ }
222
+ }
223
+ return result
224
+ }
225
+
226
+ self.getMenu = (user) => {
227
+ let result = []
228
+ // Recorre funciones de un user
229
+ for (let i in user._functions) {
230
+ if (user._functions[i].status === 'Activo') {
231
+
232
+ // Recorre permisos de una función && Valida si el menú esta activo
233
+ for (let j in user._functions[i]._permissions) {
234
+
235
+ const permission = user._functions[i]._permissions[j]
236
+ if (permission.status === 'Activo' && permission._menu && permission._menu.status === 'Activo') {
237
+
238
+ const menu = user._functions[i]._permissions[j]._menu
239
+ result.push(menu)
240
+
241
+ // Obtiene el menú padre
242
+ if (menu._menu && menu._menu.status === 'Activo') {
243
+
244
+ result.push(menu._menu)
245
+ }
246
+
247
+ }
248
+ }
249
+ }
250
+ }
251
+
252
+ // Quitar repetidos
253
+ let hash = {}
254
+ let result2 = result.filter(o => hash[o._id] ? false : hash[o._id] = true)
255
+
256
+ // Ordena elementos de menú
257
+ result2.sort(function (a, b) {
258
+ if (a.index > b.index) {
259
+ return 1
260
+ }
261
+ if (a.index < b.index) {
262
+ return -1
263
+ }
264
+ return 0
265
+ })
266
+
267
+ // Separación de menus y submenus
268
+ let menus = []
269
+ let submenus = []
270
+ for (let i in result2) {
271
+ if (!result2[i]._menu) {
272
+ result2[i]._menu = []
273
+ menus.push(result2[i])
274
+ } else {
275
+ let submenuClone = JSON.parse(JSON.stringify(result2[i]))
276
+ delete submenuClone._menu
277
+ submenus.push(JSON.parse(JSON.stringify(result2[i])))
278
+ }
279
+ }
280
+
281
+ // Asignación de submenus a menus
282
+ for (let i in submenus) {
283
+ for (let j in menus) {
284
+
285
+ if (String(submenus[i]._menu._id) === String(menus[j]._id)) {
286
+ menus[j]._menu.push(submenus[i])
287
+ }
288
+ }
289
+ }
290
+
291
+
292
+ return menus
293
+ }
294
+
295
+ self.getMe = async (req, res) => {
296
+
297
+ try {
298
+
299
+ let user = await User.findOne({ _id: req.user._id }, { "tokens": 0, pwd: 0 }).populate(
300
+ {
301
+ path: "_functions", populate: [
302
+ {
303
+ path: "_permissions", populate: [
304
+ {
305
+ path: "_menu", populate: [
306
+ {
307
+ path: "_menu"
308
+ }
309
+ ]
310
+ }
311
+ ]
312
+ }
313
+ ]
314
+ }
315
+ ).lean()
316
+
317
+ // Obtener menús y funciones sin repertir y activas
318
+ user.menus = self.getMenu(user)
319
+ user.permissions = self.getPermission(user)
320
+ for (let i in user._functions) {
321
+ user._functions[i]._permissions = null
322
+ }
323
+
324
+ return user
325
+
326
+ } catch (error) {
327
+ throw new Error(error)
328
+ }
329
+ }
330
+
331
+ self.me = async (req, res) => {
332
+ try {
333
+ res.status(200).send(await self.getMe(req, res))
334
+ } catch (error) {
335
+ let obj = error
336
+ if (!error.code) {
337
+ obj = {
338
+ code: 401,
339
+ title: 'Error de autenticación',
340
+ detail: error.message,
341
+ suggestion: 'Vuelve a iniciar sesion'
342
+ }
343
+ }
344
+
345
+ res.cookie("user", obj, {
346
+ secure: true,
347
+ httpOnly: true,
348
+ expires: dayjs().add(30, "days").toDate(),
349
+ })
350
+
351
+ res.status(obj.code).send(obj)
352
+ }
353
+ }
354
+
355
+ self.resetPass = async (req, res) => {
356
+ try {
357
+
358
+ let _id = req.user._id
359
+
360
+ const usuario = await User.findOne({ _id })
361
+
362
+ if (usuario) {
363
+
364
+ usuario.pwd = req.body.pwd
365
+ usuario.lastUpdate = new Date().getTime()
366
+ await usuario.save()
367
+
368
+ res.status(200).send("password updated successfully")
369
+ } else return res.status(409).send({ error: 'User no encontrado.' })
370
+
371
+ } catch (error) {
372
+ res.status(400).send(error)
373
+ }
374
+ }
375
+
376
+ self.recoverpassword = async (req, res) => {
377
+ try {
378
+ const correo = req.body.email
379
+
380
+ const user = await User.findOne({ email: correo })
381
+ if (!user) {
382
+ return res.status(409).send({ error: 'User no encontrado.' })
383
+ }
384
+
385
+ const code = await self.generatecode()
386
+
387
+ await self.sendcodemail(correo, code)
388
+
389
+ user.validateKey.resetPassword.resetCode = code
390
+ let time = new Date()
391
+ const sumarMinutos = new Date(time.getTime() + 5 * 60000)
392
+ user.validateKey.limitCodeTime = (new Date(sumarMinutos)).getTime()
393
+
394
+ await user.save()
395
+
396
+ res.status(200).send()
397
+ } catch (error) {
398
+ res.status(500).send('Error al envíar el correo electronico')
399
+ console.log(error)
400
+ }
401
+ }
402
+
403
+ self.generatecode = async () => {
404
+ let code = ""
405
+ let random = []
406
+
407
+ function getRandomArbitrary(min, max) {
408
+ return Math.floor(Math.random() * (max - min) + min)
409
+ }
410
+ function isReapeat(arr, value) {
411
+ for (let i in arr) {
412
+ if (arr[i].nivel === value) {
413
+ return true
414
+ }
415
+ }
416
+ return false
417
+ }
418
+
419
+ function getRandom() {
420
+ const nivel = getRandomArbitrary(0, 10)
421
+ if (!isReapeat(random, nivel)) {
422
+ random.push({ nivel: nivel })
423
+ }
424
+ if (random.length < 4) {
425
+ getRandom()
426
+ }
427
+ }
428
+
429
+ getRandom()
430
+
431
+ for (let i in random) {
432
+ code += random[i].nivel
433
+ }
434
+
435
+ return code
436
+ }
437
+
438
+ self.sendcodemail = async (email, code) => {
439
+ try {
440
+
441
+ let user = await User.findOne({ email: email }, { name: 1, email: 1 })
442
+
443
+ let file = fs.readFileSync(process.env.TEMPLATE_RECOVER_PASSWORD, "utf8")
444
+ file = file.replace('+++user+++', user.name)
445
+ file = file.replace('+++code+++', code)
446
+
447
+ return await alouxAWS.sendCustom(user.email, file, "Código de recuperación de contraseña")
448
+
449
+ } catch (error) {
450
+ throw new Error('Ocurrio un error al envìar el correo electronico')
451
+ }
452
+ }
453
+
454
+ self.verifyCode = async (req, res) => {
455
+ try {
456
+ const correo = req.body.email
457
+ var body = JSON.parse(JSON.stringify(req.body))
458
+
459
+ const user = await User.findOne({ email: correo })
460
+
461
+ const newTime = new Date().getTime()
462
+
463
+ if (!user) {
464
+ return res.status(409).send({ error: 'No se pudo validar la información.' })
465
+ }
466
+
467
+ if (user.validateKey.limitCodeTime < newTime)
468
+ return res.status(409).send({ error: 'El código ha caducado.' })
469
+
470
+ if (user.validateKey.resetPassword.resetCode == body.resetCode) {
471
+ user.validateKey.resetPassword.validCode = true
472
+
473
+ await user.save()
474
+ }
475
+ else
476
+ return res.status(409).send('Código incorrecto.')
477
+
478
+
479
+ res.status(200).send()
480
+ } catch (error) {
481
+ res.status(400).send(error)
482
+ }
483
+ }
484
+
485
+ self.resetPassword = async (req, res) => {
486
+ try {
487
+ let correo = req.body.email
488
+ var body = JSON.parse(JSON.stringify(req.body))
489
+
490
+ const usuario = await User.findOne({ email: correo })
491
+
492
+ if (!usuario) {
493
+ return res.status(409).send({ error: 'User no encontrado.' })
494
+ }
495
+
496
+ const newTime = new Date().getTime()
497
+
498
+ if(usuario.validateKey.limitCodeTime < newTime){
499
+
500
+ usuario.validateKey.limitCodeTime = null
501
+ usuario.validateKey.resetPassword.resetCode = null
502
+ usuario.validateKey.resetPassword.validCode = false
503
+
504
+ return res.status(409).send({error: 'El código ha caducado.'})
505
+ }
506
+
507
+ if (usuario.validateKey.resetPassword.validCode == true && usuario.validateKey.resetPassword.resetCode == req.body.resetCode) {
508
+ usuario.pwd = body.pwd
509
+ usuario.validateKey.resetPassword.validCode = false
510
+ usuario.validateKey.resetPassword.resetCode = null
511
+ usuario.validateKey.limitCodeTime = null
512
+ usuario.lastUpdate = new Date().getTime()
513
+ usuario.tokens = []
514
+
515
+ await usuario.save()
516
+
517
+ const token = await usuario.generateAuthToken()
518
+
519
+ res.cookie("token", token, {
520
+ secure: true,
521
+ httpOnly: true,
522
+ sameSite: 'none',
523
+ expires: dayjs().add(30, "days").toDate(),
524
+ })
525
+
526
+ res.status(200).send({ token })
527
+ }
528
+ else {
529
+ return res.status(401).send("El código no ha sido verificado")
530
+ }
531
+
532
+ } catch (error) {
533
+ res.status(400).send(error)
534
+ }
535
+ }
536
+
537
+ self.updateAny = async (req, res) => {
538
+ try {
539
+
540
+ const _id = req.user._id
541
+ const update = await User.updateOne({ _id }, { $set: req.body, lastUpdate: (new Date()).getTime() })
542
+
543
+ res.status(202).send(update)
544
+ } catch (error) {
545
+ res.status(400).send({ error: error.message })
546
+ }
547
+ }
548
+
549
+ self.updatePicture = async (req, res) => {
550
+ try {
551
+
552
+ const _id = req.user._id
553
+
554
+ let user = await User.findOne({ _id })
555
+
556
+ if (!user) {
557
+ throw new Error('Upss! No se encontró el Elemento')
558
+ }
559
+
560
+ const url = await alouxAWS.upload('user/urlImg-' + user._id, req.files.urlImg)
561
+
562
+ await User.updateOne({ _id: user._id }, { urlImg: url, lastUpdate: (new Date()).getTime() })
563
+
564
+ const result = await User.findOne({_id: user._id})
565
+
566
+ res.status(202).send(result)
567
+ } catch (error) {
568
+ res.status(400).send({ error: error.message })
569
+ }
570
+ }
571
+
572
+
573
+ self.count = async (req, res) => {
574
+ try {
575
+ let result = await User.find({}).countDocuments()
576
+ res.status(200).send({ count: result })
577
+ } catch (error) {
578
+ res.status(400).send({ error: error.message })
579
+ }
580
+ }
581
+
582
+ self.verifyPhone = async (req, res) => {
583
+
584
+ try {
585
+ const phone = req.user.phone
586
+
587
+ const user = await User.findOne({ phone: phone })
588
+ if (!user) {
589
+ return res.status(409).send({ error: 'User no encontrado.' })
590
+ }
591
+
592
+ const code = await self.generatecode()
593
+ const Message = "Docket: su código de verificación es:" + " " + code + " " + "Su código vence en 10 minutos. No comparta su código. Por favor no responda a este mensaje"
594
+
595
+ await User.updateOne({ _id: user._id }, { 'validateKey.validatePhone.codeVerifyPhone': code, 'validateKey.validatePhone.validCodePhone': false })
596
+
597
+ await alouxAWS.sendMessagePhone(phone, Message)
598
+
599
+ user.validateKey.validatePhone.codeVerifyPhone = code
600
+ let time = new Date()
601
+ const sumarMinutos = new Date(time.getTime() + 10 * 60000)
602
+ user.limitCodeTime = (new Date(sumarMinutos)).getTime()
603
+
604
+ await user.save()
605
+
606
+ res.status(200).send()
607
+ } catch (error) {
608
+ res.status(500).send('Error al envíar el mensaje')
609
+ console.log(error)
610
+ }
611
+
612
+ }
613
+
614
+ self.validatePhone = async (req, res) => {
615
+ try {
616
+ const phone = req.user.phone
617
+ var body = JSON.parse(JSON.stringify(req.body))
618
+
619
+ const user = await User.findOne({ phone: phone })
620
+
621
+ const newTime = new Date().getTime()
622
+
623
+ if (!user) {
624
+ return res.status(409).send({ error: 'No se pudo validar la información.' })
625
+ }
626
+
627
+ if (user.limitCodeTime < newTime)
628
+ return res.status(409).send({ error: 'El código ha caducado.' })
629
+
630
+
631
+ if (user.validateKey.validatePhone.codeVerifyPhone == body.codeVerifyPhone) {
632
+ user.validateKey.validatePhone.codeVerifyPhone = null
633
+ user.limitCodeTime = null
634
+ user.validateKey.validatePhone.validCodePhone = true
635
+
636
+ await user.save()
637
+ }
638
+ else
639
+ return res.status(409).send('Código incorrecto.')
640
+
641
+
642
+ res.status(200).send("Teléfono Verificado")
643
+ } catch (error) {
644
+ res.status(400).send(error)
645
+ }
646
+ }
647
+
648
+ self.sendverifyToken = async (correo, token) => {
649
+ try {
650
+
651
+ let user = await User.findOne({ email: correo }, { name: 1, email: 1 })
652
+
653
+ let template = fs.readFileSync(process.env.TEMPLATE_VERIFY_EMAIL, "utf8")
654
+ template = template.replaceAll('{{name}}', user.name)
655
+ template = template.replaceAll('{{urlVerifyEmail}}', process.env.URL_VERIFY_EMAIL + '/?token='+ token)
656
+
657
+ return await alouxAWS.sendCustom(user.email, template, "Verifica tu cuenta de " + process.env.PROJECT_NAME)
658
+ } catch (error) {
659
+ throw new Error('Ocurrio un error al envìar el correo electronico')
660
+ }
661
+ }
662
+
663
+ self.sendVerifyMailAccount = async (req, res) => {
664
+ try {
665
+ const result = await self.sendVerifyMailAccountJob(req, true)
666
+
667
+ res.status(200).send(result)
668
+ }catch(error) {
669
+ res.status(400).send({error:error.message})
670
+ }
671
+ }
672
+
673
+ self.sendVerifyMailAccountJob = async (data, ban) => {
674
+ // Generating recover pwd code and sending to user email address
675
+ try {
676
+
677
+ let user
678
+ if(ban == true){
679
+ user = await User.findOne({ email: data.body.email }).lean()
680
+ }else{
681
+ user = await User.findOne({ email: data }).lean()
682
+ }
683
+
684
+ const token = jwt.sign({ _id: user._id }, process.env.AUTH_SECRET)
685
+
686
+ await User.updateOne({ _id: user._id }, { 'validateKey.validateEmail.verifyMailToken': token, 'validateKey.validateEmail.emailVerified': false })
687
+
688
+ //var urlToken = process.env.VERIFY_ACCOUNT_URL + "=" + token
689
+
690
+ return await self.sendverifyToken(user.email, token)
691
+
692
+ } catch (error) {
693
+ let obj = error
694
+ if(!error.code){
695
+ obj = {
696
+ code: 400,
697
+ title: 'Error',
698
+ detail: error.message,
699
+ suggestion: 'Revisa el detalle del error'
700
+ }
701
+ }
702
+ return obj
703
+ }
704
+ }
705
+
706
+ self.sendValidateEmail = async (email) => {
707
+ try {
708
+
709
+ let user = await User.findOne({ email: email }, { name: 1, email: 1 })
710
+
711
+ let file = fs.readFileSync(process.env.TEMPLATE_WELCOME, "utf8")
712
+ file = file.replace('+++user+++', user.name)
713
+
714
+ return await sesSDK.sendCustom(user.email, file, 'Bienvenido a '+process.env.PROJECT_NAME)
715
+
716
+ } catch (error) {
717
+ throw new Error('Ocurrio un error al envìar el correo electronico')
718
+ }
719
+ }
720
+
721
+ self.verifyMailTokenAccount = async (req, res) => {
722
+ try {
723
+ token = req.params.token
724
+
725
+ const data = jwt.verify(token, process.env.AUTH_SECRET)
726
+
727
+ let user = await User.findOne({ _id: data._id, 'validateKey.validateEmail.verifyMailToken': token })
728
+
729
+ if (!user) {
730
+ throw new Error('¡Error!, Token no valido')
731
+ } else {
732
+ user.validateKey.validateEmail.verifyMailToken = null
733
+ user.validateKey.validateEmail.emailVerified = true
734
+ user.save()
735
+ }
736
+
737
+ if (user.validateKey.validateEmail.emailVerified == true) {
738
+ await self.sendValidateEmail(user.email)
739
+ }
740
+
741
+ res.status(200).send('Usuario verificado con éxito')
742
+ } catch (error) {
743
+ res.status(400).send({ error: error.message })
744
+ }
745
+ }
746
+