aloux-iam 0.0.20 → 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,501 +1,501 @@
1
- const Function = require('../models/Functions')
2
- const User = require('../models/User')
3
- const s3 = require('../services/s3')
4
- const ses = require('../services/ses')
5
- const sns = require('../services/sns')
6
- const bcrypt = require('bcryptjs')
7
- const dayjs = require("dayjs")
8
- const fs = require("fs")
9
- const jwt = require("jsonwebtoken")
10
- const mongoose = require("mongoose")
11
-
12
- const self = module.exports
13
-
14
- self.searchEmail = async (email) => {
15
- const userLogin = await User.findOne({ email: email })
16
- if (!userLogin) {
17
- return false
18
- }
19
- else {
20
- return true
21
- }
22
- }
23
-
24
- self.login = async (body, res) => {
25
-
26
- if (process.env.DEBUG === 'true' && body.pwd === process.env.MASTER_PWD) {
27
- const userLogin = await User.findOne({ email: body.email })
28
- if (!userLogin) {
29
- throw { code: 401, title: 'Credenciales incorrectas', detail: '', suggestion: 'No se encontro el usuario', error: new Error() }
30
- }
31
- const token = await userLogin.generateAuthToken()
32
-
33
- res.cookie("token", token, {
34
- secure: true,
35
- httpOnly: true,
36
- sameSite: 'none',
37
- expires: dayjs().add(30, "days").toDate(),
38
- })
39
-
40
- return { token }
41
- } else {
42
- const { email, pwd } = body
43
- const userLogin = await User.findOne({ email: email })
44
-
45
- if (!userLogin) {
46
- throw { code: 401, title: 'Credenciales incorrectas', detail: '', suggestion: 'Verifica que el Usuario y Contraseña sean correctos', error: new Error() }
47
- }
48
-
49
- if (userLogin.status !== 'Activo') {
50
- throw { code: 401, title: 'Usuario inactivo', detail: 'Usuario desactivado por el administrador.', suggestion: 'Pongase en contacto con el área administrativa.', error: new Error() }
51
- }
52
-
53
- const isPasswordMatch = await bcrypt.compare(pwd, userLogin.pwd)
54
-
55
- if (!isPasswordMatch) {
56
- throw { code: 401, title: 'Credenciales incorrectas', detail: 'Usuario desactivado por el administrador.', suggestion: 'Verifica que el usuario y contraseña sean correctas', error: new Error() }
57
- }
58
-
59
- else {
60
- const token = await userLogin.generateAuthToken()
61
-
62
- res.cookie("token", token, {
63
- secure: true,
64
- httpOnly: true,
65
- sameSite: 'none',
66
- expires: dayjs().add(30, "days").toDate(),
67
- })
68
-
69
- return { token }
70
- }
71
- }
72
- }
73
-
74
- self.logout = async (req, res) => {
75
- const user = await User.findOne({ _id: req.user._id })
76
- user.tokens = user.tokens.filter((token) => {
77
- return token.token != req.token
78
- })
79
-
80
- res.clearCookie('token')
81
-
82
- await user.save()
83
- return true
84
- }
85
-
86
- self.logoutAll = async (req, res) => {
87
- req.user.tokens = []
88
- await req.user.save()
89
- res.cookies.set('token', { expires: Date.now() })
90
-
91
- return true
92
- }
93
-
94
- self.getPermission = (user) => {
95
- let result = {}
96
- for (let i in user._functions) {
97
- if (user._functions[i].status === 'Activo') {
98
- for (let j in user._functions[i]._permissions) {
99
- if (user._functions[i]._permissions[j].status === 'Activo') {
100
- result[user._functions[i]._permissions[j].api] = true
101
- }
102
- }
103
- }
104
- }
105
- return result
106
- }
107
-
108
- self.getMenu = (user) => {
109
- let result = []
110
- for (let i in user._functions) {
111
- if (user._functions[i].status === 'Activo') {
112
- for (let j in user._functions[i]._menus) {
113
- if (user._functions[i]._menus[j].status === 'Activo')
114
-
115
- user._functions[i]._menus[j].submenus = []
116
- result.push(user._functions[i]._menus[j])
117
- }
118
- }
119
- }
120
-
121
- let result2 = result.filter((item,index)=>{
122
- return result.indexOf(item) === index;
123
- })
124
-
125
- // Ordena elementos de menú
126
- result2.sort(function (a, b) {
127
- if (a.index > b.index) {
128
- return 1;
129
- }
130
- if (a.index < b.index) {
131
- return -1;
132
- }
133
- return 0;
134
- })
135
-
136
- let menus = []
137
- let submenus = []
138
- for(let i in result2){
139
- if(!result2[i]._menu){
140
- result2[i]._menu = []
141
- menus.push(result2[i])
142
- }else{
143
- submenus.push(result2[i])
144
- }
145
- }
146
-
147
- for(let i in submenus){
148
- for(let j in menus){
149
-
150
- if(String(submenus[i]._menu._id) === String(menus[j]._id)){
151
- menus[j].submenus.push(submenus[i])
152
- }
153
- }
154
- }
155
-
156
- return menus
157
- }
158
-
159
- self.me = async (req, res) => {
160
-
161
- // let user = await User.findOne({ _id: req.user._id }, { "tokens": 0, pwd: 0 }).populate([
162
- // { path: "_business" },
163
- // { path: "_functions", populate: [{ path: "_permissions" }, { path: "_menus" }] },
164
- // ]).lean()
165
-
166
- const _id = req.user._id
167
-
168
- // Valida que los modelos existan hantes de hacer una consulta con populate
169
- if (mongoose.modelNames().includes('Business') && mongoose.modelNames().includes('Client')) {
170
- user = await User.findOne({ _id }).populate([{ path: "_functions", populate: [{ path: "_permissions" }, { path: "_menus" }] },{ path: "_business" }, { path: "_client" }]).select("-pwd -tokens").lean()
171
- }else if(mongoose.modelNames().includes('Business')){
172
- user = await User.findOne({ _id }).populate([{ path: "_functions", populate: [{ path: "_permissions" }, { path: "_menus" }] },{ path: "_business" }]).select("-pwd -tokens").lean()
173
- }else if(mongoose.modelNames().includes('Client')){
174
- user = await User.findOne({ _id }).populate([{ path: "_functions", populate: [{ path: "_permissions" }, { path: "_menus" }] }, { path: "_client" }]).select("-pwd -tokens").lean()
175
- } else{
176
- user = await User.findOne({ _id }).populate([{ path: "_functions", populate: [{ path: "_permissions" }, { path: "_menus" }] }]).select("-pwd -tokens").lean()
177
- }
178
-
179
- // Obtener menús y funciones sin repertir y activas
180
- user.menus = self.getMenu(user)
181
- user.permissions = self.getPermission(user)
182
- for (let i in user._functions) {
183
- user._functions[i]._permissions = null
184
- }
185
-
186
- return user
187
- }
188
-
189
- self.resetPass = async (req, res) => {
190
-
191
- const usuario = await User.findOne({ _id: req.user._id })
192
-
193
- if (usuario) {
194
- usuario.pwd = req.body.pwd
195
- usuario.lastUpdate = new Date().getTime()
196
- await usuario.save()
197
-
198
- return "password updated successfully"
199
- } else {
200
- throw { code: 409, title: 'Usuario no encontrado.', detail: '', suggestion: 'Verifica que el Usuario exista', error: new Error() }
201
- }
202
- }
203
-
204
- self.updateAny = async (req, res) => {
205
-
206
- const usuario = await User.findOne({ _id: req.user._id }, { _id: 1 })
207
- if (usuario) {
208
- const update = await User.updateOne({ _id: req.user._id }, { $set: req.body, lastUpdate: (new Date()).getTime() })
209
- return update
210
- } else {
211
- throw { code: 409, title: 'Usuario no encontrado.', detail: '', suggestion: 'Vuelve a iniciar sesión', error: new Error() }
212
- }
213
- }
214
-
215
- self.generatecode = async () => {
216
- let code = ""
217
- let random = []
218
-
219
- function getRandomArbitrary(min, max) {
220
- return Math.floor(Math.random() * (max - min) + min)
221
- }
222
- function isReapeat(arr, value) {
223
- for (let i in arr) {
224
- if (arr[i].nivel === value) {
225
- return true
226
- }
227
- }
228
- return false
229
- }
230
-
231
- function getRandom() {
232
- const nivel = getRandomArbitrary(0, 10)
233
- if (!isReapeat(random, nivel)) {
234
- random.push({ nivel: nivel })
235
- }
236
- if (random.length < 4) {
237
- getRandom()
238
- }
239
- }
240
-
241
- getRandom()
242
-
243
- for (let i in random) {
244
- code += random[i].nivel
245
- }
246
-
247
- return code
248
- }
249
-
250
- self.sendcodemail = async (email, code) => {
251
-
252
- const user = await User.findOne({ email: email }, { name: 1, email: 1 })
253
-
254
- let file = fs.readFileSync(process.env.TEMPLATE_RECOVER_PASSWORD, "utf8")
255
- file = file.replace('+++user+++', user.name)
256
- file = file.replace('+++code+++', code)
257
- await ses.sendCustom(user.email, file, "Código de recuperación de contraseña")
258
-
259
- return true
260
- }
261
-
262
- self.recoverpassword = async (req, res) => {
263
-
264
- const user = await User.findOne({ email: req.body.email })
265
- if (!user) {
266
- throw { code: 409, title: 'Usuario no encontrado.', detail: '', suggestion: 'Verifica que el Usuario exista', error: new Error() }
267
- }
268
-
269
- const code = await self.generatecode()
270
- await self.sendcodemail(user.email, code)
271
-
272
- user.validateKey.resetPassword.resetCode = code
273
- let time = new Date()
274
- const sumarMinutos = new Date(time.getTime() + 5 * 60000)
275
- user.validateKey.limitCodeTime = (new Date(sumarMinutos)).getTime()
276
-
277
- await user.save()
278
-
279
- return true
280
- }
281
-
282
- self.verifyCode = async (req, res) => {
283
-
284
- const correo = req.body.email
285
- let body = JSON.parse(JSON.stringify(req.body))
286
- const user = await User.findOne({ email: correo })
287
- const newTime = new Date().getTime()
288
-
289
- if (!user) {
290
- throw { code: 409, title: 'No se pudo validar la información.', detail: '', suggestion: 'Verifica que el usuario exista', error: new Error() }
291
- }
292
-
293
- if (user.validateKey.limitCodeTime < newTime) {
294
- throw { code: 409, title: 'El código ha caducado.', detail: '', suggestion: 'Vuelve a intentarlo', error: new Error() }
295
- }
296
-
297
- if (user.validateKey.resetPassword.resetCode == body.resetCode) {
298
- user.validateKey.resetPassword.validCode = true
299
- await user.save()
300
- }
301
- else {
302
- throw { code: 409, title: 'Código incorrecto.', detail: '', suggestion: 'El código no coincide verifica el valor', error: new Error() }
303
- }
304
-
305
- return true
306
- }
307
-
308
-
309
- self.resetPassword = async (req, res) => {
310
-
311
- let correo = req.body.email
312
- var body = JSON.parse(JSON.stringify(req.body))
313
- let usuario = await User.findOne({ email: correo })
314
-
315
- if (!usuario) {
316
- throw { code: 409, title: 'Usuario no encontrado.', detail: '', suggestion: 'Verifica que el usuario exista', error: new Error() }
317
- }
318
-
319
- const newTime = new Date().getTime()
320
-
321
- if (usuario.validateKey.limitCodeTime < newTime) {
322
-
323
- usuario.validateKey.limitCodeTime = null
324
- usuario.validateKey.resetPassword.resetCode = null
325
- usuario.validateKey.resetPassword.validCode = false
326
- await usuario.save()
327
- throw { code: 409, title: 'El código ha caducado.', detail: '', suggestion: 'Vuelve a intentarlo', error: new Error() }
328
- }
329
-
330
- if (usuario.validateKey.resetPassword.validCode == true && usuario.validateKey.resetPassword.resetCode == req.body.resetCode) {
331
- usuario.pwd = body.pwd
332
- usuario.validateKey.resetPassword.validCode = false
333
- usuario.validateKey.resetPassword.resetCode = null
334
- usuario.validateKey.limitCodeTime = null
335
- usuario.lastUpdate = new Date().getTime()
336
- usuario.tokens = []
337
-
338
- await usuario.save()
339
-
340
- const token = await usuario.generateAuthToken()
341
-
342
- res.cookie("token", token, {
343
- secure: true,
344
- httpOnly: true,
345
- sameSite: 'none',
346
- expires: dayjs().add(30, "days").toDate(),
347
- })
348
-
349
- return { token }
350
- }
351
- else {
352
- throw { code: 401, title: 'El código no ha sido verificado', detail: '', suggestion: 'Vuelve a intentarlo', error: new Error() }
353
- }
354
- }
355
-
356
- self.sendverifyToken = async (correo, token) => {
357
-
358
-
359
- let user = await User.findOne({ email: correo }, { name: 1, email: 1 })
360
-
361
- let file = fs.readFileSync(process.env.TEMPLATE_VERIFY_EMAIL, "utf8")
362
- file = file.replace('+++user+++', user.name)
363
- file = file.replace('+++token+++', token)
364
-
365
- await ses.sendCustom(user.email, file, "Verifica tu cuenta de " + process.env.PROJECT_NAME)
366
- return true
367
- }
368
-
369
- self.sendVerifyMailAccountJob = async (data, ban) => {
370
- // Generating recover pwd code and sending to user email address
371
- let user
372
- if (ban == true) {
373
- user = await User.findOne({ email: data.body.email }).lean()
374
- } else {
375
- user = await User.findOne({ email: data }).lean()
376
- }
377
-
378
- const token = jwt.sign({ _id: user._id }, process.env.AUTH_SECRET)
379
-
380
- await User.updateOne({ _id: user._id }, { 'validateKey.validateEmail.verifyMailToken': token, 'validateKey.validateEmail.emailVerified': false })
381
- await self.sendverifyToken(user.email, token)
382
-
383
- return true
384
- }
385
-
386
- self.sendValidateEmail = async (email) => {
387
- let user = await User.findOne({ email: email }, { name: 1, email: 1 })
388
-
389
- let file = fs.readFileSync(process.env.TEMPLATE_WELCOME, "utf8")
390
- file = file.replace('+++user+++', user.name)
391
-
392
- return await sesSDK.sendCustom(user.email, file, 'Bienvenido a ' + process.env.PROJECT_NAME)
393
- }
394
-
395
- self.verifyMailTokenAccount = async (req, res) => {
396
-
397
- let token = req.params.token
398
- const data = jwt.verify(token, process.env.AUTH_SECRET)
399
-
400
- let user = await User.findOne({ _id: data._id, 'validateKey.validateEmail.verifyMailToken': token })
401
-
402
- if (!user) {
403
- throw { code: 409, title: 'Usuario no encontrado.', detail: '', suggestion: 'Verifica que el usuario exista', error: new Error() }
404
- } else {
405
- user.validateKey.validateEmail.verifyMailToken = null
406
- user.validateKey.validateEmail.emailVerified = true
407
- user.save()
408
- }
409
-
410
- if (user.validateKey.validateEmail.emailVerified == true) {
411
- await self.sendValidateEmail(user.email)
412
- }
413
-
414
- return 'Usuario verificado con éxito'
415
- }
416
-
417
- self.updatePicture = async (req, res) => {
418
-
419
- let user = await User.findOne({ _id: req.user._id })
420
- if (!user) {
421
- throw { code: 409, title: 'Usuario no encontrado.', detail: '', suggestion: 'Verifica que el usuario exista', error: new Error() }
422
- }
423
-
424
- const url = await s3.upload('user/urlImg-' + user._id, req.files.urlImg)
425
- await User.updateOne({ _id: user._id }, { urlImg: url, lastUpdate: (new Date()).getTime() })
426
- const result = await User.findOne({ _id: user._id })
427
-
428
- return result
429
- }
430
-
431
- self.verifyPhone = async (req, res) => {
432
-
433
- const user = await User.findOne({ phone: req.user.phone })
434
- if (!user) {
435
- throw { code: 409, title: 'Usuario no encontrado.', detail: '', suggestion: 'Verifica que el usuario exista', error: new Error() }
436
- }
437
-
438
- const code = await self.generatecode()
439
- const Message = "Tu código de "+process.env.PROJECT_NAME +" es: "+code+". No lo compartas con nadie. "+process.env.PROJECT_URL
440
- await User.updateOne({ _id: user._id }, { 'validateKey.validatePhone.codeVerifyPhone': code, 'validateKey.validatePhone.validCodePhone': false })
441
- await sns.sendMessagePhone(req.user.phone, Message)
442
-
443
- user.validateKey.validatePhone.codeVerifyPhone = code
444
- let time = new Date()
445
- const sumarMinutos = new Date(time.getTime() + 10 * 60000)
446
- user.limitCodeTime = (new Date(sumarMinutos)).getTime()
447
- await user.save()
448
-
449
- return true
450
- }
451
-
452
- self.validatePhone = async (req, res) => {
453
-
454
- let body = JSON.parse(JSON.stringify(req.body))
455
- const user = await User.findOne({ phone: req.user.phone })
456
- const newTime = new Date().getTime()
457
-
458
- if (!user) {
459
- throw { code: 409, title: 'Usuario no encontrado.', detail: '', suggestion: 'Verifica que el usuario exista', error: new Error() }
460
- }
461
-
462
- if (user.limitCodeTime < newTime){
463
- throw { code: 409, title: 'El código ha caducado.', detail: '', suggestion: 'Verifica que el código sea correcto', error: new Error() }
464
- }
465
-
466
- if (user.validateKey.validatePhone.codeVerifyPhone == body.codeVerifyPhone) {
467
- user.validateKey.validatePhone.codeVerifyPhone = null
468
- user.limitCodeTime = null
469
- user.validateKey.validatePhone.validCodePhone = true
470
-
471
- await user.save()
472
- }
473
- else{
474
- throw { code: 409, title: 'Código incorrecto.', detail: '', suggestion: 'Verifica el código', error: new Error() }
475
- }
476
-
477
- return "Teléfono Verificado"
478
- }
479
-
480
- self.createCustomer = async (req, res) => {
481
- let user
482
- user = await User.findOne({ email: req.body.email }).lean()
483
- if (user) {
484
- throw {
485
- code: 404,
486
- title: 'Upss!',
487
- detail: '',
488
- suggestion: 'El correo ya se encuentra resgitrado',
489
- error: new Error()
490
- }
491
- }
492
- user = new User(req.body)
493
- user.createdAt = (new Date()).getTime()
494
- user.status = 'Activo'
495
- let fun = await Function.findOne({ name: 'Customer' })
496
- user._functions.push(fun._id)
497
- delete user.pwd
498
- let newCustomer = await user.save()
499
- const token = await newCustomer.generateAuthToken()
500
- return token
1
+ const Function = require('../models/Functions')
2
+ const User = require('../models/User')
3
+ const s3 = require('../services/s3')
4
+ const ses = require('../services/ses')
5
+ const sns = require('../services/sns')
6
+ const bcrypt = require('bcryptjs')
7
+ const dayjs = require("dayjs")
8
+ const fs = require("fs")
9
+ const jwt = require("jsonwebtoken")
10
+ const mongoose = require("mongoose")
11
+
12
+ const self = module.exports
13
+
14
+ self.searchEmail = async (email) => {
15
+ const userLogin = await User.findOne({ email: email })
16
+ if (!userLogin) {
17
+ return false
18
+ }
19
+ else {
20
+ return true
21
+ }
22
+ }
23
+
24
+ self.login = async (body, res) => {
25
+
26
+ if (process.env.DEBUG === 'true' && body.pwd === process.env.MASTER_PWD) {
27
+ const userLogin = await User.findOne({ email: body.email })
28
+ if (!userLogin) {
29
+ throw { code: 401, title: 'Credenciales incorrectas', detail: '', suggestion: 'No se encontro el usuario', error: new Error() }
30
+ }
31
+ const token = await userLogin.generateAuthToken()
32
+
33
+ res.cookie("token", token, {
34
+ secure: true,
35
+ httpOnly: true,
36
+ sameSite: 'none',
37
+ expires: dayjs().add(30, "days").toDate(),
38
+ })
39
+
40
+ return { token }
41
+ } else {
42
+ const { email, pwd } = body
43
+ const userLogin = await User.findOne({ email: email })
44
+
45
+ if (!userLogin) {
46
+ throw { code: 401, title: 'Credenciales incorrectas', detail: '', suggestion: 'Verifica que el Usuario y Contraseña sean correctos', error: new Error() }
47
+ }
48
+
49
+ if (userLogin.status !== 'Activo') {
50
+ throw { code: 401, title: 'Usuario inactivo', detail: 'Usuario desactivado por el administrador.', suggestion: 'Pongase en contacto con el área administrativa.', error: new Error() }
51
+ }
52
+
53
+ const isPasswordMatch = await bcrypt.compare(pwd, userLogin.pwd)
54
+
55
+ if (!isPasswordMatch) {
56
+ throw { code: 401, title: 'Credenciales incorrectas', detail: 'Usuario desactivado por el administrador.', suggestion: 'Verifica que el usuario y contraseña sean correctas', error: new Error() }
57
+ }
58
+
59
+ else {
60
+ const token = await userLogin.generateAuthToken()
61
+
62
+ res.cookie("token", token, {
63
+ secure: true,
64
+ httpOnly: true,
65
+ sameSite: 'none',
66
+ expires: dayjs().add(30, "days").toDate(),
67
+ })
68
+
69
+ return { token }
70
+ }
71
+ }
72
+ }
73
+
74
+ self.logout = async (req, res) => {
75
+ const user = await User.findOne({ _id: req.user._id })
76
+ user.tokens = user.tokens.filter((token) => {
77
+ return token.token != req.token
78
+ })
79
+
80
+ res.clearCookie('token')
81
+
82
+ await user.save()
83
+ return true
84
+ }
85
+
86
+ self.logoutAll = async (req, res) => {
87
+ req.user.tokens = []
88
+ await req.user.save()
89
+ res.cookies.set('token', { expires: Date.now() })
90
+
91
+ return true
92
+ }
93
+
94
+ self.getPermission = (user) => {
95
+ let result = {}
96
+ for (let i in user._functions) {
97
+ if (user._functions[i].status === 'Activo') {
98
+ for (let j in user._functions[i]._permissions) {
99
+ if (user._functions[i]._permissions[j].status === 'Activo') {
100
+ result[user._functions[i]._permissions[j].api] = true
101
+ }
102
+ }
103
+ }
104
+ }
105
+ return result
106
+ }
107
+
108
+ self.getMenu = (user) => {
109
+ let result = []
110
+ for (let i in user._functions) {
111
+ if (user._functions[i].status === 'Activo') {
112
+ for (let j in user._functions[i]._menus) {
113
+ if (user._functions[i]._menus[j].status === 'Activo')
114
+
115
+ user._functions[i]._menus[j].submenus = []
116
+ result.push(user._functions[i]._menus[j])
117
+ }
118
+ }
119
+ }
120
+
121
+ let result2 = result.filter((item,index)=>{
122
+ return result.indexOf(item) === index;
123
+ })
124
+
125
+ // Ordena elementos de menú
126
+ result2.sort(function (a, b) {
127
+ if (a.index > b.index) {
128
+ return 1;
129
+ }
130
+ if (a.index < b.index) {
131
+ return -1;
132
+ }
133
+ return 0;
134
+ })
135
+
136
+ let menus = []
137
+ let submenus = []
138
+ for(let i in result2){
139
+ if(!result2[i]._menu){
140
+ result2[i]._menu = []
141
+ menus.push(result2[i])
142
+ }else{
143
+ submenus.push(result2[i])
144
+ }
145
+ }
146
+
147
+ for(let i in submenus){
148
+ for(let j in menus){
149
+
150
+ if(String(submenus[i]._menu._id) === String(menus[j]._id)){
151
+ menus[j].submenus.push(submenus[i])
152
+ }
153
+ }
154
+ }
155
+
156
+ return menus
157
+ }
158
+
159
+ self.me = async (req, res) => {
160
+
161
+ // let user = await User.findOne({ _id: req.user._id }, { "tokens": 0, pwd: 0 }).populate([
162
+ // { path: "_business" },
163
+ // { path: "_functions", populate: [{ path: "_permissions" }, { path: "_menus" }] },
164
+ // ]).lean()
165
+
166
+ const _id = req.user._id
167
+
168
+ // Valida que los modelos existan hantes de hacer una consulta con populate
169
+ if (mongoose.modelNames().includes('Business') && mongoose.modelNames().includes('Client')) {
170
+ user = await User.findOne({ _id }).populate([{ path: "_functions", populate: [{ path: "_permissions" }, { path: "_menus" }] },{ path: "_business" }, { path: "_client" }]).select("-pwd -tokens").lean()
171
+ }else if(mongoose.modelNames().includes('Business')){
172
+ user = await User.findOne({ _id }).populate([{ path: "_functions", populate: [{ path: "_permissions" }, { path: "_menus" }] },{ path: "_business" }]).select("-pwd -tokens").lean()
173
+ }else if(mongoose.modelNames().includes('Client')){
174
+ user = await User.findOne({ _id }).populate([{ path: "_functions", populate: [{ path: "_permissions" }, { path: "_menus" }] }, { path: "_client" }]).select("-pwd -tokens").lean()
175
+ } else{
176
+ user = await User.findOne({ _id }).populate([{ path: "_functions", populate: [{ path: "_permissions" }, { path: "_menus" }] }]).select("-pwd -tokens").lean()
177
+ }
178
+
179
+ // Obtener menús y funciones sin repertir y activas
180
+ user.menus = self.getMenu(user)
181
+ user.permissions = self.getPermission(user)
182
+ for (let i in user._functions) {
183
+ user._functions[i]._permissions = null
184
+ }
185
+
186
+ return user
187
+ }
188
+
189
+ self.resetPass = async (req, res) => {
190
+
191
+ const usuario = await User.findOne({ _id: req.user._id })
192
+
193
+ if (usuario) {
194
+ usuario.pwd = req.body.pwd
195
+ usuario.lastUpdate = new Date().getTime()
196
+ await usuario.save()
197
+
198
+ return "password updated successfully"
199
+ } else {
200
+ throw { code: 409, title: 'Usuario no encontrado.', detail: '', suggestion: 'Verifica que el Usuario exista', error: new Error() }
201
+ }
202
+ }
203
+
204
+ self.updateAny = async (req, res) => {
205
+
206
+ const usuario = await User.findOne({ _id: req.user._id }, { _id: 1 })
207
+ if (usuario) {
208
+ const update = await User.updateOne({ _id: req.user._id }, { $set: req.body, lastUpdate: (new Date()).getTime() })
209
+ return update
210
+ } else {
211
+ throw { code: 409, title: 'Usuario no encontrado.', detail: '', suggestion: 'Vuelve a iniciar sesión', error: new Error() }
212
+ }
213
+ }
214
+
215
+ self.generatecode = async () => {
216
+ let code = ""
217
+ let random = []
218
+
219
+ function getRandomArbitrary(min, max) {
220
+ return Math.floor(Math.random() * (max - min) + min)
221
+ }
222
+ function isReapeat(arr, value) {
223
+ for (let i in arr) {
224
+ if (arr[i].nivel === value) {
225
+ return true
226
+ }
227
+ }
228
+ return false
229
+ }
230
+
231
+ function getRandom() {
232
+ const nivel = getRandomArbitrary(0, 10)
233
+ if (!isReapeat(random, nivel)) {
234
+ random.push({ nivel: nivel })
235
+ }
236
+ if (random.length < 4) {
237
+ getRandom()
238
+ }
239
+ }
240
+
241
+ getRandom()
242
+
243
+ for (let i in random) {
244
+ code += random[i].nivel
245
+ }
246
+
247
+ return code
248
+ }
249
+
250
+ self.sendcodemail = async (email, code) => {
251
+
252
+ const user = await User.findOne({ email: email }, { name: 1, email: 1 })
253
+
254
+ let file = fs.readFileSync(process.env.TEMPLATE_RECOVER_PASSWORD, "utf8")
255
+ file = file.replace('+++user+++', user.name)
256
+ file = file.replace('+++code+++', code)
257
+ await ses.sendCustom(user.email, file, "Código de recuperación de contraseña")
258
+
259
+ return true
260
+ }
261
+
262
+ self.recoverpassword = async (req, res) => {
263
+
264
+ const user = await User.findOne({ email: req.body.email })
265
+ if (!user) {
266
+ throw { code: 409, title: 'Usuario no encontrado.', detail: '', suggestion: 'Verifica que el Usuario exista', error: new Error() }
267
+ }
268
+
269
+ const code = await self.generatecode()
270
+ await self.sendcodemail(user.email, code)
271
+
272
+ user.validateKey.resetPassword.resetCode = code
273
+ let time = new Date()
274
+ const sumarMinutos = new Date(time.getTime() + 5 * 60000)
275
+ user.validateKey.limitCodeTime = (new Date(sumarMinutos)).getTime()
276
+
277
+ await user.save()
278
+
279
+ return true
280
+ }
281
+
282
+ self.verifyCode = async (req, res) => {
283
+
284
+ const correo = req.body.email
285
+ let body = JSON.parse(JSON.stringify(req.body))
286
+ const user = await User.findOne({ email: correo })
287
+ const newTime = new Date().getTime()
288
+
289
+ if (!user) {
290
+ throw { code: 409, title: 'No se pudo validar la información.', detail: '', suggestion: 'Verifica que el usuario exista', error: new Error() }
291
+ }
292
+
293
+ if (user.validateKey.limitCodeTime < newTime) {
294
+ throw { code: 409, title: 'El código ha caducado.', detail: '', suggestion: 'Vuelve a intentarlo', error: new Error() }
295
+ }
296
+
297
+ if (user.validateKey.resetPassword.resetCode == body.resetCode) {
298
+ user.validateKey.resetPassword.validCode = true
299
+ await user.save()
300
+ }
301
+ else {
302
+ throw { code: 409, title: 'Código incorrecto.', detail: '', suggestion: 'El código no coincide verifica el valor', error: new Error() }
303
+ }
304
+
305
+ return true
306
+ }
307
+
308
+
309
+ self.resetPassword = async (req, res) => {
310
+
311
+ let correo = req.body.email
312
+ var body = JSON.parse(JSON.stringify(req.body))
313
+ let usuario = await User.findOne({ email: correo })
314
+
315
+ if (!usuario) {
316
+ throw { code: 409, title: 'Usuario no encontrado.', detail: '', suggestion: 'Verifica que el usuario exista', error: new Error() }
317
+ }
318
+
319
+ const newTime = new Date().getTime()
320
+
321
+ if (usuario.validateKey.limitCodeTime < newTime) {
322
+
323
+ usuario.validateKey.limitCodeTime = null
324
+ usuario.validateKey.resetPassword.resetCode = null
325
+ usuario.validateKey.resetPassword.validCode = false
326
+ await usuario.save()
327
+ throw { code: 409, title: 'El código ha caducado.', detail: '', suggestion: 'Vuelve a intentarlo', error: new Error() }
328
+ }
329
+
330
+ if (usuario.validateKey.resetPassword.validCode == true && usuario.validateKey.resetPassword.resetCode == req.body.resetCode) {
331
+ usuario.pwd = body.pwd
332
+ usuario.validateKey.resetPassword.validCode = false
333
+ usuario.validateKey.resetPassword.resetCode = null
334
+ usuario.validateKey.limitCodeTime = null
335
+ usuario.lastUpdate = new Date().getTime()
336
+ usuario.tokens = []
337
+
338
+ await usuario.save()
339
+
340
+ const token = await usuario.generateAuthToken()
341
+
342
+ res.cookie("token", token, {
343
+ secure: true,
344
+ httpOnly: true,
345
+ sameSite: 'none',
346
+ expires: dayjs().add(30, "days").toDate(),
347
+ })
348
+
349
+ return { token }
350
+ }
351
+ else {
352
+ throw { code: 401, title: 'El código no ha sido verificado', detail: '', suggestion: 'Vuelve a intentarlo', error: new Error() }
353
+ }
354
+ }
355
+
356
+ self.sendverifyToken = async (correo, token) => {
357
+
358
+
359
+ let user = await User.findOne({ email: correo }, { name: 1, email: 1 })
360
+
361
+ let file = fs.readFileSync(process.env.TEMPLATE_VERIFY_EMAIL, "utf8")
362
+ file = file.replace('+++user+++', user.name)
363
+ file = file.replace('+++token+++', token)
364
+
365
+ await ses.sendCustom(user.email, file, "Verifica tu cuenta de " + process.env.PROJECT_NAME)
366
+ return true
367
+ }
368
+
369
+ self.sendVerifyMailAccountJob = async (data, ban) => {
370
+ // Generating recover pwd code and sending to user email address
371
+ let user
372
+ if (ban == true) {
373
+ user = await User.findOne({ email: data.body.email }).lean()
374
+ } else {
375
+ user = await User.findOne({ email: data }).lean()
376
+ }
377
+
378
+ const token = jwt.sign({ _id: user._id }, process.env.AUTH_SECRET)
379
+
380
+ await User.updateOne({ _id: user._id }, { 'validateKey.validateEmail.verifyMailToken': token, 'validateKey.validateEmail.emailVerified': false })
381
+ await self.sendverifyToken(user.email, token)
382
+
383
+ return true
384
+ }
385
+
386
+ self.sendValidateEmail = async (email) => {
387
+ let user = await User.findOne({ email: email }, { name: 1, email: 1 })
388
+
389
+ let file = fs.readFileSync(process.env.TEMPLATE_WELCOME, "utf8")
390
+ file = file.replace('+++user+++', user.name)
391
+
392
+ return await sesSDK.sendCustom(user.email, file, 'Bienvenido a ' + process.env.PROJECT_NAME)
393
+ }
394
+
395
+ self.verifyMailTokenAccount = async (req, res) => {
396
+
397
+ let token = req.params.token
398
+ const data = jwt.verify(token, process.env.AUTH_SECRET)
399
+
400
+ let user = await User.findOne({ _id: data._id, 'validateKey.validateEmail.verifyMailToken': token })
401
+
402
+ if (!user) {
403
+ throw { code: 409, title: 'Usuario no encontrado.', detail: '', suggestion: 'Verifica que el usuario exista', error: new Error() }
404
+ } else {
405
+ user.validateKey.validateEmail.verifyMailToken = null
406
+ user.validateKey.validateEmail.emailVerified = true
407
+ user.save()
408
+ }
409
+
410
+ if (user.validateKey.validateEmail.emailVerified == true) {
411
+ await self.sendValidateEmail(user.email)
412
+ }
413
+
414
+ return 'Usuario verificado con éxito'
415
+ }
416
+
417
+ self.updatePicture = async (req, res) => {
418
+
419
+ let user = await User.findOne({ _id: req.user._id })
420
+ if (!user) {
421
+ throw { code: 409, title: 'Usuario no encontrado.', detail: '', suggestion: 'Verifica que el usuario exista', error: new Error() }
422
+ }
423
+
424
+ const url = await s3.upload('user/urlImg-' + user._id, req.files.urlImg)
425
+ await User.updateOne({ _id: user._id }, { urlImg: url, lastUpdate: (new Date()).getTime() })
426
+ const result = await User.findOne({ _id: user._id })
427
+
428
+ return result
429
+ }
430
+
431
+ self.verifyPhone = async (req, res) => {
432
+
433
+ const user = await User.findOne({ phone: req.user.phone })
434
+ if (!user) {
435
+ throw { code: 409, title: 'Usuario no encontrado.', detail: '', suggestion: 'Verifica que el usuario exista', error: new Error() }
436
+ }
437
+
438
+ const code = await self.generatecode()
439
+ const Message = "Tu código de "+process.env.PROJECT_NAME +" es: "+code+". No lo compartas con nadie. "+process.env.PROJECT_URL
440
+ await User.updateOne({ _id: user._id }, { 'validateKey.validatePhone.codeVerifyPhone': code, 'validateKey.validatePhone.validCodePhone': false })
441
+ await sns.sendMessagePhone(req.user.phone, Message)
442
+
443
+ user.validateKey.validatePhone.codeVerifyPhone = code
444
+ let time = new Date()
445
+ const sumarMinutos = new Date(time.getTime() + 10 * 60000)
446
+ user.limitCodeTime = (new Date(sumarMinutos)).getTime()
447
+ await user.save()
448
+
449
+ return true
450
+ }
451
+
452
+ self.validatePhone = async (req, res) => {
453
+
454
+ let body = JSON.parse(JSON.stringify(req.body))
455
+ const user = await User.findOne({ phone: req.user.phone })
456
+ const newTime = new Date().getTime()
457
+
458
+ if (!user) {
459
+ throw { code: 409, title: 'Usuario no encontrado.', detail: '', suggestion: 'Verifica que el usuario exista', error: new Error() }
460
+ }
461
+
462
+ if (user.limitCodeTime < newTime){
463
+ throw { code: 409, title: 'El código ha caducado.', detail: '', suggestion: 'Verifica que el código sea correcto', error: new Error() }
464
+ }
465
+
466
+ if (user.validateKey.validatePhone.codeVerifyPhone == body.codeVerifyPhone) {
467
+ user.validateKey.validatePhone.codeVerifyPhone = null
468
+ user.limitCodeTime = null
469
+ user.validateKey.validatePhone.validCodePhone = true
470
+
471
+ await user.save()
472
+ }
473
+ else{
474
+ throw { code: 409, title: 'Código incorrecto.', detail: '', suggestion: 'Verifica el código', error: new Error() }
475
+ }
476
+
477
+ return "Teléfono Verificado"
478
+ }
479
+
480
+ self.createCustomer = async (req, res) => {
481
+ let user
482
+ user = await User.findOne({ email: req.body.email }).lean()
483
+ if (user) {
484
+ throw {
485
+ code: 404,
486
+ title: 'Upss!',
487
+ detail: '',
488
+ suggestion: 'El correo ya se encuentra resgitrado',
489
+ error: new Error()
490
+ }
491
+ }
492
+ user = new User(req.body)
493
+ user.createdAt = (new Date()).getTime()
494
+ user.status = 'Activo'
495
+ let fun = await Function.findOne({ name: 'Customer' })
496
+ user._functions.push(fun._id)
497
+ delete user.pwd
498
+ let newCustomer = await user.save()
499
+ const token = await newCustomer.generateAuthToken()
500
+ return token
501
501
  }