@yongdall/api 0.2.0 → 0.4.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,21 +1,21 @@
1
1
  {
2
2
  "name": "@yongdall/api",
3
+ "version": "0.4.0",
3
4
  "type": "module",
4
5
  "main": "./index.mjs",
5
6
  "exports": {
6
7
  ".": "./index.mjs"
7
8
  },
8
- "version": "0.2.0",
9
9
  "description": "",
10
10
  "keywords": [],
11
11
  "author": "",
12
12
  "license": "ISC",
13
13
  "dependencies": {
14
- "@yongdall/common": "^0.2.0",
15
- "@yongdall/context": "^0.2.0",
16
- "@yongdall/model": "^0.2.0",
17
- "@yongdall/core": "^0.2.0",
18
- "@yongdall/connection": "^0.2.0",
19
- "@yongdall/http": "^0.2.0"
14
+ "@yongdall/common": "^0.4.0",
15
+ "@yongdall/context": "^0.4.0",
16
+ "@yongdall/model": "^0.4.0",
17
+ "@yongdall/core": "^0.4.0",
18
+ "@yongdall/connection": "^0.4.0",
19
+ "@yongdall/http": "^0.4.0"
20
20
  }
21
21
  }
@@ -4,8 +4,8 @@ import { bootConfiguration, getEnumerations, getModel, getUser, isSingleUser, lo
4
4
  import { useDatabase } from "@yongdall/connection";
5
5
 
6
6
  //#region api/api/routers/page.mjs
7
- const router$5 = new ApiRouter();
8
- router$5.get(async (ctx) => {
7
+ const router$4 = new ApiRouter();
8
+ router$4.get(async (ctx) => {
9
9
  const searchParams = ctx.url.searchParams;
10
10
  const applicationId = searchParams.get("application") || searchParams.get("applicationId") || "";
11
11
  const model = searchParams.get("model") || "";
@@ -33,7 +33,7 @@ router$5.get(async (ctx) => {
33
33
  }
34
34
  return await database.first(sql) || null;
35
35
  });
36
- var page_default = router$5;
36
+ var page_default = router$4;
37
37
 
38
38
  //#endregion
39
39
  //#region api/api/routers/application.mjs
@@ -60,10 +60,28 @@ async function defaultConfiguration(domain, port) {
60
60
  async function createConfiguration(app) {
61
61
  return {
62
62
  multiUser: !await useTenant().then((v) => Boolean(v.single)),
63
- pages: bootConfiguration.pages,
64
- configurationPages: bootConfiguration.configurationPages,
65
- domain: app.domain,
66
- port: app.port,
63
+ pages: {
64
+ ...bootConfiguration.pages,
65
+ ...Array.isArray(app.pages) ? Object.fromEntries(app.pages.map((v) => {
66
+ if (!v) return ["", ""];
67
+ const { type, widget } = v;
68
+ if (!type || typeof type !== "string") return ["", ""];
69
+ if (!widget || typeof widget !== "string") return ["", ""];
70
+ return [type, widget];
71
+ })) : app.pages
72
+ },
73
+ configurationPages: {
74
+ ...bootConfiguration.configurationPages,
75
+ ...Array.isArray(app.configurationPages) ? Object.fromEntries(app.configurationPages.map((v) => {
76
+ if (!v) return ["", ""];
77
+ const { type, widget } = v;
78
+ if (!type || typeof type !== "string") return ["", ""];
79
+ if (!widget || typeof widget !== "string") return ["", ""];
80
+ return [type, widget];
81
+ })) : app.configurationPages
82
+ },
83
+ domain: app.domain || "",
84
+ port: app.port || 0,
67
85
  path: app.path,
68
86
  route: app.route || bootConfiguration.route,
69
87
  theme: app.theme || bootConfiguration.theme,
@@ -74,13 +92,14 @@ async function createConfiguration(app) {
74
92
  title: app.title || "",
75
93
  company: app.company || "",
76
94
  type: app.type || "",
77
- application: app.id || "",
95
+ id: app.id || "",
78
96
  help: app.help || "",
79
- userMenus: app.userMenus || []
97
+ userMenus: app.userMenus || [],
98
+ menus: app.menus || []
80
99
  };
81
100
  }
82
- const router$4 = new ApiRouter();
83
- router$4.get(async (ctx) => {
101
+ const applicationRouter = new ApiRouter();
102
+ applicationRouter.get(async (ctx) => {
84
103
  const searchParams = ctx.url.searchParams;
85
104
  const domain = searchParams.get("domain") || "";
86
105
  const port = searchParams.get("port") || "";
@@ -120,7 +139,17 @@ router$4.get(async (ctx) => {
120
139
  if (!app) return defaultConfiguration(domain, port);
121
140
  return createConfiguration(app);
122
141
  });
123
- var application_default = router$4;
142
+ const applicationIdParam = new Param();
143
+ const applicationsRouter = new ApiRouter();
144
+ applicationsRouter.get`${applicationIdParam}`(async (ctx) => {
145
+ const applicationId = applicationIdParam.param(ctx);
146
+ if (!applicationId) return 404;
147
+ const model = await getModel("application");
148
+ if (!model) return 404;
149
+ const app = await useDatabase(model.databaseId).first(new Query(model, true).primary(applicationId));
150
+ if (!app) return 404;
151
+ return createConfiguration(app);
152
+ });
124
153
 
125
154
  //#endregion
126
155
  //#region api/api/routers/menus.mjs
@@ -240,7 +269,8 @@ const api = {
240
269
  page: page_default,
241
270
  user: user_default,
242
271
  menus: menus_default,
243
- application: application_default,
272
+ application: applicationRouter,
273
+ applications: applicationsRouter,
244
274
  enumerations: enumerations_default,
245
275
  formLayouts: formLayouts_default,
246
276
  permissions: permissions_default
@@ -1 +1 @@
1
- {"version":3,"file":"routers.yongdall.mjs","names":["router","router","router","name","router","router","pageRouter","userRouter","menusRouter","applicationRouter","enumerationsRouter","formLayoutsRouter","permissionsRouter"],"sources":["../../api/api/routers/page.mjs","../../api/api/routers/application.mjs","../../api/api/routers/menus.mjs","../../api/api/routers/user.mjs","../../api/api/routers/enumerations.mjs","../../api/api/routers/formLayouts.mjs","../../api/api/routers/permissions.mjs","../../api/api/routers/index.mjs"],"sourcesContent":["import { ApiRouter } from '@yongdall/http';\nimport { Query, Where } from '@yongdall/model';\nimport { getModel } from '@yongdall/core';\nimport { useDatabase } from '@yongdall/connection';\n\n\n\nconst router = new ApiRouter();\nrouter.get(async ctx => {\n\tconst searchParams = ctx.url.searchParams;\n\tconst applicationId = searchParams.get('application') || searchParams.get('applicationId') || '';\n\tconst model = searchParams.get('model') || '';\n\tconst organization = searchParams.get('organization') || '';\n\tconst user = searchParams.get('user') || '';\n\tconst workspace = searchParams.get('workspace') || '';\n\tconst page = searchParams.get('page') || '';\n\tif (!page) { return null; }\n\tif (!model && !organization && !user && !workspace) { return null; }\n\n\n\tconst pageModel = await getModel('page');\n\tif (!pageModel) { return null; }\n\n\tconst applicationKey = ['applicationId', 'application'].find(field => {\n\t\tconst type = pageModel.fields[field]?.type;\n\t\treturn type && typeof type === 'string';\n\t});\n\n\tlet sql = new Query(pageModel, true)\n\t\t.where('model', model)\n\t\t.where('organization', organization)\n\t\t.where('user', user)\n\t\t.where('workspace', workspace)\n\t\t.where('page', page)\n\t\t.where('current', true);\n\tif (applicationKey) {\n\t\tlet where = Where.and(applicationKey, null);\n\t\tsql = sql.where(\n\t\t\tapplicationId\n\t\t\t\t? where.or(applicationKey, applicationId)\n\t\t\t\t: where\n\t\t);\n\t}\n\tconst database = useDatabase(pageModel.databaseId);\n\tif (applicationKey && applicationId) {\n\t\tconst list = await database.find(sql);\n\t\tconst define = list.find(v => v[applicationKey]) || list[0];\n\t\treturn define || null;\n\t}\n\tlet define = await database.first(sql);\n\treturn define || null;\n});\nexport default router;\n","import { ApiRouter } from '@yongdall/http';\nimport { Query, Where } from '@yongdall/model';\nimport { bootConfiguration, getModel, isSingleUser, useTenant } from '@yongdall/core';\nimport { useDatabase } from '@yongdall/connection';\n/** @import { BootConfiguration } from '@yongdall/common' */\n\n/**\n * \n * @param {string} domain \n * @param {string | number} port \n * @returns {Promise<BootConfiguration>}\n */\nasync function defaultConfiguration(domain, port) {\n\treturn createConfiguration({\n\t\tdomain, port, path: bootConfiguration.path,\n\t\tauthRequired: bootConfiguration.authRequired,\n\t})\n\n}\n/**\n * \n * @param {Record<string, any>} app \n * @returns {Promise<BootConfiguration>}\n */\nasync function createConfiguration(app) {\n\treturn {\n\t\tmultiUser: !await useTenant().then(v => Boolean(v.single)),\n\t\tpages: bootConfiguration.pages,\n\t\tconfigurationPages: bootConfiguration.configurationPages,\n\t\tdomain: app.domain, port: app.port, path: app.path,\n\t\troute: app.route || bootConfiguration.route,\n\t\ttheme: app.theme || bootConfiguration.theme,\n\t\tskin: app.skin || bootConfiguration.skin,\n\t\tauthenticator: app.authenticator || bootConfiguration.authenticator,\n\t\tauthRequired: Boolean(app.authRequired),\n\t\tlogo: app.logo || '', title: app.title || '', company: app.company || '',\n\t\ttype: app.type || '', application: app.id || '',\n\t\thelp: app.help || '',\n\t\tuserMenus: app.userMenus || [],\n\t};\n\n}\nconst router = new ApiRouter();\nrouter.get(async ctx => {\n\tconst searchParams = ctx.url.searchParams;\n\tconst domain = searchParams.get('domain') || '';\n\tconst port = searchParams.get('port') || '';\n\tconst path = searchParams.get('path') || '';\n\tconst model = await getModel('application');\n\tif (!model) { return defaultConfiguration(domain, port); }\n\n\tconst database = useDatabase(model.databaseId);\n\n\n\tconst domainType = model.fields.domain?.type;\n\tconst portType = model.fields.port?.type;\n\tconst pathType = model.fields.path?.type;\n\tlet sql = new Query(model, true);\n\tif (domainType && typeof domainType === 'string') {\n\t\tif (domain) {\n\t\t\tsql = sql.where('domain', 'in', ['', domain]);\n\t\t} else {\n\t\t\tsql = sql.where('domain', '');\n\t\t}\n\t}\n\tif (portType && typeof portType === 'string') {\n\t\tif (port) {\n\t\t\tsql = sql.where('port', 'in', [0, port]);\n\t\t} else {\n\t\t\tsql = sql.where('port', 0);\n\t\t}\n\t}\n\tlet baseSql = sql.clone();\n\tif (pathType && typeof pathType === 'string') {\n\t\tconst allPaths = ['/'];\n\t\tfor (const paths = path.split('/').filter(Boolean); paths.length; paths.pop()) {\n\t\t\tallPaths.push(`/${paths.join('/')}/`);\n\t\t}\n\t\tbaseSql = baseSql.where('path', 'in', allPaths);\n\t}\n\tlet apps = await database.find(baseSql);\n\tif (!apps.length) {\n\t\tconst defaultType = model.fields.default?.type;\n\t\tconst singleDefaultType = await isSingleUser(true) && model.fields.singleDefault?.type;\n\t\tconst hasDefault = defaultType && typeof defaultType === 'string';\n\t\tconst hasSingleDefault = singleDefaultType && typeof singleDefaultType === 'string';\n\t\tif (hasDefault && hasSingleDefault) {\n\t\t\tapps = await database.find(sql.clone().where(Where.and('default', true).or('singleDefault', true)));\n\t\t} else if (hasDefault) {\n\t\t\tapps = await database.find(sql.clone().where('default', true));\n\t\t} else if (hasSingleDefault) {\n\t\t\tapps = await database.find(sql.clone().where('singleDefault', true));\n\t\t}\n\t\tif (apps.length > 1) {\n\t\t\tapps = apps.sort((a, b) => Number(b.singleDefault) - Number(a.singleDefault)).slice(0, 1);\n\t\t}\n\t}\n\tconst app = apps.sort((a, b) => {\n\t\tconst ak = (a.domain ? 2 ** 26 : 0) + (a.port ? 2 ** 25 : 0) + a.path.length;\n\t\tconst bk = (b.domain ? 2 ** 26 : 0) + (b.port ? 2 ** 25 : 0) + b.path.length;\n\t\treturn bk - ak;\n\t})[0];\n\tif (!app) { return defaultConfiguration(domain, port); }\n\n\treturn createConfiguration(app);\n});\nexport default router;\n","import { ApiRouter, Param } from '@yongdall/http';\nimport { Query } from '@yongdall/model';\nimport { getModel } from '@yongdall/core';\nimport { useDatabase } from '@yongdall/connection';\n\n\nconst type = new Param();\nconst group = new Param();\n/**\n * \n * @param {string | string[]} type \n * @param {string | string[]} [group] \n * @returns \n */\nasync function getMenus(type, group = '') {\n\tconst model = await getModel('menu');\n\tif (!model) {\n\t\treturn []\n\t}\n\n\tconst database = useDatabase(model.databaseId);\n\tlet sql = new Query(model, true);\n\tsql = sql.where('groupType', type);\n\tsql = sql.where('group', group);\n\tsql = sql.sort('no');\n\treturn await database.find(sql);\n}\n\nconst router = new ApiRouter();\nrouter.get`${type}`(async ctx => {\n\treturn {menus: await getMenus(type.param(ctx) || '')};\n});\nrouter.get`${type}/groups/${group}`(async ctx => {\n\treturn {menus: await getMenus(type.param(ctx) || '', group.param(ctx) || '')};\n\n});\nexport default router;\n","import { ApiRouter } from '@yongdall/http';\nimport { getUser, isSingleUser, loadUser, setUser } from '@yongdall/core';\n\nconst userRouter = new ApiRouter();\n\n\nuserRouter.get(async ctx => {\n\tconst sessionUserId = await getUser(true);\n\tconst sessionUser = sessionUserId && await loadUser(sessionUserId, true);\n\tconst single = await isSingleUser(true);\n\tconst targetUserId = sessionUserId || single ? await getUser(false) : null;\n\tconst targetUser = targetUserId && await loadUser(targetUserId, true);\n\treturn {\n\t\tsession: single || sessionUser,\n\t\ttarget: targetUser,\n\t};\n});\n\nuserRouter.delete(async ctx => {\n\tawait setUser(null);\n\tctx.status = 204;\n});\n\nexport default userRouter;\n","import { ApiRouter, Param } from '@yongdall/http';\nimport { getEnumerations } from '@yongdall/core';\n\n\nconst name = new Param();\n\nconst router = new ApiRouter();\nrouter.get`${name}`(async ctx => {\n\treturn {values: await getEnumerations(name.param(ctx) || '')};\n});\nexport default router;\n","import { ApiRouter, Param } from '@yongdall/http';\nimport { Query } from '@yongdall/model';\nimport { getModel } from '@yongdall/core';\nimport { useDatabase } from '@yongdall/connection';\n\n\nconst name = new Param();\n\nconst router = new ApiRouter();\nrouter.get`${name}`(async ctx => {\n\tconst searchParams = ctx.url.searchParams;\n\tconst model = searchParams.get('model') || '';\n\tconst organization = searchParams.get('organization') || '';\n\tconst user = searchParams.get('user') || '';\n\tconst workspace = searchParams.get('workspace') || '';\n\tconst page = searchParams.get('page') || '';\n\tif (!page) { return null; }\n\tif (!model && !organization && !user && !workspace) { return null; }\n\t\n\n\tconst pageModel = await getModel('formLayout');\n\tif (!pageModel) {\n\t\tctx.status = 404;\n\t\treturn\n\t}\n\n\tlet sql = new Query(pageModel, true).select('layout', 'type').where('id', name.param(ctx) || '')\n\tconst database = useDatabase(pageModel.databaseId);\n\tlet define = await database.first(sql);\n\tif (!define) { ctx.status = 404; }\n\treturn define;\n});\nexport default router;\n","import { getModel } from '@yongdall/core';\nimport { useDatabase } from '@yongdall/connection';\nimport { Query, Where } from '@yongdall/model';\nimport { ApiRouter } from '@yongdall/http';\n\nconst router = new ApiRouter();\nrouter.get(async ctx => {\n\n\tconst PermissionModel = await getModel('permission');\n\tif (!PermissionModel) { return []; }\n\n\tconst data = await useDatabase(PermissionModel.databaseId).find(\n\t\tnew Query(PermissionModel, true),\n\t);\n\tif (!data.length) { return []; }\n\n\n\tconst permissionMap = Object.groupBy(data, v => v.groupId);\n\tconst groupIds = Object.keys(permissionMap).filter(Boolean);\n\tconst PermissionGroupModel = await getModel('permissionGroup');\n\tconst groups = groupIds.length && PermissionGroupModel ? Object.fromEntries(await useDatabase(PermissionGroupModel.databaseId).find(\n\t\tnew Query(PermissionGroupModel, true).where(Where.and('id', 'in', groupIds)),\n\t).then(v => v.map(v => [v.id, v.label]))) : {};\n\n\t/** @type {{children: {value: string; label: string}[]; label: string}[]} */\n\tconst allPermissions = [];\n\tfor (const [group, permissions] of Object.entries(permissionMap)) {\n\t\tif (!permissions?.length) { continue; }\n\t\tconst list = permissions.map(({ label, id }) => ({ label, value: id }));\n\t\tif (!list.length) { continue; }\n\t\tallPermissions.push({ label: `${Object.hasOwn(groups, group) && groups[group] || group}`, children: list });\n\t}\n\treturn allPermissions;\n});\n\nexport default router;\n","import pageRouter from './page.mjs';\nimport applicationRouter from './application.mjs';\nimport menusRouter from './menus.mjs';\nimport userRouter from './user.mjs';\nimport enumerationsRouter from './enumerations.mjs';\nimport formLayoutsRouter from './formLayouts.mjs';\nimport permissionsRouter from './permissions.mjs';\n\nexport const api = {\n\tpage: pageRouter,\n\tuser: userRouter,\n\tmenus: menusRouter,\n\tapplication: applicationRouter,\n\tenumerations: enumerationsRouter,\n\tformLayouts: formLayoutsRouter,\n\tpermissions: permissionsRouter,\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"routers.yongdall.mjs","names":["router","router","name","router","router","pageRouter","userRouter","menusRouter","enumerationsRouter","formLayoutsRouter","permissionsRouter"],"sources":["../../api/api/routers/page.mjs","../../api/api/routers/application.mjs","../../api/api/routers/menus.mjs","../../api/api/routers/user.mjs","../../api/api/routers/enumerations.mjs","../../api/api/routers/formLayouts.mjs","../../api/api/routers/permissions.mjs","../../api/api/routers/index.mjs"],"sourcesContent":["import { ApiRouter } from '@yongdall/http';\nimport { Query, Where } from '@yongdall/model';\nimport { getModel } from '@yongdall/core';\nimport { useDatabase } from '@yongdall/connection';\n\n\n\nconst router = new ApiRouter();\nrouter.get(async ctx => {\n\tconst searchParams = ctx.url.searchParams;\n\tconst applicationId = searchParams.get('application') || searchParams.get('applicationId') || '';\n\tconst model = searchParams.get('model') || '';\n\tconst organization = searchParams.get('organization') || '';\n\tconst user = searchParams.get('user') || '';\n\tconst workspace = searchParams.get('workspace') || '';\n\tconst page = searchParams.get('page') || '';\n\tif (!page) { return null; }\n\tif (!model && !organization && !user && !workspace) { return null; }\n\n\n\tconst pageModel = await getModel('page');\n\tif (!pageModel) { return null; }\n\n\tconst applicationKey = ['applicationId', 'application'].find(field => {\n\t\tconst type = pageModel.fields[field]?.type;\n\t\treturn type && typeof type === 'string';\n\t});\n\n\tlet sql = new Query(pageModel, true)\n\t\t.where('model', model)\n\t\t.where('organization', organization)\n\t\t.where('user', user)\n\t\t.where('workspace', workspace)\n\t\t.where('page', page)\n\t\t.where('current', true);\n\tif (applicationKey) {\n\t\tlet where = Where.and(applicationKey, null);\n\t\tsql = sql.where(\n\t\t\tapplicationId\n\t\t\t\t? where.or(applicationKey, applicationId)\n\t\t\t\t: where\n\t\t);\n\t}\n\tconst database = useDatabase(pageModel.databaseId);\n\tif (applicationKey && applicationId) {\n\t\tconst list = await database.find(sql);\n\t\tconst define = list.find(v => v[applicationKey]) || list[0];\n\t\treturn define || null;\n\t}\n\tlet define = await database.first(sql);\n\treturn define || null;\n});\nexport default router;\n","import { ApiRouter, Param } from '@yongdall/http';\nimport { Query, Where } from '@yongdall/model';\nimport { bootConfiguration, getModel, isSingleUser, useTenant } from '@yongdall/core';\nimport { useDatabase } from '@yongdall/connection';\n/** @import { BootConfiguration } from '@yongdall/common' */\n\n/**\n * \n * @param {string} domain \n * @param {string | number} port \n * @returns {Promise<BootConfiguration>}\n */\nasync function defaultConfiguration(domain, port) {\n\treturn createConfiguration({\n\t\tdomain, port, path: bootConfiguration.path,\n\t\tauthRequired: bootConfiguration.authRequired,\n\t});\n\n}\n/**\n * \n * @param {Record<string, any>} app \n * @returns {Promise<BootConfiguration>}\n */\nasync function createConfiguration(app) {\n\treturn {\n\t\tmultiUser: !await useTenant().then(v => Boolean(v.single)),\n\t\tpages: {\n\t\t\t...bootConfiguration.pages,\n\t\t\t...Array.isArray(app.pages)\n\t\t\t\t? Object.fromEntries(app.pages.map(v => {\n\t\t\t\t\tif (!v) { return ['', '']; }\n\t\t\t\t\tconst { type, widget } = v;\n\t\t\t\t\tif (!type || typeof type !== 'string') { return ['', '']; }\n\t\t\t\t\tif (!widget || typeof widget !== 'string') { return ['', '']; }\n\t\t\t\t\treturn [type, widget];\n\t\t\t\t})) : app.pages,\n\t\t},\n\t\tconfigurationPages: {\n\t\t\t...bootConfiguration.configurationPages,\n\t\t\t...Array.isArray(app.configurationPages)\n\t\t\t\t? Object.fromEntries(app.configurationPages.map(v => {\n\t\t\t\t\tif (!v) { return ['', '']; }\n\t\t\t\t\tconst { type, widget } = v;\n\t\t\t\t\tif (!type || typeof type !== 'string') { return ['', '']; }\n\t\t\t\t\tif (!widget || typeof widget !== 'string') { return ['', '']; }\n\t\t\t\t\treturn [type, widget];\n\t\t\t\t})) : app.configurationPages,\n\t\t},\n\t\tdomain: app.domain || '', port: app.port || 0, path: app.path,\n\t\troute: app.route || bootConfiguration.route,\n\t\ttheme: app.theme || bootConfiguration.theme,\n\t\tskin: app.skin || bootConfiguration.skin,\n\t\tauthenticator: app.authenticator || bootConfiguration.authenticator,\n\t\tauthRequired: Boolean(app.authRequired),\n\t\tlogo: app.logo || '', title: app.title || '', company: app.company || '',\n\t\ttype: app.type || '', id: app.id || '',\n\t\thelp: app.help || '',\n\t\tuserMenus: app.userMenus || [],\n\t\tmenus: app.menus || [],\n\t};\n\n}\nexport const applicationRouter = new ApiRouter();\napplicationRouter.get(async ctx => {\n\tconst searchParams = ctx.url.searchParams;\n\tconst domain = searchParams.get('domain') || '';\n\tconst port = searchParams.get('port') || '';\n\tconst path = searchParams.get('path') || '';\n\tconst model = await getModel('application');\n\tif (!model) { return defaultConfiguration(domain, port); }\n\n\tconst database = useDatabase(model.databaseId);\n\n\n\tconst domainType = model.fields.domain?.type;\n\tconst portType = model.fields.port?.type;\n\tconst pathType = model.fields.path?.type;\n\tlet sql = new Query(model, true);\n\tif (domainType && typeof domainType === 'string') {\n\t\tif (domain) {\n\t\t\tsql = sql.where('domain', 'in', ['', domain]);\n\t\t} else {\n\t\t\tsql = sql.where('domain', '');\n\t\t}\n\t}\n\tif (portType && typeof portType === 'string') {\n\t\tif (port) {\n\t\t\tsql = sql.where('port', 'in', [0, port]);\n\t\t} else {\n\t\t\tsql = sql.where('port', 0);\n\t\t}\n\t}\n\tlet baseSql = sql.clone();\n\tif (pathType && typeof pathType === 'string') {\n\t\tconst allPaths = ['/'];\n\t\tfor (const paths = path.split('/').filter(Boolean); paths.length; paths.pop()) {\n\t\t\tallPaths.push(`/${paths.join('/')}/`);\n\t\t}\n\t\tbaseSql = baseSql.where('path', 'in', allPaths);\n\t}\n\tlet apps = await database.find(baseSql);\n\tif (!apps.length) {\n\t\tconst defaultType = model.fields.default?.type;\n\t\tconst singleDefaultType = await isSingleUser(true) && model.fields.singleDefault?.type;\n\t\tconst hasDefault = defaultType && typeof defaultType === 'string';\n\t\tconst hasSingleDefault = singleDefaultType && typeof singleDefaultType === 'string';\n\t\tif (hasDefault && hasSingleDefault) {\n\t\t\tapps = await database.find(sql.clone().where(Where.and('default', true).or('singleDefault', true)));\n\t\t} else if (hasDefault) {\n\t\t\tapps = await database.find(sql.clone().where('default', true));\n\t\t} else if (hasSingleDefault) {\n\t\t\tapps = await database.find(sql.clone().where('singleDefault', true));\n\t\t}\n\t\tif (apps.length > 1) {\n\t\t\tapps = apps.sort((a, b) => Number(b.singleDefault) - Number(a.singleDefault)).slice(0, 1);\n\t\t}\n\t}\n\tconst app = apps.sort((a, b) => {\n\t\tconst ak = (a.domain ? 2 ** 26 : 0) + (a.port ? 2 ** 25 : 0) + a.path.length;\n\t\tconst bk = (b.domain ? 2 ** 26 : 0) + (b.port ? 2 ** 25 : 0) + b.path.length;\n\t\treturn bk - ak;\n\t})[0];\n\tif (!app) { return defaultConfiguration(domain, port); }\n\n\treturn createConfiguration(app);\n});\n\nconst applicationIdParam = new Param();\nexport const applicationsRouter = new ApiRouter();\napplicationsRouter.get`${applicationIdParam}`(async ctx => {\n\tconst applicationId = applicationIdParam.param(ctx);\n\tif (!applicationId) { return 404; }\n\tconst model = await getModel('application');\n\tif (!model) { return 404; }\n\n\tconst database = useDatabase(model.databaseId);\n\tconst app = await database.first(new Query(model, true).primary(applicationId));\n\tif (!app) { return 404; }\n\treturn createConfiguration(app);\n});\n","import { ApiRouter, Param } from '@yongdall/http';\nimport { Query } from '@yongdall/model';\nimport { getModel } from '@yongdall/core';\nimport { useDatabase } from '@yongdall/connection';\n\n\nconst type = new Param();\nconst group = new Param();\n/**\n * \n * @param {string | string[]} type \n * @param {string | string[]} [group] \n * @returns \n */\nasync function getMenus(type, group = '') {\n\tconst model = await getModel('menu');\n\tif (!model) {\n\t\treturn []\n\t}\n\n\tconst database = useDatabase(model.databaseId);\n\tlet sql = new Query(model, true);\n\tsql = sql.where('groupType', type);\n\tsql = sql.where('group', group);\n\tsql = sql.sort('no');\n\treturn await database.find(sql);\n}\n\nconst router = new ApiRouter();\nrouter.get`${type}`(async ctx => {\n\treturn {menus: await getMenus(type.param(ctx) || '')};\n});\nrouter.get`${type}/groups/${group}`(async ctx => {\n\treturn {menus: await getMenus(type.param(ctx) || '', group.param(ctx) || '')};\n\n});\nexport default router;\n","import { ApiRouter } from '@yongdall/http';\nimport { getUser, isSingleUser, loadUser, setUser } from '@yongdall/core';\n\nconst userRouter = new ApiRouter();\n\n\nuserRouter.get(async ctx => {\n\tconst sessionUserId = await getUser(true);\n\tconst sessionUser = sessionUserId && await loadUser(sessionUserId, true);\n\tconst single = await isSingleUser(true);\n\tconst targetUserId = sessionUserId || single ? await getUser(false) : null;\n\tconst targetUser = targetUserId && await loadUser(targetUserId, true);\n\treturn {\n\t\tsession: single || sessionUser,\n\t\ttarget: targetUser,\n\t};\n});\n\nuserRouter.delete(async ctx => {\n\tawait setUser(null);\n\tctx.status = 204;\n});\n\nexport default userRouter;\n","import { ApiRouter, Param } from '@yongdall/http';\nimport { getEnumerations } from '@yongdall/core';\n\n\nconst name = new Param();\n\nconst router = new ApiRouter();\nrouter.get`${name}`(async ctx => {\n\treturn {values: await getEnumerations(name.param(ctx) || '')};\n});\nexport default router;\n","import { ApiRouter, Param } from '@yongdall/http';\nimport { Query } from '@yongdall/model';\nimport { getModel } from '@yongdall/core';\nimport { useDatabase } from '@yongdall/connection';\n\n\nconst name = new Param();\n\nconst router = new ApiRouter();\nrouter.get`${name}`(async ctx => {\n\tconst searchParams = ctx.url.searchParams;\n\tconst model = searchParams.get('model') || '';\n\tconst organization = searchParams.get('organization') || '';\n\tconst user = searchParams.get('user') || '';\n\tconst workspace = searchParams.get('workspace') || '';\n\tconst page = searchParams.get('page') || '';\n\tif (!page) { return null; }\n\tif (!model && !organization && !user && !workspace) { return null; }\n\t\n\n\tconst pageModel = await getModel('formLayout');\n\tif (!pageModel) {\n\t\tctx.status = 404;\n\t\treturn\n\t}\n\n\tlet sql = new Query(pageModel, true).select('layout', 'type').where('id', name.param(ctx) || '')\n\tconst database = useDatabase(pageModel.databaseId);\n\tlet define = await database.first(sql);\n\tif (!define) { ctx.status = 404; }\n\treturn define;\n});\nexport default router;\n","import { getModel } from '@yongdall/core';\nimport { useDatabase } from '@yongdall/connection';\nimport { Query, Where } from '@yongdall/model';\nimport { ApiRouter } from '@yongdall/http';\n\nconst router = new ApiRouter();\nrouter.get(async ctx => {\n\n\tconst PermissionModel = await getModel('permission');\n\tif (!PermissionModel) { return []; }\n\n\tconst data = await useDatabase(PermissionModel.databaseId).find(\n\t\tnew Query(PermissionModel, true),\n\t);\n\tif (!data.length) { return []; }\n\n\n\tconst permissionMap = Object.groupBy(data, v => v.groupId);\n\tconst groupIds = Object.keys(permissionMap).filter(Boolean);\n\tconst PermissionGroupModel = await getModel('permissionGroup');\n\tconst groups = groupIds.length && PermissionGroupModel ? Object.fromEntries(await useDatabase(PermissionGroupModel.databaseId).find(\n\t\tnew Query(PermissionGroupModel, true).where(Where.and('id', 'in', groupIds)),\n\t).then(v => v.map(v => [v.id, v.label]))) : {};\n\n\t/** @type {{children: {value: string; label: string}[]; label: string}[]} */\n\tconst allPermissions = [];\n\tfor (const [group, permissions] of Object.entries(permissionMap)) {\n\t\tif (!permissions?.length) { continue; }\n\t\tconst list = permissions.map(({ label, id }) => ({ label, value: id }));\n\t\tif (!list.length) { continue; }\n\t\tallPermissions.push({ label: `${Object.hasOwn(groups, group) && groups[group] || group}`, children: list });\n\t}\n\treturn allPermissions;\n});\n\nexport default router;\n","import pageRouter from './page.mjs';\nimport {applicationRouter, applicationsRouter} from './application.mjs';\nimport menusRouter from './menus.mjs';\nimport userRouter from './user.mjs';\nimport enumerationsRouter from './enumerations.mjs';\nimport formLayoutsRouter from './formLayouts.mjs';\nimport permissionsRouter from './permissions.mjs';\n\nexport const api = {\n\tpage: pageRouter,\n\tuser: userRouter,\n\tmenus: menusRouter,\n\tapplication: applicationRouter,\n\tapplications: applicationsRouter,\n\tenumerations: enumerationsRouter,\n\tformLayouts: formLayoutsRouter,\n\tpermissions: permissionsRouter,\n}\n"],"mappings":"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"}