aloux-iam 0.0.116 → 0.0.117

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,82 @@
1
+ const Label = require("../models/Label");
2
+ const self = module.exports;
3
+
4
+ self.create = async (req, res) => {
5
+ try {
6
+ const label = new Label(req.body);
7
+ label.createdAt = new Date().getTime();
8
+ label.status = "Activo";
9
+ await label.save();
10
+ res.status(201).send(label);
11
+ } catch (error) {
12
+ res.status(400).send({ error: error.message });
13
+ }
14
+ };
15
+
16
+ self.update = async (req, resp) => {
17
+ try {
18
+ await new Label(req.body).validate();
19
+ const _id = req.params.LABEL_ID;
20
+ const count = await Label.findOne({ _id }).countDocuments();
21
+ if (!count) throw new Error("Upss! No se encontró el registro");
22
+ req.body.lastUpdate = new Date().getTime();
23
+ const result = await Label.updateOne({ _id }, req.body);
24
+ resp.status(200).send(req.body);
25
+ } catch (error) {
26
+ resp.status(400).send({ error: error.message });
27
+ }
28
+ };
29
+ self.status = async (req, resp) => {
30
+ try {
31
+ const _id = req.params.LABEL_ID;
32
+ const user = await Label.findOne({ _id });
33
+ if (!user) throw new Error("Upss! No se encontró el Elemento");
34
+ user.status = req.body.status;
35
+ user.lastUpdate = new Date().getTime();
36
+ const result = await user.save();
37
+ resp.status(200).send(result);
38
+ } catch (error) {
39
+ resp.status(400).send({ error: error.message });
40
+ }
41
+ };
42
+ self.retrieve = async (req, res) => {
43
+ try {
44
+ const consulta = await Label.find({}).sort({ index: 1 });
45
+ if (!consulta) res.status(404).send();
46
+ res.status(200).send(consulta);
47
+ } catch (error) {
48
+ res.status(400).send(error);
49
+ }
50
+ };
51
+
52
+ self.get = async (req, res) => {
53
+ try {
54
+ const _id = req.params.LABEL_ID;
55
+ const label = await Label.findOne({ _id });
56
+ if (!label) res.status(404).send();
57
+ res.status(200).send(label);
58
+ } catch (error) {
59
+ res.status(400).send(error);
60
+ }
61
+ };
62
+
63
+ self.delete = async (req, res) => {
64
+ try {
65
+ const _id = req.params.LABEL_ID;
66
+ const response = await Label.deleteOne({ _id });
67
+ if (!response.deletedCount)
68
+ res.status(404).send({ error: "El registro no existe" });
69
+ else res.status(200).send({});
70
+ } catch (error) {
71
+ res.status(400).send({ error: error.message });
72
+ }
73
+ };
74
+
75
+ self.count = async (req, res) => {
76
+ try {
77
+ let result = await Label.find({}).countDocuments();
78
+ res.status(200).send({ count: result });
79
+ } catch (error) {
80
+ res.status(400).send({ error: error.message });
81
+ }
82
+ };
@@ -0,0 +1,268 @@
1
+ const Log = require("../models/Log");
2
+ const Label = require("../models/Label");
3
+ const self = module.exports;
4
+
5
+ self.create = async (req, res) => {
6
+ try {
7
+ const log = new Log(req.body);
8
+ log.createdAt = new Date().getTime();
9
+ log._user = req.user._id;
10
+ const label = await Label.findOne(
11
+ { label: req.body.label },
12
+ { _id: 1 }
13
+ ).lean();
14
+ if (label) {
15
+ log._label = label._id;
16
+ await log.save();
17
+ }
18
+
19
+ res.status(201).send(log);
20
+ } catch (error) {
21
+ res.status(400).send({ error: error.message });
22
+ }
23
+ };
24
+
25
+ self.update = async (req, resp) => {
26
+ try {
27
+ await new Log(req.body).validate();
28
+ const _id = req.params.LOG_ID;
29
+ const count = await Log.findOne({ _id }).countDocuments();
30
+ if (!count) throw new Error("Upss! No se encontró el registro");
31
+ req.body.lastUpdate = new Date().getTime();
32
+ const result = await Log.updateOne({ _id }, req.body);
33
+ resp.status(200).send(req.body);
34
+ } catch (error) {
35
+ resp.status(400).send({ error: error.message });
36
+ }
37
+ };
38
+ self.status = async (req, resp) => {
39
+ try {
40
+ const _id = req.params.LOG_ID;
41
+ const user = await Log.findOne({ _id });
42
+ if (!user) throw new Error("Upss! No se encontró el Elemento");
43
+ user.status = req.body.status;
44
+ user.lastUpdate = new Date().getTime();
45
+ const result = await user.save();
46
+ resp.status(200).send(result);
47
+ } catch (error) {
48
+ resp.status(400).send({ error: error.message });
49
+ }
50
+ };
51
+ self.retrieve = async (req, res) => {
52
+ try {
53
+ let query = {};
54
+
55
+ if (req.body.users.length) {
56
+ query = {
57
+ _user: { $in: req.body.users },
58
+ };
59
+ }
60
+
61
+ const consulta = await Log.find(query)
62
+ .populate([
63
+ { path: "_label" },
64
+ { path: "_user", select: { name: 1, lastName: 1 } },
65
+ ])
66
+ .sort({ createdAt: 1 })
67
+ .lean();
68
+
69
+ const response = {
70
+ dataset0: { field: "Total de operaciones", count: consulta.length },
71
+ dataset1: consulta,
72
+ dataset2: processDataset2(consulta),
73
+ dataset3: processDataset3(consulta),
74
+ dataset4: processDataset4(consulta),
75
+ dataset5: processDataset5(consulta),
76
+ dataset6: processDataset6(consulta),
77
+ dataset7: processDataset7(consulta),
78
+ };
79
+
80
+ res.status(200).send(response);
81
+ } catch (error) {
82
+ console.error(error);
83
+ res.status(400).send(error);
84
+ }
85
+ };
86
+
87
+ function formatDate(date) {
88
+ const day = String(date.getDate()).padStart(2, "0");
89
+ const monthNames = [
90
+ "Ene",
91
+ "Feb",
92
+ "Mar",
93
+ "Abr",
94
+ "May",
95
+ "Jun",
96
+ "Jul",
97
+ "Ago",
98
+ "Sep",
99
+ "Oct",
100
+ "Nov",
101
+ "Dic",
102
+ ];
103
+ const month = monthNames[date.getMonth()];
104
+ const year = date.getFullYear();
105
+ return `${day} ${month} ${year}`;
106
+ }
107
+
108
+ function processDataset2(consulta) {
109
+ const labelCounts = consulta.reduce((acc, item) => {
110
+ const label = item._label.label;
111
+ acc[label] = (acc[label] || 0) + 1;
112
+ return acc;
113
+ }, {});
114
+
115
+ return {
116
+ field: "Distribución de acciones",
117
+ counts: Object.values(labelCounts),
118
+ operations: Object.keys(labelCounts),
119
+ };
120
+ }
121
+
122
+ function processDataset3(consulta) {
123
+ const labelCounts = consulta.reduce((acc, item) => {
124
+ const label = item._label.label;
125
+ acc[label] = (acc[label] || 0) + 1;
126
+ return acc;
127
+ }, {});
128
+
129
+ return {
130
+ field: "Distribución de acciones",
131
+ items: Object.keys(labelCounts).map((label) => ({
132
+ addGroup: label,
133
+ totalResponse: labelCounts[label],
134
+ })),
135
+ };
136
+ }
137
+
138
+ function processDataset4(consulta) {
139
+ const dateCounts = consulta.reduce((acc, item) => {
140
+ const date = formatDate(new Date(item.createdAt));
141
+ acc[date] = (acc[date] || 0) + 1;
142
+ return acc;
143
+ }, {});
144
+
145
+ return {
146
+ field: "Actividad en la plataforma",
147
+ counts: Object.values(dateCounts),
148
+ actionsName: Object.keys(dateCounts),
149
+ };
150
+ }
151
+
152
+ function processDataset5(consulta) {
153
+ const labelCountsByDate = {};
154
+ const categories = new Set();
155
+
156
+ consulta.forEach((item) => {
157
+ const date = formatDate(new Date(item.createdAt));
158
+ const label = item._label.label;
159
+ categories.add(date);
160
+
161
+ if (!labelCountsByDate[date]) {
162
+ labelCountsByDate[date] = {};
163
+ }
164
+ labelCountsByDate[date][label] = (labelCountsByDate[date][label] || 0) + 1;
165
+ });
166
+
167
+ const uniqueLabels = new Set(
168
+ Object.values(labelCountsByDate).flatMap(Object.keys)
169
+ );
170
+ const series = Array.from(uniqueLabels).map((label) => ({
171
+ name: label,
172
+ data: Array.from(categories).map(
173
+ (date) => labelCountsByDate[date]?.[label] || 0
174
+ ),
175
+ }));
176
+
177
+ return {
178
+ field: "Actividad en la plataforma por operación",
179
+ categories: Array.from(categories),
180
+ series: series,
181
+ };
182
+ }
183
+
184
+ function processDataset6(data) {
185
+ const userActivity = {};
186
+
187
+ // Count activity per user. Assuming data contains _user with name and lastName
188
+ data.forEach((item) => {
189
+ const fullName = `${item._user.name} ${item._user.lastName}`;
190
+ userActivity[fullName] = (userActivity[fullName] || 0) + 1;
191
+ });
192
+
193
+ // Sort users by activity count in descending order
194
+ const sortedUsers = Object.entries(userActivity).sort(
195
+ ([, countA], [, countB]) => countB - countA
196
+ );
197
+
198
+ // Extract top 10 users
199
+ const topUsers = sortedUsers.slice(0, 10);
200
+
201
+ // Build the result object
202
+ const result = {
203
+ counts: topUsers.map(([, count]) => count),
204
+ actionsName: topUsers.map(([fullName]) => fullName.split(" ")),
205
+ field: "Usuarios con mas actividad en la plataforma",
206
+ };
207
+
208
+ return result;
209
+ }
210
+
211
+ function processDataset7(data) {
212
+ const userActivity = {};
213
+
214
+ // Count activity per user. Assuming data contains _user with name and lastName
215
+ data.forEach((item) => {
216
+ const fullName = `${item._user.name} ${item._user.lastName}`;
217
+ userActivity[fullName] = (userActivity[fullName] || 0) + 1;
218
+ });
219
+
220
+ // Sort users by activity count in ascending order
221
+ const sortedUsers = Object.entries(userActivity).sort(
222
+ ([, countA], [, countB]) => countA - countB
223
+ );
224
+
225
+ // Extract top 10 least active users
226
+ const leastActiveUsers = sortedUsers.slice(0, 10);
227
+
228
+ // Build the result object
229
+ const result = {
230
+ counts: leastActiveUsers.map(([, count]) => count),
231
+ actionsName: leastActiveUsers.map(([fullName]) => fullName.split(" ")),
232
+ field: "Usuarios con menos actividad en la plataforma",
233
+ };
234
+
235
+ return result;
236
+ }
237
+
238
+ self.get = async (req, res) => {
239
+ try {
240
+ const _id = req.params.LOG_ID;
241
+ const log = await Log.findOne({ _id });
242
+ if (!log) res.status(404).send();
243
+ res.status(200).send(log);
244
+ } catch (error) {
245
+ res.status(400).send(error);
246
+ }
247
+ };
248
+
249
+ self.delete = async (req, res) => {
250
+ try {
251
+ const _id = req.params.LOG_ID;
252
+ const response = await Log.deleteOne({ _id });
253
+ if (!response.deletedCount)
254
+ res.status(404).send({ error: "El registro no existe" });
255
+ else res.status(200).send({});
256
+ } catch (error) {
257
+ res.status(400).send({ error: error.message });
258
+ }
259
+ };
260
+
261
+ self.count = async (req, res) => {
262
+ try {
263
+ let result = await Log.find({}).countDocuments();
264
+ res.status(200).send({ count: result });
265
+ } catch (error) {
266
+ res.status(400).send({ error: error.message });
267
+ }
268
+ };
@@ -8,6 +8,7 @@ const serviceUser = require("../services/user");
8
8
  const utils = require("../config/utils");
