aloux-iam 0.0.146 → 0.0.148

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,22 +1,17 @@
1
1
  const fs = require("fs");
2
2
  const self = module.exports;
3
3
 
4
- self.responseError = (res, error, defaultCode, defaultTitle, defaultSuggestion) => {
5
- let code, title, detail, suggestion;
6
-
7
- if (error && typeof error.code === "number") {
8
- code = error.code;
9
- title = error.title || "Error";
10
- detail = typeof error.detail === "string" ? error.detail : "";
11
- suggestion = error.suggestion || "Revisa el detalle";
12
- } else {
13
- code = defaultCode || 400;
14
- title = defaultTitle || "Error";
15
- detail = error?.message || "";
16
- suggestion = defaultSuggestion || "Revisa el detalle";
4
+ self.responseError = async (res, error) => {
5
+ let obj = error;
6
+ if (!error.code) {
7
+ obj = {
8
+ code: 400,
9
+ title: "Error",
10
+ detail: error.message,
11
+ suggestion: "Revisar el detalle",
12
+ };
17
13
  }
18
-
19
- res.status(code).send({ code, title, detail, suggestion });
14
+ res.status(obj.code).send(obj);
20
15
  };
21
16
 
22
17
  self.generatePaginationResponse = async (count, page, itemsPerPage, items) => {
@@ -74,31 +69,6 @@ self.brand = {
74
69
  },
75
70
  };
76
71
 
77
- self.escapeRegex = (str) => {
78
- if (typeof str !== 'string') return '';
79
- return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
80
- };
81
-
82
- self.hashToken = (token) => {
83
- const crypto = require('crypto');
84
- return crypto.createHash('sha256').update(String(token)).digest('hex');
85
- };
86
-
87
- self.hashCode = (code) => {
88
- const crypto = require('crypto');
89
- return crypto.createHash('sha256').update(String(code)).digest('hex');
90
- };
91
-
92
- self.sanitizeSort = (sort, allowedFields) => {
93
- if (!sort || typeof sort !== 'object' || Array.isArray(sort)) return null;
94
- const safe = {};
95
- for (const [key, val] of Object.entries(sort)) {
96
- const n = Number(val);
97
- if (allowedFields.includes(key) && (n === 1 || n === -1)) safe[key] = n;
98
- }
99
- return Object.keys(safe).length > 0 ? safe : null;
100
- };
101
-
102
72
  // Gkey
103
73
  self.resolveGkey = (business) => {
104
74
  const businessGkey = business.gkey || null;
@@ -3,33 +3,7 @@ const utils = require("../config/utils");
3
3
 
4
4
  const self = module.exports;
5
5
 
6
- const _rateLimitStore = new Map();
7
- const _checkRateLimit = (req, res) => {
8
- const maxAttempts = parseInt(process.env.FAILED_ATTEMPS) || 5;
9
- const windowMs = 15 * 60 * 1000;
10
- const key = req.ip || req.connection.remoteAddress;
11
- const now = Date.now();
12
- const record = _rateLimitStore.get(key) || { count: 0, resetAt: now + windowMs };
13
- if (now > record.resetAt) {
14
- record.count = 0;
15
- record.resetAt = now + windowMs;
16
- }
17
- record.count++;
18
- _rateLimitStore.set(key, record);
19
- if (record.count > maxAttempts) {
20
- res.status(429).send({
21
- code: 429,
22
- title: 'Demasiados intentos',
23
- detail: 'Has superado el límite de intentos permitidos.',
24
- suggestion: 'Espera unos minutos antes de intentarlo nuevamente.'
25
- });
26
- return false;
27
- }
28
- return true;
29
- };
30
-
31
6
  self.email = async (req, res) => {
32
- if (!_checkRateLimit(req, res)) return;
33
7
  try {
34
8
  const response = await Auth.searchEmail(req.body.email, req.body.code);
35
9
  res.status(response.statusCode).send({
@@ -44,7 +18,6 @@ self.email = async (req, res) => {
44
18
  };
45
19
 
46
20
  self.login = async (req, res) => {
47
- if (!_checkRateLimit(req, res)) return;
48
21
  try {
49
22
  const response = await Auth.login(req.body, res);
50
23
  res.status(200).send(response);
@@ -73,7 +46,7 @@ self.logout = async (req, res) => {
73
46
 
74
47
  self.logoutAll = async (req, res) => {
75
48
  try {
76
- await Auth.logoutAll(req, res);
49
+ await Auth.logoutAll(req.body);
77
50
  res.status(200).send();
78
51
  } catch (error) {
79
52
  await utils.responseError(res, error);
@@ -108,7 +81,6 @@ self.updateAny = async (req, res) => {
108
81
  };
109
82
 
110
83
  self.recoverpassword = async (req, res) => {
111
- if (!_checkRateLimit(req, res)) return;
112
84
  try {
113
85
  await Auth.recoverpassword(req, res);
114
86
  res.status(200).send();
@@ -118,7 +90,6 @@ self.recoverpassword = async (req, res) => {
118
90
  };
119
91
 
120
92
  self.verifyCode = async (req, res) => {
121
- if (!_checkRateLimit(req, res)) return;
122
93
  try {
123
94
  const response = await Auth.verifyCode(req, res);
124
95
  res.status(200).send(response);
@@ -128,7 +99,6 @@ self.verifyCode = async (req, res) => {
128
99
  };
129
100
 
130
101
  self.resetPassword = async (req, res) => {
131
- if (!_checkRateLimit(req, res)) return;
132
102
  try {
133
103
  const response = await Auth.resetPassword(req, res);
134
104
  res.status(200).send(response);
@@ -138,7 +108,6 @@ self.resetPassword = async (req, res) => {
138
108
  };
139
109
 
140
110
  self.sendVerifyMailAccount = async (req, res) => {
141
- if (!_checkRateLimit(req, res)) return;
142
111
  try {
143
112
  await Auth.sendVerifyMailAccountJob(req, true);
144
113
  res.status(200).send();
@@ -209,4 +178,3 @@ self.validatEmailChange = async (req, res) => {
209
178
  await utils.responseError(res, error);
210
179
  }
211
180
  };
212
-
@@ -1,7 +1,7 @@
1
1
  const Business = require("../models/Business");
2
2
  const Company = require("../models/Company");
3
3
  const utils = require("../config/utils");
4
- const providers = require("../providers");
4
+ const AlouxAWS = require("./operationsAWS");
5
5
  const errorController = require("../config/utils");
6
6
  const { resolveGkey } = require("../config/utils");
7
7
 
@@ -41,30 +41,56 @@ self.create = async (req, res) => {
41
41
 
42
42
  self.retrieve = async (req, res) => {
43
43
  try {
44
- const { page, itemsPerPage, search } = req.query
45
- const paginate = page != null && itemsPerPage != null
46
- let query = {}
44
+ const retrieve = await Business.find({}, { gkey: 0 })
45
+ .populate("_company")
46
+ .lean();
47
+ res.status(200).send(retrieve);
48
+ } catch (error) {
49
+ await errorController.responseError(res, error);
50
+ }
51
+ };
47
52
 
48
- if (search) {
49
- const s = utils.escapeRegex(String(search))
50
- query.$or = [{ name: { $regex: s, $options: 'i' } }]
53
+
54
+ self.retrievePages = async (req, res) => {
55
+ try {
56
+ let { page = 1, itemsPerPage = 10, sort = { createdAt: -1 } } = req.body.config || {}
57
+ let query = {}
58
+ let attributes = { pwd: 0, tokens: 0 }
59
+ if (req?.body?.filter?.search) {
60
+ query.$or = [
61
+ { name: { $regex: req.body.filter.search, $options: 'i' } }
62
+ ];
51
63
  }
52
64
 
53
- if (paginate) {
54
- const perPage = Math.min(Number(itemsPerPage), 100)
55
- const count = await Business.countDocuments(query)
56
- const items = await Business.find(query, { gkey: 0 }).skip(perPage * (Number(page) - 1)).limit(perPage).sort({ createdAt: -1 }).lean()
57
- const response = await utils.generatePaginationResponse(count, Number(page), perPage, items)
58
- const active = await Business.countDocuments({ status: 'Activo' })
59
- const inactive = await Business.countDocuments({ status: 'Inactivo' })
60
- response.summary = { active, inactive, total: active + inactive }
61
- return res.status(200).send(response)
65
+ const count = await Business.countDocuments(query)
66
+ let items
67
+
68
+ if (Number(page) === 0 && Number(itemsPerPage) === 0) {
69
+ items = await Business.find(query, attributes)
70
+ .sort(sort)
71
+ .lean()
72
+ page = 1
73
+ itemsPerPage = count > 0 ? count : 1
74
+ } else {
75
+ items = await Business.find(query, attributes)
76
+ .skip(Number(itemsPerPage) * (Number(page) - 1))
77
+ .limit(Number(itemsPerPage))
78
+ .sort(sort)
79
+ .lean()
62
80
  }
63
81
 
64
- const retrieve = await Business.find(query, { gkey: 0 }).populate('_company').lean()
65
- res.status(200).send(retrieve)
82
+ const response = await utils.generatePaginationResponse(count, page, itemsPerPage, items)
83
+ const active = await Business.countDocuments({ status: "Activo" })
84
+ const inactive = await Business.countDocuments({ status: "Inactivo" })
85
+
86
+ response.summary = {
87
+ active,
88
+ inactive,
89
+ total: active + inactive
90
+ }
91
+ res.status(200).send(response);
66
92
  } catch (error) {
67
- await errorController.responseError(res, error)
93
+ res.status(400).send({ error: error.message });
68
94
  }
69
95
  }
70
96
 
@@ -182,8 +208,8 @@ self.picture = async (req, res) => {
182
208
  try {
183
209
  let business = await Business.findOne({ _id: req.params.BUSINESS_ID });
184
210
 
185
- const imgUrl = await providers.storage()?.upload(
186
- "business/picture-" + req.params.BUSINESS_ID,
211
+ const imgUrl = await AlouxAWS.upload(
212
+ "business/" + "picture" + "-" + req.params.BUSINESS_ID,
187
213
  req.files.picture
188
214
  );
189
215
 
@@ -192,7 +218,7 @@ self.picture = async (req, res) => {
192
218
 
193
219
  res.status(202).send(updateBusiness);
194
220
  } catch (error) {
195
- errorController.responseError(res, error);
221
+ res.status(400).send({ error: error.message });
196
222
  }
197
223
  };
198
224
 
@@ -200,8 +226,8 @@ self.favicon = async (req, res) => {
200
226
  try {
201
227
  let business = await Business.findOne({ _id: req.params.BUSINESS_ID });
202
228
 
203
- const faviconUrl = await providers.storage()?.upload(
204
- "business/favicon-" + req.params.BUSINESS_ID,
229
+ const faviconUrl = await AlouxAWS.upload(
230
+ "business/" + "favicon" + "-" + req.params.BUSINESS_ID,
205
231
  req.files.favicon
206
232
  );
207
233
 
@@ -210,7 +236,7 @@ self.favicon = async (req, res) => {
210
236
 
211
237
  res.status(202).send(updateBusiness);
212
238
  } catch (error) {
213
- errorController.responseError(res, error);
239
+ res.status(400).send({ error: error.message });
214
240
  }
215
241
  };
216
242
 
@@ -1,5 +1,5 @@
1
1
  const Company = require("../models/Company");
2
- const providers = require("../providers");
2
+ const AlouxAWS = require("./operationsAWS");
3
3
  const errorController = require("../config/utils");
4
4
  const self = module.exports;
5
5
 
@@ -98,8 +98,8 @@ self.picture = async (req, res) => {
98
98
  try {
99
99
  let company = await Company.findOne({ _id: req.params.COMPANY_ID });
100
100
 
101
- const imgUrl = await providers.storage()?.upload(
102
- "company/picture-" + req.params.COMPANY_ID,
101
+ const imgUrl = await AlouxAWS.upload(
102
+ "company/" + "picture" + "-" + req.params.COMPANY_ID,
103
103
  req.files.picture
104
104
  );
105
105
 
@@ -109,7 +109,7 @@ self.picture = async (req, res) => {
109
109
  res.status(202).send(updateCompany);
110
110
  } catch (error) {
111
111
  console.error(error);
112
- errorController.responseError(res, error);
112
+ res.status(400).send({ error: error.message });
113
113
  }
114
114
  };
115
115
 
@@ -117,8 +117,8 @@ self.favicon = async (req, res) => {
117
117
  try {
118
118
  let company = await Company.findOne({ _id: req.params.COMPANY_ID });
119
119
 
120
- const faviconUrl = await providers.storage()?.upload(
121
- "company/favicon-" + req.params.COMPANY_ID,
120
+ const faviconUrl = await AlouxAWS.upload(
121
+ "company/" + "favicon" + "-" + req.params.COMPANY_ID,
122
122
  req.files.favicon
123
123
  );
124
124
 
@@ -127,7 +127,7 @@ self.favicon = async (req, res) => {
127
127
 
128
128
  res.status(202).send(updateCompany);
129
129
  } catch (error) {
130
- errorController.responseError(res, error);
130
+ res.status(400).send({ error: error.message });
131
131
  }
132
132
  };
133
133
 
@@ -10,24 +10,25 @@ self.create = async (req, res) => {
10
10
  await functions.save()
11
11
  res.status(201).send(functions)
12
12
  } catch (error) {
13
- utils.responseError(res, error)
13
+ console.log(error)
14
+ res.status(400).send({ error: error.message })
14
15
  }
15
16
  }
16
17
 
17
- self.update = async (req, res) => {
18
+ self.update = async (req, resp) => {
18
19
  try {
19
- const count = await Functions.exists({ _id: req.params.FUNCTION_ID })
20
+ await (new Functions(req.body)).validate()
21
+ const count = await Functions.findOne({ _id: req.params.FUNCTION_ID }).countDocuments()
20
22
  if (!count)
21
23
  throw new Error('Upss! No se encontró el registro')
22
24
  req.body.lastUpdate = (new Date()).getTime()
23
- await Functions.updateOne({ _id: req.params.FUNCTION_ID }, { $set: req.body })
24
- res.status(200).send(req.body)
25
+ const result = await Functions.updateOne({ _id: req.params.FUNCTION_ID }, req.body)
26
+ resp.status(200).send(req.body)
25
27
  } catch (error) {
26
- utils.responseError(res, error)
28
+ resp.status(400).send({ error: error.message })
27
29
  }
28
30
  }
29
-
30
- self.status = async (req, res) => {
31
+ self.status = async (req, resp) => {
31
32
  try {
32
33
  const _id = req.params.FUNCTION_ID
33
34
  const functions = await Functions.findOne({ _id })
@@ -36,41 +37,62 @@ self.status = async (req, res) => {
36
37
  functions.status = req.body.status
37
38
  functions.lastUpdate = (new Date()).getTime()
38
39
  const result = await functions.save()
39
- res.status(200).send(result)
40
+ resp.status(200).send(result)
40
41
  } catch (error) {
41
- utils.responseError(res, error)
42
+ resp.status(400).send({ error: error.message })
42
43
  }
43
44
  }
44
-
45
45
  self.retrieve = async (req, res) => {
46
46
  try {
47
- const { page, itemsPerPage, search } = req.query
48
- const paginate = page != null && itemsPerPage != null
47
+ const response = await Functions.find({}).sort({ createdAt: -1 })
48
+ res.status(200).send(response)
49
+ } catch (error) {
50
+ res.status(400).send(error)
51
+ }
52
+ }
53
+
54
+ self.retrievePages = async (req, res) => {
55
+ try {
56
+ let { page = 1, itemsPerPage = 10, sort = { createdAt: -1 } } = req.body.config || {}
49
57
  let query = {}
58
+ let attributes = { pwd: 0, tokens: 0 }
50
59
 
51
- if (search) {
52
- const s = utils.escapeRegex(String(search))
60
+ if (req?.body?.filter?.search) {
53
61
  query.$or = [
54
- { name: { $regex: s, $options: 'i' } },
55
- { description: { $regex: s, $options: 'i' } }
56
- ]
62
+ { name: { $regex: req.body.filter.search, $options: 'i' } },
63
+ { description: { $regex: req.body.filter.search, $options: 'i' } }
64
+ ];
57
65
  }
58
66
 
59
- if (paginate) {
60
- const perPage = Math.min(Number(itemsPerPage), 100)
61
- const count = await Functions.countDocuments(query)
62
- const items = await Functions.find(query).skip(perPage * (Number(page) - 1)).limit(perPage).sort({ createdAt: -1 }).lean()
63
- const response = await utils.generatePaginationResponse(count, Number(page), perPage, items)
64
- const active = await Functions.countDocuments({ status: 'Activo' })
65
- const inactive = await Functions.countDocuments({ status: 'Inactivo' })
66
- response.summary = { active, inactive, total: active + inactive }
67
- return res.status(200).send(response)
67
+ const count = await Functions.countDocuments(query)
68
+ let items
69
+
70
+ if (Number(page) === 0 && Number(itemsPerPage) === 0) {
71
+ items = await Functions.find(query, attributes)
72
+ .sort(sort)
73
+ .lean()
74
+ page = 1
75
+ itemsPerPage = count > 0 ? count : 1
76
+ } else {
77
+ items = await Functions.find(query, attributes)
78
+ .skip(Number(itemsPerPage) * (Number(page) - 1))
79
+ .limit(Number(itemsPerPage))
80
+ .sort(sort)
81
+ .lean()
68
82
  }
69
83
 
70
- const response = await Functions.find(query).sort({ createdAt: -1 })
71
- res.status(200).send(response)
84
+ const response = await utils.generatePaginationResponse(count, page, itemsPerPage, items)
85
+ const active = await Functions.countDocuments({ status: "Activo" })
86
+ const inactive = await Functions.countDocuments({ status: "Inactivo" })
87
+
88
+ response.summary = {
89
+ active,
90
+ inactive,
91
+ total: active + inactive
92
+ }
93
+ res.status(200).send(response);
72
94
  } catch (error) {
73
- utils.responseError(res, error)
95
+ res.status(400).send({ error: error.message });
74
96
  }
75
97
  }
76
98
 
@@ -79,30 +101,32 @@ self.get = async (req, res) => {
79
101
  const _id = req.params.FUNCTION_ID
80
102
  const functions = await Functions.findOne({ _id }).populate([{ path: "_permissions" }, { path: "_menus" }]).lean()
81
103
  if (!functions)
82
- return res.status(404).send({ code: 404, title: "No encontrado", detail: "", suggestion: "Verifica el ID de la función" })
104
+ res.status(404).send()
83
105
  res.status(200).send(functions)
84
106
  } catch (error) {
85
- utils.responseError(res, error)
107
+ res.status(400).send(error)
86
108
  }
87
109
  }
88
110
 
89
111
  self.delete = async (req, res) => {
90
112
  try {
113
+
91
114
  const _id = req.params.FUNCTION_ID
92
115
  const response = await Functions.deleteOne({ _id })
93
116
  if (!response.deletedCount)
94
- return res.status(404).send({ code: 404, title: "No encontrado", detail: "", suggestion: "El registro no existe" })
95
- res.status(200).send({})
117
+ res.status(404).send({ error: "El registro no existe" })
118
+ else
119
+ res.status(200).send({})
96
120
  } catch (error) {
97
- utils.responseError(res, error)
121
+ res.status(400).send({ error: error.message })
98
122
  }
99
123
  }
100
124
 
101
125
  self.count = async (req, res) => {
102
126
  try {
103
- const result = await Functions.countDocuments()
127
+ let result = await Functions.find({}).countDocuments()
104
128
  res.status(200).send({ count: result })
105
129
  } catch (error) {
106
- utils.responseError(res, error)
130
+ res.status(400).send({ error: error.message })
107
131
  }
108
- }
132
+ }
@@ -1,5 +1,4 @@
1
1
  const Label = require("../models/Label");
2
- const utils = require("../config/utils");
3
2
  const self = module.exports;
4
3
 
5
4
  self.create = async (req, res) => {
@@ -10,43 +9,43 @@ self.create = async (req, res) => {
10
9
  await label.save();
11
10
  res.status(201).send(label);
12
11
  } catch (error) {
13
- utils.responseError(res, error);
12
+ res.status(400).send({ error: error.message });
14
13
  }
15
14
  };
16
15
 
17
- self.update = async (req, res) => {
16
+ self.update = async (req, resp) => {
18
17
  try {
18
+ await new Label(req.body).validate();
19
19
  const _id = req.params.LABEL_ID;
20
- const exists = await Label.exists({ _id });
21
- if (!exists) throw new Error("Upss! No se encontró el registro");
20
+ const count = await Label.findOne({ _id }).countDocuments();
21
+ if (!count) throw new Error("Upss! No se encontró el registro");
22
22
  req.body.lastUpdate = new Date().getTime();
23
- await Label.updateOne({ _id }, req.body);
24
- res.status(200).send(req.body);
23
+ const result = await Label.updateOne({ _id }, req.body);
24
+ resp.status(200).send(req.body);
25
25
  } catch (error) {
26
- utils.responseError(res, error);
26
+ resp.status(400).send({ error: error.message });
27
27
  }
28
28
  };
29
-
30
- self.status = async (req, res) => {
29
+ self.status = async (req, resp) => {
31
30
  try {
32
31
  const _id = req.params.LABEL_ID;
33
- const label = await Label.findOne({ _id });
34
- if (!label) throw new Error("Upss! No se encontró el Elemento");
35
- label.status = req.body.status;
36
- label.lastUpdate = new Date().getTime();
37
- const result = await label.save();
38
- res.status(200).send(result);
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);
39
38
  } catch (error) {
40
- utils.responseError(res, error);
39
+ resp.status(400).send({ error: error.message });
41
40
  }
42
41
  };
43
-
44
42
  self.retrieve = async (req, res) => {
45
43
  try {
46
44
  const consulta = await Label.find({}).sort({ index: 1 });
45
+ if (!consulta) res.status(404).send();
47
46
  res.status(200).send(consulta);
48
47
  } catch (error) {
49
- utils.responseError(res, error);
48
+ res.status(400).send(error);
50
49
  }
51
50
  };
52
51
 
@@ -54,10 +53,10 @@ self.get = async (req, res) => {
54
53
  try {
55
54
  const _id = req.params.LABEL_ID;
56
55
  const label = await Label.findOne({ _id });
57
- if (!label) return res.status(404).send({ code: 404, title: "No encontrado", detail: "", suggestion: "Verifica el ID de la etiqueta" });
56
+ if (!label) res.status(404).send();
58
57
  res.status(200).send(label);
59
58
  } catch (error) {
60
- utils.responseError(res, error);
59
+ res.status(400).send(error);
61
60
  }
62
61
  };
63
62
 
@@ -66,18 +65,18 @@ self.delete = async (req, res) => {
66
65
  const _id = req.params.LABEL_ID;
67
66
  const response = await Label.deleteOne({ _id });
68
67
  if (!response.deletedCount)
69
- return res.status(404).send({ code: 404, title: "No encontrado", detail: "", suggestion: "El registro no existe" });
70
- res.status(200).send({});
68
+ res.status(404).send({ error: "El registro no existe" });
69
+ else res.status(200).send({});
71
70
  } catch (error) {
72
- utils.responseError(res, error);
71
+ res.status(400).send({ error: error.message });
73
72
  }
74
73
  };
75
74
 
76
75
  self.count = async (req, res) => {
77
76
  try {
78
- const result = await Label.countDocuments();
77
+ let result = await Label.find({}).countDocuments();
79
78
  res.status(200).send({ count: result });
80
79
  } catch (error) {
81
- utils.responseError(res, error);
80
+ res.status(400).send({ error: error.message });
82
81
  }
83
82
  };