@yongdall/api 0.1.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/index.d.mts ADDED
@@ -0,0 +1 @@
1
+ export { };
package/index.mjs ADDED
File without changes
package/package.json ADDED
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "@yongdall/api",
3
+ "type": "module",
4
+ "main": "./index.mjs",
5
+ "exports": {
6
+ ".": "./index.mjs"
7
+ },
8
+ "version": "0.1.0",
9
+ "description": "",
10
+ "keywords": [],
11
+ "author": "",
12
+ "license": "ISC",
13
+ "dependencies": {
14
+ "@yongdall/common": "^0.1.0",
15
+ "@yongdall/context": "^0.1.0",
16
+ "@yongdall/model": "^0.1.0",
17
+ "@yongdall/core": "^0.1.0",
18
+ "@yongdall/connection": "^0.1.0",
19
+ "@yongdall/http": "^0.1.0"
20
+ }
21
+ }
@@ -0,0 +1,240 @@
1
+ import { ApiRouter, Param, e404 } from "@yongdall/http";
2
+ import { Query, Where } from "@yongdall/model";
3
+ import { bootConfiguration, getEnumerations, getModel, getUser, isSingleUser, loadUser, setUser, useTenant } from "@yongdall/core";
4
+ import { useDatabase } from "@yongdall/connection";
5
+
6
+ //#region api/api/routers/page.mjs
7
+ const router$5 = new ApiRouter();
8
+ router$5.get(async (ctx) => {
9
+ const searchParams = ctx.url.searchParams;
10
+ const model = searchParams.get("model") || "";
11
+ const organization = searchParams.get("organization") || "";
12
+ const user = searchParams.get("user") || "";
13
+ const workspace = searchParams.get("workspace") || "";
14
+ const page = searchParams.get("page") || "";
15
+ if (!page) return e404(ctx);
16
+ if (!model && !organization && !user && !workspace) return e404(ctx);
17
+ const pageModel = await getModel("page");
18
+ if (!pageModel) {
19
+ ctx.status = 404;
20
+ return;
21
+ }
22
+ let sql = new Query(pageModel, true).where("model", model).where("organization", organization).where("user", user).where("workspace", workspace).where("page", page).where("current", true);
23
+ let define = await useDatabase(pageModel.databaseId).first(sql);
24
+ if (!define) ctx.status = 404;
25
+ return define;
26
+ });
27
+ var page_default = router$5;
28
+
29
+ //#endregion
30
+ //#region api/api/routers/application.mjs
31
+ /** @import { BootConfiguration } from '@yongdall/common' */
32
+ /**
33
+ *
34
+ * @param {string} domain
35
+ * @param {string | number} port
36
+ * @returns {Promise<BootConfiguration>}
37
+ */
38
+ async function defaultConfiguration(domain, port) {
39
+ return createConfiguration({
40
+ domain,
41
+ port,
42
+ path: bootConfiguration.path,
43
+ authRequired: bootConfiguration.authRequired
44
+ });
45
+ }
46
+ /**
47
+ *
48
+ * @param {Record<string, any>} app
49
+ * @returns {Promise<BootConfiguration>}
50
+ */
51
+ async function createConfiguration(app) {
52
+ return {
53
+ single: await useTenant().then((v) => Boolean(v.single)),
54
+ pages: bootConfiguration.pages,
55
+ configurationPages: bootConfiguration.configurationPages,
56
+ domain: app.domain,
57
+ port: app.port,
58
+ path: app.path,
59
+ route: app.route || bootConfiguration.route,
60
+ theme: app.theme || bootConfiguration.theme,
61
+ skin: app.skin || bootConfiguration.skin,
62
+ authenticator: app.authenticator || bootConfiguration.authenticator,
63
+ authRequired: Boolean(app.authRequired),
64
+ logo: app.logo || "",
65
+ title: app.title || "",
66
+ company: app.company || "",
67
+ type: app.type || "",
68
+ application: app.id || "",
69
+ help: app.help || "",
70
+ userMenus: app.userMenus || []
71
+ };
72
+ }
73
+ const router$4 = new ApiRouter();
74
+ router$4.get(async (ctx) => {
75
+ const searchParams = ctx.url.searchParams;
76
+ const domain = searchParams.get("domain") || "";
77
+ const port = searchParams.get("port") || "";
78
+ const path = searchParams.get("path") || "";
79
+ const model = await getModel("application");
80
+ if (!model) return defaultConfiguration(domain, port);
81
+ const database = useDatabase(model.databaseId);
82
+ const domainType = model.fields.domain?.type;
83
+ const portType = model.fields.port?.type;
84
+ const pathType = model.fields.path?.type;
85
+ let sql = new Query(model, true);
86
+ if (domainType && typeof domainType === "string") if (domain) sql = sql.where("domain", "in", ["", domain]);
87
+ else sql = sql.where("domain", "");
88
+ if (portType && typeof portType === "string") if (port) sql = sql.where("port", "in", [0, port]);
89
+ else sql = sql.where("port", 0);
90
+ let baseSql = sql.clone();
91
+ if (pathType && typeof pathType === "string") {
92
+ const allPaths = ["/"];
93
+ for (const paths = path.split("/").filter(Boolean); paths.length; paths.pop()) allPaths.push(`/${paths.join("/")}/`);
94
+ baseSql = baseSql.where("path", "in", allPaths);
95
+ }
96
+ let apps = await database.find(baseSql);
97
+ if (!apps.length) {
98
+ const defaultType = model.fields.default?.type;
99
+ const singleDefaultType = await isSingleUser(true) && model.fields.singleDefault?.type;
100
+ const hasDefault = defaultType && typeof defaultType === "string";
101
+ const hasSingleDefault = singleDefaultType && typeof singleDefaultType === "string";
102
+ if (hasDefault && hasSingleDefault) apps = await database.find(sql.clone().where(Where.and("default", true).or("singleDefault", true)));
103
+ else if (hasDefault) apps = await database.find(sql.clone().where("default", true));
104
+ else if (hasSingleDefault) apps = await database.find(sql.clone().where("singleDefault", true));
105
+ if (apps.length > 1) apps = apps.sort((a, b) => Number(b.singleDefault) - Number(a.singleDefault)).slice(0, 1);
106
+ }
107
+ const app = apps.sort((a, b) => {
108
+ const ak = (a.domain ? 2 ** 26 : 0) + (a.port ? 2 ** 25 : 0) + a.path.length;
109
+ return (b.domain ? 2 ** 26 : 0) + (b.port ? 2 ** 25 : 0) + b.path.length - ak;
110
+ })[0];
111
+ if (!app) return defaultConfiguration(domain, port);
112
+ return createConfiguration(app);
113
+ });
114
+ var application_default = router$4;
115
+
116
+ //#endregion
117
+ //#region api/api/routers/menus.mjs
118
+ const type = new Param();
119
+ const group = new Param();
120
+ /**
121
+ *
122
+ * @param {string | string[]} type
123
+ * @param {string | string[]} [group]
124
+ * @returns
125
+ */
126
+ async function getMenus(type, group = "") {
127
+ const model = await getModel("menu");
128
+ if (!model) return [];
129
+ const database = useDatabase(model.databaseId);
130
+ let sql = new Query(model, true);
131
+ sql = sql.where("groupType", type);
132
+ sql = sql.where("group", group);
133
+ sql = sql.sort("no");
134
+ return await database.find(sql);
135
+ }
136
+ const router$3 = new ApiRouter();
137
+ router$3.get`${type}`(async (ctx) => {
138
+ return { menus: await getMenus(type.param(ctx) || "") };
139
+ });
140
+ router$3.get`${type}/groups/${group}`(async (ctx) => {
141
+ return { menus: await getMenus(type.param(ctx) || "", group.param(ctx) || "") };
142
+ });
143
+ var menus_default = router$3;
144
+
145
+ //#endregion
146
+ //#region api/api/routers/user.mjs
147
+ const userRouter = new ApiRouter();
148
+ userRouter.get(async (ctx) => {
149
+ const sessionUserId = await getUser(true);
150
+ const sessionUser = sessionUserId && await loadUser(sessionUserId, true);
151
+ const targetUserId = sessionUserId || await isSingleUser(true) ? await getUser(false) : null;
152
+ return {
153
+ session: sessionUser,
154
+ target: targetUserId && await loadUser(targetUserId, true)
155
+ };
156
+ });
157
+ userRouter.delete(async (ctx) => {
158
+ await setUser(null);
159
+ ctx.status = 204;
160
+ });
161
+ var user_default = userRouter;
162
+
163
+ //#endregion
164
+ //#region api/api/routers/enumerations.mjs
165
+ const name$1 = new Param();
166
+ const router$2 = new ApiRouter();
167
+ router$2.get`${name$1}`(async (ctx) => {
168
+ return { values: await getEnumerations(name$1.param(ctx) || "") };
169
+ });
170
+ var enumerations_default = router$2;
171
+
172
+ //#endregion
173
+ //#region api/api/routers/formLayouts.mjs
174
+ const name = new Param();
175
+ const router$1 = new ApiRouter();
176
+ router$1.get`${name}`(async (ctx) => {
177
+ const searchParams = ctx.url.searchParams;
178
+ const model = searchParams.get("model") || "";
179
+ const organization = searchParams.get("organization") || "";
180
+ const user = searchParams.get("user") || "";
181
+ const workspace = searchParams.get("workspace") || "";
182
+ if (!(searchParams.get("page") || "")) return e404(ctx);
183
+ if (!model && !organization && !user && !workspace) return e404(ctx);
184
+ const pageModel = await getModel("formLayout");
185
+ if (!pageModel) {
186
+ ctx.status = 404;
187
+ return;
188
+ }
189
+ let sql = new Query(pageModel, true).select("layout", "type").where("id", name.param(ctx) || "");
190
+ let define = await useDatabase(pageModel.databaseId).first(sql);
191
+ if (!define) ctx.status = 404;
192
+ return define;
193
+ });
194
+ var formLayouts_default = router$1;
195
+
196
+ //#endregion
197
+ //#region api/api/routers/permissions.mjs
198
+ const router = new ApiRouter();
199
+ router.get(async (ctx) => {
200
+ const PermissionModel = await getModel("permission");
201
+ if (!PermissionModel) return [];
202
+ const data = await useDatabase(PermissionModel.databaseId).find(new Query(PermissionModel, true));
203
+ if (!data.length) return [];
204
+ const permissionMap = Object.groupBy(data, (v) => v.groupId);
205
+ const groupIds = Object.keys(permissionMap).filter(Boolean);
206
+ const PermissionGroupModel = await getModel("permissionGroup");
207
+ const groups = groupIds.length && PermissionGroupModel ? Object.fromEntries(await useDatabase(PermissionGroupModel.databaseId).find(new Query(PermissionGroupModel, true).where(Where.and("id", "in", groupIds))).then((v) => v.map((v) => [v.id, v.label]))) : {};
208
+ /** @type {{children: {value: string; label: string}[]; label: string}[]} */
209
+ const allPermissions = [];
210
+ for (const [group, permissions] of Object.entries(permissionMap)) {
211
+ if (!permissions?.length) continue;
212
+ const list = permissions.map(({ label, id }) => ({
213
+ label,
214
+ value: id
215
+ }));
216
+ if (!list.length) continue;
217
+ allPermissions.push({
218
+ label: `${Object.hasOwn(groups, group) && groups[group] || group}`,
219
+ children: list
220
+ });
221
+ }
222
+ return allPermissions;
223
+ });
224
+ var permissions_default = router;
225
+
226
+ //#endregion
227
+ //#region api/api/routers/index.mjs
228
+ const api = {
229
+ page: page_default,
230
+ user: user_default,
231
+ menus: menus_default,
232
+ application: application_default,
233
+ enumerations: enumerations_default,
234
+ formLayouts: formLayouts_default,
235
+ permissions: permissions_default
236
+ };
237
+
238
+ //#endregion
239
+ export { api };
240
+ //# sourceMappingURL=routers.yongdall.mjs.map
@@ -0,0 +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 } from '@yongdall/model';\nimport { getModel } from '@yongdall/core';\nimport { useDatabase } from '@yongdall/connection';\nimport { e404 } from '@yongdall/http';\n\n\n\nconst router = new ApiRouter();\nrouter.get(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 e404(ctx); }\n\tif (!model && !organization && !user && !workspace) { return e404(ctx); }\n\t\n\n\tconst pageModel = await getModel('page');\n\tif (!pageModel) {\n\t\tctx.status = 404;\n\t\treturn\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\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 { 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\tsingle: 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 targetUserId = sessionUserId || await isSingleUser(true) ? await getUser(false) : null;\n\tconst targetUser = targetUserId && await loadUser(targetUserId, true);\n\treturn {\n\t\tsession: 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';\nimport { e404 } from '@yongdall/http';\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 e404(ctx); }\n\tif (!model && !organization && !user && !workspace) { return e404(ctx); }\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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"}