@yongdall/api-model 0.4.0 → 0.5.0
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/package.json +8 -8
- package/routers.yongdall.mjs +108 -51
- package/routers.yongdall.mjs.map +1 -1
- package/yongdall.plugin.yml +1 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yongdall/api-model",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./index.mjs",
|
|
6
6
|
"exports": {
|
|
@@ -11,14 +11,14 @@
|
|
|
11
11
|
"author": "",
|
|
12
12
|
"license": "ISC",
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"@yongdall/common": "^0.
|
|
15
|
-
"@yongdall/context": "^0.
|
|
16
|
-
"@yongdall/core": "^0.
|
|
17
|
-
"@yongdall/model": "^0.
|
|
18
|
-
"@yongdall/connection": "^0.
|
|
19
|
-
"@yongdall/http": "^0.
|
|
14
|
+
"@yongdall/common": "^0.5.0",
|
|
15
|
+
"@yongdall/context": "^0.5.0",
|
|
16
|
+
"@yongdall/core": "^0.5.0",
|
|
17
|
+
"@yongdall/model": "^0.5.0",
|
|
18
|
+
"@yongdall/connection": "^0.5.0",
|
|
19
|
+
"@yongdall/http": "^0.5.0"
|
|
20
20
|
},
|
|
21
21
|
"devDependencies": {
|
|
22
|
-
"@yongdall/types": "^0.
|
|
22
|
+
"@yongdall/types": "^0.5.0"
|
|
23
23
|
}
|
|
24
24
|
}
|
package/routers.yongdall.mjs
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { a as useModelId, i as useModel, n as useDocument, r as modelId, t as documentId } from "./useDocument-Bsmiy9SB.mjs";
|
|
2
2
|
import { Search, getPatternFields, runPattern, yieldPermissionConstraintFields } from "@yongdall/common";
|
|
3
3
|
import { Query, Where, getLabelPattern, getModelOptions } from "@yongdall/model";
|
|
4
|
-
import { ApiRouter, Param, e404, enumRouter, useBody } from "@yongdall/http";
|
|
4
|
+
import { ApiRouter, Param, e404, enumRouter, k99Context, useBody } from "@yongdall/http";
|
|
5
|
+
import { createStore } from "@yongdall/context";
|
|
5
6
|
import { useDatabase } from "@yongdall/connection";
|
|
6
|
-
import { createPermissionMatches, filterPermissionDocument, filterPermissionUpdate, getModel, getModelAuthorizationPermissions, search2where, testPermissions, toDocumentFields } from "@yongdall/core";
|
|
7
|
+
import { createPermissionMatches, filterPermissionDocument, filterPermissionUpdate, getModel, getModelAuthorizationPermissions, getModelPermissions, search2where, testPermissions, toDocumentFields } from "@yongdall/core";
|
|
7
8
|
|
|
8
9
|
//#region api/api-model/utils.mjs
|
|
9
10
|
/** @import { ModelTable, TableDefine } from '@yongdall/model'*/
|
|
@@ -90,15 +91,49 @@ async function loadDocumentsLabel(list, model) {
|
|
|
90
91
|
await Promise.all(promises);
|
|
91
92
|
}
|
|
92
93
|
|
|
94
|
+
//#endregion
|
|
95
|
+
//#region api/api-model/routers/useModelService.mjs
|
|
96
|
+
/** @import { ModelService } from '@yongdall/types' */
|
|
97
|
+
const modelServiceParam = new Param();
|
|
98
|
+
const [getter, setter] = createStore(null);
|
|
99
|
+
/**
|
|
100
|
+
*
|
|
101
|
+
* @returns {Promise<[ModelService, string]?>}
|
|
102
|
+
*/
|
|
103
|
+
async function loadModelService() {
|
|
104
|
+
const ctx = k99Context();
|
|
105
|
+
if (!ctx) return null;
|
|
106
|
+
const serviceId = modelServiceParam.param(ctx) || "";
|
|
107
|
+
if (!serviceId) return null;
|
|
108
|
+
const modelId = await useModelId();
|
|
109
|
+
const model = await getModel("modelService");
|
|
110
|
+
if (!model) return null;
|
|
111
|
+
const database = useDatabase(model.databaseId);
|
|
112
|
+
let sql = new Query(model, true).where("id", serviceId);
|
|
113
|
+
const modelField = model.fields.model;
|
|
114
|
+
if (modelField && typeof modelField.type === "string" && !modelField.array) sql = sql.where(modelField.column || "model", modelId);
|
|
115
|
+
const service = await database.first(sql);
|
|
116
|
+
if (!service) return null;
|
|
117
|
+
return [service, serviceId];
|
|
118
|
+
}
|
|
119
|
+
function useModelService() {
|
|
120
|
+
let s = getter();
|
|
121
|
+
if (!s) {
|
|
122
|
+
s = loadModelService();
|
|
123
|
+
setter(s);
|
|
124
|
+
}
|
|
125
|
+
return s.then((v) => v?.[0] || null);
|
|
126
|
+
}
|
|
127
|
+
|
|
93
128
|
//#endregion
|
|
94
129
|
//#region api/api-model/routers/model.documents.mjs
|
|
95
130
|
const documentsRouter = new ApiRouter();
|
|
96
131
|
documentsRouter.get(async function(ctx) {
|
|
97
132
|
const model = await useModel();
|
|
98
133
|
const modelId = await useModelId();
|
|
99
|
-
if (!model || !modelId) return e404(
|
|
100
|
-
const permissions = await getModelAuthorizationPermissions(modelId, "query");
|
|
101
|
-
if (!permissions?.length) return e404(
|
|
134
|
+
if (!model || !modelId) return e404();
|
|
135
|
+
const permissions = await getModelAuthorizationPermissions(modelId, "query", (await useModelService())?.permissionGroupId);
|
|
136
|
+
if (!permissions?.length) return e404();
|
|
102
137
|
const { sort, offset, limit, select, where, orWhere, or, primary, total: hasTotal } = Search.merge(Search.parse(ctx.url.search.slice(1)), await useBody() || {});
|
|
103
138
|
const permissionMatches = await createPermissionMatches(permissions);
|
|
104
139
|
let modelQuery = new Query(model, true).offset(offset).limit(limit);
|
|
@@ -124,19 +159,19 @@ documentsRouter.get(async function(ctx) {
|
|
|
124
159
|
documentsRouter.post(async (ctx) => {
|
|
125
160
|
const model = await useModel();
|
|
126
161
|
const modelId = await useModelId();
|
|
127
|
-
if (!model || !modelId) return e404(
|
|
128
|
-
const permissions = await getModelAuthorizationPermissions(modelId, "create");
|
|
129
|
-
if (!permissions?.length) return e404(
|
|
162
|
+
if (!model || !modelId) return e404();
|
|
163
|
+
const permissions = await getModelAuthorizationPermissions(modelId, "create", (await useModelService())?.permissionGroupId);
|
|
164
|
+
if (!permissions?.length) return e404();
|
|
130
165
|
const newDocument = (await useBody() || {}).document;
|
|
131
|
-
if (!newDocument) return e404(
|
|
166
|
+
if (!newDocument) return e404();
|
|
132
167
|
const document = await filterPermissionDocument(model, permissions, newDocument);
|
|
133
|
-
if (!document) return e404(
|
|
168
|
+
if (!document) return e404();
|
|
134
169
|
return await useDatabase(model.databaseId).create(model, document);
|
|
135
170
|
});
|
|
136
171
|
const documentRouter$1 = documentsRouter.route`${documentId}`();
|
|
137
172
|
documentRouter$1.guard(async (ctx) => {
|
|
138
173
|
if (await useDocument()) return;
|
|
139
|
-
return e404(
|
|
174
|
+
return e404();
|
|
140
175
|
});
|
|
141
176
|
documentRouter$1.route(enumRouter("documentApi"));
|
|
142
177
|
var model_documents_default = documentsRouter;
|
|
@@ -145,20 +180,18 @@ var model_documents_default = documentsRouter;
|
|
|
145
180
|
//#region api/api-model/routers/models.mjs
|
|
146
181
|
const modelsRouter = new ApiRouter();
|
|
147
182
|
const modelRouter = modelsRouter.route`${modelId}`();
|
|
148
|
-
async function loadPermissions() {
|
|
149
|
-
return {};
|
|
150
|
-
}
|
|
151
183
|
modelRouter.get(async function getDefine(ctx) {
|
|
152
|
-
const model = await useModel();
|
|
153
|
-
if (!model) return null;
|
|
184
|
+
const [model, modelId] = await Promise.all([useModel(), useModelId()]);
|
|
185
|
+
if (!modelId || !model) return null;
|
|
154
186
|
return {
|
|
155
187
|
...getModelOptions(model),
|
|
156
|
-
id:
|
|
188
|
+
id: modelId,
|
|
157
189
|
fields: toDocumentFields(model.fields),
|
|
158
|
-
|
|
190
|
+
permissions: await getModelPermissions(modelId) || []
|
|
159
191
|
};
|
|
160
192
|
});
|
|
161
193
|
modelRouter.route(enumRouter("modelApi"));
|
|
194
|
+
modelRouter.route(enumRouter("modelServiceApi"));
|
|
162
195
|
var models_default = modelsRouter;
|
|
163
196
|
|
|
164
197
|
//#endregion
|
|
@@ -167,23 +200,24 @@ const documentRouter = new ApiRouter();
|
|
|
167
200
|
documentRouter.get(async (ctx) => {
|
|
168
201
|
const model = await useModel();
|
|
169
202
|
const modelId = await useModelId();
|
|
170
|
-
if (!model || !modelId) return e404(
|
|
171
|
-
const readPermissions = await getModelAuthorizationPermissions(modelId, "read");
|
|
172
|
-
if (!readPermissions?.length) return e404(
|
|
203
|
+
if (!model || !modelId) return e404();
|
|
204
|
+
const readPermissions = await getModelAuthorizationPermissions(modelId, "read", (await useModelService())?.permissionGroupId);
|
|
205
|
+
if (!readPermissions?.length) return e404();
|
|
173
206
|
const document = await useDocument();
|
|
174
|
-
if (!document) return e404(
|
|
207
|
+
if (!document) return e404();
|
|
175
208
|
const doc = await filterPermissionDocument(model, readPermissions, document);
|
|
176
|
-
if (!doc) return e404(
|
|
209
|
+
if (!doc) return e404();
|
|
177
210
|
return { document: doc };
|
|
178
211
|
});
|
|
179
212
|
documentRouter.put(async (ctx) => {
|
|
180
213
|
const model = await useModel();
|
|
181
214
|
const modelId = await useModelId();
|
|
182
|
-
if (!model || !modelId) return e404(
|
|
183
|
-
const
|
|
184
|
-
|
|
215
|
+
if (!model || !modelId) return e404();
|
|
216
|
+
const modelService = await useModelService();
|
|
217
|
+
const updatePermissions = await getModelAuthorizationPermissions(modelId, "update", modelService?.permissionGroupId);
|
|
218
|
+
if (!updatePermissions?.length) return e404();
|
|
185
219
|
const document = await useDocument();
|
|
186
|
-
if (!document) return e404(
|
|
220
|
+
if (!document) return e404();
|
|
187
221
|
const data = await useBody();
|
|
188
222
|
if (!data) return;
|
|
189
223
|
const newValue = data.document;
|
|
@@ -191,35 +225,35 @@ documentRouter.put(async (ctx) => {
|
|
|
191
225
|
const newData = await filterPermissionUpdate(model, updatePermissions, document, newValue);
|
|
192
226
|
const result = newData && Object.keys(newData).length ? await useDatabase(model.databaseId).save(model, document, newData) : document;
|
|
193
227
|
if (!result) return {};
|
|
194
|
-
const readPermissions = await getModelAuthorizationPermissions(modelId, "read");
|
|
228
|
+
const readPermissions = await getModelAuthorizationPermissions(modelId, "read", modelService?.permissionGroupId);
|
|
195
229
|
if (!readPermissions?.length) return {};
|
|
196
230
|
return await filterPermissionDocument(model, readPermissions, result);
|
|
197
231
|
});
|
|
198
232
|
documentRouter.delete(async (ctx) => {
|
|
199
233
|
const model = await useModel();
|
|
200
234
|
const modelId = await useModelId();
|
|
201
|
-
if (!model || !modelId) return e404(
|
|
202
|
-
const permissions = await getModelAuthorizationPermissions(modelId, "read");
|
|
203
|
-
if (!permissions?.length) return e404(
|
|
235
|
+
if (!model || !modelId) return e404();
|
|
236
|
+
const permissions = await getModelAuthorizationPermissions(modelId, "read", (await useModelService())?.permissionGroupId);
|
|
237
|
+
if (!permissions?.length) return e404();
|
|
204
238
|
const document = await useDocument();
|
|
205
|
-
if (!document) return e404(
|
|
206
|
-
if (!await testPermissions(permissions, document)) return e404(
|
|
239
|
+
if (!document) return e404();
|
|
240
|
+
if (!await testPermissions(permissions, document)) return e404();
|
|
207
241
|
await useDatabase(model.databaseId).destroy(model, document).then(Boolean);
|
|
208
242
|
ctx.status = 204;
|
|
209
243
|
});
|
|
210
244
|
const fieldParam = new Param();
|
|
211
245
|
documentRouter.route`fields/${fieldParam}`().get(async (ctx) => {
|
|
212
246
|
const fieldName = fieldParam.param(ctx);
|
|
213
|
-
if (!fieldName) return e404(
|
|
247
|
+
if (!fieldName) return e404();
|
|
214
248
|
const model = await useModel();
|
|
215
249
|
const modelId = await useModelId();
|
|
216
|
-
if (!model || !modelId) return e404(
|
|
250
|
+
if (!model || !modelId) return e404();
|
|
217
251
|
const { fields } = model;
|
|
218
|
-
if (!Object.hasOwn(fields, fieldName)) return e404(
|
|
252
|
+
if (!Object.hasOwn(fields, fieldName)) return e404();
|
|
219
253
|
const field = fields[fieldName];
|
|
220
|
-
if (!field) return e404(
|
|
221
|
-
const readPermissions = await getModelAuthorizationPermissions(modelId, "read");
|
|
222
|
-
if (!readPermissions?.length) return e404(
|
|
254
|
+
if (!field) return e404();
|
|
255
|
+
const readPermissions = await getModelAuthorizationPermissions(modelId, "read", (await useModelService())?.permissionGroupId);
|
|
256
|
+
if (!readPermissions?.length) return e404();
|
|
223
257
|
if (readPermissions) {
|
|
224
258
|
const group = field.group;
|
|
225
259
|
if (!readPermissions.find((v) => {
|
|
@@ -227,13 +261,13 @@ documentRouter.route`fields/${fieldParam}`().get(async (ctx) => {
|
|
|
227
261
|
if (field === fieldName || field === "*" || Array.isArray(field) && (field.includes(fieldName) || field.includes("*"))) return true;
|
|
228
262
|
if (!group || v.group) return false;
|
|
229
263
|
if (v.group === group || Array.isArray(v.group) && v.group.includes(group)) return true;
|
|
230
|
-
})) return e404(
|
|
264
|
+
})) return e404();
|
|
231
265
|
}
|
|
232
266
|
const document = await useDocument();
|
|
233
|
-
if (!document) return e404(
|
|
267
|
+
if (!document) return e404();
|
|
234
268
|
const doc = await filterPermissionDocument(model, readPermissions, document);
|
|
235
|
-
if (!doc) return e404(
|
|
236
|
-
if (!Object.hasOwn(doc, fieldName)) return e404(
|
|
269
|
+
if (!doc) return e404();
|
|
270
|
+
if (!Object.hasOwn(doc, fieldName)) return e404();
|
|
237
271
|
return { value: doc[fieldName] };
|
|
238
272
|
});
|
|
239
273
|
documentRouter.route`values`();
|
|
@@ -246,9 +280,9 @@ const optionsRouter = new ApiRouter();
|
|
|
246
280
|
optionsRouter.get(async function(ctx) {
|
|
247
281
|
const model = await useModel();
|
|
248
282
|
const modelId = await useModelId();
|
|
249
|
-
if (!model || !modelId) return e404(
|
|
283
|
+
if (!model || !modelId) return e404();
|
|
250
284
|
const permissions = await getModelAuthorizationPermissions(modelId, "options");
|
|
251
|
-
if (!permissions?.length) return e404(
|
|
285
|
+
if (!permissions?.length) return e404();
|
|
252
286
|
const { sort, offset, limit, select, where, orWhere, or, primary, total: hasTotal } = Search.merge(Search.parse(ctx.url.search.slice(1)), await useBody() || {});
|
|
253
287
|
const permissionMatches = await createPermissionMatches(permissions);
|
|
254
288
|
let modelQuery = new Query(model, true).offset(offset).limit(limit);
|
|
@@ -274,26 +308,49 @@ optionsRouter.get(async function(ctx) {
|
|
|
274
308
|
optionsRouter.get`${documentId}`(async (ctx) => {
|
|
275
309
|
const model = await useModel();
|
|
276
310
|
const modelId = await useModelId();
|
|
277
|
-
if (!model || !modelId) return e404(
|
|
311
|
+
if (!model || !modelId) return e404();
|
|
278
312
|
const permissions = await getModelAuthorizationPermissions(modelId, "options");
|
|
279
|
-
if (!permissions?.length) return e404(
|
|
313
|
+
if (!permissions?.length) return e404();
|
|
280
314
|
const document = await useDocument();
|
|
281
|
-
if (!document) return e404(
|
|
315
|
+
if (!document) return e404();
|
|
282
316
|
const option = await filterPermissionDocument(model, permissions, document);
|
|
283
|
-
if (!option) return e404(
|
|
317
|
+
if (!option) return e404();
|
|
284
318
|
return { option };
|
|
285
319
|
});
|
|
286
320
|
var model_options_default = optionsRouter;
|
|
287
321
|
|
|
322
|
+
//#endregion
|
|
323
|
+
//#region api/api-model/routers/modelServices.mjs
|
|
324
|
+
const modelServicesRouter = new ApiRouter();
|
|
325
|
+
const modelServiceRouter = modelServicesRouter.route`${modelServiceParam}`();
|
|
326
|
+
modelServiceRouter.get(async function getDefine(ctx) {
|
|
327
|
+
const [model, modelId, modelService] = await Promise.all([
|
|
328
|
+
useModel(),
|
|
329
|
+
useModelId(),
|
|
330
|
+
useModelService()
|
|
331
|
+
]);
|
|
332
|
+
if (!modelId || !model || !modelService) return null;
|
|
333
|
+
return {
|
|
334
|
+
...getModelOptions(model),
|
|
335
|
+
id: modelId,
|
|
336
|
+
fields: toDocumentFields(model.fields),
|
|
337
|
+
permissions: await getModelPermissions(modelId, modelService?.permissionGroupId) || []
|
|
338
|
+
};
|
|
339
|
+
});
|
|
340
|
+
modelServiceRouter.route(enumRouter("modelApi"));
|
|
341
|
+
modelServiceRouter.route(enumRouter("modelServiceApi"));
|
|
342
|
+
var modelServices_default = modelServicesRouter;
|
|
343
|
+
|
|
288
344
|
//#endregion
|
|
289
345
|
//#region api/api-model/routers/index.mjs
|
|
290
346
|
const api = { models: models_default };
|
|
291
|
-
const modelApi = {
|
|
347
|
+
const modelApi = { services: modelServices_default };
|
|
348
|
+
const modelServiceApi = {
|
|
292
349
|
documents: model_documents_default,
|
|
293
350
|
options: model_options_default
|
|
294
351
|
};
|
|
295
352
|
const documentApi = { "": model_document_default };
|
|
296
353
|
|
|
297
354
|
//#endregion
|
|
298
|
-
export { api, documentApi, modelApi };
|
|
355
|
+
export { api, documentApi, modelApi, modelServiceApi };
|
|
299
356
|
//# sourceMappingURL=routers.yongdall.mjs.map
|
package/routers.yongdall.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routers.yongdall.mjs","names":["documentRouter","modelsRouter","documentsRouter","optionsRouter","documentRouter"],"sources":["../../api/api-model/utils.mjs","../../api/api-model/routers/model.documents.mjs","../../api/api-model/routers/models.mjs","../../api/api-model/routers/model.document.mjs","../../api/api-model/routers/model.options.mjs","../../api/api-model/routers/index.mjs"],"sourcesContent":["/** @import { ModelTable, TableDefine } from '@yongdall/model'*/\nimport { getPatternFields, runPattern } from '@yongdall/common';\nimport { Query, getLabelPattern, Where } from '@yongdall/model';\nimport { useDatabase } from '@yongdall/connection';\nimport { getModel } from '@yongdall/core';\n\n\n/**\n * \n * @param {[model: string, id: any, data: Record<string, any>, field: string][]} list\n * @param {TableDefine} model\n * @param {string?} [databaseId]\n */\nasync function loadDocumentLabel(list, model, databaseId) {\n\tconst labelPattern = getLabelPattern(model);\n\tif (!labelPattern) { return; }\n\tconst labelFields = getPatternFields(labelPattern);\n\tif (!labelFields.length) { return; }\n\tconst primaryFields = Object.entries(model.fields)\n\t\t.filter(([, v]) => v.primary)\n\t\t.sort(([, a], [, b]) => Number(a.primary) - Number(b.primary))\n\t\t.map(([v]) => v);\n\tif (!primaryFields.length) { return; }\n\tlet query = new Query(model, true);\n\tquery = query.select(primaryFields).select(labelFields);\n\tconst ids = [...new Set(list.map(([, id]) => id))];\n\tlet where = new Where();\n\tif (primaryFields.length === 1) {\n\t\tconst [field] = primaryFields;\n\t\twhere = where.and(field, 'in', ids);\n\t} else {\n\t\t/** @type {} */\n\t\tconst idsMap = [];\n\t\tids.map(v => `${v}`.split('$'));\n\t\tfor (const id of ids) {\n\t\t\tconst values = `${id}`.split('$');\n\t\t\tif (values.length !== primaryFields.length) { continue; }\n\t\t\tidsMap.push([values]);\n\t\t}\n\t\tif (!idsMap.length) { return; }\n\t\twhere = where.and(primaryFields, 'in', idsMap);\n\n\n\t}\n\tconst result = await useDatabase(databaseId).select(query.where(where));\n\tif (!result.length) { return; }\n\tconst labels = Object.fromEntries(result.map(v => [\n\t\tprimaryFields.map(f => v[f]).join('$'),\n\t\trunPattern(labelPattern, v)\n\t]));\n\tfor (const [, id, data, field] of list) {\n\t\tconst label = Object.hasOwn(labels, id) && labels[id];\n\t\tif (!label) { continue; }\n\t\tdata[`${field}~label`] = label;\n\t}\n}\n/**\n * \n * @param {(Record<string, any> | null)[]} list \n * @param {ModelTable} model \n */\nexport async function loadDocumentsLabel(list, model) {\n\t/** @type {[model: string, id: any, data: Record<string, any>, field: string][]} */\n\tconst setList = [];\n\t/** @type {[model: ModelTable, list: (Record<string, any> | null)[]][]} */\n\tconst queue = [[model, list]];\n\tfor (let line = queue.shift(); line; line = queue.shift()) {\n\t\tconst [model, list] = line;\n\t\tfor (const [name, field] of Object.entries(model.fields)) {\n\t\t\tconst type = field.type;\n\t\t\tif (!type) { continue; }\n\t\t\tif (typeof type === 'object') {\n\t\t\t\tqueue.push([type, list.flatMap(v => v?.[name] || [])]);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst modelName = field.model;\n\t\t\tif (!modelName) { continue; }\n\t\t\tfor (const item of list) {\n\t\t\t\tif (!item) { continue; }\n\t\t\t\tconst id = item[name];\n\t\t\t\tif (!id) { continue; }\n\t\t\t\tsetList.push([modelName, id, item, name]);\n\t\t\t}\n\t\t}\n\t}\n\tconst promises = [];\n\tfor (const [modelName, list] of Object.entries(Object.groupBy(setList, v => v[0]))) {\n\t\tif (!list) { continue; }\n\t\tpromises.push(\n\t\t\tgetModel(modelName)\n\t\t\t\t.then(model => model && loadDocumentLabel(list, model, model.databaseId)),\n\t\t);\n\t}\n\tawait Promise.all(promises);\n\n}\n","import { Search, yieldPermissionConstraintFields } from '@yongdall/common';\nimport { Query } from '@yongdall/model';\nimport { useBody, e404, enumRouter } from '@yongdall/http';\nimport { ApiRouter } from '@yongdall/http';\nimport useDocument, { documentId } from './useDocument.mjs';\nimport { useDatabase } from '@yongdall/connection';\nimport useModel, { useModelId } from './useModel.mjs';\nimport { createPermissionMatches, getModelAuthorizationPermissions, filterPermissionDocument, search2where } from '@yongdall/core';\nimport { loadDocumentsLabel } from '../utils.mjs';\n\nconst documentsRouter = new ApiRouter();\n\n\n\ndocumentsRouter.get(async function (ctx) {\n\tconst model = await useModel();\n\tconst modelId = await useModelId();\n\tif (!model || !modelId) { return e404(ctx); }\n\tconst permissions = await getModelAuthorizationPermissions(modelId, 'query');\n\tif (!permissions?.length) { return e404(ctx); }\n\tconst { sort, offset, limit, select, where, orWhere, or, primary, total: hasTotal } = Search.merge(\n\t\tSearch.parse(ctx.url.search.slice(1)),\n\t\tawait useBody() || {},\n\t);\n\n\tconst permissionMatches = await createPermissionMatches(permissions);\n\n\tlet modelQuery = new Query(model, true).offset(offset).limit(limit);\n\tif (permissionMatches) {\n\t\tmodelQuery = modelQuery.where(permissionMatches);\n\t}\n\tif (primary?.length) {\n\t\tmodelQuery = modelQuery.primary(primary);\n\t}\n\tconst searchWhere = await search2where(model.fields, where, orWhere, or);\n\tif (searchWhere) { modelQuery = modelQuery.where(searchWhere); }\n\n\tmodelQuery = modelQuery.sort();\n\tif (sort) { modelQuery = modelQuery.sort(...sort); }\n\tconst allFields = [\n\t\tselect || [],\n\t\tObject.entries(model.fields).filter(v => v[1].primary).map(v => v[0]),\n\t\tpermissionMatches && permissions.flatMap(v => [...yieldPermissionConstraintFields(v)]) || [],\n\t].flat();\n\n\tconst [result, total] = await useDatabase(model.databaseId).transaction(t => Promise.all([\n\t\tt.search(modelQuery, allFields),\n\t\thasTotal ? t.count(modelQuery) : -1,\n\t]));\n\n\tconst documents = await Promise.all(result.map(v => filterPermissionDocument(model, permissions, v)));\n\tawait loadDocumentsLabel(documents, model);\n\treturn { documents, total };\n});\n\ndocumentsRouter.post(async ctx => {\n\tconst model = await useModel();\n\tconst modelId = await useModelId();\n\tif (!model || !modelId) { return e404(ctx); }\n\tconst permissions = await getModelAuthorizationPermissions(modelId, 'create');\n\tif (!permissions?.length) { return e404(ctx); }\n\tconst data = await useBody() || {};\n\tconst newDocument = data.document;\n\tif (!newDocument) { return e404(ctx); }\n\tconst document = await filterPermissionDocument(model, permissions, newDocument);\n\tif (!document) { return e404(ctx); }\n\tconst doc = await useDatabase(model.databaseId).create(model, document);\n\treturn doc;\n});\n\nconst documentRouter = documentsRouter.route`${documentId}`();\ndocumentRouter.guard(async (ctx) => {\n\tconst doc = await useDocument();\n\tif (doc) { return; }\n\treturn e404(ctx);\n});\n\ndocumentRouter.route(enumRouter('documentApi'));\n\nexport default documentsRouter;\n","import { ApiRouter } from '@yongdall/http';\nimport { e404, enumRouter } from '@yongdall/http';\nimport {toDocumentFields} from '@yongdall/core';\nimport useModel, { modelId, useModelId } from './useModel.mjs';\nimport { getModelOptions } from '@yongdall/model';\n\n\n\nconst modelsRouter = new ApiRouter();\nconst modelRouter = modelsRouter.route`${modelId}`();\n\nasync function loadPermissions() {\n\treturn {};\n}\nmodelRouter.get(async function getDefine(ctx) {\n\tconst model = await useModel();\n\tif (!model) { return null; }\n\treturn {\n\t\t...getModelOptions(model),\n\t\tid: await useModelId() || '',\n\t\tfields: toDocumentFields(model.fields),\n\t\tpermission: await loadPermissions(),\n\t}\n});\nmodelRouter.route(enumRouter('modelApi'));\n\nexport default modelsRouter;\n","import { e404, Param, useBody } from '@yongdall/http';\nimport { ApiRouter } from '@yongdall/http';\nimport useDocument from './useDocument.mjs';\nimport { useDatabase } from '@yongdall/connection';\nimport useModel, { useModelId } from './useModel.mjs';\nimport { filterPermissionDocument, filterPermissionUpdate, getModelAuthorizationPermissions, testPermissions } from '@yongdall/core';\n\n\nconst documentRouter = new ApiRouter();\n\n\ndocumentRouter.get(async ctx => {\n\tconst model = await useModel();\n\tconst modelId = await useModelId();\n\tif (!model || !modelId) { return e404(ctx); }\n\tconst readPermissions = await getModelAuthorizationPermissions(modelId, 'read');\n\tif (!readPermissions?.length) { return e404(ctx); }\n\tconst document = await useDocument();\n\tif (!document) { return e404(ctx); }\n\tconst doc = await filterPermissionDocument(model, readPermissions, document);\n\tif (!doc) { return e404(ctx); }\n\treturn { document: doc };\n});\n\ndocumentRouter.put(async ctx => {\n\tconst model = await useModel();\n\tconst modelId = await useModelId();\n\tif (!model || !modelId) { return e404(ctx); }\n\tconst updatePermissions = await getModelAuthorizationPermissions(modelId, 'update');\n\tif (!updatePermissions?.length) { return e404(ctx); }\n\tconst document = await useDocument();\n\tif (!document) { return e404(ctx); }\n\tconst data = await useBody();\n\tif (!data) { return; }\n\tconst newValue = data.document;\n\tif (!newValue) { return; }\n\tconst newData = await filterPermissionUpdate(model, updatePermissions, document, newValue);\n\tconst result = newData && Object.keys(newData).length\n\t\t? await useDatabase(model.databaseId).save(model, document, newData)\n\t\t: document;\n\tif (!result) { return {}; }\n\tconst readPermissions = await getModelAuthorizationPermissions(modelId, 'read');\n\tif (!readPermissions?.length) { return {}; }\n\n\treturn await filterPermissionDocument(model, readPermissions, result);\n});\n\ndocumentRouter.delete(async ctx => {\n\tconst model = await useModel();\n\tconst modelId = await useModelId();\n\tif (!model || !modelId) { return e404(ctx); }\n\tconst permissions = await getModelAuthorizationPermissions(modelId, 'read');\n\tif (!permissions?.length) { return e404(ctx); }\n\tconst document = await useDocument();\n\tif (!document) { return e404(ctx); }\n\tif (!await testPermissions(permissions, document)) { return e404(ctx); }\n\tawait useDatabase(model.databaseId).destroy(model, document).then(Boolean);\n\tctx.status = 204;\n});\n\n\nconst fieldParam = new Param();\n\n// TODO: GET :field\n// TODO: POST :field\n// TODO: PUT :field\n// TODO: DELETE :field\nconst documentFieldsRouter = documentRouter.route`fields/${fieldParam}`();\ndocumentFieldsRouter.get(async ctx => {\n\tconst fieldName =fieldParam.param(ctx);\n\tif (!fieldName) { return e404(ctx); }\n\tconst model = await useModel();\n\tconst modelId = await useModelId();\n\tif (!model || !modelId) { return e404(ctx); }\n\tconst {fields} = model;\n\tif (!Object.hasOwn(fields, fieldName)) { return e404(ctx); }\n\tconst field = fields[fieldName];\n\tif (!field) { return e404(ctx) }\n\tconst readPermissions = await getModelAuthorizationPermissions(modelId, 'read');\n\tif (!readPermissions?.length) { return e404(ctx); }\n\tif (readPermissions) {\n\t\tconst group = field.group;\n\t\tif (!readPermissions.find(v => {\n\t\t\tconst field = v.fields;\n\t\t\tif (field === fieldName || field === '*' || Array.isArray(field) && (field.includes(fieldName) || field.includes('*'))) {return true; }\n\t\t\tif (!group || v.group) { return false; }\n\t\t\tif (v.group === group || Array.isArray(v.group) && v.group.includes(group)) {return true; }\n\t\t})) { return e404(ctx); }\n\t}\n\tconst document = await useDocument();\n\tif (!document) { return e404(ctx); }\n\tconst doc = await filterPermissionDocument(model, readPermissions, document);\n\tif (!doc) { return e404(ctx); }\n\tif (!Object.hasOwn(doc, fieldName)) { return e404(ctx); }\n\treturn { value: doc[fieldName] };\n\n})\n\n// TODO: GET :value\n// TODO: POST :value\n// TODO: PUT :value\n// TODO: DELETE :field\nconst documentValuesRouter = documentRouter.route`values`();\n\n// TODO: GET :dataset/records\n// TODO: POST :dataset/records\n// TODO: GET :dataset/records/:record\n// TODO: PUT :dataset/records/:record\n// TODO: DELETE :dataset/records/:record\nconst documentDatasetsRouter = documentRouter.route`datasets`();\n\n\n\n\nexport default documentRouter;\n","import { useBody } from '@yongdall/http';\nimport { Search, yieldPermissionConstraintFields } from '@yongdall/common';\nimport { Query } from '@yongdall/model';\nimport { ApiRouter } from '@yongdall/http';\nimport useDocument, { documentId } from './useDocument.mjs';\nimport { useDatabase } from '@yongdall/connection';\nimport useModel, { useModelId } from './useModel.mjs';\nimport { createPermissionMatches, getModelAuthorizationPermissions, filterPermissionDocument, search2where } from '@yongdall/core';\nimport { e404 } from '@yongdall/http';\nimport { loadDocumentsLabel } from '../utils.mjs';\n\n\n\n\nconst optionsRouter = new ApiRouter();\n\n\n\noptionsRouter.get(async function (ctx) {\n\tconst model = await useModel();\n\tconst modelId = await useModelId();\n\tif (!model || !modelId) { return e404(ctx); }\n\tconst permissions = await getModelAuthorizationPermissions(modelId, 'options');\n\tif (!permissions?.length) { return e404(ctx); }\n\tconst { sort, offset, limit, select, where, orWhere, or, primary, total: hasTotal } = Search.merge(\n\t\tSearch.parse(ctx.url.search.slice(1)),\n\t\tawait useBody() || {},\n\t);\n\n\tconst permissionMatches = await createPermissionMatches(permissions);\n\n\tlet modelQuery = new Query(model, true).offset(offset).limit(limit);\n\tif (permissionMatches) {\n\t\tmodelQuery = modelQuery.where(permissionMatches);\n\t}\n\tif (primary?.length) {\n\t\tmodelQuery = modelQuery.primary(primary);\n\t}\n\tconst searchWhere = await search2where(model.fields, where, orWhere, or);\n\tif (searchWhere) { modelQuery = modelQuery.where(searchWhere); }\n\n\tmodelQuery = modelQuery.sort();\n\tif (sort) { modelQuery = modelQuery.sort(...sort); }\n\tmodelQuery = modelQuery.select([...new Set([\n\t\tselect || [],\n\t\tObject.entries(model.fields).filter(([, { type }]) => type && typeof type === 'string').map(v => v[0]),\n\t\tpermissionMatches && permissions.flatMap(v => [...yieldPermissionConstraintFields(v)]) || [],\n\t].flat())]);\n\n\tconst [documents, total] = await useDatabase(model.databaseId).transaction(t => Promise.all([\n\t\tt.select(modelQuery),\n\t\thasTotal ? t.count(modelQuery) : -1,\n\t]));\n\n\tconst options = await Promise.all(documents.map(v => filterPermissionDocument(model, permissions, v)));\n\tawait loadDocumentsLabel(options, model);\n\treturn { options, total };\n});\n\n\noptionsRouter.get`${documentId}`(async ctx => {\n\tconst model = await useModel();\n\tconst modelId = await useModelId();\n\tif (!model || !modelId) { return e404(ctx); }\n\tconst permissions = await getModelAuthorizationPermissions(modelId, 'options');\n\tif (!permissions?.length) { return e404(ctx); }\n\tconst document = await useDocument();\n\tif (!document) { return e404(ctx); }\n\tconst option = await filterPermissionDocument(model, permissions, document);\n\tif (!option) { return e404(ctx); }\n\treturn { option };\n});\n\nexport default optionsRouter;\n","import documentsRouter from './model.documents.mjs';\n\nimport modelsRouter from './models.mjs';\nimport documentRouter from './model.document.mjs';\nimport optionsRouter from './model.options.mjs';\n\nexport const api = {\n\tmodels: modelsRouter,\n}\nexport const modelApi = {\n\tdocuments: documentsRouter,\n\toptions: optionsRouter,\n}\nexport const documentApi = {\n\t'': documentRouter,\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"routers.yongdall.mjs","names":["documentRouter","modelsRouter","modelServicesRouter","documentsRouter","optionsRouter","documentRouter"],"sources":["../../api/api-model/utils.mjs","../../api/api-model/routers/useModelService.mjs","../../api/api-model/routers/model.documents.mjs","../../api/api-model/routers/models.mjs","../../api/api-model/routers/model.document.mjs","../../api/api-model/routers/model.options.mjs","../../api/api-model/routers/modelServices.mjs","../../api/api-model/routers/index.mjs"],"sourcesContent":["/** @import { ModelTable, TableDefine } from '@yongdall/model'*/\nimport { getPatternFields, runPattern } from '@yongdall/common';\nimport { Query, getLabelPattern, Where } from '@yongdall/model';\nimport { useDatabase } from '@yongdall/connection';\nimport { getModel } from '@yongdall/core';\n\n\n/**\n * \n * @param {[model: string, id: any, data: Record<string, any>, field: string][]} list\n * @param {TableDefine} model\n * @param {string?} [databaseId]\n */\nasync function loadDocumentLabel(list, model, databaseId) {\n\tconst labelPattern = getLabelPattern(model);\n\tif (!labelPattern) { return; }\n\tconst labelFields = getPatternFields(labelPattern);\n\tif (!labelFields.length) { return; }\n\tconst primaryFields = Object.entries(model.fields)\n\t\t.filter(([, v]) => v.primary)\n\t\t.sort(([, a], [, b]) => Number(a.primary) - Number(b.primary))\n\t\t.map(([v]) => v);\n\tif (!primaryFields.length) { return; }\n\tlet query = new Query(model, true);\n\tquery = query.select(primaryFields).select(labelFields);\n\tconst ids = [...new Set(list.map(([, id]) => id))];\n\tlet where = new Where();\n\tif (primaryFields.length === 1) {\n\t\tconst [field] = primaryFields;\n\t\twhere = where.and(field, 'in', ids);\n\t} else {\n\t\t/** @type {} */\n\t\tconst idsMap = [];\n\t\tids.map(v => `${v}`.split('$'));\n\t\tfor (const id of ids) {\n\t\t\tconst values = `${id}`.split('$');\n\t\t\tif (values.length !== primaryFields.length) { continue; }\n\t\t\tidsMap.push([values]);\n\t\t}\n\t\tif (!idsMap.length) { return; }\n\t\twhere = where.and(primaryFields, 'in', idsMap);\n\n\n\t}\n\tconst result = await useDatabase(databaseId).select(query.where(where));\n\tif (!result.length) { return; }\n\tconst labels = Object.fromEntries(result.map(v => [\n\t\tprimaryFields.map(f => v[f]).join('$'),\n\t\trunPattern(labelPattern, v)\n\t]));\n\tfor (const [, id, data, field] of list) {\n\t\tconst label = Object.hasOwn(labels, id) && labels[id];\n\t\tif (!label) { continue; }\n\t\tdata[`${field}~label`] = label;\n\t}\n}\n/**\n * \n * @param {(Record<string, any> | null)[]} list \n * @param {ModelTable} model \n */\nexport async function loadDocumentsLabel(list, model) {\n\t/** @type {[model: string, id: any, data: Record<string, any>, field: string][]} */\n\tconst setList = [];\n\t/** @type {[model: ModelTable, list: (Record<string, any> | null)[]][]} */\n\tconst queue = [[model, list]];\n\tfor (let line = queue.shift(); line; line = queue.shift()) {\n\t\tconst [model, list] = line;\n\t\tfor (const [name, field] of Object.entries(model.fields)) {\n\t\t\tconst type = field.type;\n\t\t\tif (!type) { continue; }\n\t\t\tif (typeof type === 'object') {\n\t\t\t\tqueue.push([type, list.flatMap(v => v?.[name] || [])]);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst modelName = field.model;\n\t\t\tif (!modelName) { continue; }\n\t\t\tfor (const item of list) {\n\t\t\t\tif (!item) { continue; }\n\t\t\t\tconst id = item[name];\n\t\t\t\tif (!id) { continue; }\n\t\t\t\tsetList.push([modelName, id, item, name]);\n\t\t\t}\n\t\t}\n\t}\n\tconst promises = [];\n\tfor (const [modelName, list] of Object.entries(Object.groupBy(setList, v => v[0]))) {\n\t\tif (!list) { continue; }\n\t\tpromises.push(\n\t\t\tgetModel(modelName)\n\t\t\t\t.then(model => model && loadDocumentLabel(list, model, model.databaseId)),\n\t\t);\n\t}\n\tawait Promise.all(promises);\n\n}\n","/** @import { ModelService } from '@yongdall/types' */\nimport { k99Context } from '@yongdall/http';\nimport { createStore } from '@yongdall/context';\nimport { Query } from '@yongdall/model';\nimport { getModel } from '@yongdall/core';\nimport { Param } from '@yongdall/http';\nimport { useDatabase } from '@yongdall/connection';\nimport { useModelId } from './useModel.mjs';\n\n\n\nexport const modelServiceParam = new Param();\nconst [getter, setter] = createStore(/** @type {Promise<[ModelService, string]?>?} */(null));\n\n/**\n * \n * @returns {Promise<[ModelService, string]?>}\n */\nasync function loadModelService() {\n\tconst ctx = k99Context();\n\tif (!ctx) { return null}\n\tconst serviceId = modelServiceParam.param(ctx) || '';\n\tif (!serviceId) { return null}\n\tconst modelId = await useModelId()\n\tconst model = await getModel('modelService');\n\tif (!model) { return null; }\n\t\tconst database = useDatabase(model.databaseId);\n\tlet sql = new Query(model, true).where('id', serviceId);\n\tconst modelField = model.fields.model;\n\tif (modelField && typeof modelField.type === 'string' && !modelField.array) {\n\t\tsql = sql.where(modelField.column || 'model', modelId);\n\t}\n\tconst service = await database.first(sql);\n\tif (!service) { return null; }\n\treturn [service, serviceId];\n\n}\nexport default function useModelService() {\n\tlet s = getter();\n\tif (!s) {\n\t\ts = loadModelService()\n\t\tsetter(s);\n\t}\n\treturn s.then(v => v?.[0] || null);\n}\n","import { Search, yieldPermissionConstraintFields } from '@yongdall/common';\nimport { Query } from '@yongdall/model';\nimport { useBody, e404, enumRouter } from '@yongdall/http';\nimport { ApiRouter } from '@yongdall/http';\nimport useDocument, { documentId } from './useDocument.mjs';\nimport { useDatabase } from '@yongdall/connection';\nimport useModel, { useModelId } from './useModel.mjs';\nimport { createPermissionMatches, getModelAuthorizationPermissions, filterPermissionDocument, search2where } from '@yongdall/core';\nimport { loadDocumentsLabel } from '../utils.mjs';\nimport useModelService from './useModelService.mjs';\n\nconst documentsRouter = new ApiRouter();\n\n\n\ndocumentsRouter.get(async function (ctx) {\n\tconst model = await useModel();\n\tconst modelId = await useModelId();\n\tif (!model || !modelId) { return e404(); }\n\tconst modelService = await useModelService();\n\tconst permissions = await getModelAuthorizationPermissions(modelId, 'query', modelService?.permissionGroupId);\n\tif (!permissions?.length) { return e404(); }\n\tconst { sort, offset, limit, select, where, orWhere, or, primary, total: hasTotal } = Search.merge(\n\t\tSearch.parse(ctx.url.search.slice(1)),\n\t\tawait useBody() || {},\n\t);\n\n\tconst permissionMatches = await createPermissionMatches(permissions);\n\n\tlet modelQuery = new Query(model, true).offset(offset).limit(limit);\n\tif (permissionMatches) {\n\t\tmodelQuery = modelQuery.where(permissionMatches);\n\t}\n\tif (primary?.length) {\n\t\tmodelQuery = modelQuery.primary(primary);\n\t}\n\tconst searchWhere = await search2where(model.fields, where, orWhere, or);\n\tif (searchWhere) { modelQuery = modelQuery.where(searchWhere); }\n\n\tmodelQuery = modelQuery.sort();\n\tif (sort) { modelQuery = modelQuery.sort(...sort); }\n\tconst allFields = [\n\t\tselect || [],\n\t\tObject.entries(model.fields).filter(v => v[1].primary).map(v => v[0]),\n\t\tpermissionMatches && permissions.flatMap(v => [...yieldPermissionConstraintFields(v)]) || [],\n\t].flat();\n\n\tconst [result, total] = await useDatabase(model.databaseId).transaction(t => Promise.all([\n\t\tt.search(modelQuery, allFields),\n\t\thasTotal ? t.count(modelQuery) : -1,\n\t]));\n\n\tconst documents = await Promise.all(result.map(v => filterPermissionDocument(model, permissions, v)));\n\tawait loadDocumentsLabel(documents, model);\n\treturn { documents, total };\n});\n\ndocumentsRouter.post(async ctx => {\n\tconst model = await useModel();\n\tconst modelId = await useModelId();\n\tif (!model || !modelId) { return e404(); }\n\tconst modelService = await useModelService();\n\tconst permissions = await getModelAuthorizationPermissions(modelId, 'create', modelService?.permissionGroupId);\n\tif (!permissions?.length) { return e404(); }\n\tconst data = await useBody() || {};\n\tconst newDocument = data.document;\n\tif (!newDocument) { return e404(); }\n\tconst document = await filterPermissionDocument(model, permissions, newDocument);\n\tif (!document) { return e404(); }\n\tconst doc = await useDatabase(model.databaseId).create(model, document);\n\treturn doc;\n});\n\nconst documentRouter = documentsRouter.route`${documentId}`();\ndocumentRouter.guard(async (ctx) => {\n\tconst doc = await useDocument();\n\tif (doc) { return; }\n\treturn e404();\n});\n\ndocumentRouter.route(enumRouter('documentApi'));\n\nexport default documentsRouter;\n","import { ApiRouter } from '@yongdall/http';\nimport { e404, enumRouter } from '@yongdall/http';\nimport {getModelPermissions, toDocumentFields} from '@yongdall/core';\nimport useModel, { modelId, useModelId } from './useModel.mjs';\nimport { getModelOptions } from '@yongdall/model';\n\n\n\nconst modelsRouter = new ApiRouter();\nconst modelRouter = modelsRouter.route`${modelId}`();\n\nmodelRouter.get(async function getDefine(ctx) {\n\tconst [model, modelId] = await Promise.all([\n\t\tuseModel(),\n\t\tuseModelId(),\n\t]);\n\tif (!modelId || !model) { return null; }\n\treturn {\n\t\t...getModelOptions(model),\n\t\tid: modelId,\n\t\tfields: toDocumentFields(model.fields),\n\t\tpermissions: await getModelPermissions(modelId) || [],\n\t\n\t}\n});\nmodelRouter.route(enumRouter('modelApi'));\nmodelRouter.route(enumRouter('modelServiceApi'));\n\nexport default modelsRouter;\n","import { e404, Param, useBody } from '@yongdall/http';\nimport { ApiRouter } from '@yongdall/http';\nimport useDocument from './useDocument.mjs';\nimport { useDatabase } from '@yongdall/connection';\nimport useModel, { useModelId } from './useModel.mjs';\nimport { filterPermissionDocument, filterPermissionUpdate, getModelAuthorizationPermissions, testPermissions } from '@yongdall/core';\nimport useModelService from './useModelService.mjs';\n\n\nconst documentRouter = new ApiRouter();\n\n\ndocumentRouter.get(async ctx => {\n\tconst model = await useModel();\n\tconst modelId = await useModelId();\n\tif (!model || !modelId) { return e404(); }\n\tconst modelService = await useModelService();\n\tconst readPermissions = await getModelAuthorizationPermissions(modelId, 'read', modelService?.permissionGroupId);\n\tif (!readPermissions?.length) { return e404(); }\n\tconst document = await useDocument();\n\tif (!document) { return e404(); }\n\tconst doc = await filterPermissionDocument(model, readPermissions, document);\n\tif (!doc) { return e404(); }\n\treturn { document: doc };\n});\n\ndocumentRouter.put(async ctx => {\n\tconst model = await useModel();\n\tconst modelId = await useModelId();\n\tif (!model || !modelId) { return e404(); }\n\tconst modelService = await useModelService();\n\tconst updatePermissions = await getModelAuthorizationPermissions(modelId, 'update', modelService?.permissionGroupId);\n\tif (!updatePermissions?.length) { return e404(); }\n\tconst document = await useDocument();\n\tif (!document) { return e404(); }\n\tconst data = await useBody();\n\tif (!data) { return; }\n\tconst newValue = data.document;\n\tif (!newValue) { return; }\n\tconst newData = await filterPermissionUpdate(model, updatePermissions, document, newValue);\n\tconst result = newData && Object.keys(newData).length\n\t\t? await useDatabase(model.databaseId).save(model, document, newData)\n\t\t: document;\n\tif (!result) { return {}; }\n\tconst readPermissions = await getModelAuthorizationPermissions(modelId, 'read', modelService?.permissionGroupId);\n\tif (!readPermissions?.length) { return {}; }\n\n\treturn await filterPermissionDocument(model, readPermissions, result);\n});\n\ndocumentRouter.delete(async ctx => {\n\tconst model = await useModel();\n\tconst modelId = await useModelId();\n\tif (!model || !modelId) { return e404(); }\n\tconst modelService = await useModelService();\n\tconst permissions = await getModelAuthorizationPermissions(modelId, 'read', modelService?.permissionGroupId);\n\tif (!permissions?.length) { return e404(); }\n\tconst document = await useDocument();\n\tif (!document) { return e404(); }\n\tif (!await testPermissions(permissions, document)) { return e404(); }\n\tawait useDatabase(model.databaseId).destroy(model, document).then(Boolean);\n\tctx.status = 204;\n});\n\n\nconst fieldParam = new Param();\n\n// TODO: GET :field\n// TODO: POST :field\n// TODO: PUT :field\n// TODO: DELETE :field\nconst documentFieldsRouter = documentRouter.route`fields/${fieldParam}`();\ndocumentFieldsRouter.get(async ctx => {\n\tconst fieldName = fieldParam.param(ctx);\n\tif (!fieldName) { return e404(); }\n\tconst model = await useModel();\n\tconst modelId = await useModelId();\n\tif (!model || !modelId) { return e404(); }\n\tconst { fields } = model;\n\tif (!Object.hasOwn(fields, fieldName)) { return e404(); }\n\tconst field = fields[fieldName];\n\tif (!field) { return e404(); }\n\tconst modelService = await useModelService();\n\tconst readPermissions = await getModelAuthorizationPermissions(modelId, 'read', modelService?.permissionGroupId);\n\tif (!readPermissions?.length) { return e404(); }\n\tif (readPermissions) {\n\t\tconst group = field.group;\n\t\tif (!readPermissions.find(v => {\n\t\t\tconst field = v.fields;\n\t\t\tif (field === fieldName || field === '*' || Array.isArray(field) && (field.includes(fieldName) || field.includes('*'))) { return true; }\n\t\t\tif (!group || v.group) { return false; }\n\t\t\tif (v.group === group || Array.isArray(v.group) && v.group.includes(group)) { return true; }\n\t\t})) { return e404(); }\n\t}\n\tconst document = await useDocument();\n\tif (!document) { return e404(); }\n\tconst doc = await filterPermissionDocument(model, readPermissions, document);\n\tif (!doc) { return e404(); }\n\tif (!Object.hasOwn(doc, fieldName)) { return e404(); }\n\treturn { value: doc[fieldName] };\n\n});\n\n// TODO: GET :value\n// TODO: POST :value\n// TODO: PUT :value\n// TODO: DELETE :field\nconst documentValuesRouter = documentRouter.route`values`();\n\n// TODO: GET :dataset/records\n// TODO: POST :dataset/records\n// TODO: GET :dataset/records/:record\n// TODO: PUT :dataset/records/:record\n// TODO: DELETE :dataset/records/:record\nconst documentDatasetsRouter = documentRouter.route`datasets`();\n\n\n\n\nexport default documentRouter;\n","import { useBody } from '@yongdall/http';\nimport { Search, yieldPermissionConstraintFields } from '@yongdall/common';\nimport { Query } from '@yongdall/model';\nimport { ApiRouter } from '@yongdall/http';\nimport useDocument, { documentId } from './useDocument.mjs';\nimport { useDatabase } from '@yongdall/connection';\nimport useModel, { useModelId } from './useModel.mjs';\nimport { createPermissionMatches, getModelAuthorizationPermissions, filterPermissionDocument, search2where } from '@yongdall/core';\nimport { e404 } from '@yongdall/http';\nimport { loadDocumentsLabel } from '../utils.mjs';\n\n\n\n\nconst optionsRouter = new ApiRouter();\n\n\n\noptionsRouter.get(async function (ctx) {\n\tconst model = await useModel();\n\tconst modelId = await useModelId();\n\tif (!model || !modelId) { return e404(); }\n\tconst permissions = await getModelAuthorizationPermissions(modelId, 'options');\n\tif (!permissions?.length) { return e404(); }\n\tconst { sort, offset, limit, select, where, orWhere, or, primary, total: hasTotal } = Search.merge(\n\t\tSearch.parse(ctx.url.search.slice(1)),\n\t\tawait useBody() || {},\n\t);\n\n\tconst permissionMatches = await createPermissionMatches(permissions);\n\n\tlet modelQuery = new Query(model, true).offset(offset).limit(limit);\n\tif (permissionMatches) {\n\t\tmodelQuery = modelQuery.where(permissionMatches);\n\t}\n\tif (primary?.length) {\n\t\tmodelQuery = modelQuery.primary(primary);\n\t}\n\tconst searchWhere = await search2where(model.fields, where, orWhere, or);\n\tif (searchWhere) { modelQuery = modelQuery.where(searchWhere); }\n\n\tmodelQuery = modelQuery.sort();\n\tif (sort) { modelQuery = modelQuery.sort(...sort); }\n\tmodelQuery = modelQuery.select([...new Set([\n\t\tselect || [],\n\t\tObject.entries(model.fields).filter(([, { type }]) => type && typeof type === 'string').map(v => v[0]),\n\t\tpermissionMatches && permissions.flatMap(v => [...yieldPermissionConstraintFields(v)]) || [],\n\t].flat())]);\n\n\tconst [documents, total] = await useDatabase(model.databaseId).transaction(t => Promise.all([\n\t\tt.select(modelQuery),\n\t\thasTotal ? t.count(modelQuery) : -1,\n\t]));\n\n\tconst options = await Promise.all(documents.map(v => filterPermissionDocument(model, permissions, v)));\n\tawait loadDocumentsLabel(options, model);\n\treturn { options, total };\n});\n\n\noptionsRouter.get`${documentId}`(async ctx => {\n\tconst model = await useModel();\n\tconst modelId = await useModelId();\n\tif (!model || !modelId) { return e404(); }\n\tconst permissions = await getModelAuthorizationPermissions(modelId, 'options');\n\tif (!permissions?.length) { return e404(); }\n\tconst document = await useDocument();\n\tif (!document) { return e404(); }\n\tconst option = await filterPermissionDocument(model, permissions, document);\n\tif (!option) { return e404(); }\n\treturn { option };\n});\n\nexport default optionsRouter;\n","import { ApiRouter } from '@yongdall/http';\nimport { e404, enumRouter } from '@yongdall/http';\nimport {getModelPermissions, toDocumentFields} from '@yongdall/core';\nimport useModel, { modelId, useModelId } from './useModel.mjs';\nimport { getModelOptions } from '@yongdall/model';\nimport useModelService, { modelServiceParam } from './useModelService.mjs';\n\n\n\nconst modelServicesRouter = new ApiRouter();\nconst modelServiceRouter = modelServicesRouter.route`${modelServiceParam}`();\n\nmodelServiceRouter.get(async function getDefine(ctx) {\n\tconst [model, modelId, modelService] = await Promise.all([\n\t\tuseModel(),\n\t\tuseModelId(),\n\t\tuseModelService(),\n\t]);\n\tif (!modelId || !model || !modelService) { return null; }\n\treturn {\n\t\t...getModelOptions(model),\n\t\tid: modelId,\n\t\tfields: toDocumentFields(model.fields),\n\t\tpermissions: await getModelPermissions(modelId, modelService?.permissionGroupId) || [],\n\t\n\t}\n});\nmodelServiceRouter.route(enumRouter('modelApi'));\nmodelServiceRouter.route(enumRouter('modelServiceApi'));\n\nexport default modelServicesRouter;\n","import documentsRouter from './model.documents.mjs';\n\nimport modelsRouter from './models.mjs';\nimport documentRouter from './model.document.mjs';\nimport optionsRouter from './model.options.mjs';\nimport modelServicesRouter from './modelServices.mjs';\n\nexport const api = {\n\tmodels: modelsRouter,\n}\nexport const modelApi = {\n\tservices: modelServicesRouter,\n}\nexport const modelServiceApi = {\n\tdocuments: documentsRouter,\n\toptions: optionsRouter,\n}\nexport const documentApi = {\n\t'': documentRouter,\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
label: 模型应用接口
|