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.
- package/.gitattributes +2 -2
- package/CONTRIBUTING.md +1 -1
- package/LICENSE +21 -21
- package/README.md +273 -137
- package/index.js +33 -33
- package/lib/auth.js +90 -90
- package/lib/config/utils.js +13 -13
- package/lib/controllers/auth.js +147 -147
- package/lib/controllers/functions.js +86 -86
- package/lib/controllers/menu.js +101 -101
- package/lib/controllers/operationsAWS.js +218 -218
- package/lib/controllers/permission.js +90 -90
- package/lib/controllers/user.js +746 -746
- package/lib/middleware.js +90 -90
- package/lib/models/Functions.js +13 -13
- package/lib/models/Menu.js +15 -15
- package/lib/models/Permission.js +14 -14
- package/lib/models/User.js +104 -103
- package/lib/router.js +72 -72
- package/lib/services/auth.js +500 -500
- package/lib/services/s3.js +71 -71
- package/lib/services/ses.js +97 -97
- package/lib/services/sns.js +21 -21
- package/lib/services/user.js +98 -98
- package/lib/swagger.yaml +1176 -1176
- package/package.json +38 -38
package/lib/services/auth.js
CHANGED
|
@@ -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
|
}
|