@modular-rest/server 1.11.13 → 1.12.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/.nvmrc +1 -0
- package/.prettierrc.json +9 -0
- package/.releaserc.json +24 -0
- package/README.md +79 -94
- package/dist/application.d.ts +29 -0
- package/dist/application.js +217 -0
- package/dist/class/cms_trigger.d.ts +61 -0
- package/dist/class/cms_trigger.js +47 -0
- package/dist/class/collection_definition.d.ts +112 -0
- package/dist/class/collection_definition.js +87 -0
- package/dist/class/combinator.d.ts +43 -0
- package/dist/class/combinator.js +174 -0
- package/dist/class/database_trigger.d.ts +84 -0
- package/dist/class/database_trigger.js +64 -0
- package/dist/class/db_schemas.d.ts +25 -0
- package/dist/class/db_schemas.js +28 -0
- package/dist/class/directory.d.ts +20 -0
- package/dist/class/directory.js +87 -0
- package/dist/class/paginator.d.ts +31 -0
- package/dist/class/paginator.js +43 -0
- package/dist/class/reply.d.ts +29 -0
- package/dist/class/reply.js +44 -0
- package/dist/class/security.d.ts +186 -0
- package/dist/class/security.js +178 -0
- package/dist/class/trigger_operator.d.ts +92 -0
- package/dist/class/trigger_operator.js +99 -0
- package/dist/class/user.d.ts +81 -0
- package/dist/class/user.js +151 -0
- package/dist/class/validator.d.ts +19 -0
- package/dist/class/validator.js +101 -0
- package/dist/config.d.ts +112 -0
- package/dist/config.js +26 -0
- package/dist/defult-permissions.d.ts +2 -0
- package/dist/defult-permissions.js +31 -0
- package/dist/events.d.ts +23 -0
- package/dist/events.js +47 -0
- package/dist/helper/data_insertion.d.ts +38 -0
- package/dist/helper/data_insertion.js +110 -0
- package/dist/helper/presetup_services.d.ts +60 -0
- package/dist/helper/presetup_services.js +108 -0
- package/dist/index.d.ts +118 -0
- package/dist/index.js +79 -0
- package/dist/middlewares.d.ts +53 -0
- package/dist/middlewares.js +106 -0
- package/dist/play-test.d.ts +1 -0
- package/dist/play-test.js +9 -0
- package/dist/services/data_provider/router.d.ts +4 -0
- package/dist/services/data_provider/router.js +187 -0
- package/dist/services/data_provider/service.d.ts +131 -0
- package/dist/services/data_provider/service.js +252 -0
- package/dist/services/data_provider/typeCasters.d.ts +9 -0
- package/dist/services/data_provider/typeCasters.js +18 -0
- package/dist/services/file/db.d.ts +1 -0
- package/dist/services/file/db.js +31 -0
- package/dist/services/file/router.d.ts +4 -0
- package/dist/services/file/router.js +115 -0
- package/dist/services/file/service.d.ts +204 -0
- package/dist/services/file/service.js +341 -0
- package/dist/services/functions/router.d.ts +4 -0
- package/dist/services/functions/router.js +67 -0
- package/dist/services/functions/service.d.ts +132 -0
- package/dist/services/functions/service.js +159 -0
- package/dist/services/jwt/router.d.ts +4 -0
- package/dist/services/jwt/router.js +99 -0
- package/dist/services/jwt/service.d.ts +97 -0
- package/dist/services/jwt/service.js +135 -0
- package/dist/services/user_manager/db.d.ts +1 -0
- package/dist/services/user_manager/db.js +75 -0
- package/dist/services/user_manager/permissionManager.d.ts +19 -0
- package/dist/services/user_manager/permissionManager.js +42 -0
- package/dist/services/user_manager/router.d.ts +4 -0
- package/dist/services/user_manager/router.js +195 -0
- package/dist/services/user_manager/service.d.ts +317 -0
- package/dist/services/user_manager/service.js +628 -0
- package/docs/.keep +0 -0
- package/docs/system-access-type.md +26 -0
- package/package.json +58 -45
- package/src/application.ts +206 -0
- package/src/class/cms_trigger.ts +68 -0
- package/src/class/collection_definition.ts +134 -0
- package/src/class/combinator.ts +176 -0
- package/src/class/database_trigger.ts +99 -0
- package/src/class/db_schemas.ts +44 -0
- package/src/class/{directory.js → directory.ts} +40 -18
- package/src/class/paginator.ts +51 -0
- package/src/class/reply.ts +59 -0
- package/src/class/security.ts +250 -0
- package/src/class/trigger_operator.ts +142 -0
- package/src/class/user.ts +199 -0
- package/src/class/validator.ts +123 -0
- package/src/config.ts +121 -0
- package/src/defult-permissions.ts +31 -0
- package/src/events.ts +59 -0
- package/src/helper/data_insertion.ts +94 -0
- package/src/helper/presetup_services.ts +96 -0
- package/src/index.ts +146 -0
- package/src/middlewares.ts +75 -0
- package/src/play-test.ts +8 -0
- package/src/services/data_provider/router.ts +191 -0
- package/src/services/data_provider/service.ts +305 -0
- package/src/services/data_provider/typeCasters.ts +15 -0
- package/src/services/file/db.ts +29 -0
- package/src/services/file/router.ts +88 -0
- package/src/services/file/service.ts +387 -0
- package/src/services/functions/router.ts +34 -0
- package/src/services/functions/service.ts +203 -0
- package/src/services/jwt/router.ts +73 -0
- package/src/services/jwt/service.ts +139 -0
- package/src/services/user_manager/db.ts +87 -0
- package/src/services/user_manager/permissionManager.ts +49 -0
- package/src/services/user_manager/router.ts +193 -0
- package/src/services/user_manager/service.ts +698 -0
- package/tsconfig.json +16 -9
- package/typedoc.mjs +41 -0
- package/LICENSE +0 -21
- package/package-lock.json +0 -1373
- package/src/application.js +0 -239
- package/src/class/cms_trigger.js +0 -20
- package/src/class/collection_definition.js +0 -33
- package/src/class/combinator.js +0 -133
- package/src/class/database_trigger.js +0 -20
- package/src/class/db_schemas.js +0 -18
- package/src/class/paginator.js +0 -31
- package/src/class/reply.js +0 -37
- package/src/class/security.js +0 -141
- package/src/class/trigger_operator.js +0 -39
- package/src/class/user.js +0 -112
- package/src/class/validator.js +0 -91
- package/src/config.js +0 -67
- package/src/events.js +0 -15
- package/src/helper/data_insertion.js +0 -64
- package/src/helper/presetup_services.js +0 -31
- package/src/index.js +0 -66
- package/src/middlewares.js +0 -44
- package/src/services/data_provider/router.js +0 -552
- package/src/services/data_provider/service.js +0 -262
- package/src/services/data_provider/typeCasters.js +0 -10
- package/src/services/file/db.js +0 -29
- package/src/services/file/router.js +0 -92
- package/src/services/file/service.js +0 -231
- package/src/services/functions/router.js +0 -37
- package/src/services/functions/service.js +0 -74
- package/src/services/jwt/router.js +0 -82
- package/src/services/jwt/service.js +0 -37
- package/src/services/user_manager/db.js +0 -83
- package/src/services/user_manager/permissionManager.js +0 -43
- package/src/services/user_manager/router.js +0 -176
- package/src/services/user_manager/service.js +0 -377
- package/types/application.d.ts +0 -97
- package/types/class/cms_trigger.d.ts +0 -24
- package/types/class/collection_definition.d.ts +0 -36
- package/types/class/combinator.d.ts +0 -30
- package/types/class/database_trigger.d.ts +0 -28
- package/types/class/db_schemas.d.ts +0 -2
- package/types/class/directory.d.ts +0 -2
- package/types/class/paginator.d.ts +0 -8
- package/types/class/reply.d.ts +0 -8
- package/types/class/security.d.ts +0 -109
- package/types/class/trigger_operator.d.ts +0 -19
- package/types/class/user.d.ts +0 -24
- package/types/class/validator.d.ts +0 -9
- package/types/config.d.ts +0 -101
- package/types/events.d.ts +0 -7
- package/types/helper/data_insertion.d.ts +0 -4
- package/types/helper/presetup_services.d.ts +0 -5
- package/types/index.d.ts +0 -72
- package/types/middlewares.d.ts +0 -10
- package/types/services/data_provider/router.d.ts +0 -3
- package/types/services/data_provider/service.d.ts +0 -40
- package/types/services/data_provider/typeCasters.d.ts +0 -3
- package/types/services/file/db.d.ts +0 -3
- package/types/services/file/router.d.ts +0 -3
- package/types/services/file/service.d.ts +0 -81
- package/types/services/functions/router.d.ts +0 -3
- package/types/services/functions/service.d.ts +0 -23
- package/types/services/jwt/router.d.ts +0 -3
- package/types/services/jwt/service.d.ts +0 -10
- package/types/services/user_manager/db.d.ts +0 -3
- package/types/services/user_manager/permissionManager.d.ts +0 -3
- package/types/services/user_manager/router.d.ts +0 -3
- package/types/services/user_manager/service.d.ts +0 -131
|
@@ -1,552 +0,0 @@
|
|
|
1
|
-
let { AccessTypes } = require("./../../class/security");
|
|
2
|
-
let Router = require("koa-router");
|
|
3
|
-
let validateObject = require("../../class/validator");
|
|
4
|
-
let reply = require("../../class/reply").create;
|
|
5
|
-
var nestedProperty = require("nested-property");
|
|
6
|
-
|
|
7
|
-
//let Types = require('./types.js');
|
|
8
|
-
|
|
9
|
-
let name = "data-provider";
|
|
10
|
-
|
|
11
|
-
let service = require("./service");
|
|
12
|
-
let middleware = require("./../../middlewares");
|
|
13
|
-
|
|
14
|
-
let dataProvider = new Router();
|
|
15
|
-
|
|
16
|
-
dataProvider.use("/", middleware.auth, async (ctx, next) => {
|
|
17
|
-
let body = ctx.request.body;
|
|
18
|
-
let bodyValidated = validateObject(body, "database collection");
|
|
19
|
-
|
|
20
|
-
// fields validation
|
|
21
|
-
if (!bodyValidated.isValid) {
|
|
22
|
-
ctx.throw(
|
|
23
|
-
412,
|
|
24
|
-
JSON.stringify(reply("e", { error: bodyValidated.requires }))
|
|
25
|
-
);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
// type caster
|
|
29
|
-
if (body.types && body.hasOwnProperty(body.bodyKey || ".")) {
|
|
30
|
-
let bodyKey = body.bodyKey;
|
|
31
|
-
for (const key in body.types) {
|
|
32
|
-
if (
|
|
33
|
-
body.types.hasOwnProperty(key) &&
|
|
34
|
-
typeof body.types[key] == "object"
|
|
35
|
-
) {
|
|
36
|
-
let typeDetail = body.types[key];
|
|
37
|
-
|
|
38
|
-
try {
|
|
39
|
-
let value = nestedProperty.get(body[bodyKey], typeDetail.path);
|
|
40
|
-
let newProperty = service.TypeCasters[typeDetail.type](value);
|
|
41
|
-
nestedProperty.set(body[bodyKey], typeDetail.path, newProperty);
|
|
42
|
-
console.log(
|
|
43
|
-
"newProperty",
|
|
44
|
-
newProperty,
|
|
45
|
-
JSON.stringify(body[bodyKey])
|
|
46
|
-
);
|
|
47
|
-
} catch (e) {
|
|
48
|
-
console.log("type caster error", e);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
await next();
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
dataProvider.post("/find", async (ctx) => {
|
|
58
|
-
let body = ctx.request.body;
|
|
59
|
-
let bodyValidate = validateObject(body, "database collection query");
|
|
60
|
-
|
|
61
|
-
// fields validation
|
|
62
|
-
if (!bodyValidate.isValid) {
|
|
63
|
-
ctx.throw(
|
|
64
|
-
412,
|
|
65
|
-
JSON.stringify(reply("e", { error: bodyValidate.requires }))
|
|
66
|
-
);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// access validation
|
|
70
|
-
let hasAccess = service.checkAccess(
|
|
71
|
-
body.database,
|
|
72
|
-
body.collection,
|
|
73
|
-
AccessTypes.read,
|
|
74
|
-
body.query,
|
|
75
|
-
ctx.state.user
|
|
76
|
-
);
|
|
77
|
-
if (!hasAccess) {
|
|
78
|
-
console.log(body);
|
|
79
|
-
console.log(ctx.state.user.permission);
|
|
80
|
-
ctx.throw(403, "access denied");
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// collection validation
|
|
84
|
-
let collection = service.getCollection(body.database, body.collection);
|
|
85
|
-
if (collection == null) {
|
|
86
|
-
ctx.throw(
|
|
87
|
-
412,
|
|
88
|
-
JSON.stringify(reply("e", { error: "wrong database or collection" }))
|
|
89
|
-
);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// operate on db
|
|
93
|
-
let queryRequest = collection.find(body.query, body.projection);
|
|
94
|
-
|
|
95
|
-
if (body.options) {
|
|
96
|
-
queryRequest = service.performAdditionalOptionsToQueryObject(
|
|
97
|
-
queryRequest,
|
|
98
|
-
body.options
|
|
99
|
-
);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
if (body.populates) {
|
|
103
|
-
try {
|
|
104
|
-
req = service.performPopulateToQueryObject(queryRequest, body.populates);
|
|
105
|
-
} catch (err) {
|
|
106
|
-
ctx.status = 412;
|
|
107
|
-
ctx.body = err;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
await queryRequest
|
|
112
|
-
.exec()
|
|
113
|
-
.then(async (docs) => {
|
|
114
|
-
// Call trigger
|
|
115
|
-
service.triggers.call("find", body.database, body.collection, {
|
|
116
|
-
query: body.query,
|
|
117
|
-
queryResult: docs,
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
ctx.body = { data: docs };
|
|
121
|
-
})
|
|
122
|
-
.catch((err) => {
|
|
123
|
-
ctx.status = err.status || 500;
|
|
124
|
-
ctx.body = err.message;
|
|
125
|
-
});
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
dataProvider.post("/find-one", async (ctx) => {
|
|
129
|
-
let body = ctx.request.body;
|
|
130
|
-
let bodyValidate = validateObject(body, "database collection query");
|
|
131
|
-
|
|
132
|
-
// fields validation
|
|
133
|
-
if (!bodyValidate.isValid) {
|
|
134
|
-
ctx.throw(
|
|
135
|
-
JSON.stringify(reply("e", { error: bodyValidate.requires })),
|
|
136
|
-
412
|
|
137
|
-
);
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
// access validation
|
|
141
|
-
let hasAccess = service.checkAccess(
|
|
142
|
-
body.database,
|
|
143
|
-
body.collection,
|
|
144
|
-
AccessTypes.read,
|
|
145
|
-
body.query,
|
|
146
|
-
ctx.state.user
|
|
147
|
-
);
|
|
148
|
-
if (!hasAccess) ctx.throw(403, "access denied");
|
|
149
|
-
|
|
150
|
-
// collection validation
|
|
151
|
-
let collection = service.getCollection(body.database, body.collection);
|
|
152
|
-
if (collection == null) {
|
|
153
|
-
ctx.throw(
|
|
154
|
-
JSON.stringify(reply("e", { error: "wrong database or collection" })),
|
|
155
|
-
412
|
|
156
|
-
);
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
// operate on db
|
|
160
|
-
let queryRequest = collection.findOne(
|
|
161
|
-
body.query,
|
|
162
|
-
body.projection,
|
|
163
|
-
body.options
|
|
164
|
-
);
|
|
165
|
-
|
|
166
|
-
if (body.options) {
|
|
167
|
-
queryRequest = service.performAdditionalOptionsToQueryObject(
|
|
168
|
-
queryRequest,
|
|
169
|
-
body.options
|
|
170
|
-
);
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
if (body.populates) {
|
|
174
|
-
try {
|
|
175
|
-
req = service.performPopulateToQueryObject(queryRequest, body.populates);
|
|
176
|
-
} catch (err) {
|
|
177
|
-
ctx.status = 412;
|
|
178
|
-
ctx.body = err;
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
// operate on db
|
|
183
|
-
await queryRequest
|
|
184
|
-
.exec()
|
|
185
|
-
.then(async (doc) => {
|
|
186
|
-
// Call trigger
|
|
187
|
-
service.triggers.call("find-one", body.database, body.collection, {
|
|
188
|
-
query: body.query,
|
|
189
|
-
queryResult: doc,
|
|
190
|
-
});
|
|
191
|
-
|
|
192
|
-
ctx.body = { data: doc };
|
|
193
|
-
})
|
|
194
|
-
.catch((err) => {
|
|
195
|
-
ctx.status = err.status || 500;
|
|
196
|
-
ctx.body = err.message;
|
|
197
|
-
});
|
|
198
|
-
});
|
|
199
|
-
|
|
200
|
-
dataProvider.post("/count", async (ctx) => {
|
|
201
|
-
let body = ctx.request.body;
|
|
202
|
-
let bodyValidate = validateObject(body, "database collection query");
|
|
203
|
-
|
|
204
|
-
// fields validation
|
|
205
|
-
if (!bodyValidate.isValid) {
|
|
206
|
-
ctx.throw(
|
|
207
|
-
JSON.stringify(reply("e", { error: bodyValidate.requires })),
|
|
208
|
-
412
|
|
209
|
-
);
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
// access validation
|
|
213
|
-
let hasAccess = service.checkAccess(
|
|
214
|
-
body.database,
|
|
215
|
-
body.collection,
|
|
216
|
-
AccessTypes.read,
|
|
217
|
-
body.query,
|
|
218
|
-
ctx.state.user
|
|
219
|
-
);
|
|
220
|
-
if (!hasAccess) ctx.throw(403, "access denied");
|
|
221
|
-
|
|
222
|
-
// collection validation
|
|
223
|
-
let collection = service.getCollection(body.database, body.collection);
|
|
224
|
-
if (collection == null) {
|
|
225
|
-
ctx.throw(
|
|
226
|
-
JSON.stringify(reply("e", { error: "wrong database or collection" })),
|
|
227
|
-
412
|
|
228
|
-
);
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
// operate on db
|
|
232
|
-
await collection
|
|
233
|
-
.countDocuments(body.query)
|
|
234
|
-
.exec()
|
|
235
|
-
.then((count) => {
|
|
236
|
-
// Call trigger
|
|
237
|
-
service.triggers.call("count", body.database, body.collection, {
|
|
238
|
-
query: body.query,
|
|
239
|
-
queryResult: count,
|
|
240
|
-
});
|
|
241
|
-
|
|
242
|
-
ctx.body = { data: count };
|
|
243
|
-
})
|
|
244
|
-
.catch((err) => {
|
|
245
|
-
ctx.status = err.status || 500;
|
|
246
|
-
ctx.body = err.message;
|
|
247
|
-
});
|
|
248
|
-
});
|
|
249
|
-
|
|
250
|
-
dataProvider.post("/update-one", async (ctx) => {
|
|
251
|
-
let body = ctx.request.body;
|
|
252
|
-
let bodyValidate = validateObject(body, "database collection query update");
|
|
253
|
-
|
|
254
|
-
// fields validation
|
|
255
|
-
if (!bodyValidate.isValid) {
|
|
256
|
-
ctx.throw(
|
|
257
|
-
JSON.stringify(reply("e", { error: bodyValidate.requires })),
|
|
258
|
-
412
|
|
259
|
-
);
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
// access validation
|
|
263
|
-
let hasAccess = service.checkAccess(
|
|
264
|
-
body.database,
|
|
265
|
-
body.collection,
|
|
266
|
-
AccessTypes.write,
|
|
267
|
-
body.query,
|
|
268
|
-
ctx.state.user
|
|
269
|
-
);
|
|
270
|
-
if (!hasAccess) ctx.throw(403, "access denied");
|
|
271
|
-
|
|
272
|
-
// collection validation
|
|
273
|
-
let collection = service.getCollection(body.database, body.collection);
|
|
274
|
-
if (collection == null) {
|
|
275
|
-
ctx.throw(
|
|
276
|
-
JSON.stringify(reply("e", { error: "wrong database or collection" })),
|
|
277
|
-
412
|
|
278
|
-
);
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
// get removing doc as output for triggers
|
|
282
|
-
let output = await collection.findOne(body.query).exec().then();
|
|
283
|
-
|
|
284
|
-
// operate on db
|
|
285
|
-
await collection
|
|
286
|
-
.updateOne(body.query, body.update, body.options)
|
|
287
|
-
.exec()
|
|
288
|
-
.then((writeOpResult) => {
|
|
289
|
-
// Call trigger
|
|
290
|
-
service.triggers.call("update-one", body.database, body.collection, {
|
|
291
|
-
query: body.query,
|
|
292
|
-
queryResult: writeOpResult,
|
|
293
|
-
});
|
|
294
|
-
|
|
295
|
-
ctx.body = { data: writeOpResult };
|
|
296
|
-
})
|
|
297
|
-
.catch((err) => {
|
|
298
|
-
ctx.status = err.status || 500;
|
|
299
|
-
ctx.body = err.message;
|
|
300
|
-
});
|
|
301
|
-
});
|
|
302
|
-
|
|
303
|
-
dataProvider.post("/insert-one", async (ctx) => {
|
|
304
|
-
let body = ctx.request.body;
|
|
305
|
-
let bodyValidate = validateObject(body, "database collection doc");
|
|
306
|
-
|
|
307
|
-
// fields validation
|
|
308
|
-
if (!bodyValidate.isValid) {
|
|
309
|
-
ctx.throw(
|
|
310
|
-
JSON.stringify(reply("e", { error: bodyValidate.requires })),
|
|
311
|
-
412
|
|
312
|
-
);
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
// access validation
|
|
316
|
-
let hasAccess = service.checkAccess(
|
|
317
|
-
body.database,
|
|
318
|
-
body.collection,
|
|
319
|
-
AccessTypes.write,
|
|
320
|
-
body.doc,
|
|
321
|
-
ctx.state.user
|
|
322
|
-
);
|
|
323
|
-
if (!hasAccess) {
|
|
324
|
-
console.log(body);
|
|
325
|
-
console.log(ctx.state.user.permission);
|
|
326
|
-
ctx.throw(403, "access denied");
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
// collection validation
|
|
330
|
-
let collection = service.getCollection(body.database, body.collection);
|
|
331
|
-
if (collection == null) {
|
|
332
|
-
ctx.throw(
|
|
333
|
-
JSON.stringify(reply("e", { error: "wrong database or collection" })),
|
|
334
|
-
412
|
|
335
|
-
);
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
// operate on db
|
|
339
|
-
await new collection(body.doc)
|
|
340
|
-
.save()
|
|
341
|
-
.then(async (newDoc) => {
|
|
342
|
-
// Call trigger
|
|
343
|
-
service.triggers.call("insert-one", body.database, body.collection, {
|
|
344
|
-
query: body.query,
|
|
345
|
-
queryResult: newDoc,
|
|
346
|
-
});
|
|
347
|
-
|
|
348
|
-
ctx.body = { data: newDoc };
|
|
349
|
-
})
|
|
350
|
-
.catch((err) => {
|
|
351
|
-
ctx.status = err.status || 500;
|
|
352
|
-
ctx.body = err.message;
|
|
353
|
-
});
|
|
354
|
-
});
|
|
355
|
-
|
|
356
|
-
dataProvider.post("/remove-one", async (ctx) => {
|
|
357
|
-
let body = ctx.request.body;
|
|
358
|
-
let bodyValidate = validateObject(body, "database collection query");
|
|
359
|
-
|
|
360
|
-
// fields validation
|
|
361
|
-
if (!bodyValidate.isValid) {
|
|
362
|
-
ctx.throw(
|
|
363
|
-
JSON.stringify(reply("e", { error: bodyValidate.requires })),
|
|
364
|
-
412
|
|
365
|
-
);
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
// access validation
|
|
369
|
-
let hasAccess = service.checkAccess(
|
|
370
|
-
body.database,
|
|
371
|
-
body.collection,
|
|
372
|
-
AccessTypes.write,
|
|
373
|
-
body.query,
|
|
374
|
-
ctx.state.user
|
|
375
|
-
);
|
|
376
|
-
if (!hasAccess) ctx.throw(403, "access denied");
|
|
377
|
-
|
|
378
|
-
// collection validation
|
|
379
|
-
let collection = service.getCollection(body.database, body.collection);
|
|
380
|
-
if (collection == null) {
|
|
381
|
-
ctx.throw(
|
|
382
|
-
JSON.stringify(reply("e", { error: "wrong database or collection" })),
|
|
383
|
-
412
|
|
384
|
-
);
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
// get removing doc as output for triggers
|
|
388
|
-
let output = await collection.findOne(body.query).exec().then();
|
|
389
|
-
|
|
390
|
-
// operate on db
|
|
391
|
-
await collection
|
|
392
|
-
.deleteOne(body.query)
|
|
393
|
-
.exec()
|
|
394
|
-
.then(async (result) => {
|
|
395
|
-
// Call trigger
|
|
396
|
-
service.triggers.call("remove-one", body.database, body.collection, {
|
|
397
|
-
query: body.query,
|
|
398
|
-
queryResult: result,
|
|
399
|
-
});
|
|
400
|
-
|
|
401
|
-
ctx.body = { data: result };
|
|
402
|
-
})
|
|
403
|
-
.catch((err) => {
|
|
404
|
-
ctx.status = err.status || 500;
|
|
405
|
-
ctx.body = err.message;
|
|
406
|
-
});
|
|
407
|
-
});
|
|
408
|
-
|
|
409
|
-
dataProvider.post("/aggregate", async (ctx) => {
|
|
410
|
-
let body = ctx.request.body;
|
|
411
|
-
let bodyValidate = validateObject(body, "database collection accessQuery");
|
|
412
|
-
|
|
413
|
-
// fields validation
|
|
414
|
-
if (!bodyValidate.isValid) {
|
|
415
|
-
ctx.throw(
|
|
416
|
-
JSON.stringify(reply("e", { error: bodyValidate.requires })),
|
|
417
|
-
412
|
|
418
|
-
);
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
// access validation
|
|
422
|
-
let hasAccess = service.checkAccess(
|
|
423
|
-
body.database,
|
|
424
|
-
body.collection,
|
|
425
|
-
AccessTypes.read,
|
|
426
|
-
body.accessQuery,
|
|
427
|
-
ctx.state.user
|
|
428
|
-
);
|
|
429
|
-
if (!hasAccess) ctx.throw(403, "access denied");
|
|
430
|
-
|
|
431
|
-
// collection validation
|
|
432
|
-
let collection = service.getCollection(body.database, body.collection);
|
|
433
|
-
if (collection == null) {
|
|
434
|
-
ctx.throw(
|
|
435
|
-
JSON.stringify(reply("e", { error: "wrong database or collection" })),
|
|
436
|
-
412
|
|
437
|
-
);
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
// operate on db
|
|
441
|
-
await collection
|
|
442
|
-
.aggregate(body.pipelines)
|
|
443
|
-
.exec()
|
|
444
|
-
.then(async (result) => {
|
|
445
|
-
// Call trigger
|
|
446
|
-
service.triggers.call("aggregate", body.database, body.collection, {
|
|
447
|
-
query: body.query,
|
|
448
|
-
queryResult: result,
|
|
449
|
-
});
|
|
450
|
-
|
|
451
|
-
ctx.body = { data: result };
|
|
452
|
-
})
|
|
453
|
-
.catch((err) => {
|
|
454
|
-
ctx.status = err.status || 500;
|
|
455
|
-
ctx.body = err.message;
|
|
456
|
-
});
|
|
457
|
-
});
|
|
458
|
-
|
|
459
|
-
dataProvider.post("/findByIds", async (ctx, next) => {
|
|
460
|
-
let body = ctx.request.body;
|
|
461
|
-
let bodyValidate = validateObject(body, "database collection ids");
|
|
462
|
-
|
|
463
|
-
// fields validation
|
|
464
|
-
if (!bodyValidate.isValid) {
|
|
465
|
-
ctx.throw(
|
|
466
|
-
JSON.stringify(reply("e", { error: bodyValidate.requires })),
|
|
467
|
-
412
|
|
468
|
-
);
|
|
469
|
-
}
|
|
470
|
-
|
|
471
|
-
// access validation
|
|
472
|
-
let hasAccess = service.checkAccess(
|
|
473
|
-
body.database,
|
|
474
|
-
body.collection,
|
|
475
|
-
AccessTypes.read,
|
|
476
|
-
body.accessQuery || {},
|
|
477
|
-
ctx.state.user
|
|
478
|
-
);
|
|
479
|
-
if (!hasAccess) ctx.throw(403, "access denied");
|
|
480
|
-
|
|
481
|
-
// collection validation
|
|
482
|
-
let collection = service.getCollection(body.database, body.collection);
|
|
483
|
-
if (collection == null) {
|
|
484
|
-
ctx.throw(
|
|
485
|
-
JSON.stringify(reply("e", { error: "wrong database or collection" })),
|
|
486
|
-
412
|
|
487
|
-
);
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
let or = [];
|
|
491
|
-
|
|
492
|
-
try {
|
|
493
|
-
body.ids.forEach((id) => {
|
|
494
|
-
let castedid = service.getAsID(id);
|
|
495
|
-
or.push({ _id: castedid });
|
|
496
|
-
});
|
|
497
|
-
} catch (e) {
|
|
498
|
-
console.log("ids.forEach", e);
|
|
499
|
-
}
|
|
500
|
-
|
|
501
|
-
let pipelines = [
|
|
502
|
-
{
|
|
503
|
-
$match: { $or: or },
|
|
504
|
-
},
|
|
505
|
-
// {
|
|
506
|
-
// $sort: body.sort || { _id: 1 }
|
|
507
|
-
// }
|
|
508
|
-
];
|
|
509
|
-
|
|
510
|
-
// operate on db
|
|
511
|
-
await collection
|
|
512
|
-
.aggregate(pipelines)
|
|
513
|
-
.exec()
|
|
514
|
-
.then(async (result) => {
|
|
515
|
-
ctx.state = { data: result };
|
|
516
|
-
await next();
|
|
517
|
-
})
|
|
518
|
-
.catch((err) => {
|
|
519
|
-
ctx.status = err.status || 500;
|
|
520
|
-
ctx.body = err.message;
|
|
521
|
-
});
|
|
522
|
-
});
|
|
523
|
-
|
|
524
|
-
dataProvider.use("/", async (ctx, next) => {
|
|
525
|
-
// this event is responsible to covert whole mongoose doc to json form
|
|
526
|
-
// inclouding getters, public propertise
|
|
527
|
-
// each mongoose doc must have a "toJson" method being defined on its own Schema.
|
|
528
|
-
|
|
529
|
-
let state = ctx.state;
|
|
530
|
-
// let result;
|
|
531
|
-
|
|
532
|
-
// // array
|
|
533
|
-
// if(!isNaN(state.length)) {
|
|
534
|
-
// result = [];
|
|
535
|
-
|
|
536
|
-
// for (let index = 0; index < state.length; index++) {
|
|
537
|
-
// const element = state[index];
|
|
538
|
-
// if(element.hasOwnProperty('toJson'))
|
|
539
|
-
// result.push(element.toJson());
|
|
540
|
-
// else result.push(element);
|
|
541
|
-
// }
|
|
542
|
-
// }
|
|
543
|
-
// // object
|
|
544
|
-
// else {
|
|
545
|
-
// result = state.toJson();
|
|
546
|
-
// }
|
|
547
|
-
|
|
548
|
-
ctx.body = state;
|
|
549
|
-
});
|
|
550
|
-
|
|
551
|
-
module.exports.name = name;
|
|
552
|
-
module.exports.main = dataProvider;
|