@yongdall/api 0.2.0 → 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,17 +5,17 @@
5
5
  "exports": {
6
6
  ".": "./index.mjs"
7
7
  },
8
- "version": "0.2.0",
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.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.3.0",
15
+ "@yongdall/context": "^0.3.0",
16
+ "@yongdall/model": "^0.3.0",
17
+ "@yongdall/core": "^0.3.0",
18
+ "@yongdall/connection": "^0.3.0",
19
+ "@yongdall/http": "^0.3.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,16 @@ 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
+ ...app.pages
66
+ },
67
+ configurationPages: {
68
+ ...bootConfiguration.configurationPages,
69
+ ...app.configurationPages
70
+ },
71
+ domain: app.domain || "",
72
+ port: app.port || 0,
67
73
  path: app.path,
68
74
  route: app.route || bootConfiguration.route,
69
75
  theme: app.theme || bootConfiguration.theme,
@@ -74,13 +80,14 @@ async function createConfiguration(app) {
74
80
  title: app.title || "",
75
81
  company: app.company || "",
76
82
  type: app.type || "",
77
- application: app.id || "",
83
+ id: app.id || "",
78
84
  help: app.help || "",
79
- userMenus: app.userMenus || []
85
+ userMenus: app.userMenus || [],
86
+ menus: app.menus || []
80
87
  };
81
88
  }
82
- const router$4 = new ApiRouter();
83
- router$4.get(async (ctx) => {
89
+ const applicationRouter = new ApiRouter();
90
+ applicationRouter.get(async (ctx) => {
84
91
  const searchParams = ctx.url.searchParams;
85
92
  const domain = searchParams.get("domain") || "";
86
93
  const port = searchParams.get("port") || "";
@@ -120,7 +127,17 @@ router$4.get(async (ctx) => {
120
127
  if (!app) return defaultConfiguration(domain, port);
121
128
  return createConfiguration(app);
122
129
  });
123
- var application_default = router$4;
130
+ const applicationIdParam = new Param();
131
+ const applicationsRouter = new ApiRouter();
132
+ applicationsRouter.get`${applicationIdParam}`(async (ctx) => {
133
+ const applicationId = applicationIdParam.param(ctx);
134
+ if (!applicationId) return 404;
135
+ const model = await getModel("application");
136
+ if (!model) return 404;
137
+ const app = await useDatabase(model.databaseId).first(new Query(model, true).primary(applicationId));
138
+ if (!app) return 404;
139
+ return createConfiguration(app);
140
+ });
124
141
 
125
142
  //#endregion
126
143
  //#region api/api/routers/menus.mjs
@@ -240,7 +257,8 @@ const api = {
240
257
  page: page_default,
241
258
  user: user_default,
242
259
  menus: menus_default,
243
- application: application_default,
260
+ application: applicationRouter,
261
+ applications: applicationsRouter,
244
262
  enumerations: enumerations_default,
245
263
  formLayouts: formLayouts_default,
246
264
  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...app.pages,\n\t\t},\n\t\tconfigurationPages: {\n\t\t\t...bootConfiguration.configurationPages,\n\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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"}