@opengis/admin 0.1.80 → 0.1.82
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-DWLdkAUG.js → IconChevronDown-TOHGDzb9.js} +1 -1
- package/dist/{add-page-GDPnGgQK.js → add-page-DVsruEe8.js} +1 -1
- package/dist/{admin-interface-DOqhM3SD.js → admin-interface-CqPS5k9y.js} +363 -363
- package/dist/{admin-view-xnJ3u3oI.js → admin-view-DtZwCxNO.js} +4 -4
- package/dist/admin.js +1 -1
- package/dist/admin.umd.cjs +85 -85
- package/dist/assets/logo.svg +41 -41
- package/dist/card-page-DiSMqrtf.js +358 -0
- package/dist/{card-view-CuKF08UR.js → card-view-RC_RStl7.js} +1 -1
- package/dist/{edit-page-J0eDzIuJ.js → edit-page-B0syX8OD.js} +1 -1
- package/dist/{import-file-REG5YZVe.js → import-file-BihjtZo9.js} +8208 -8008
- 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 -13
- 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 -27
- 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 +15 -15
- package/server/helpers/controllers/vue.js +2 -2
- package/server/helpers/index.mjs +17 -17
- package/server/plugins/access/funcs/getAdminAccess.js +15 -0
- package/server/plugins/access/index.mjs +6 -0
- package/server/plugins/adminHook.js +93 -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 +33 -0
- package/server/routes/access/controllers/access.group.post.js +44 -0
- package/server/routes/access/index.mjs +63 -0
- 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 -94
- 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 -14
- 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 +10 -0
- 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 -15
- 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 -22
- 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 -26
- package/dist/card-page-DhYFr0FI.js +0 -280
@@ -1,54 +1,54 @@
|
|
1
|
-
const tableDataSchema = {
|
2
|
-
querystring: {
|
3
|
-
limit: { type: 'string', pattern: '^(\\d+)$' },
|
4
|
-
page: { type: 'string', pattern: '^(\\d+)$' },
|
5
|
-
// filter: { type: 'string', pattern: '^([\\w\\d_-]+)=([А-Яа-яҐґЄєІіЇї\\d\\w\\s\\/\\[\\]\\(\\)\\{\\}\\|,.!?;:—_=-@%#$&^*+=`~]+)$' },
|
6
|
-
// search: { type: 'string', pattern: '^([А-Яа-яҐґЄєІіЇї\\d\\w\\s\\/\\[\\]\\(\\)\\{\\}\\|,.!?;:—_=-@%#$&^*+=`~]+)$' },
|
7
|
-
order: { type: 'string', pattern: '^([\\d\\w_.-]+)$' },
|
8
|
-
desc: { type: 'string', pattern: '^(\\d+)$' },
|
9
|
-
state: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
|
10
|
-
custom: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
|
11
|
-
bbox: { type: 'string', pattern: '^([\\d\\s,.-]+)$' },
|
12
|
-
polyline: { type: 'string', pattern: '^([\\d\\w|@{}~_`]+)$' },
|
13
|
-
// key: { type: 'string', pattern: '^([\\d\\w_]+)$' },
|
14
|
-
sql: { type: 'string', pattern: '^(\\d)$' },
|
15
|
-
},
|
16
|
-
params: {
|
17
|
-
id: { type: 'string', pattern: '^([\\d\\w]+)$' },
|
18
|
-
table: { type: 'string', pattern: '^([\\d\\w_.-]+)$' },
|
19
|
-
}
|
20
|
-
};
|
21
|
-
|
22
|
-
const tableDataIdSchema = {
|
23
|
-
params: {
|
24
|
-
id: { type: 'string', pattern: '^([\\d\\w]+)$' },
|
25
|
-
name: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
|
26
|
-
}
|
27
|
-
};
|
28
|
-
|
29
|
-
const tableFilterSchema = {
|
30
|
-
params: {
|
31
|
-
name: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
|
32
|
-
}
|
33
|
-
};
|
34
|
-
|
35
|
-
const cardDataSchema = {
|
36
|
-
params: {
|
37
|
-
id: { type: 'string', pattern: '^([\\d\\w]+)$' },
|
38
|
-
table: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
|
39
|
-
}
|
40
|
-
};
|
41
|
-
|
42
|
-
const cardTabDataSchema = {
|
43
|
-
querystring: {
|
44
|
-
sql: { type: 'string', pattern: '^(\\d)$' }
|
45
|
-
},
|
46
|
-
params: {
|
47
|
-
token: { type: 'string', pattern: '^([\\d\\w]+)$' },
|
48
|
-
}
|
49
|
-
};
|
50
|
-
export {
|
51
|
-
tableDataSchema, tableDataIdSchema, tableFilterSchema,
|
52
|
-
cardDataSchema, cardTabDataSchema
|
53
|
-
}
|
54
|
-
export default null;
|
1
|
+
const tableDataSchema = {
|
2
|
+
querystring: {
|
3
|
+
limit: { type: 'string', pattern: '^(\\d+)$' },
|
4
|
+
page: { type: 'string', pattern: '^(\\d+)$' },
|
5
|
+
// filter: { type: 'string', pattern: '^([\\w\\d_-]+)=([А-Яа-яҐґЄєІіЇї\\d\\w\\s\\/\\[\\]\\(\\)\\{\\}\\|,.!?;:—_=-@%#$&^*+=`~]+)$' },
|
6
|
+
// search: { type: 'string', pattern: '^([А-Яа-яҐґЄєІіЇї\\d\\w\\s\\/\\[\\]\\(\\)\\{\\}\\|,.!?;:—_=-@%#$&^*+=`~]+)$' },
|
7
|
+
order: { type: 'string', pattern: '^([\\d\\w_.-]+)$' },
|
8
|
+
desc: { type: 'string', pattern: '^(\\d+)$' },
|
9
|
+
state: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
|
10
|
+
custom: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
|
11
|
+
bbox: { type: 'string', pattern: '^([\\d\\s,.-]+)$' },
|
12
|
+
polyline: { type: 'string', pattern: '^([\\d\\w|@{}~_`]+)$' },
|
13
|
+
// key: { type: 'string', pattern: '^([\\d\\w_]+)$' },
|
14
|
+
sql: { type: 'string', pattern: '^(\\d)$' },
|
15
|
+
},
|
16
|
+
params: {
|
17
|
+
id: { type: 'string', pattern: '^([\\d\\w]+)$' },
|
18
|
+
table: { type: 'string', pattern: '^([\\d\\w_.-]+)$' },
|
19
|
+
}
|
20
|
+
};
|
21
|
+
|
22
|
+
const tableDataIdSchema = {
|
23
|
+
params: {
|
24
|
+
id: { type: 'string', pattern: '^([\\d\\w]+)$' },
|
25
|
+
name: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
|
26
|
+
}
|
27
|
+
};
|
28
|
+
|
29
|
+
const tableFilterSchema = {
|
30
|
+
params: {
|
31
|
+
name: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
|
32
|
+
}
|
33
|
+
};
|
34
|
+
|
35
|
+
const cardDataSchema = {
|
36
|
+
params: {
|
37
|
+
id: { type: 'string', pattern: '^([\\d\\w]+)$' },
|
38
|
+
table: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
|
39
|
+
}
|
40
|
+
};
|
41
|
+
|
42
|
+
const cardTabDataSchema = {
|
43
|
+
querystring: {
|
44
|
+
sql: { type: 'string', pattern: '^(\\d)$' }
|
45
|
+
},
|
46
|
+
params: {
|
47
|
+
token: { type: 'string', pattern: '^([\\d\\w]+)$' },
|
48
|
+
}
|
49
|
+
};
|
50
|
+
export {
|
51
|
+
tableDataSchema, tableDataIdSchema, tableFilterSchema,
|
52
|
+
cardDataSchema, cardTabDataSchema
|
53
|
+
}
|
54
|
+
export default null;
|
@@ -1,68 +1,68 @@
|
|
1
|
-
|
2
|
-
import { join } from 'path';
|
3
|
-
import { userTemplateDir, config, getAccess, pgClients } from '@opengis/fastify-table/utils.js';
|
4
|
-
|
5
|
-
import { existsSync, readdirSync, readFileSync } from 'fs';
|
6
|
-
const menuCache = [];
|
7
|
-
// check module dir
|
8
|
-
const moduleDir = join(process.cwd(), 'module');
|
9
|
-
const dirs = existsSync(moduleDir) ?
|
10
|
-
readdirSync(moduleDir).map(el => join(moduleDir, el)) : [];
|
11
|
-
|
12
|
-
// all menu files module + user
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
const isProduction = process.env.NODE_ENV === 'production';
|
17
|
-
// readMenu();
|
18
|
-
|
19
|
-
async function readMenu() {
|
20
|
-
const menuList = dirs.concat(userTemplateDir)
|
21
|
-
.map(el => join(el, 'menu.json'))
|
22
|
-
.filter(el => existsSync(el))
|
23
|
-
// const list = menuList.map(el => readFileSync(el, 'utf-8')); // sync
|
24
|
-
const list = await Promise.all(menuList.map(el => readFileSync(el, 'utf-8'))); // sync
|
25
|
-
const menus = list.reduce((p, el) => p.concat(JSON.parse(el)), [])
|
26
|
-
.map(el => ({ order: 0, ...el }))
|
27
|
-
.sort((a, b) => (a.order > b.order) ? 1 : ((b.order > a.order) ? -1 : 0))
|
28
|
-
|
29
|
-
if (!menuCache.length) menus.forEach(el => menuCache.push(el))
|
30
|
-
return menus;
|
31
|
-
}
|
32
|
-
export default async function adminMenu({ user = {}, session, pg = pgClients.client }) {
|
33
|
-
if (!user.uid) return { status: 403, message: 'access restricted' }
|
34
|
-
|
35
|
-
const menus = isProduction && menuCache.length ? menuCache : await readMenu();
|
36
|
-
|
37
|
-
// update user access
|
38
|
-
if (session && user?.uid) {
|
39
|
-
const { type, gl = [] } = await pg.query(`select user_type as type, b.gl from admin.users a
|
40
|
-
left join lateral (
|
41
|
-
select array_agg(role_id) as gl from admin.user_roles where user_uid=a.uid
|
42
|
-
)b on 1=1 where uid=$1`, [user.uid]).then(el => el.rows[0] || {});
|
43
|
-
/* const { interfaces = [] } = await pg.query(`select array_agg(route_id) as interfaces from admin.access
|
44
|
-
where user_uid=$1 or role_id=any($2::text[])`, [user.uid, gl]).then((res) => res.rows?.[0] || {}); */
|
45
|
-
Object.assign(user, { type, group_list: gl });
|
46
|
-
session?.set?.('passport', { user });
|
47
|
-
}
|
48
|
-
return menus;
|
49
|
-
|
50
|
-
if (req) {
|
51
|
-
const user = req?.session?.passport?.user || {};
|
52
|
-
const userMenu = await Promise.all(menus.map(async (menu) => {
|
53
|
-
if (menu?.menu?.length) {
|
54
|
-
const submenu = await Promise.all(menu.menu?.map(async (submenu) => {
|
55
|
-
const access = await getAccess({ table: submenu?.table, user });
|
56
|
-
return { ...submenu, access };
|
57
|
-
}));
|
58
|
-
return { ...menu, menu: submenu.filter((e) => e?.access), access: submenu.filter((e) => e?.access?.actions?.includes('get'))?.length };
|
59
|
-
} else if (menu?.table) {
|
60
|
-
const access = await getAccess({ table: menu?.table, user });
|
61
|
-
return { ...menu, access };
|
62
|
-
}
|
63
|
-
return menu;
|
64
|
-
}));
|
65
|
-
return userMenu.filter((e) => e?.access)?.map((e) => ({ ...e, menu: e?.menu ? e?.menu?.filter((el) => el?.access?.actions?.includes('get')) : undefined }));
|
66
|
-
}
|
67
|
-
return menus;
|
1
|
+
|
2
|
+
import { join } from 'path';
|
3
|
+
import { userTemplateDir, config, getAccess, pgClients } from '@opengis/fastify-table/utils.js';
|
4
|
+
|
5
|
+
import { existsSync, readdirSync, readFileSync } from 'fs';
|
6
|
+
const menuCache = [];
|
7
|
+
// check module dir
|
8
|
+
const moduleDir = join(process.cwd(), 'module');
|
9
|
+
const dirs = existsSync(moduleDir) ?
|
10
|
+
readdirSync(moduleDir).map(el => join(moduleDir, el)) : [];
|
11
|
+
|
12
|
+
// all menu files module + user
|
13
|
+
|
14
|
+
|
15
|
+
|
16
|
+
const isProduction = process.env.NODE_ENV === 'production';
|
17
|
+
// readMenu();
|
18
|
+
|
19
|
+
async function readMenu() {
|
20
|
+
const menuList = dirs.concat(userTemplateDir)
|
21
|
+
.map(el => join(el, 'menu.json'))
|
22
|
+
.filter(el => existsSync(el))
|
23
|
+
// const list = menuList.map(el => readFileSync(el, 'utf-8')); // sync
|
24
|
+
const list = await Promise.all(menuList.map(el => readFileSync(el, 'utf-8'))); // sync
|
25
|
+
const menus = list.reduce((p, el) => p.concat(JSON.parse(el)), [])
|
26
|
+
.map(el => ({ order: 0, ...el }))
|
27
|
+
.sort((a, b) => (a.order > b.order) ? 1 : ((b.order > a.order) ? -1 : 0))
|
28
|
+
|
29
|
+
if (!menuCache.length) menus.forEach(el => menuCache.push(el))
|
30
|
+
return menus;
|
31
|
+
}
|
32
|
+
export default async function adminMenu({ user = {}, session, pg = pgClients.client }) {
|
33
|
+
if (!user.uid) return { status: 403, message: 'access restricted' }
|
34
|
+
|
35
|
+
const menus = isProduction && menuCache.length ? menuCache : await readMenu();
|
36
|
+
|
37
|
+
// update user access
|
38
|
+
if (session && user?.uid) {
|
39
|
+
const { type, gl = [] } = await pg.query(`select user_type as type, b.gl from admin.users a
|
40
|
+
left join lateral (
|
41
|
+
select array_agg(role_id) as gl from admin.user_roles where user_uid=a.uid
|
42
|
+
)b on 1=1 where uid=$1`, [user.uid]).then(el => el.rows[0] || {});
|
43
|
+
/* const { interfaces = [] } = await pg.query(`select array_agg(route_id) as interfaces from admin.access
|
44
|
+
where user_uid=$1 or role_id=any($2::text[])`, [user.uid, gl]).then((res) => res.rows?.[0] || {}); */
|
45
|
+
Object.assign(user, { type, group_list: gl });
|
46
|
+
session?.set?.('passport', { user });
|
47
|
+
}
|
48
|
+
return menus;
|
49
|
+
|
50
|
+
if (req) {
|
51
|
+
const user = req?.session?.passport?.user || {};
|
52
|
+
const userMenu = await Promise.all(menus.map(async (menu) => {
|
53
|
+
if (menu?.menu?.length) {
|
54
|
+
const submenu = await Promise.all(menu.menu?.map(async (submenu) => {
|
55
|
+
const access = await getAccess({ table: submenu?.table, user });
|
56
|
+
return { ...submenu, access };
|
57
|
+
}));
|
58
|
+
return { ...menu, menu: submenu.filter((e) => e?.access), access: submenu.filter((e) => e?.access?.actions?.includes('get'))?.length };
|
59
|
+
} else if (menu?.table) {
|
60
|
+
const access = await getAccess({ table: menu?.table, user });
|
61
|
+
return { ...menu, access };
|
62
|
+
}
|
63
|
+
return menu;
|
64
|
+
}));
|
65
|
+
return userMenu.filter((e) => e?.access)?.map((e) => ({ ...e, menu: e?.menu ? e?.menu?.filter((el) => el?.access?.actions?.includes('get')) : undefined }));
|
66
|
+
}
|
67
|
+
return menus;
|
68
68
|
}
|
@@ -1,5 +1,5 @@
|
|
1
|
-
import getMenu from './controllers/getMenu.js';
|
2
|
-
|
3
|
-
export default async function (fastify, opts) {
|
4
|
-
fastify.get(`/user-menu`, getMenu);
|
5
|
-
}
|
1
|
+
import getMenu from './controllers/getMenu.js';
|
2
|
+
|
3
|
+
export default async function (fastify, opts) {
|
4
|
+
fastify.get(`/user-menu`, getMenu);
|
5
|
+
}
|
@@ -1,27 +1,27 @@
|
|
1
|
-
export default async function readNotifications({
|
2
|
-
pg, params = {}, query = {}, session = {},
|
3
|
-
}) {
|
4
|
-
const { uid } = session.passport?.user || {};
|
5
|
-
|
6
|
-
if (!uid) {
|
7
|
-
return { message: 'access restricted', status: 403 };
|
8
|
-
}
|
9
|
-
|
10
|
-
|
11
|
-
const { userId } = await pg.query('select uid as "userId" from admin.users where $1 in (uid,login) limit 1', [uid])
|
12
|
-
.then((res) => res.rows?.[0] || {});
|
13
|
-
|
14
|
-
if (!userId) {
|
15
|
-
return { message: 'access restricted: 2', status: 403 };
|
16
|
-
}
|
17
|
-
|
18
|
-
const q = `update crm.notifications set read=true where read is not true
|
19
|
-
and ${params?.id ? 'notification_id=$2' : '1=1'} and addressee_id=$1`;
|
20
|
-
|
21
|
-
if (query.sql) return q;
|
22
|
-
|
23
|
-
const { rowCount = 0 } = await pg.query(q, [userId, params?.id].filter((el) => el));
|
24
|
-
|
25
|
-
return { message: `${rowCount} unread notifications marked as read`, status: 200 };
|
26
|
-
|
27
|
-
}
|
1
|
+
export default async function readNotifications({
|
2
|
+
pg, params = {}, query = {}, session = {},
|
3
|
+
}) {
|
4
|
+
const { uid } = session.passport?.user || {};
|
5
|
+
|
6
|
+
if (!uid) {
|
7
|
+
return { message: 'access restricted', status: 403 };
|
8
|
+
}
|
9
|
+
|
10
|
+
|
11
|
+
const { userId } = await pg.query('select uid as "userId" from admin.users where $1 in (uid,login) limit 1', [uid])
|
12
|
+
.then((res) => res.rows?.[0] || {});
|
13
|
+
|
14
|
+
if (!userId) {
|
15
|
+
return { message: 'access restricted: 2', status: 403 };
|
16
|
+
}
|
17
|
+
|
18
|
+
const q = `update crm.notifications set read=true where read is not true
|
19
|
+
and ${params?.id ? 'notification_id=$2' : '1=1'} and addressee_id=$1`;
|
20
|
+
|
21
|
+
if (query.sql) return q;
|
22
|
+
|
23
|
+
const { rowCount = 0 } = await pg.query(q, [userId, params?.id].filter((el) => el));
|
24
|
+
|
25
|
+
return { message: `${rowCount} unread notifications marked as read`, status: 200 };
|
26
|
+
|
27
|
+
}
|
@@ -1,35 +1,35 @@
|
|
1
|
-
import config from '../../../../config.js';
|
2
|
-
|
3
|
-
import sendNotification from '../funcs/sendNotification.js';
|
4
|
-
|
5
|
-
export default async function testNotification({
|
6
|
-
pg, query = {}, session = {},
|
7
|
-
}) {
|
8
|
-
const { local } = config || {};
|
9
|
-
|
10
|
-
if (!session?.passport?.user?.user_type?.includes('admin') && !local) {
|
11
|
-
return { message: 'Forbidden', status: 403 };
|
12
|
-
}
|
13
|
-
|
14
|
-
const date = new Date().toISOString().split('T')[0];
|
15
|
-
if (!query.to) {
|
16
|
-
return { message: 'param to is required', status: 400 };
|
17
|
-
}
|
18
|
-
|
19
|
-
const {
|
20
|
-
to, template, table, id, nocache,
|
21
|
-
} = query;
|
22
|
-
|
23
|
-
const data = await sendNotification({
|
24
|
-
pg,
|
25
|
-
to,
|
26
|
-
template,
|
27
|
-
title: `Test Softpro ${date}`,
|
28
|
-
table,
|
29
|
-
nocache,
|
30
|
-
id,
|
31
|
-
message: `Test mail Softpro ${date} Lorem Ipsum Lorem Ipsum`,
|
32
|
-
});
|
33
|
-
|
34
|
-
return { message: data || 'ok' };
|
35
|
-
}
|
1
|
+
import config from '../../../../config.js';
|
2
|
+
|
3
|
+
import sendNotification from '../funcs/sendNotification.js';
|
4
|
+
|
5
|
+
export default async function testNotification({
|
6
|
+
pg, query = {}, session = {},
|
7
|
+
}) {
|
8
|
+
const { local } = config || {};
|
9
|
+
|
10
|
+
if (!session?.passport?.user?.user_type?.includes('admin') && !local) {
|
11
|
+
return { message: 'Forbidden', status: 403 };
|
12
|
+
}
|
13
|
+
|
14
|
+
const date = new Date().toISOString().split('T')[0];
|
15
|
+
if (!query.to) {
|
16
|
+
return { message: 'param to is required', status: 400 };
|
17
|
+
}
|
18
|
+
|
19
|
+
const {
|
20
|
+
to, template, table, id, nocache,
|
21
|
+
} = query;
|
22
|
+
|
23
|
+
const data = await sendNotification({
|
24
|
+
pg,
|
25
|
+
to,
|
26
|
+
template,
|
27
|
+
title: `Test Softpro ${date}`,
|
28
|
+
table,
|
29
|
+
nocache,
|
30
|
+
id,
|
31
|
+
message: `Test mail Softpro ${date} Lorem Ipsum Lorem Ipsum`,
|
32
|
+
});
|
33
|
+
|
34
|
+
return { message: data || 'ok' };
|
35
|
+
}
|
@@ -1,53 +1,53 @@
|
|
1
|
-
// for example only
|
2
|
-
/*
|
3
|
-
const res = await dataInsert({
|
4
|
-
pg,
|
5
|
-
table: 'crm.notifications',
|
6
|
-
data: {
|
7
|
-
subject: 'notif title',
|
8
|
-
body: 'notif body',
|
9
|
-
link: 'http://localhost:3000/api/notification',
|
10
|
-
addressee_id: userId,
|
11
|
-
author_id: userId,
|
12
|
-
},
|
13
|
-
});
|
14
|
-
*/
|
15
|
-
|
16
|
-
import { getSelectVal } from '@opengis/fastify-table/utils.js';
|
17
|
-
|
18
|
-
const maxLimit = 100;
|
19
|
-
|
20
|
-
export default async function userNotifications({
|
21
|
-
pg, query = {}, session = {},
|
22
|
-
}) {
|
23
|
-
const time = Date.now();
|
24
|
-
|
25
|
-
const { uid } = session.passport?.user || {};
|
26
|
-
|
27
|
-
if (!uid) {
|
28
|
-
return { message: 'access restricted', status: 403 };
|
29
|
-
}
|
30
|
-
|
31
|
-
const limit = Math.min(maxLimit, +(query.limit || 5));
|
32
|
-
const offset = query.page && query.page > 0 ? (query.page - 1) * limit : 0;
|
33
|
-
|
34
|
-
const q = `select notification_id as id, subject, body, cdate,
|
35
|
-
author_id, read, link, entity_id, (select avatar from admin.users where uid=a.author_id limit 1) as avatar from crm.notifications a where addressee_id=$1 order by cdate desc limit $2 offset $3`;
|
36
|
-
|
37
|
-
if (query.sql) return q;
|
38
|
-
|
39
|
-
const { rows = [] } = await pg.query(q, [uid, limit, offset]);
|
40
|
-
|
41
|
-
const values = rows.map((el) => el.author_id)
|
42
|
-
?.filter((el, idx, arr) => el && arr.indexOf(el) === idx);
|
43
|
-
|
44
|
-
if (values?.length) {
|
45
|
-
const vals = await getSelectVal({ name: 'core.user_mentioned', values });
|
46
|
-
rows.forEach((row) => {
|
47
|
-
Object.assign(row, { author: vals?.[row.author_id] });
|
48
|
-
});
|
49
|
-
}
|
50
|
-
|
51
|
-
return { time: Date.now() - time, total: rows?.length, rows };
|
52
|
-
|
53
|
-
}
|
1
|
+
// for example only
|
2
|
+
/*
|
3
|
+
const res = await dataInsert({
|
4
|
+
pg,
|
5
|
+
table: 'crm.notifications',
|
6
|
+
data: {
|
7
|
+
subject: 'notif title',
|
8
|
+
body: 'notif body',
|
9
|
+
link: 'http://localhost:3000/api/notification',
|
10
|
+
addressee_id: userId,
|
11
|
+
author_id: userId,
|
12
|
+
},
|
13
|
+
});
|
14
|
+
*/
|
15
|
+
|
16
|
+
import { getSelectVal } from '@opengis/fastify-table/utils.js';
|
17
|
+
|
18
|
+
const maxLimit = 100;
|
19
|
+
|
20
|
+
export default async function userNotifications({
|
21
|
+
pg, query = {}, session = {},
|
22
|
+
}) {
|
23
|
+
const time = Date.now();
|
24
|
+
|
25
|
+
const { uid } = session.passport?.user || {};
|
26
|
+
|
27
|
+
if (!uid) {
|
28
|
+
return { message: 'access restricted', status: 403 };
|
29
|
+
}
|
30
|
+
|
31
|
+
const limit = Math.min(maxLimit, +(query.limit || 5));
|
32
|
+
const offset = query.page && query.page > 0 ? (query.page - 1) * limit : 0;
|
33
|
+
|
34
|
+
const q = `select notification_id as id, subject, body, cdate,
|
35
|
+
author_id, read, link, entity_id, (select avatar from admin.users where uid=a.author_id limit 1) as avatar from crm.notifications a where addressee_id=$1 order by cdate desc limit $2 offset $3`;
|
36
|
+
|
37
|
+
if (query.sql) return q;
|
38
|
+
|
39
|
+
const { rows = [] } = await pg.query(q, [uid, limit, offset]);
|
40
|
+
|
41
|
+
const values = rows.map((el) => el.author_id)
|
42
|
+
?.filter((el, idx, arr) => el && arr.indexOf(el) === idx);
|
43
|
+
|
44
|
+
if (values?.length) {
|
45
|
+
const vals = await getSelectVal({ name: 'core.user_mentioned', values });
|
46
|
+
rows.forEach((row) => {
|
47
|
+
Object.assign(row, { author: vals?.[row.author_id] });
|
48
|
+
});
|
49
|
+
}
|
50
|
+
|
51
|
+
return { time: Date.now() - time, total: rows?.length, rows };
|
52
|
+
|
53
|
+
}
|
@@ -1,21 +1,21 @@
|
|
1
|
-
import { dataInsert } from '@opengis/fastify-table/utils.js';
|
2
|
-
|
3
|
-
export default async function addNotification({
|
4
|
-
pg, session = {}, subject, body, link, uid, entity,
|
5
|
-
}) {
|
6
|
-
const { uid: author } = session.passport?.user || {};
|
7
|
-
const res = await dataInsert({
|
8
|
-
pg,
|
9
|
-
table: 'crm.notifications',
|
10
|
-
data: {
|
11
|
-
subject,
|
12
|
-
body,
|
13
|
-
link,
|
14
|
-
addressee_id: uid,
|
15
|
-
author_id: author,
|
16
|
-
entity_id: entity,
|
17
|
-
uid: author,
|
18
|
-
},
|
19
|
-
});
|
20
|
-
return res?.rows?.[0] || {};
|
21
|
-
}
|
1
|
+
import { dataInsert } from '@opengis/fastify-table/utils.js';
|
2
|
+
|
3
|
+
export default async function addNotification({
|
4
|
+
pg, session = {}, subject, body, link, uid, entity,
|
5
|
+
}) {
|
6
|
+
const { uid: author } = session.passport?.user || {};
|
7
|
+
const res = await dataInsert({
|
8
|
+
pg,
|
9
|
+
table: 'crm.notifications',
|
10
|
+
data: {
|
11
|
+
subject,
|
12
|
+
body,
|
13
|
+
link,
|
14
|
+
addressee_id: uid,
|
15
|
+
author_id: author,
|
16
|
+
entity_id: entity,
|
17
|
+
uid: author,
|
18
|
+
},
|
19
|
+
});
|
20
|
+
return res?.rows?.[0] || {};
|
21
|
+
}
|