@yongdall/api-model 0.3.3 → 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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yongdall/api-model",
3
- "version": "0.3.3",
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.3.0",
15
- "@yongdall/context": "^0.3.0",
16
- "@yongdall/core": "^0.3.0",
17
- "@yongdall/model": "^0.3.0",
18
- "@yongdall/connection": "^0.3.0",
19
- "@yongdall/http": "^0.3.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.3.0"
22
+ "@yongdall/types": "^0.5.0"
23
23
  }
24
24
  }
@@ -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(ctx);
100
- const permissions = await getModelAuthorizationPermissions(modelId, "query");
101
- if (!permissions?.length) return e404(ctx);
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(ctx);
128
- const permissions = await getModelAuthorizationPermissions(modelId, "create");
129
- if (!permissions?.length) return e404(ctx);
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(ctx);
166
+ if (!newDocument) return e404();
132
167
  const document = await filterPermissionDocument(model, permissions, newDocument);
133
- if (!document) return e404(ctx);
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(ctx);
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: await useModelId() || "",
188
+ id: modelId,
157
189
  fields: toDocumentFields(model.fields),
158
- permission: await loadPermissions()
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(ctx);
171
- const readPermissions = await getModelAuthorizationPermissions(modelId, "read");
172
- if (!readPermissions?.length) return e404(ctx);
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(ctx);
207
+ if (!document) return e404();
175
208
  const doc = await filterPermissionDocument(model, readPermissions, document);
176
- if (!doc) return e404(ctx);
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(ctx);
183
- const updatePermissions = await getModelAuthorizationPermissions(modelId, "update");
184
- if (!updatePermissions?.length) return e404(ctx);
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(ctx);
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(ctx);
202
- const permissions = await getModelAuthorizationPermissions(modelId, "read");
203
- if (!permissions?.length) return e404(ctx);
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(ctx);
206
- if (!await testPermissions(permissions, document)) return e404(ctx);
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(ctx);
247
+ if (!fieldName) return e404();
214
248
  const model = await useModel();
215
249
  const modelId = await useModelId();
216
- if (!model || !modelId) return e404(ctx);
250
+ if (!model || !modelId) return e404();
217
251
  const { fields } = model;
218
- if (!Object.hasOwn(fields, fieldName)) return e404(ctx);
252
+ if (!Object.hasOwn(fields, fieldName)) return e404();
219
253
  const field = fields[fieldName];
220
- if (!field) return e404(ctx);
221
- const readPermissions = await getModelAuthorizationPermissions(modelId, "read");
222
- if (!readPermissions?.length) return e404(ctx);
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(ctx);
264
+ })) return e404();
231
265
  }
232
266
  const document = await useDocument();
233
- if (!document) return e404(ctx);
267
+ if (!document) return e404();
234
268
  const doc = await filterPermissionDocument(model, readPermissions, document);
235
- if (!doc) return e404(ctx);
236
- if (!Object.hasOwn(doc, fieldName)) return e404(ctx);
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(ctx);
283
+ if (!model || !modelId) return e404();
250
284
  const permissions = await getModelAuthorizationPermissions(modelId, "options");
251
- if (!permissions?.length) return e404(ctx);
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(ctx);
311
+ if (!model || !modelId) return e404();
278
312
  const permissions = await getModelAuthorizationPermissions(modelId, "options");
279
- if (!permissions?.length) return e404(ctx);
313
+ if (!permissions?.length) return e404();
280
314
  const document = await useDocument();
281
- if (!document) return e404(ctx);
315
+ if (!document) return e404();
282
316
  const option = await filterPermissionDocument(model, permissions, document);
283
- if (!option) return e404(ctx);
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
@@ -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: 模型应用接口