@yongdall/api-model 0.1.4 → 0.3.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
@@ -5,20 +5,20 @@
5
5
  "exports": {
6
6
  ".": "./index.mjs"
7
7
  },
8
- "version": "0.1.4",
8
+ "version": "0.3.0",
9
9
  "description": "",
10
10
  "keywords": [],
11
11
  "author": "",
12
12
  "license": "ISC",
13
13
  "dependencies": {
14
- "@yongdall/common": "^0.1.0",
15
- "@yongdall/context": "^0.1.0",
16
- "@yongdall/core": "^0.1.0",
17
- "@yongdall/model": "^0.1.0",
18
- "@yongdall/connection": "^0.1.0",
19
- "@yongdall/http": "^0.1.0"
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"
20
20
  },
21
21
  "devDependencies": {
22
- "@yongdall/types": "^0.1.0"
22
+ "@yongdall/types": "^0.3.0"
23
23
  }
24
24
  }
@@ -50,13 +50,13 @@ async function loadDocumentLabel(list, model, databaseId) {
50
50
  }
51
51
  /**
52
52
  *
53
- * @param {any[]} list
53
+ * @param {(Record<string, any> | null)[]} list
54
54
  * @param {ModelTable} model
55
55
  */
56
56
  async function loadDocumentsLabel(list, model) {
57
57
  /** @type {[model: string, id: any, data: Record<string, any>, field: string][]} */
58
58
  const setList = [];
59
- /** @type {[model: ModelTable, list: any[]][]} */
59
+ /** @type {[model: ModelTable, list: (Record<string, any> | null)[]][]} */
60
60
  const queue = [[model, list]];
61
61
  for (let line = queue.shift(); line; line = queue.shift()) {
62
62
  const [model, list] = line;
@@ -64,12 +64,13 @@ async function loadDocumentsLabel(list, model) {
64
64
  const type = field.type;
65
65
  if (!type) continue;
66
66
  if (typeof type === "object") {
67
- queue.push([type, list.flatMap((v) => v[name] || [])]);
67
+ queue.push([type, list.flatMap((v) => v?.[name] || [])]);
68
68
  continue;
69
69
  }
70
70
  const modelName = field.model;
71
71
  if (!modelName) continue;
72
72
  for (const item of list) {
73
+ if (!item) continue;
73
74
  const id = item[name];
74
75
  if (!id) continue;
75
76
  setList.push([
@@ -98,7 +99,7 @@ documentsRouter.get(async function(ctx) {
98
99
  if (!model || !modelId) return e404(ctx);
99
100
  const permissions = await getModelAuthorizationPermissions(modelId, "query");
100
101
  if (!permissions?.length) return e404(ctx);
101
- const { sort, offset, limit, select, where, orWhere, or } = Search.merge(Search.parse(ctx.url.search.slice(1)), await useBody() || {});
102
+ const { sort, offset, limit, select, where, orWhere, or, total: hasTotal } = Search.merge(Search.parse(ctx.url.search.slice(1)), await useBody() || {});
102
103
  const permissionMatches = await createPermissionMatches(permissions);
103
104
  let modelQuery = new Query(model, true).offset(offset).limit(limit);
104
105
  if (permissionMatches) modelQuery = modelQuery.where(permissionMatches);
@@ -111,7 +112,7 @@ documentsRouter.get(async function(ctx) {
111
112
  Object.entries(model.fields).filter((v) => v[1].primary).map((v) => v[0]),
112
113
  permissionMatches && permissions.flatMap((v) => [...yieldPermissionConstraintFields(v)]) || []
113
114
  ].flat();
114
- const [result, total] = await useDatabase(model.databaseId).transaction((t) => Promise.all([t.search(modelQuery, allFields), t.count(modelQuery)]));
115
+ const [result, total] = await useDatabase(model.databaseId).transaction((t) => Promise.all([t.search(modelQuery, allFields), hasTotal ? t.count(modelQuery) : -1]));
115
116
  const documents = await Promise.all(result.map((v) => filterPermissionDocument(model, permissions, v)));
116
117
  await loadDocumentsLabel(documents, model);
117
118
  return {
@@ -132,9 +133,9 @@ documentsRouter.post(async (ctx) => {
132
133
  return await useDatabase(model.databaseId).create(model, document);
133
134
  });
134
135
  const documentRouter$1 = documentsRouter.route`${documentId}`();
135
- documentRouter$1.onionskin(async (ctx, next) => {
136
- if (!await useDocument()) return e404(ctx);
137
- return next();
136
+ documentRouter$1.guard(async (ctx) => {
137
+ if (await useDocument()) return;
138
+ return e404(ctx);
138
139
  });
139
140
  documentRouter$1.route(enumRouter("documentApi"));
140
141
  var model_documents_default = documentsRouter;
@@ -247,7 +248,7 @@ optionsRouter.get(async function(ctx) {
247
248
  if (!model || !modelId) return e404(ctx);
248
249
  const permissions = await getModelAuthorizationPermissions(modelId, "options");
249
250
  if (!permissions?.length) return e404(ctx);
250
- const { sort, offset, limit, select, where, orWhere, or } = Search.merge(Search.parse(ctx.url.search.slice(1)), await useBody() || {});
251
+ const { sort, offset, limit, select, where, orWhere, or, total: hasTotal } = Search.merge(Search.parse(ctx.url.search.slice(1)), await useBody() || {});
251
252
  const permissionMatches = await createPermissionMatches(permissions);
252
253
  let modelQuery = new Query(model, true).offset(offset).limit(limit);
253
254
  if (permissionMatches) modelQuery = modelQuery.where(permissionMatches);
@@ -260,10 +261,13 @@ optionsRouter.get(async function(ctx) {
260
261
  Object.entries(model.fields).filter(([, { type }]) => type && typeof type === "string").map((v) => v[0]),
261
262
  permissionMatches && permissions.flatMap((v) => [...yieldPermissionConstraintFields(v)]) || []
262
263
  ].flat())]);
263
- const documents = await useDatabase(model.databaseId).transaction((t) => t.select(modelQuery));
264
+ const [documents, total] = await useDatabase(model.databaseId).transaction((t) => Promise.all([t.select(modelQuery), hasTotal ? t.count(modelQuery) : -1]));
264
265
  const options = await Promise.all(documents.map((v) => filterPermissionDocument(model, permissions, v)));
265
266
  await loadDocumentsLabel(options, model);
266
- return { options };
267
+ return {
268
+ options,
269
+ total
270
+ };
267
271
  });
268
272
  optionsRouter.get`${documentId}`(async (ctx) => {
269
273
  const model = await useModel();
@@ -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 {any[]} 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: any[]][]} */\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\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 } = 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\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([t.search(modelQuery, allFields), t.count(modelQuery)]));\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.onionskin(async (ctx, next) => {\n\tconst doc = await useDocument();\n\tif (!doc) { return e404(ctx); }\n\treturn next();\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 } = 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\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 = await useDatabase(model.databaseId).transaction(t => t.select(modelQuery));\n\n\tconst options = await Promise.all(documents.map(v => filterPermissionDocument(model, permissions, v)));\n\tawait loadDocumentsLabel(options, model);\n\treturn { options };\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","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, 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\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, 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\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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"}