hola-server 1.0.10 → 2.0.1

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.
Files changed (83) hide show
  1. package/README.md +196 -1
  2. package/core/array.js +79 -142
  3. package/core/bash.js +208 -259
  4. package/core/chart.js +26 -16
  5. package/core/cron.js +14 -3
  6. package/core/date.js +15 -44
  7. package/core/encrypt.js +19 -9
  8. package/core/file.js +42 -29
  9. package/core/lhs.js +32 -6
  10. package/core/meta.js +213 -289
  11. package/core/msg.js +20 -7
  12. package/core/number.js +105 -103
  13. package/core/obj.js +15 -12
  14. package/core/random.js +9 -6
  15. package/core/role.js +69 -77
  16. package/core/thread.js +12 -2
  17. package/core/type.js +300 -261
  18. package/core/url.js +20 -12
  19. package/core/validate.js +29 -26
  20. package/db/db.js +297 -227
  21. package/db/entity.js +631 -963
  22. package/db/gridfs.js +120 -166
  23. package/design/add_default_field_attr.md +56 -0
  24. package/http/context.js +22 -8
  25. package/http/cors.js +25 -8
  26. package/http/error.js +27 -9
  27. package/http/express.js +70 -41
  28. package/http/params.js +70 -42
  29. package/http/router.js +51 -40
  30. package/http/session.js +59 -36
  31. package/index.js +85 -9
  32. package/package.json +2 -2
  33. package/router/clone.js +28 -36
  34. package/router/create.js +21 -26
  35. package/router/delete.js +24 -28
  36. package/router/read.js +137 -123
  37. package/router/update.js +38 -56
  38. package/setting.js +22 -6
  39. package/skills/array.md +155 -0
  40. package/skills/bash.md +91 -0
  41. package/skills/chart.md +54 -0
  42. package/skills/code.md +422 -0
  43. package/skills/context.md +177 -0
  44. package/skills/date.md +58 -0
  45. package/skills/express.md +255 -0
  46. package/skills/file.md +60 -0
  47. package/skills/lhs.md +54 -0
  48. package/skills/meta.md +1023 -0
  49. package/skills/msg.md +30 -0
  50. package/skills/number.md +88 -0
  51. package/skills/obj.md +36 -0
  52. package/skills/params.md +206 -0
  53. package/skills/random.md +22 -0
  54. package/skills/role.md +59 -0
  55. package/skills/session.md +281 -0
  56. package/skills/storage.md +743 -0
  57. package/skills/thread.md +22 -0
  58. package/skills/type.md +547 -0
  59. package/skills/url.md +34 -0
  60. package/skills/validate.md +48 -0
  61. package/test/cleanup/close-db.js +5 -0
  62. package/test/core/array.js +226 -0
  63. package/test/core/chart.js +51 -0
  64. package/test/core/file.js +59 -0
  65. package/test/core/lhs.js +44 -0
  66. package/test/core/number.js +167 -12
  67. package/test/core/obj.js +47 -0
  68. package/test/core/random.js +24 -0
  69. package/test/core/thread.js +20 -0
  70. package/test/core/type.js +216 -0
  71. package/test/core/validate.js +67 -0
  72. package/test/db/db-ops.js +99 -0
  73. package/test/db/pipe_test.txt +0 -0
  74. package/test/db/test_case_design.md +528 -0
  75. package/test/db/test_db_class.js +613 -0
  76. package/test/db/test_entity_class.js +414 -0
  77. package/test/db/test_gridfs_class.js +234 -0
  78. package/test/entity/create.js +1 -1
  79. package/test/entity/delete-mixed.js +156 -0
  80. package/test/entity/ref-filter.js +63 -0
  81. package/tool/gen_i18n.js +55 -21
  82. package/test/crud/router.js +0 -99
  83. package/test/router/user.js +0 -17
package/router/delete.js CHANGED
@@ -1,3 +1,8 @@
1
+ /**
2
+ * @fileoverview Delete router initialization.
3
+ * @module router/delete
4
+ */
5
+
1
6
  const { required_post_params } = require('../http/params');
2
7
  const { has_value } = require('../core/validate');