9
9
  const mongoose = require("mongoose");
10
10
  const AWS_SES = require("../services/ses");
11
+ const Business = require("../models/Business");
11
12
  const self = module.exports;
12
13
 
13
14
  self.create = async (req, res) => {
@@ -20,10 +21,14 @@ self.create = async (req, res) => {
20
21
  file = file.replace("{{user}}", user.name);
21
22
  file = file.replace("{{email}}", req.body.email);
22
23
  file = file.replace("{{password}}", req.body.pwd);
23
- if(process.env.URL_EMAIL){
24
+ if (process.env.URL_EMAIL) {
24
25
  file = file.replace("{{urlToken}}", process.env.URL_EMAIL);
25
26
  }
26
- await AWS_SES.sendCustom(user.email, file, process.env.SUBJECT_EMAIL || "bienvenido");
27
+ await AWS_SES.sendCustom(
28
+ user.email,
29
+ file,
30
+ process.env.SUBJECT_EMAIL || "bienvenido"
31
+ );
27
32
  }
28
33
 
29
34
  res.status(201).send(user);
@@ -140,6 +145,33 @@ self.retrieve = async (req, res) => {
140
145
  }
141
146
  };
142
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
+
143
175
  self.delete = async (req, res) => {
144
176
  try {
145
177
  const _id = req.params.USER_ID;
@@ -0,0 +1,13 @@
1
+ const mongoose = require("mongoose");
2
+
3
+ const menuSchema = mongoose.Schema({
4
+ label: { type: String, required: true, trim: true },
5
+ description: { type: String, required: false, trim: true },
6
+
7
+ status: { type: String, required: true, enum: ["Activo", "Inactivo"] },
8
+ createdAt: { type: Number },
9
+ lastUpdate: { type: Number },
10
+ });
11
+
12
+ const Menu = mongoose.model("Label", menuSchema);
13
+ module.exports = Menu;
@@ -0,0 +1,11 @@
1
+ const mongoose = require("mongoose");
2
+ const ObjectId = mongoose.Schema.Types.ObjectId;
3
+
4
+ const menuSchema = mongoose.Schema({
5
+ _label: { type: ObjectId, required: true, ref: "Label" },
6
+ _user: { type: ObjectId, required: true, ref: "User" },
7
+ createdAt: { type: Number },
8
+ });
9
+
10
+ const Menu = mongoose.model("Log", menuSchema);
11
+ module.exports = Menu;
package/lib/router.js CHANGED
@@ -7,6 +7,9 @@ const user = require("./controllers/user");
7
7
  const menu = require("./controllers/menu");
8
8
  const permission = require("./controllers/permission");
9
9
  const functions = require("./controllers/functions");
10
+ const label = require("./controllers/label");
11
+ const log = require("./controllers/log");
12
+
10
13
  const history = require("./controllers/history.js");
11
14
 
12
15
  // User / user self (no auth)
@@ -33,6 +36,7 @@ router.post("/iam/auth/validate/mail", middleware, auth.validatEmailChange);
33
36
  // IAM / User
34
37
  router.post("/iam/user", middleware, user.create);
35
38
  router.get("/iam/user", middleware, user.retrieve);
39
+ router.get("/iam/business/user", middleware, user.retrieveByBusiness);
36
40
  router.get("/iam/user/:USER_ID", middleware, user.get);
37
41
  router.patch("/iam/user/:USER_ID", middleware, user.update);
38
42
  router.put("/iam/user/:USER_ID/status", middleware, user.status);
@@ -79,4 +83,22 @@ router.get("/iam/history/:HISTORY_ID", middleware, history.detail);
79
83
  // Utilities
80
84
  router.patch("/iam/add/time/:TOKEN", user.addTimeToken);
81
85
 
86
+ // IAM / Label
87
+ router.post("/iam/label", middleware, label.create);
88
+ router.patch("/iam/label/:LABEL_ID", middleware, label.update);
89
+ router.put("/iam/label/:LABEL_ID/status", middleware, label.status);
90
+ router.get("/iam/label", middleware, label.retrieve);
91
+ router.get("/iam/label/:LABEL_ID", middleware, label.get);
92
+ router.delete("/iam/label/:LABEL_ID", middleware, label.delete);
93
+ router.get("/iam/label/count/all", middleware, label.count);
94
+
95
+ // IAM / Log
96
+ router.post("/iam/log", middleware, log.create);
97
+ router.patch("/iam/log/:LOG_ID", middleware, log.update);
98
+ router.put("/iam/log/:LOG_ID/status", middleware, log.status);
99
+ router.post("/iam/log/retrieve", middleware, log.retrieve);
100
+ router.get("/iam/log/:LOG_ID", middleware, log.get);
101
+ router.delete("/iam/log/:LOG_ID", middleware, log.delete);
102
+ router.get("/iam/log/count/all", middleware, log.count);
103
+
82
104
  module.exports = router;
@@ -574,15 +574,17 @@ self.resetPassword = async (req, res) => {
574
574
  var body = JSON.parse(JSON.stringify(req.body));
575
575
  let usuario = await User.findOne({ email: correo });
576
576
 
577
- if (!usuario || !usuario?.data?.changePwd) {
578
- //evaluar si se queda
579
- throw {
580
- code: 409,
581
- title: "Usuario no encontrado.",
582
- detail: "",
583
- suggestion: "Verifica que el usuario exista",
584
- error: new Error(),
585
- };
577
+ if (process.env.CHANGE_PWD === "true") {
578
+ if (!usuario || !usuario?.data?.changePwd) {
579
+ //evaluar si se queda
580
+ throw {
581
+ code: 409,
582
+ title: "Usuario no encontrado.",
583
+ detail: "",
584
+ suggestion: "Verifica que el usuario exista",
585
+ error: new Error(),
586
+ };
587
+ }
586
588
  }
587
589
 
588
590
  const newTime = new Date().getTime();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aloux-iam",
3
- "version": "0.0.116",
3
+ "version": "0.0.117",
4
4
  "description": "Aloux IAM for APIs ",
5
5
  "main": "index.js",
6
6
  "scripts": {