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