3
8
  const { NO_PARAMS, NO_RIGHTS } = require('../http/code');
@@ -8,46 +13,37 @@ const { wrap_http } = require('../http/error');
8
13
  const { Entity } = require('../db/entity');
9
14
 
10
15
  /**
11
- * init http delete router
12
- * @param {express router} router
13
- * @param {meta info} meta
16
+ * Initialize HTTP delete router.
17
+ * @param {Object} router - Express router
18
+ * @param {Object} meta - Entity metadata
14
19
  */
15
- const init_delete_router = function (router, meta) {
20
+ const init_delete_router = (router, meta) => {
16
21
  const entity = new Entity(meta);
17
22
 
18
- router.post('/delete', wrap_http(async function (req, res) {
19
- const [role_mode, role_view] = get_user_role_right(req, meta);
20
- const has_right = role_mode.includes("d");
21
- if (!has_right) {
22
- res.json({ code: NO_RIGHTS, err: "no rights error" });
23
- return;
23
+ router.post('/delete', wrap_http(async (req, res) => {
24
+ const [role_mode] = get_user_role_right(req, meta);
25
+ if (!role_mode.includes("d")) {
26
+ return res.json({ code: NO_RIGHTS, err: "no rights" });
24
27
  }
25
28
 
26
29
  const params = required_post_params(req, ["ids"]);
27
- if (params === null) {
28
- res.json({ code: NO_PARAMS, err: ["ids"] });
29
- return;
30
+ if (!params) {
31
+ return res.json({ code: NO_PARAMS, err: ["ids"] });
30
32
  }
31
33
 
32
- const { ids } = params;
33
- const id_array = ids.split(",");
34
+ const ids = params.ids.split(",");
34
35
 
35
- for (let i = 0; i < id_array.length; i++) {
36
- const id_query = oid_query(id_array[i]);
37
- const owner = await is_owner(req, meta, entity, id_query);
38
- if (!owner) {
39
- res.json({ code: NO_RIGHTS, err: "no rights error" });
40
- return;
36
+ for (const id of ids) {
37
+ if (!await is_owner(req, meta, entity, oid_query(id))) {
38
+ return res.json({ code: NO_RIGHTS, err: "no ownership rights" });
41
39
  }
42
40
  }
43
41
 
44
- const { code, err } = await entity.delete_entity(id_array);
45
- if (!has_value(code)) {
46
- throw new Error("the delete_entity method should return code");
47
- }
42
+ const { code, err } = await entity.delete_entity(ids);
43
+ if (!has_value(code)) throw new Error("delete_entity must return code");
48
44
 
49
- res.json({ code: code, err: err });
45
+ res.json({ code, err });
50
46
  }));
51
- }
47
+ };
52
48
 
53
- module.exports = { init_delete_router }
49
+ module.exports = { init_delete_router };
package/router/read.js CHANGED
@@ -1,177 +1,191 @@
1
+ /**
2
+ * @fileoverview Read router initialization.
3
+ * @module router/read
4
+ */
5
+
1
6
  const { required_post_params, get_params } = require('../http/params');
2
7
  const { has_value } = require('../core/validate');
3
8
  const { NO_PARAMS, SUCCESS, NO_RIGHTS } = require('../http/code');
4
9
  const { get_user_role_right } = require('../core/role');
5
- const { get_session_userid, get_session_user_groups, is_owner } = require('../http/session');
10
+ const { get_session_user_id, get_session_user_groups, is_owner } = require('../http/session');
6
11
  const { wrap_http } = require('../http/error');
7
12
  const { oid_query } = require('../db/db');
8
13
  const { Entity } = require('../db/entity');
9
14
 
10
- const contain_view = (array, view) => {
11
- for (let i = 0; i < array.length; i++) {
12
- if (view.includes(array[i])) {
13
- return true;
15
+ /**
16
+ * Check if any array element is contained in view string.
17
+ * @param {string[]} array - View array
18
+ * @param {string} view - Target view
19
+ * @returns {boolean}
20
+ */
21
+ const contain_view = (array, view) => array.some(item => view.includes(item));
22
+
23
+ /**
24
+ * Check read rights and return false with error response if unauthorized.
25
+ * @param {Object} req - Express request
26
+ * @param {Object} res - Express response
27
+ * @param {Object} meta - Entity metadata
28
+ * @returns {[boolean, string, string]} [hasRights, roleMode, roleView]
29
+ */
30
+ const check_read_rights = (req, res, meta) => {
31
+ const [role_mode, role_view] = get_user_role_right(req, meta);
32
+ if (!role_mode.includes("r")) {
33
+ res.json({ code: NO_RIGHTS, err: "no rights" });
34
+ return [false, null, null];
35
+ }
36
+ return [true, role_mode, role_view];
37
+ };
38
+
39
+ /**
40
+ * Filter fields by role view.
41
+ * @param {Object} meta - Entity metadata
42
+ * @param {string} role_view - Role view string
43
+ * @returns {Object[]} Filtered client fields
44
+ */
45
+ const filter_fields_by_view = (meta, role_view) => {
46
+ if (!role_view || role_view === "*") return meta.client_fields;
47
+
48
+ return meta.client_fields.filter(field => {
49
+ const view = field.view;
50
+ if (Array.isArray(view)) {
51
+ return contain_view(view, role_view) || view.includes("*");
14
52
  }
53
+ return role_view.includes(view) || view === "*";
54
+ });
55
+ };
56
+
57
+ /**
58
+ * Build permission flags from role mode.
59
+ * @param {string} role_mode - Role mode string
60
+ * @returns {Object} Permission flags
61
+ */
62
+ const build_permissions = (role_mode) => ({
63
+ creatable: role_mode.includes("c"),
64
+ readable: role_mode.includes("r"),
65
+ updatable: role_mode.includes("u"),
66
+ deleteable: role_mode.includes("d"),
67
+ cloneable: role_mode.includes("o"),
68
+ importable: role_mode.includes("i"),
69
+ exportable: role_mode.includes("e"),
70
+ editable: role_mode.includes("c") || role_mode.includes("u")
71
+ });
72
+
73
+ /**
74
+ * Get user ID or group IDs based on user_field config.
75
+ * @param {Object} req - Express request
76
+ * @param {Object} meta - Entity metadata
77
+ * @returns {string|string[]} User ID or group IDs
78
+ */
79
+ const get_user_filter = (req, meta) => {
80
+ const [user_field] = meta.fields.filter(f => f.name === meta.user_field);
81
+
82
+ if (user_field?.group) {
83
+ const user_ids = get_session_user_groups(req);
84
+ if (!user_ids) throw new Error("no user group found in session");
85
+ return user_ids;
15
86
  }
16
- return false;
17
- }
87
+
88
+ const user_id = get_session_user_id(req);
89
+ if (!user_id) throw new Error("no user id found in session");
90
+ return user_id;
91
+ };
18
92
 
19
93
  /**
20
- * init http read router
21
- * @param {express router} router
22
- * @param {meta info} meta
94
+ * Initialize HTTP read router.
95
+ * @param {Object} router - Express router
96
+ * @param {Object} meta - Entity metadata
23
97
  */
24
- const init_read_router = function (router, meta) {
98
+ const init_read_router = (router, meta) => {
25
99
  const entity = new Entity(meta);
26
100
 
27
- router.get('/meta', wrap_http(async function (req, res) {
28
- const [role_mode, role_view] = get_user_role_right(req, meta);
29
- const has_right = role_mode.includes("r");
30
- if (!has_right) {
31
- res.json({ code: NO_RIGHTS, err: "no rights error" });
32
- return;
33
- }
101
+ router.get('/meta', wrap_http(async (req, res) => {
102
+ const [ok, role_mode, role_view] = check_read_rights(req, res, meta);
103
+ if (!ok) return;
34
104
 
35
- const client_fields = role_view && role_view !== "*" ? meta.client_fields.filter(field => Array.isArray(field.view) ? contain_view(field.view, role_view) || field.view.includes("*") : role_view.includes(field.view) || field.view === "*") : meta.client_fields;
36
- const entity_meta = {
37
- creatable: role_mode.includes("c"),
38
- readable: role_mode.includes("r"),
39
- updatable: role_mode.includes("u"),
40
- deleteable: role_mode.includes("d"),
41
- cloneable: role_mode.includes("o"),
42
- importable: role_mode.includes("i"),
43
- exportable: role_mode.includes("e"),
44
- editable: role_mode.includes("c") || role_mode.includes("u"),
45
- fields: client_fields
46
- }
47
- res.json({ code: SUCCESS, data: entity_meta });
105
+ res.json({
106
+ code: SUCCESS,
107
+ data: {
108
+ ...build_permissions(role_mode),
109
+ fields: filter_fields_by_view(meta, role_view)
110
+ }
111
+ });
48
112
  }));
49
113
 
50
- router.get('/mode', wrap_http(async function (req, res) {
51
- const [role_mode, role_view] = get_user_role_right(req, meta);
52
- const has_right = role_mode.includes("r");
53
-
54
- if (!has_right) {
55
- res.json({ code: NO_RIGHTS, err: "no rights error" });
56
- return;
57
- }
114
+ router.get('/mode', wrap_http(async (req, res) => {
115
+ const [ok, role_mode, role_view] = check_read_rights(req, res, meta);
116
+ if (!ok) return;
58
117
 
59
118
  res.json({ code: SUCCESS, mode: role_mode, view: role_view });
60
119
  }));
61
120
 
62
- router.get('/ref', wrap_http(async function (req, res) {
63
- const [role_mode, role_view] = get_user_role_right(req, meta);
64
- const has_right = role_mode.includes("r");
65
- if (!has_right) {
66
- res.json({ code: NO_RIGHTS, err: "no rights error" });
67
- return;
68
- }
121
+ router.get('/ref', wrap_http(async (req, res) => {
122
+ const [ok] = check_read_rights(req, res, meta);
123
+ if (!ok) return;
69
124
 
70
125
  const { ref_by_entity, query } = get_params(req, ["ref_by_entity", "query"]);
71
126
  const list = await entity.get_filtered_ref_labels(ref_by_entity, query);
72
- const items = list.map(obj => ({ "text": obj[meta.ref_label], "value": obj["_id"] + "" }));
127
+ const items = list.map(obj => ({ text: obj[meta.ref_label], value: String(obj._id) }));
73
128
  res.json({ code: SUCCESS, data: items });
74
129
  }));
75
130
 
76
- router.post('/list', wrap_http(async function (req, res) {
77
- const [role_mode, role_view] = get_user_role_right(req, meta);
78
- const has_right = role_mode.includes("r");
79
- if (!has_right) {
80
- res.json({ code: NO_RIGHTS, err: "no rights error" });
81
- return;
82
- }
131
+ router.post('/list', wrap_http(async (req, res) => {
132
+ const [ok, , role_view] = check_read_rights(req, res, meta);
133
+ if (!ok) return;
83
134
 
84
135
  const query_params = required_post_params(req, ["_query"]);
85
- if (query_params === null) {
86
- res.json({ code: NO_PARAMS, err: ["_query"] });
87
- return;
136
+ if (!query_params) {
137
+ return res.json({ code: NO_PARAMS, err: ["_query"] });
88
138
  }
89
139
 
90
140
  const param_obj = req.body;
91
-
92
141
  if (meta.user_field) {
93
- const [user_field] = meta.fields.filter(f => f.name == meta.user_field);
94
- if (user_field && user_field.group == true) {
95
- const user_ids = get_session_user_groups(req);
96
- if (user_ids == null) {
97
- throw new Error("no user group is found in session");
98
- }
99
- param_obj[meta.user_field] = user_ids;
100
- } else {
101
- const user_id = get_session_userid(req);
102
- if (user_id == null) {
103
- throw new Error("no user id is found in session");
104
- }
105
- param_obj[meta.user_field] = user_id;
106
- }
142
+ param_obj[meta.user_field] = get_user_filter(req, meta);
107
143
  }
108
144
 
109
145
  const query = meta.list_query ? await meta.list_query(entity, param_obj, req) : null;
110
- const { code, err, total, data } = await entity.list_entity(query_params["_query"], query, param_obj, role_view);
111
- if (!has_value(code)) {
112
- throw new Error("the list_entity method should return code");
113
- }
146
+ const { code, err, total, data } = await entity.list_entity(query_params._query, query, param_obj, role_view);
147
+ if (!has_value(code)) throw new Error("list_entity must return code");
114
148
 
115
- res.json({ code: code, err: err, total: total, data: data });
149
+ res.json({ code, err, total, data });
116
150
  }));
117
151
 
118
- router.post('/read_entity', wrap_http(async function (req, res) {
119
- const [role_mode, role_view] = get_user_role_right(req, meta);
120
- const has_right = role_mode.includes("r");
121
- if (!has_right) {
122
- res.json({ code: NO_RIGHTS, err: "no rights error" });
123
- return;
124
- }
152
+ router.post('/read_entity', wrap_http(async (req, res) => {
153
+ const [ok, , role_view] = check_read_rights(req, res, meta);
154
+ if (!ok) return;
125
155
 
126
- let params = required_post_params(req, ["_id", "attr_names"]);
127
- if (params === null) {
128
- res.json({ code: NO_PARAMS, err: '[_id,attr_names] checking params are failed!' });
129
- return;
156
+ const params = required_post_params(req, ["_id", "attr_names"]);
157
+ if (!params) {
158
+ return res.json({ code: NO_PARAMS, err: "[_id, attr_names] required" });
130
159
  }
131
160
 
132
- const { _id, attr_names } = params;
133
-
134
- const owner = await is_owner(req, meta, entity, oid_query(_id));
135
- if (!owner) {
136
- res.json({ code: NO_RIGHTS, err: "no rights error" });
137
- return;
161
+ if (!await is_owner(req, meta, entity, oid_query(params._id))) {
162
+ return res.json({ code: NO_RIGHTS, err: "no ownership rights" });
138
163
  }
139
164
 
140
- const { code, err, data } = await entity.read_entity(_id, attr_names, role_view);
141
- if (!has_value(code)) {
142
- throw new Error("the method should return code");
143
- }
144
- res.json({ code: code, err: err, data: data });
165
+ const { code, err, data } = await entity.read_entity(params._id, params.attr_names, role_view);
166
+ if (!has_value(code)) throw new Error("read_entity must return code");
167
+
168
+ res.json({ code, err, data });
145
169
  }));
146
170
 
147
- router.post('/read_property', wrap_http(async function (req, res) {
148
- const [role_mode, role_view] = get_user_role_right(req, meta);
149
- const has_right = role_mode.includes("r");
150
- if (!has_right) {
151
- res.json({ code: NO_RIGHTS, err: "no rights error" });
152
- return;
153
- }
171
+ router.post('/read_property', wrap_http(async (req, res) => {
172
+ const [ok, , role_view] = check_read_rights(req, res, meta);
173
+ if (!ok) return;
154
174
 
155
- let params = required_post_params(req, ["_id", "attr_names"]);
156
- if (params === null) {
157
- res.json({ code: NO_PARAMS, err: '[_id,attr_names] checking params are failed!' });
158
- return;
175
+ const params = required_post_params(req, ["_id", "attr_names"]);
176
+ if (!params) {
177
+ return res.json({ code: NO_PARAMS, err: "[_id, attr_names] required" });
159
178
  }
160
179
 
161
- const { _id, attr_names } = params;
162
-
163
- const owner = await is_owner(req, meta, entity, oid_query(_id));
164
- if (!owner) {
165
- res.json({ code: NO_RIGHTS, err: "no rights error" });
166
- return;
180
+ if (!await is_owner(req, meta, entity, oid_query(params._id))) {
181
+ return res.json({ code: NO_RIGHTS, err: "no ownership rights" });
167
182
  }
168
183
 
169
- const { code, err, data } = await entity.read_property(_id, attr_names, role_view);
170
- if (!has_value(code)) {
171
- throw new Error("the method should return code");
172
- }
173
- res.json({ code: code, err: err, data: data });
184
+ const { code, err, data } = await entity.read_property(params._id, params.attr_names, role_view);
185
+ if (!has_value(code)) throw new Error("read_property must return code");
186
+
187
+ res.json({ code, err, data });
174
188
  }));
175
- }
189
+ };
176
190
 
177
- module.exports = { init_read_router }
191
+ module.exports = { init_read_router };
package/router/update.js CHANGED
@@ -1,3 +1,8 @@
1
+ /**
2
+ * @fileoverview Update router initialization.
3
+ * @module router/update
4
+ */
5
+
1
6
  const { set_file_fields, save_file_fields_to_db } = require('../db/gridfs');
2
7
  const { required_post_params, post_update_params, post_params } = require('../http/params');
3
8
  const { SUCCESS, NO_PARAMS, NO_RIGHTS } = require('../http/code');
@@ -12,96 +17,73 @@ const multer = require('multer');
12
17
  const upload_file = multer({ dest: 'file_tmp/' });
13
18
 
14
19
  /**
15
- * init http update router
16
- * @param {express router} router
17
- * @param {meta info} meta
20
+ * Initialize HTTP update router.
21
+ * @param {Object} router - Express router
22
+ * @param {Object} meta - Entity metadata
18
23
  */
19
- const init_update_router = function (router, meta) {
24
+ const init_update_router = (router, meta) => {
20
25
  const entity = new Entity(meta);
21
26
  const cp_upload = meta.upload_fields.length > 0 ? upload_file.fields(meta.upload_fields) : upload_file.none();
22
27
 
23
- router.post('/update', cp_upload, wrap_http(async function (req, res) {
24
- //which view to update the entity
25
- let { _view } = post_params(req, ["_view"]);
26
- if (!_view) {
27
- _view = "*";
28
- }
28
+ router.post('/update', cp_upload, wrap_http(async (req, res) => {
29
+ const _view = post_params(req, ["_view"])._view || "*";
29
30
 
30
- const has_right = check_user_role(req, meta, "u", _view);
31
- if (!has_right) {
32
- res.json({ code: NO_RIGHTS, err: "no rights error" });
33
- return;
31
+ if (!check_user_role(req, meta, "u", _view)) {
32
+ return res.json({ code: NO_RIGHTS, err: "no rights" });
34
33
  }
35
34
 
36
- let params = required_post_params(req, ["_id"]);
37
- if (params === null) {
38
- params = required_post_params(req, meta.primary_keys);
39
- if (params === null) {
40
- res.json({ code: NO_PARAMS, err: '[_id] checking params are failed!' });
41
- return;
42
- }
35
+ let params = required_post_params(req, ["_id"]) || required_post_params(req, meta.primary_keys);
36
+ if (!params) {
37
+ return res.json({ code: NO_PARAMS, err: "[_id] required" });
43
38
  }
44
39
 
45
40
  const param_obj = post_update_params(req, meta.field_names);
46
41
  set_file_fields(meta, req, param_obj);
47
42
 
48
- const query = params["_id"] ? oid_query(params["_id"]) : entity.primary_key_query(param_obj);
49
- const owner = await is_owner(req, meta, entity, query);
50
- if (!owner) {
51
- res.json({ code: NO_RIGHTS, err: "no rights error" });
52
- return;
43
+ const query = params._id ? oid_query(params._id) : entity.primary_key_query(param_obj);
44
+ if (!await is_owner(req, meta, entity, query)) {
45
+ return res.json({ code: NO_RIGHTS, err: "no ownership rights" });
53
46
  }
54
47
 
55
- const { code, err } = await entity.update_entity(params["_id"], param_obj, _view);
56
- if (!has_value(code)) {
57
- throw new Error("the method should return code");
58
- }
48
+ const { code, err } = await entity.update_entity(params._id, param_obj, _view);
49
+ if (!has_value(code)) throw new Error("update_entity must return code");
59
50
 
60
- if (code == SUCCESS) {
51
+ if (code === SUCCESS) {
61
52
  await save_file_fields_to_db(meta.collection, meta.file_fields, req, param_obj);
62
53
  }
63
54
 
64
- res.json({ code: code, err: err });
55
+ res.json({ code, err });
65
56
  }));
66
57
 
67
- router.post('/batch_update', cp_upload, wrap_http(async function (req, res) {
58
+ router.post('/batch_update', cp_upload, wrap_http(async (req, res) => {
68
59
  const [role_mode, role_view] = get_user_role_right(req, meta);
69
- const has_right = role_mode.includes("u");
70
- if (!has_right) {
71
- res.json({ code: NO_RIGHTS, err: "no rights error" });
72
- return;
60
+ if (!role_mode.includes("u")) {
61
+ return res.json({ code: NO_RIGHTS, err: "no rights" });
73
62
  }
74
63
 
75
- let params = required_post_params(req, ["_ids"]);
76
- if (params === null) {
77
- res.json({ code: NO_PARAMS, err: '[_ids] checking params are failed!' });
78
- return;
64
+ const params = required_post_params(req, ["_ids"]);
65
+ if (!params) {
66
+ return res.json({ code: NO_PARAMS, err: "[_ids] required" });
79
67
  }
80
68
 
81
69
  const param_obj = post_update_params(req, meta.field_names);
82
70
  set_file_fields(meta, req, param_obj);
83
71
 
84
- const ids = params["_ids"];
85
- for (let i = 0; i < ids.length; i++) {
86
- const id_query = oid_query(ids[i]);
87
- const owner = await is_owner(req, meta, entity, id_query);
88
- if (!owner) {
89
- res.json({ code: NO_RIGHTS, err: "no rights error" });
90
- return;
72
+ for (const id of params._ids) {
73
+ if (!await is_owner(req, meta, entity, oid_query(id))) {
74
+ return res.json({ code: NO_RIGHTS, err: "no ownership rights" });
91
75
  }
92
76
  }
93
77
 
94
- const { code, err } = await entity.batch_update_entity(ids, param_obj, role_view);
95
- if (!has_value(code)) {
96
- throw new Error("the batch_update_entity method should return code");
97
- }
78
+ const { code, err } = await entity.batch_update_entity(params._ids, param_obj, role_view);
79
+ if (!has_value(code)) throw new Error("batch_update_entity must return code");
98
80
 
99
- if (code == SUCCESS) {
81
+ if (code === SUCCESS) {
100
82
  await save_file_fields_to_db(meta.collection, meta.file_fields, req, param_obj);
101
83
  }
102
84
 
103
- res.json({ code: code, err: err });
85
+ res.json({ code, err });
104
86
  }));
105
- }
87
+ };
106
88
 
107
- module.exports = { init_update_router }
89
+ module.exports = { init_update_router };
package/setting.js CHANGED
@@ -1,5 +1,14 @@
1
+ /**
2
+ * @fileoverview Application settings management.
3
+ * @module setting
4
+ */
5
+
1
6
  const dev_mode = true;
2
7
 
8
+ /**
9
+ * Default application settings.
10
+ * @type {Object}
11
+ */
3
12
  let settings = {
4
13
  axios: {
5
14
  retry: 3,
@@ -16,7 +25,7 @@ let settings = {
16
25
  log: {
17
26
  col_log: 'log',
18
27
  log_level: 0,
19
- save_db: dev_mode == false,
28
+ save_db: dev_mode === false,
20
29
  },
21
30
  roles: [
22
31
  { name: "admin", root: true },
@@ -29,7 +38,7 @@ let settings = {
29
38
  check_user: true,
30
39
  exclude_urls: ["/"],
31
40
  session: {
32
- cookie_max_age: 1000 * 60 * 60 * 24 * 256 * 10,// ten years
41
+ cookie_max_age: 1000 * 60 * 60 * 24 * 256 * 10, // ten years
33
42
  secret: 'BGTDYWJ*)#*$&*%(%#'
34
43
  },
35
44
  threshold: {
@@ -40,12 +49,19 @@ let settings = {
40
49
  }
41
50
  };
42
51
 
52
+ /**
53
+ * Initialize application settings with user-provided configuration.
54
+ * Replaces default settings completely.
55
+ * @param {Object} user_setting - User-provided settings object.
56
+ */
43
57
  const init_settings = (user_setting) => {
44
58
  settings = user_setting;
45
- }
59
+ };
46
60
 
47
- const get_settings = () => {
48
- return settings;
49
- }
61
+ /**
62
+ * Get current application settings.
63
+ * @returns {Object} Current settings object.
64
+ */
65
+ const get_settings = () => settings;
50
66
 
51
67
  module.exports = { init_settings, get_settings };