aloux-iam 0.0.143 → 0.0.145

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,6 @@
1
1
  const Log = require("../models/Log");
2
2
  const Label = require("../models/Label");
3
+ const Functions = require("../models/Functions");
3
4
  const mongoose = require("mongoose");
4
5
  const self = module.exports;
5
6
 
@@ -9,7 +10,8 @@ self.create = async (req, res) => {
9
10
  req.header("Company") !== "undefined" ? req.header("Company") : null;
10
11
 
11
12
  const log = new Log(req.body);
12
- const businessId = req.header("business") !== "undefined" ? req.header("business") : null;
13
+ const businessId =
14
+ req.header("business") !== "undefined" ? req.header("business") : null;
13
15
  log.createdAt = new Date().getTime();
14
16
  log._user = req.user._id;
15
17
  log._company = companyId;
@@ -56,6 +58,14 @@ self.retrieve = async (req, res) => {
56
58
  const companyId =
57
59
  req.header("Company") !== "undefined" ? req.header("Company") : null;
58
60
 
61
+ const excludeFunctions = req.body.excludeFunctions || [];
62
+
63
+ const excludeFuncs = await Functions.find({
64
+ name: { $in: excludeFunctions },
65
+ }).lean();
66
+
67
+ const excludeIds = excludeFuncs.map((f) => f._id);
68
+
59
69
  const query = { _company: companyId };
60
70
 
61
71
  if (req.body.users?.length) {
@@ -74,18 +84,29 @@ self.retrieve = async (req, res) => {
74
84
  query._business = { $in: req.body.business };
75
85
  }
76
86
 
77
- const consulta = await Log.find(query).populate("_user", "name lastName email");
87
+ const consulta = await Log.find(query).populate({
88
+ path: "_user",
89
+ select: "name lastName email _functions",
90
+ match: excludeIds.length ? { _functions: { $nin: excludeIds } } : {},
91
+ });
92
+
93
+ const filtrados = consulta.filter((log) => log._user !== null);
78
94
 
79
95
  const response = {
80
- dataset0: { field: "Visualizaciones totales", count: consulta.length },
81
- dataset1: processDataset1(consulta),
82
- dataset2: processDataset2(consulta),
83
- dataset3: processDataset3(consulta),
84
- dataset4: processDataset4(consulta),
85
- dataset5: processDataset5(consulta),
86
- dataset6: processDataset6(consulta),
87
- dataset7: processDataset7(consulta),
88
- dataset8: processDataset8(consulta, req.body.search, req.body.page, req.body.limit),
96
+ dataset0: { field: "Visualizaciones totales", count: filtrados.length },
97
+ dataset1: processDataset1(filtrados),
98
+ dataset2: processDataset2(filtrados),
99
+ dataset3: processDataset3(filtrados),
100
+ dataset4: processDataset4(filtrados),
101
+ dataset5: processDataset5(filtrados),
102
+ dataset6: processDataset6(filtrados),
103
+ dataset7: processDataset7(filtrados),
104
+ dataset8: processDataset8(
105
+ filtrados,
106
+ req.body.search,
107
+ req.body.page,
108
+ req.body.limit,
109
+ ),
89
110
  };
90
111
 
91
112
  res.status(200).send(response);
@@ -98,8 +119,18 @@ self.retrieve = async (req, res) => {
98
119
  function formatDate(isoDate) {
99
120
  const [year, month, day] = isoDate.split("-");
100
121
  const monthNames = [
101
- "Ene", "Feb", "Mar", "Abr", "May", "Jun",
102
- "Jul", "Ago", "Sep", "Oct", "Nov", "Dic",
122
+ "Ene",
123
+ "Feb",
124
+ "Mar",
125
+ "Abr",
126
+ "May",
127
+ "Jun",
128
+ "Jul",
129
+ "Ago",
130
+ "Sep",
131
+ "Oct",
132
+ "Nov",
133
+ "Dic",
103
134
  ];
104
135
  return `${day} ${monthNames[parseInt(month) - 1]} ${year}`;
105
136
  }
@@ -176,12 +207,12 @@ function processDataset5(consulta) {
176
207
  });
177
208
 
178
209
  const uniqueLabels = new Set(
179
- Object.values(labelCountsByDate).flatMap(Object.keys)
210
+ Object.values(labelCountsByDate).flatMap(Object.keys),
180
211
  );
181
212
  const series = Array.from(uniqueLabels).map((label) => ({
182
213
  name: label,
183
214
  data: Array.from(categories).map(
184
- (date) => labelCountsByDate[date]?.[label] || 0
215
+ (date) => labelCountsByDate[date]?.[label] || 0,
185
216
  ),
186
217
  }));
187
218
 
@@ -230,7 +261,7 @@ function processDataset7(data) {
230
261
  };
231
262
  }
232
263
 
233
- function processDataset8(data, search = "", page = 1, limit = 10) {
264
+ function processDataset8(data, search = "", page = 1, limit = null) {
234
265
  const userActivity = {};
235
266
 
236
267
  data.forEach((item) => {
@@ -249,24 +280,32 @@ function processDataset8(data, search = "", page = 1, limit = 10) {
249
280
  let users = Object.values(userActivity).sort((a, b) => b.count - a.count);
250
281
 
251
282
  if (search) {
252
- const s = search.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "");
283
+ const s = search
284
+ .toLowerCase()
285
+ .normalize("NFD")
286
+ .replace(/[\u0300-\u036f]/g, "");
253
287
  users = users.filter((u) => {
254
- const full = `${u.name} ${u.lastName} ${u.email}`.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "");
288
+ const full = `${u.name} ${u.lastName} ${u.email}`
289
+ .toLowerCase()
290
+ .normalize("NFD")
291
+ .replace(/[\u0300-\u036f]/g, "");
255
292
  return full.includes(s);
256
293
  });
257
294
  }
258
295
 
259
296
  const total = users.length;
260
- const totalPages = Math.ceil(total / limit);
261
- const start = (page - 1) * limit;
262
- const items = users.slice(start, start + limit);
297
+ const paginate = limit !== null && limit !== undefined;
298
+ const parsedLimit = paginate ? parseInt(limit) : total;
299
+ const parsedPage = parseInt(page);
300
+ const start = (parsedPage - 1) * parsedLimit;
301
+ const items = paginate ? users.slice(start, start + parsedLimit) : users;
263
302
 
264
303
  return {
265
304
  field: "Actividad de usuarios",
266
305
  total,
267
- page,
268
- limit,
269
- totalPages,
306
+ page: parsedPage,
307
+ limit: parsedLimit,
308
+ totalPages: paginate ? Math.ceil(total / parsedLimit) : 1,
270
309
  items,
271
310
  };
272
311
  }
@@ -301,4 +340,4 @@ self.count = async (req, res) => {
301
340
  } catch (error) {
302
341
  res.status(400).send({ error: error.message });
303
342
  }
304
- };
343
+ };
package/lib/middleware.js CHANGED
@@ -4,15 +4,13 @@ const Permission = require("./models/Permission");
4
4
  const historyController = require("./controllers/history");
5
5
 
6
6
  const getAccess = (user, resource) => {
7
- // Cuenta de servicio
7
+ // Cuenta de servicio: verifica acceso por api asignada
8
8
  const userApis = user?.data?.apis || [];
9
- if (userApis.length > 0) {
10
- return userApis.some(
11
- (apiId) => apiId.toString() === resource._id.toString(),
12
- );
9
+ if (userApis.some((apiId) => apiId.toString() === resource._id.toString())) {
10
+ return true;
13
11
  }
14
12
 
15
- // Flujo normal
13
+ // Flujo normal: verifica permisos por función/rol
16
14
  for (let i in user._functions) {
17
15
  for (let j in user._functions[i]._permissions) {
18
16
  if (user._functions[i]._permissions[j].status === "Activo") {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aloux-iam",
3
- "version": "0.0.143",
3
+ "version": "0.0.145",
4
4
  "description": "Aloux IAM for APIs ",
5
5
  "main": "index.js",
6
6
  "scripts": {