@opengis/admin 0.1.84 → 0.1.85
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/README.md +29 -29
- package/config.js +4 -4
- package/dist/{IconChevronDown-DoqykhvB.js → IconChevronDown-IrRpX-i0.js} +1 -1
- package/dist/{add-page-ChBpMfRU.js → add-page-DRXx4iOi.js} +1 -1
- package/dist/{admin-interface-SDtt7rqS.js → admin-interface-BY-D9Jvu.js} +4 -4
- package/dist/{admin-view-CKTriO6z.js → admin-view-BZ75rygK.js} +44 -44
- package/dist/admin.js +1 -1
- package/dist/admin.umd.cjs +7 -7
- package/dist/assets/logo.svg +41 -41
- package/dist/{card-page-BaSbgjMn.js → card-page-BAeSkHUO.js} +2 -2
- package/dist/{card-view-B8ohi0lw.js → card-view-p73B3Gbl.js} +1 -1
- package/dist/{edit-page-DLlbyyd_.js → edit-page-CZ8SDvjo.js} +1 -1
- package/dist/{import-file-CV5CU5lC.js → import-file-f46xrNIz.js} +22 -15
- package/dist/style.css +1 -1
- package/module/settings/card/admin.roles.table/access.hbs +27 -27
- package/module/settings/card/admin.roles.table/general_info.hbs +16 -16
- package/module/settings/card/admin.roles.table/index.yml +14 -14
- package/module/settings/card/admin.roles.table/users.hbs +27 -27
- package/module/settings/card/admin.routes.table/general_info.hbs +40 -40
- package/module/settings/card/admin.routes.table/index.yml +8 -8
- package/module/settings/card/admin.routes.table/users.hbs +33 -33
- package/module/settings/card/admin.users.table/general_info.hbs +25 -25
- package/module/settings/card/admin.users.table/index.yml +12 -12
- package/module/settings/card/admin.users.table/logs.hbs +30 -30
- package/module/settings/card/admin.users.table/user_roles.hbs +24 -24
- package/module/settings/cls/core.actions.json +17 -17
- package/module/settings/cls/core.scope.json +13 -13
- package/module/settings/cls/properties.site_status.json +13 -13
- package/module/settings/cls/properties.widget_status.json +13 -13
- package/module/settings/cls/users.user_type.json +13 -13
- package/module/settings/form/admin.access.form.json +36 -36
- package/module/settings/form/admin.custom_column.form.json +71 -71
- package/module/settings/form/admin.properties.form.json +15 -15
- package/module/settings/form/admin.roles.form.json +19 -19
- package/module/settings/form/admin.routes.form.json +25 -25
- package/module/settings/form/admin.user_properties.form.json +15 -15
- package/module/settings/form/admin.user_roles.form.json +21 -21
- package/module/settings/form/admin.users.form.json +153 -153
- package/module/settings/form/user.user_roles.form.json +13 -13
- package/module/settings/interface/admin.properties.json +4 -4
- package/module/settings/interface/admin.roles.json +4 -4
- package/module/settings/interface/admin.routes.json +4 -4
- package/module/settings/interface/admin.users.json +4 -4
- package/module/settings/menu.json +50 -50
- package/module/settings/select/core.roles.json +2 -2
- package/module/settings/select/core.routes.sql +1 -1
- package/module/settings/select/core.user_mentioned.sql +1 -1
- package/module/settings/select/core.user_uid.sql +1 -1
- package/module/settings/table/admin.access.table.json +83 -83
- package/module/settings/table/admin.custom_column.table.json +99 -99
- package/module/settings/table/admin.properties.table.json +39 -39
- package/module/settings/table/admin.roles.table.json +64 -64
- package/module/settings/table/admin.routes.table.json +68 -68
- package/module/settings/table/admin.user_properties.table.json +34 -34
- package/module/settings/table/admin.user_roles.table.json +72 -72
- package/module/settings/table/admin.users.table.json +121 -121
- package/package.json +82 -82
- package/plugin.js +29 -29
- package/server/helpers/controllers/badge.js +11 -11
- package/server/helpers/controllers/hb.js +2 -2
- package/server/helpers/controllers/map.js +2 -2
- package/server/helpers/controllers/mls.js +2 -2
- package/server/helpers/controllers/token.js +16 -16
- package/server/helpers/controllers/vue.js +2 -2
- package/server/helpers/index.mjs +29 -17
- package/server/helpers/list/buttonHelper.js +11 -0
- package/server/helpers/list/descriptionList.js +34 -0
- package/server/helpers/list/tableList.js +66 -0
- package/server/helpers/list/utils/button.js +6 -0
- package/server/plugins/access/funcs/getAdminAccess.js +14 -14
- package/server/plugins/access/index.mjs +6 -6
- package/server/plugins/adminHook.js +81 -93
- package/server/plugins/cron.js +10 -10
- package/server/plugins/docs.js +28 -28
- package/server/plugins/hook.js +223 -223
- package/server/plugins/vite.js +71 -71
- package/server/routes/access/controllers/access.group.js +29 -29
- package/server/routes/access/controllers/access.group.post.js +43 -43
- package/server/routes/access/index.mjs +63 -63
- package/server/routes/calendar/controllers/calendar.data.js +87 -87
- package/server/routes/calendar/index.mjs +7 -7
- package/server/routes/calendar/schema.js +21 -21
- package/server/routes/data/controllers/cardData.js +81 -81
- package/server/routes/data/controllers/cardTabData.js +49 -49
- package/server/routes/data/controllers/funcs/getFilterSQL/index.js +92 -92
- package/server/routes/data/controllers/funcs/getFilterSQL/util/formatValue.js +170 -170
- package/server/routes/data/controllers/funcs/getFilterSQL/util/getCustomQuery.js +13 -13
- package/server/routes/data/controllers/funcs/getFilterSQL/util/getFilterQuery.js +64 -64
- package/server/routes/data/controllers/funcs/getFilterSQL/util/getOptimizedQuery.js +12 -12
- package/server/routes/data/controllers/funcs/getFilterSQL/util/getTableSql.js +34 -34
- package/server/routes/data/controllers/tableData.js +20 -20
- package/server/routes/data/controllers/tableDataId.js +27 -27
- package/server/routes/data/controllers/tableFilter.js +63 -63
- package/server/routes/data/controllers/tokenInfo.js +9 -9
- package/server/routes/data/controllers/utils/assignTokens.js +30 -30
- package/server/routes/data/controllers/utils/getColumns.js +8 -8
- package/server/routes/data/index.mjs +17 -17
- package/server/routes/data/schema.js +54 -54
- package/server/routes/menu/controllers/getMenu.js +67 -67
- package/server/routes/menu/index.mjs +5 -5
- package/server/routes/notifications/controllers/readNotifications.js +27 -27
- package/server/routes/notifications/controllers/testEmail.js +35 -35
- package/server/routes/notifications/controllers/userNotifications.js +53 -53
- package/server/routes/notifications/funcs/addNotification.js +21 -21
- package/server/routes/notifications/funcs/sendNotification.js +105 -105
- package/server/routes/notifications/hook/onWidgetSet.js +57 -57
- package/server/routes/notifications/index.mjs +27 -27
- package/server/routes/notifications/schema.js +16 -16
- package/server/routes/properties/controllers/admin.properties.get.js +29 -29
- package/server/routes/properties/controllers/user.properties.get.js +30 -30
- package/server/routes/properties/controllers/user.properties.post.js +30 -30
- package/server/routes/properties/funcs/getSettings.js +56 -56
- package/server/routes/properties/funcs/setSettings.js +44 -44
- package/server/routes/properties/funcs/utils/dataInsert.js +26 -26
- package/server/routes/properties/index.mjs +14 -14
- package/server/routes/properties/schema.js +10 -10
- package/server/routes/root.mjs +3 -3
- package/server/routes/templates/controllers/getTemplate.js +26 -26
- package/server/routes/templates/index.mjs +16 -16
- package/server/routes/templates/schema.js +8 -8
- package/server/routes/user/controllers/user.cls.id.js +14 -14
- package/server/routes/user/controllers/user.cls.js +71 -71
- package/server/routes/user/controllers/user.cls.post.js +52 -52
- package/server/routes/user/controllers/user.info.js +17 -17
- package/server/routes/user/schema.js +14 -14
- package/server/routes/widget/controllers/utils/historyFormat.js +75 -75
- package/server/routes/widget/controllers/utils/obj2db.js +13 -13
- package/server/routes/widget/controllers/widget.del.js +41 -41
- package/server/routes/widget/controllers/widget.get.js +96 -96
- package/server/routes/widget/controllers/widget.set.js +76 -76
- package/server/routes/widget/index.mjs +11 -11
- package/server/routes/widget/schema.js +12 -12
- package/server/templates/cls/itree.recrzone_category.json +73 -73
- package/server/templates/cls/test.json +9 -9
- package/server/templates/form/admin.user_cls.data.form.json +49 -49
- package/server/templates/form/admin.user_group_rel.form.json +21 -21
- package/server/templates/form/cp_building.form.json +32 -32
- package/server/templates/form/form-user-pass.json +10 -10
- package/server/templates/form/form-user_group.json +39 -39
- package/server/templates/form/form-users.json +156 -156
- package/server/templates/form/user_group_access.form.json +22 -22
- package/server/templates/select/account_id.json +2 -2
- package/server/templates/table/gis.dataset.table.json +43 -43
- package/server/templates/table/management.user_group.table.json +112 -112
- package/server/templates/table/management.users.table.json +126 -126
- package/utils.js +29 -29
@@ -1,30 +1,30 @@
|
|
1
|
-
import { pgClients } from '@opengis/fastify-table/utils.js';
|
2
|
-
|
3
|
-
import { getAdminAccess } from '../../../../utils.js';
|
4
|
-
|
5
|
-
export default async function accessGroup({
|
6
|
-
pg = pgClients.client, params = {}, session = {},
|
7
|
-
}) {
|
8
|
-
const { user = {} } = session?.passport || {};
|
9
|
-
|
10
|
-
if (!params?.id) {
|
11
|
-
return { message: 'not enough params: id', status: 400 };
|
12
|
-
}
|
13
|
-
|
14
|
-
// restrict access - admin only
|
15
|
-
const check = await getAdminAccess({
|
16
|
-
id: params.id, user,
|
17
|
-
});
|
18
|
-
if (check) return check;
|
19
|
-
|
20
|
-
const { rows: routes = [] } = await pg.query(`select a.route_id as path, coalesce(a.actions, b.actions) as actions from admin.routes a
|
21
|
-
left join admin.access b on a.route_id=b.route_id
|
22
|
-
where b.role_id=$1`, [params.id]);
|
23
|
-
|
24
|
-
const { rows: users = [] } = await pg.query(`select user_uid as id, user_name as name, access_granted,
|
25
|
-
b.cdate as user_created, b.last_activity_date as last_activity from admin.user_roles a
|
26
|
-
left join admin.users b on a.user_uid=b.uid
|
27
|
-
where a.role_id=$1`, [params.id]);
|
28
|
-
|
29
|
-
return { routes, users };
|
1
|
+
import { pgClients } from '@opengis/fastify-table/utils.js';
|
2
|
+
|
3
|
+
import { getAdminAccess } from '../../../../utils.js';
|
4
|
+
|
5
|
+
export default async function accessGroup({
|
6
|
+
pg = pgClients.client, params = {}, session = {},
|
7
|
+
}) {
|
8
|
+
const { user = {} } = session?.passport || {};
|
9
|
+
|
10
|
+
if (!params?.id) {
|
11
|
+
return { message: 'not enough params: id', status: 400 };
|
12
|
+
}
|
13
|
+
|
14
|
+
// restrict access - admin only
|
15
|
+
const check = await getAdminAccess({
|
16
|
+
id: params.id, user,
|
17
|
+
});
|
18
|
+
if (check) return check;
|
19
|
+
|
20
|
+
const { rows: routes = [] } = await pg.query(`select a.route_id as path, coalesce(a.actions, b.actions) as actions from admin.routes a
|
21
|
+
left join admin.access b on a.route_id=b.route_id
|
22
|
+
where b.role_id=$1`, [params.id]);
|
23
|
+
|
24
|
+
const { rows: users = [] } = await pg.query(`select user_uid as id, user_name as name, access_granted,
|
25
|
+
b.cdate as user_created, b.last_activity_date as last_activity from admin.user_roles a
|
26
|
+
left join admin.users b on a.user_uid=b.uid
|
27
|
+
where a.role_id=$1`, [params.id]);
|
28
|
+
|
29
|
+
return { routes, users };
|
30
30
|
}
|
@@ -1,44 +1,44 @@
|
|
1
|
-
import { config, pgClients } from '@opengis/fastify-table/utils.js';
|
2
|
-
|
3
|
-
import { getAdminAccess } from '../../../../utils.js';
|
4
|
-
import accessGroup from './access.group.js';
|
5
|
-
|
6
|
-
export default async function accessGroupPost({
|
7
|
-
pg = pgClients.client, params = {}, session = {}, body = {},
|
8
|
-
}) {
|
9
|
-
const { id } = params;
|
10
|
-
const { user = {} } = session?.passport || {};
|
11
|
-
const uid = config?.auth?.disable ? '1' : user?.uid;
|
12
|
-
|
13
|
-
// restrict access - admin only
|
14
|
-
const check = await getAdminAccess({ id, user });
|
15
|
-
if (check) return check;
|
16
|
-
|
17
|
-
const { users = [], routes = [] } = body;
|
18
|
-
|
19
|
-
if (!routes?.length && !users?.length) {
|
20
|
-
return { message: 'not enough params: users / routes', status: 400 };
|
21
|
-
}
|
22
|
-
|
23
|
-
if (routes?.length) {
|
24
|
-
const q = `delete from admin.access where role_id='${id.replace(/'/g, "''")}';
|
25
|
-
insert into admin.access(role_id,route_id,actions)
|
26
|
-
values ${routes.filter((el) => el?.path && Object.hasOwn(el, 'actions')).map((el) => `('${id.replace(/'/g, "''")}','${el.path.replace(/'/g, "''")}',${el.actions?.length ? `'{ ${el.actions} }'::text[]` : 'null'})`)}`;
|
27
|
-
|
28
|
-
await pg.query(q);
|
29
|
-
|
30
|
-
if (!users?.length) {
|
31
|
-
return { message: { id, routes: rows }, status: 200 };
|
32
|
-
}
|
33
|
-
}
|
34
|
-
|
35
|
-
const q = `delete from admin.user_roles where role_id='${id.replace(/'/g, "''")}';
|
36
|
-
insert into admin.user_roles(role_id,user_uid,access_granted)
|
37
|
-
values ${users.filter((el) => el?.id).map((el) => `('${id.replace(/'/g, "''")}','${el.id.replace(/'/g, "''")}','${uid?.replace(/'/g, "''")}')`)}`;
|
38
|
-
|
39
|
-
await pg.query(q);
|
40
|
-
|
41
|
-
const res = await accessGroup({ pg, params, session });
|
42
|
-
|
43
|
-
return res;
|
1
|
+
import { config, pgClients } from '@opengis/fastify-table/utils.js';
|
2
|
+
|
3
|
+
import { getAdminAccess } from '../../../../utils.js';
|
4
|
+
import accessGroup from './access.group.js';
|
5
|
+
|
6
|
+
export default async function accessGroupPost({
|
7
|
+
pg = pgClients.client, params = {}, session = {}, body = {},
|
8
|
+
}) {
|
9
|
+
const { id } = params;
|
10
|
+
const { user = {} } = session?.passport || {};
|
11
|
+
const uid = config?.auth?.disable ? '1' : user?.uid;
|
12
|
+
|
13
|
+
// restrict access - admin only
|
14
|
+
const check = await getAdminAccess({ id, user });
|
15
|
+
if (check) return check;
|
16
|
+
|
17
|
+
const { users = [], routes = [] } = body;
|
18
|
+
|
19
|
+
if (!routes?.length && !users?.length) {
|
20
|
+
return { message: 'not enough params: users / routes', status: 400 };
|
21
|
+
}
|
22
|
+
|
23
|
+
if (routes?.length) {
|
24
|
+
const q = `delete from admin.access where role_id='${id.replace(/'/g, "''")}';
|
25
|
+
insert into admin.access(role_id,route_id,actions)
|
26
|
+
values ${routes.filter((el) => el?.path && Object.hasOwn(el, 'actions')).map((el) => `('${id.replace(/'/g, "''")}','${el.path.replace(/'/g, "''")}',${el.actions?.length ? `'{ ${el.actions} }'::text[]` : 'null'})`)}`;
|
27
|
+
|
28
|
+
await pg.query(q);
|
29
|
+
|
30
|
+
if (!users?.length) {
|
31
|
+
return { message: { id, routes: rows }, status: 200 };
|
32
|
+
}
|
33
|
+
}
|
34
|
+
|
35
|
+
const q = `delete from admin.user_roles where role_id='${id.replace(/'/g, "''")}';
|
36
|
+
insert into admin.user_roles(role_id,user_uid,access_granted)
|
37
|
+
values ${users.filter((el) => el?.id).map((el) => `('${id.replace(/'/g, "''")}','${el.id.replace(/'/g, "''")}','${uid?.replace(/'/g, "''")}')`)}`;
|
38
|
+
|
39
|
+
await pg.query(q);
|
40
|
+
|
41
|
+
const res = await accessGroup({ pg, params, session });
|
42
|
+
|
43
|
+
return res;
|
44
44
|
}
|
@@ -1,63 +1,63 @@
|
|
1
|
-
import accessGroup from "./controllers/access.group.js";
|
2
|
-
import accessGroupPost from "./controllers/access.group.post.js";
|
3
|
-
|
4
|
-
const accessGroupSchema = {
|
5
|
-
params: {
|
6
|
-
type: 'object',
|
7
|
-
properties: {
|
8
|
-
id: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
|
9
|
-
},
|
10
|
-
required: ['id'],
|
11
|
-
},
|
12
|
-
};
|
13
|
-
|
14
|
-
const accessGroupPostSchema = {
|
15
|
-
params: {
|
16
|
-
type: 'object',
|
17
|
-
properties: {
|
18
|
-
id: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
|
19
|
-
},
|
20
|
-
required: ['id'],
|
21
|
-
},
|
22
|
-
body: {
|
23
|
-
type: 'object',
|
24
|
-
properties: {
|
25
|
-
users: {
|
26
|
-
type: 'array',
|
27
|
-
items: {
|
28
|
-
type: 'object',
|
29
|
-
properties: {
|
30
|
-
id: {
|
31
|
-
type: 'string',
|
32
|
-
pattern: '^([\\d\\w._-]+)$',
|
33
|
-
},
|
34
|
-
},
|
35
|
-
},
|
36
|
-
},
|
37
|
-
routes: {
|
38
|
-
type: 'array',
|
39
|
-
items: {
|
40
|
-
type: 'object',
|
41
|
-
properties: {
|
42
|
-
path: {
|
43
|
-
type: 'string',
|
44
|
-
pattern: '^([\\d\\w._-]+)$',
|
45
|
-
},
|
46
|
-
actions: {
|
47
|
-
type: 'array',
|
48
|
-
items: {
|
49
|
-
type: 'string',
|
50
|
-
enum: ['get', 'add', 'edit', 'del'],
|
51
|
-
},
|
52
|
-
},
|
53
|
-
},
|
54
|
-
},
|
55
|
-
},
|
56
|
-
},
|
57
|
-
},
|
58
|
-
};
|
59
|
-
|
60
|
-
export default async function route(fastify) {
|
61
|
-
fastify.get('/access-group/:id', { schema: accessGroupSchema }, accessGroup);
|
62
|
-
fastify.post('/access-group/:id', { schema: accessGroupPostSchema }, accessGroupPost);
|
63
|
-
}
|
1
|
+
import accessGroup from "./controllers/access.group.js";
|
2
|
+
import accessGroupPost from "./controllers/access.group.post.js";
|
3
|
+
|
4
|
+
const accessGroupSchema = {
|
5
|
+
params: {
|
6
|
+
type: 'object',
|
7
|
+
properties: {
|
8
|
+
id: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
|
9
|
+
},
|
10
|
+
required: ['id'],
|
11
|
+
},
|
12
|
+
};
|
13
|
+
|
14
|
+
const accessGroupPostSchema = {
|
15
|
+
params: {
|
16
|
+
type: 'object',
|
17
|
+
properties: {
|
18
|
+
id: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
|
19
|
+
},
|
20
|
+
required: ['id'],
|
21
|
+
},
|
22
|
+
body: {
|
23
|
+
type: 'object',
|
24
|
+
properties: {
|
25
|
+
users: {
|
26
|
+
type: 'array',
|
27
|
+
items: {
|
28
|
+
type: 'object',
|
29
|
+
properties: {
|
30
|
+
id: {
|
31
|
+
type: 'string',
|
32
|
+
pattern: '^([\\d\\w._-]+)$',
|
33
|
+
},
|
34
|
+
},
|
35
|
+
},
|
36
|
+
},
|
37
|
+
routes: {
|
38
|
+
type: 'array',
|
39
|
+
items: {
|
40
|
+
type: 'object',
|
41
|
+
properties: {
|
42
|
+
path: {
|
43
|
+
type: 'string',
|
44
|
+
pattern: '^([\\d\\w._-]+)$',
|
45
|
+
},
|
46
|
+
actions: {
|
47
|
+
type: 'array',
|
48
|
+
items: {
|
49
|
+
type: 'string',
|
50
|
+
enum: ['get', 'add', 'edit', 'del'],
|
51
|
+
},
|
52
|
+
},
|
53
|
+
},
|
54
|
+
},
|
55
|
+
},
|
56
|
+
},
|
57
|
+
},
|
58
|
+
};
|
59
|
+
|
60
|
+
export default async function route(fastify) {
|
61
|
+
fastify.get('/access-group/:id', { schema: accessGroupSchema }, accessGroup);
|
62
|
+
fastify.post('/access-group/:id', { schema: accessGroupPostSchema }, accessGroupPost);
|
63
|
+
}
|
@@ -1,88 +1,88 @@
|
|
1
|
-
import { handlebars, getMeta, getTemplate } from '@opengis/fastify-table/utils.js';
|
2
|
-
|
3
|
-
export default async function calendarData({
|
4
|
-
pg, params = {}, query = {}, session = {},
|
5
|
-
}) {
|
6
|
-
const { name } = params;
|
7
|
-
const { uid } = session.passport?.user || {};
|
8
|
-
if (!name) {
|
9
|
-
return { message: 'not enough params: name', status: 400 };
|
10
|
-
}
|
11
|
-
const { date, sql } = query;
|
12
|
-
|
13
|
-
|
14
|
-
const body = await getTemplate('calendar', name);
|
15
|
-
|
16
|
-
if (!body) {
|
17
|
-
return { message: `calendar not found: ${name}`, status: 404 };
|
18
|
-
}
|
19
|
-
|
20
|
-
const {
|
21
|
-
title,
|
22
|
-
table,
|
23
|
-
query: query1 = '1=1',
|
24
|
-
meta = {},
|
25
|
-
filter = [],
|
26
|
-
} = body;
|
27
|
-
|
28
|
-
if (!table) {
|
29
|
-
return { message: 'not enough calendar params: table', status: 404 };
|
30
|
-
}
|
31
|
-
if (!pg.pk?.[table]) {
|
32
|
-
return { message: `table pkey not found: ${table}`, status: 404 };
|
33
|
-
}
|
34
|
-
|
35
|
-
const filterWhere = filter?.length && query.filter?.length
|
36
|
-
? filter.filter((el) => (Object.hasOwn(el, 'enabled') ? el?.enabled : true))
|
37
|
-
.map((el) => {
|
38
|
-
const val = query.filter.split(',').find((e) => e?.split('=')?.shift()?.includes(el.column || el.name))?.split('=')?.pop();
|
39
|
-
if (val) return el.column && val ? `(${[`${el.column}::text='${val.replace(/'/g,"''")}'::text`, el.query].filter((el) => el).join(' and ')})` : el.query;
|
40
|
-
}).filter((el) => el).join(' and ')
|
41
|
-
: undefined;
|
42
|
-
// console.log(filterWhere);
|
43
|
-
|
44
|
-
const queryWhere = await handlebars.compile(query1)({ uid });
|
45
|
-
const filterDate = date ? `date_trunc('month', "${meta?.date || meta?.start}"::date)='${date}'::date` : undefined;
|
46
|
-
const where = [queryWhere, filterDate, filterWhere].filter((el) => el).join(' and ');
|
47
|
-
|
48
|
-
const filtersByColumn = filter.filter((el) => (Object.hasOwn(el, 'enabled') ? el?.enabled : true) && el?.column);
|
49
|
-
|
50
|
-
const filters = [];
|
51
|
-
if (filtersByColumn?.length) {
|
52
|
-
await Promise.all(filtersByColumn.map(async (el) => {
|
53
|
-
const { rows: filterData = [] } = await pg.query(`select $1 as id, count(*) from $2
|
54
|
-
where ${el.query || '1=1'} and ${filterWhere || '1=1'} group by $1`, [el.column, table] );
|
55
|
-
if (!filterData?.length) return;
|
56
|
-
|
57
|
-
// const clsData = await getSelectVal({ pg, name: el.cls, values: filterData.map((el) => el.id) });
|
58
|
-
const clsData = el.cls ? await getTemplate(['cls', 'select'], el.cls) : undefined;
|
59
|
-
|
60
|
-
if (!el.cls) {
|
61
|
-
filterData.forEach((el1) => filters.push(el1));
|
62
|
-
return;
|
63
|
-
}
|
64
|
-
|
65
|
-
filterData.forEach((el1) => {
|
66
|
-
const cls = clsData.find((item) => item.id === el1.id.toString());
|
67
|
-
Object.assign(el1, { title: cls?.text, color: cls?.color });
|
68
|
-
filters.push(el1);
|
69
|
-
});
|
70
|
-
}));
|
71
|
-
}
|
72
|
-
|
73
|
-
const tableMeta = await getMeta({ pg, table });
|
74
|
-
const columnList = tableMeta?.columns?.map((el) => el?.name);
|
75
|
-
const columns = Object.keys(meta).filter((el) => ['date', 'start','end','title','status'].includes(el) && columnList.includes(meta[el])).map((el) => `"${meta[el]}" as ${el}`);
|
76
|
-
|
77
|
-
if (!columns?.length) {
|
78
|
-
return { message: `calendar param meta is invalid: invalid/empty keys`, status: 404 };
|
79
|
-
}
|
80
|
-
|
81
|
-
const q = `select &1 from $2 where $3`;
|
82
|
-
if (sql) return q;
|
83
|
-
|
84
|
-
const { rows = [] } = await pg.query(q, [columns.join(','), table, where]);
|
85
|
-
|
86
|
-
return { title, filters, rows };
|
87
|
-
|
1
|
+
import { handlebars, getMeta, getTemplate } from '@opengis/fastify-table/utils.js';
|
2
|
+
|
3
|
+
export default async function calendarData({
|
4
|
+
pg, params = {}, query = {}, session = {},
|
5
|
+
}) {
|
6
|
+
const { name } = params;
|
7
|
+
const { uid } = session.passport?.user || {};
|
8
|
+
if (!name) {
|
9
|
+
return { message: 'not enough params: name', status: 400 };
|
10
|
+
}
|
11
|
+
const { date, sql } = query;
|
12
|
+
|
13
|
+
|
14
|
+
const body = await getTemplate('calendar', name);
|
15
|
+
|
16
|
+
if (!body) {
|
17
|
+
return { message: `calendar not found: ${name}`, status: 404 };
|
18
|
+
}
|
19
|
+
|
20
|
+
const {
|
21
|
+
title,
|
22
|
+
table,
|
23
|
+
query: query1 = '1=1',
|
24
|
+
meta = {},
|
25
|
+
filter = [],
|
26
|
+
} = body;
|
27
|
+
|
28
|
+
if (!table) {
|
29
|
+
return { message: 'not enough calendar params: table', status: 404 };
|
30
|
+
}
|
31
|
+
if (!pg.pk?.[table]) {
|
32
|
+
return { message: `table pkey not found: ${table}`, status: 404 };
|
33
|
+
}
|
34
|
+
|
35
|
+
const filterWhere = filter?.length && query.filter?.length
|
36
|
+
? filter.filter((el) => (Object.hasOwn(el, 'enabled') ? el?.enabled : true))
|
37
|
+
.map((el) => {
|
38
|
+
const val = query.filter.split(',').find((e) => e?.split('=')?.shift()?.includes(el.column || el.name))?.split('=')?.pop();
|
39
|
+
if (val) return el.column && val ? `(${[`${el.column}::text='${val.replace(/'/g,"''")}'::text`, el.query].filter((el) => el).join(' and ')})` : el.query;
|
40
|
+
}).filter((el) => el).join(' and ')
|
41
|
+
: undefined;
|
42
|
+
// console.log(filterWhere);
|
43
|
+
|
44
|
+
const queryWhere = await handlebars.compile(query1)({ uid });
|
45
|
+
const filterDate = date ? `date_trunc('month', "${meta?.date || meta?.start}"::date)='${date}'::date` : undefined;
|
46
|
+
const where = [queryWhere, filterDate, filterWhere].filter((el) => el).join(' and ');
|
47
|
+
|
48
|
+
const filtersByColumn = filter.filter((el) => (Object.hasOwn(el, 'enabled') ? el?.enabled : true) && el?.column);
|
49
|
+
|
50
|
+
const filters = [];
|
51
|
+
if (filtersByColumn?.length) {
|
52
|
+
await Promise.all(filtersByColumn.map(async (el) => {
|
53
|
+
const { rows: filterData = [] } = await pg.query(`select $1 as id, count(*) from $2
|
54
|
+
where ${el.query || '1=1'} and ${filterWhere || '1=1'} group by $1`, [el.column, table] );
|
55
|
+
if (!filterData?.length) return;
|
56
|
+
|
57
|
+
// const clsData = await getSelectVal({ pg, name: el.cls, values: filterData.map((el) => el.id) });
|
58
|
+
const clsData = el.cls ? await getTemplate(['cls', 'select'], el.cls) : undefined;
|
59
|
+
|
60
|
+
if (!el.cls) {
|
61
|
+
filterData.forEach((el1) => filters.push(el1));
|
62
|
+
return;
|
63
|
+
}
|
64
|
+
|
65
|
+
filterData.forEach((el1) => {
|
66
|
+
const cls = clsData.find((item) => item.id === el1.id.toString());
|
67
|
+
Object.assign(el1, { title: cls?.text, color: cls?.color });
|
68
|
+
filters.push(el1);
|
69
|
+
});
|
70
|
+
}));
|
71
|
+
}
|
72
|
+
|
73
|
+
const tableMeta = await getMeta({ pg, table });
|
74
|
+
const columnList = tableMeta?.columns?.map((el) => el?.name);
|
75
|
+
const columns = Object.keys(meta).filter((el) => ['date', 'start','end','title','status'].includes(el) && columnList.includes(meta[el])).map((el) => `"${meta[el]}" as ${el}`);
|
76
|
+
|
77
|
+
if (!columns?.length) {
|
78
|
+
return { message: `calendar param meta is invalid: invalid/empty keys`, status: 404 };
|
79
|
+
}
|
80
|
+
|
81
|
+
const q = `select &1 from $2 where $3`;
|
82
|
+
if (sql) return q;
|
83
|
+
|
84
|
+
const { rows = [] } = await pg.query(q, [columns.join(','), table, where]);
|
85
|
+
|
86
|
+
return { title, filters, rows };
|
87
|
+
|
88
88
|
}
|
@@ -1,7 +1,7 @@
|
|
1
|
-
import calendarData from "./controllers/calendar.data.js";
|
2
|
-
|
3
|
-
import { calendarDataSchema } from './schema.js';
|
4
|
-
|
5
|
-
export default async function route(fastify) {
|
6
|
-
fastify.get('/calendar/:name', { schema: calendarDataSchema }, calendarData);
|
7
|
-
}
|
1
|
+
import calendarData from "./controllers/calendar.data.js";
|
2
|
+
|
3
|
+
import { calendarDataSchema } from './schema.js';
|
4
|
+
|
5
|
+
export default async function route(fastify) {
|
6
|
+
fastify.get('/calendar/:name', { schema: calendarDataSchema }, calendarData);
|
7
|
+
}
|
@@ -1,22 +1,22 @@
|
|
1
|
-
const calendarDataSchema = {
|
2
|
-
params: {
|
3
|
-
name: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
|
4
|
-
},
|
5
|
-
querystring: {
|
6
|
-
date: { type: 'string', pattern: '^([\\d\\s\\/,.:-]+)$' },
|
7
|
-
sql: { type: 'string', pattern: '^(\\d)$' },
|
8
|
-
},
|
9
|
-
|
10
|
-
// query: {
|
11
|
-
// type: 'object',
|
12
|
-
// properties: {
|
13
|
-
// date: {
|
14
|
-
// type: 'string',
|
15
|
-
// format: 'date',
|
16
|
-
// },
|
17
|
-
// },
|
18
|
-
// },
|
19
|
-
};
|
20
|
-
|
21
|
-
export { calendarDataSchema }
|
1
|
+
const calendarDataSchema = {
|
2
|
+
params: {
|
3
|
+
name: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
|
4
|
+
},
|
5
|
+
querystring: {
|
6
|
+
date: { type: 'string', pattern: '^([\\d\\s\\/,.:-]+)$' },
|
7
|
+
sql: { type: 'string', pattern: '^(\\d)$' },
|
8
|
+
},
|
9
|
+
|
10
|
+
// query: {
|
11
|
+
// type: 'object',
|
12
|
+
// properties: {
|
13
|
+
// date: {
|
14
|
+
// type: 'string',
|
15
|
+
// format: 'date',
|
16
|
+
// },
|
17
|
+
// },
|
18
|
+
// },
|
19
|
+
};
|
20
|
+
|
21
|
+
export { calendarDataSchema }
|
22
22
|
export default null;
|