@yongdall/api 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yongdall/api",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "type": "module",
5
5
  "main": "./index.mjs",
6
6
  "exports": {
@@ -11,11 +11,11 @@
11
11
  "author": "",
12
12
  "license": "ISC",
13
13
  "dependencies": {
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"
14
+ "@yongdall/common": "^0.5.0",
15
+ "@yongdall/context": "^0.5.0",
16
+ "@yongdall/model": "^0.5.0",
17
+ "@yongdall/core": "^0.5.0",
18
+ "@yongdall/connection": "^0.5.0",
19
+ "@yongdall/http": "^0.5.0"
20
20
  }
21
21
  }
@@ -94,6 +94,7 @@ async function createConfiguration(app) {
94
94
  type: app.type || "",
95
95
  id: app.id || "",
96
96
  help: app.help || "",
97
+ userType: app.userType || "user",
97
98
  userMenus: app.userMenus || [],
98
99
  menus: app.menus || []
99
100
  };
@@ -1 +1 @@
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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"}
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\tuserType: app.userType || 'user',\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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"}
@@ -0,0 +1 @@
1
+ label: 基础应用接口