hola-server 1.0.11 → 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.
- package/README.md +196 -1
- package/core/array.js +79 -142
- package/core/bash.js +208 -259
- package/core/chart.js +26 -16
- package/core/cron.js +14 -3
- package/core/date.js +15 -44
- package/core/encrypt.js +19 -9
- package/core/file.js +42 -29
- package/core/lhs.js +32 -6
- package/core/meta.js +213 -289
- package/core/msg.js +20 -7
- package/core/number.js +105 -103
- package/core/obj.js +15 -12
- package/core/random.js +9 -6
- package/core/role.js +69 -77
- package/core/thread.js +12 -2
- package/core/type.js +300 -261
- package/core/url.js +20 -12
- package/core/validate.js +29 -26
- package/db/db.js +297 -227
- package/db/entity.js +631 -963
- package/db/gridfs.js +120 -166
- package/design/add_default_field_attr.md +56 -0
- package/http/context.js +22 -8
- package/http/cors.js +25 -8
- package/http/error.js +27 -9
- package/http/express.js +70 -41
- package/http/params.js +70 -42
- package/http/router.js +51 -40
- package/http/session.js +59 -36
- package/index.js +85 -9
- package/package.json +2 -2
- package/router/clone.js +28 -36
- package/router/create.js +21 -26
- package/router/delete.js +24 -28
- package/router/read.js +137 -123
- package/router/update.js +38 -56
- package/setting.js +22 -6
- package/skills/array.md +155 -0
- package/skills/bash.md +91 -0
- package/skills/chart.md +54 -0
- package/skills/code.md +422 -0
- package/skills/context.md +177 -0
- package/skills/date.md +58 -0
- package/skills/express.md +255 -0
- package/skills/file.md +60 -0
- package/skills/lhs.md +54 -0
- package/skills/meta.md +1023 -0
- package/skills/msg.md +30 -0
- package/skills/number.md +88 -0
- package/skills/obj.md +36 -0
- package/skills/params.md +206 -0
- package/skills/random.md +22 -0
- package/skills/role.md +59 -0
- package/skills/session.md +281 -0
- package/skills/storage.md +743 -0
- package/skills/thread.md +22 -0
- package/skills/type.md +547 -0
- package/skills/url.md +34 -0
- package/skills/validate.md +48 -0
- package/test/cleanup/close-db.js +5 -0
- package/test/core/array.js +226 -0
- package/test/core/chart.js +51 -0
- package/test/core/file.js +59 -0
- package/test/core/lhs.js +44 -0
- package/test/core/number.js +167 -12
- package/test/core/obj.js +47 -0
- package/test/core/random.js +24 -0
- package/test/core/thread.js +20 -0
- package/test/core/type.js +216 -0
- package/test/core/validate.js +67 -0
- package/test/db/db-ops.js +99 -0
- package/test/db/pipe_test.txt +0 -0
- package/test/db/test_case_design.md +528 -0
- package/test/db/test_db_class.js +613 -0
- package/test/db/test_entity_class.js +414 -0
- package/test/db/test_gridfs_class.js +234 -0
- package/test/entity/create.js +1 -1
- package/test/entity/delete-mixed.js +156 -0
- package/test/entity/ref-filter.js +63 -0
- package/tool/gen_i18n.js +55 -21
- package/test/crud/router.js +0 -99
- 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
|
-
*
|
|
12
|
-
* @param {
|
|
13
|
-
* @param {
|
|
16
|
+
* Initialize HTTP delete router.
|
|
17
|
+
* @param {Object} router - Express router
|
|
18
|
+
* @param {Object} meta - Entity metadata
|
|
14
19
|
*/
|
|
15
|
-
const init_delete_router =
|
|
20
|
+
const init_delete_router = (router, meta) => {
|
|
16
21
|
const entity = new Entity(meta);
|
|
17
22
|
|
|
18
|
-
router.post('/delete', wrap_http(async
|
|
19
|
-
const [role_mode
|
|
20
|
-
|
|
21
|
-
|
|
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
|
|
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
|
|
33
|
-
const id_array = ids.split(",");
|
|
34
|
+
const ids = params.ids.split(",");
|
|
34
35
|
|
|
35
|
-
for (
|
|
36
|
-
|
|
37
|
-
|
|
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(
|
|
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
|
|
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 {
|
|
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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
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
|
-
*
|
|
21
|
-
* @param {
|
|
22
|
-
* @param {
|
|
94
|
+
* Initialize HTTP read router.
|
|
95
|
+
* @param {Object} router - Express router
|
|
96
|
+
* @param {Object} meta - Entity metadata
|
|
23
97
|
*/
|
|
24
|
-
const init_read_router =
|
|
98
|
+
const init_read_router = (router, meta) => {
|
|
25
99
|
const entity = new Entity(meta);
|
|
26
100
|
|
|
27
|
-
router.get('/meta', wrap_http(async
|
|
28
|
-
const [role_mode, role_view] =
|
|
29
|
-
|
|
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
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
|
51
|
-
const [role_mode, role_view] =
|
|
52
|
-
|
|
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
|
|
63
|
-
const [
|
|
64
|
-
|
|
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 => ({
|
|
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
|
|
77
|
-
const [
|
|
78
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
149
|
+
res.json({ code, err, total, data });
|
|
116
150
|
}));
|
|
117
151
|
|
|
118
|
-
router.post('/read_entity', wrap_http(async
|
|
119
|
-
const [
|
|
120
|
-
|
|
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
|
-
|
|
127
|
-
if (params
|
|
128
|
-
res.json({ code: NO_PARAMS, err:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
148
|
-
const [
|
|
149
|
-
|
|
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
|
-
|
|
156
|
-
if (params
|
|
157
|
-
res.json({ code: NO_PARAMS, err:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
*
|
|
16
|
-
* @param {
|
|
17
|
-
* @param {
|
|
20
|
+
* Initialize HTTP update router.
|
|
21
|
+
* @param {Object} router - Express router
|
|
22
|
+
* @param {Object} meta - Entity metadata
|
|
18
23
|
*/
|
|
19
|
-
const init_update_router =
|
|
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
|
|
24
|
-
|
|
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
|
-
|
|
31
|
-
|
|
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
|
|
38
|
-
|
|
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
|
|
49
|
-
|
|
50
|
-
|
|
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
|
|
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
|
|
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
|
|
55
|
+
res.json({ code, err });
|
|
65
56
|
}));
|
|
66
57
|
|
|
67
|
-
router.post('/batch_update', cp_upload, wrap_http(async
|
|
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
|
-
|
|
70
|
-
|
|
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
|
-
|
|
76
|
-
if (params
|
|
77
|
-
res.json({ code: NO_PARAMS, err:
|
|
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
|
|
85
|
-
|
|
86
|
-
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
48
|
-
|
|
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 };
|