@opengis/admin 0.3.43 → 0.3.44
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 +97 -97
- package/config.js +4 -4
- package/dist/{add-page-D7DejR6f.js → add-page-D7k1z2z2.js} +1 -1
- package/dist/{admin-interface-D1ILPfFS.js → admin-interface-C5JbxrTW.js} +2 -2
- package/dist/{admin-view-BV5GiUFB.js → admin-view-CtyfgHHf.js} +1 -1
- package/dist/admin.js +1 -1
- package/dist/admin.umd.cjs +52 -52
- package/dist/assets/logo.svg +41 -41
- package/dist/{card-view-DnHFSCxY.js → card-view-CS42wpFl.js} +1 -1
- package/dist/{edit-page-BfW1ystC.js → edit-page-DamPRsiC.js} +1 -1
- package/dist/{import-file-dlOWa1-N.js → import-file-DAuB2UFK.js} +6268 -6276
- package/dist/{profile-page-BHl9qGJX.js → profile-page-CqrHlzPZ.js} +1 -1
- package/dist/style.css +1 -1
- package/module/settings/card/admin.accounts.table/index.yml +7 -7
- package/module/settings/card/admin.accounts.table/rules.hbs +18 -18
- package/module/settings/card/admin.accounts.table/users.hbs +13 -13
- package/module/settings/card/admin.routes.table/groups.hbs +11 -11
- package/module/settings/card/admin.routes.table/users.hbs +16 -16
- 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/cls/yes_no.json +11 -11
- package/module/settings/form/admin.accounts.form.json +13 -13
- package/module/settings/form/admin.properties.form.json +15 -15
- package/module/settings/form/admin.roles.form.json +21 -21
- package/module/settings/form/admin.user_properties.form.json +15 -15
- package/module/settings/form/admin.user_roles_card.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/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.properties.table.json +39 -39
- package/module/settings/table/admin.user_properties.table.json +34 -34
- package/package.json +3 -3
- package/server/helpers/core/badge.js +16 -16
- package/server/helpers/core/buttonHelper.js +21 -21
- package/server/helpers/core/coalesce.js +7 -7
- package/server/helpers/core/select.js +48 -48
- package/server/helpers/core/token.js +18 -18
- package/server/helpers/list/buttonHelper.js +21 -21
- package/server/helpers/list/utils/button.js +5 -5
- package/server/helpers/temp/contentList.js +58 -58
- package/server/helpers/temp/ifCond.js +101 -101
- package/server/helpers/utils/button.js +5 -5
- package/server/helpers/utils/mdToHTML.js +17 -17
- package/server/plugins/access/index.mjs +6 -6
- package/server/plugins/adminHook.js +81 -81
- package/server/plugins/cron.js +10 -10
- package/server/plugins/docs.js +28 -28
- package/server/routes/access/controllers/access.group.js +29 -29
- package/server/routes/access/controllers/access.group.post.js +54 -54
- package/server/routes/access/index.mjs +11 -11
- package/server/routes/access/schema.mjs +67 -67
- package/server/routes/calendar/controllers/calendar.data.js +125 -125
- package/server/routes/calendar/index.mjs +7 -7
- package/server/routes/calendar/schema.js +21 -21
- 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 +3 -3
- package/server/routes/data/controllers/tableDataId.js +27 -27
- 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/conditions.js +20 -20
- package/server/routes/data/controllers/utils/getColumns.js +8 -8
- package/server/routes/data/index.mjs +20 -20
- package/server/routes/data/schema.js +54 -54
- package/server/routes/notifications/controllers/readNotifications.js +18 -18
- package/server/routes/notifications/controllers/testEmail.js +35 -35
- package/server/routes/notifications/controllers/userNotifications.js +53 -53
- package/server/routes/notifications/hook/onWidgetSet.js +56 -56
- package/server/routes/notifications/index.mjs +26 -26
- package/server/routes/notifications/schema.js +16 -16
- package/server/routes/print/controllers/cardPrint.js +135 -135
- package/server/routes/properties/schema.js +10 -10
- package/server/routes/report/controllers/data.js +76 -76
- package/server/routes/report/controllers/list.js +18 -18
- package/server/routes/report/index.mjs +7 -7
- package/server/routes/report/utils/formatValue.js +179 -179
- package/server/routes/root.mjs +3 -3
- package/server/routes/templates/controllers/getTemplate.js +44 -44
- 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 +72 -72
- package/server/routes/user/controllers/user.info.js +17 -17
- package/server/routes/user/schema.js +14 -14
- package/server/routes/util/controllers/code.generator.js +89 -89
- package/server/routes/widget/controllers/widget.del.js +80 -80
- package/server/routes/widget/controllers/widget.set.js +93 -93
- package/server/routes/widget/hook/onWidgetSet.js +12 -12
- package/server/routes/widget/index.mjs +16 -16
- 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/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/server/utils/addNotification.js +21 -21
- package/server/utils/sendNotification.js +89 -89
@@ -1,28 +1,28 @@
|
|
1
|
-
import { handlebars } from "@opengis/fastify-table/utils.js";
|
2
|
-
|
3
|
-
import getTemplate from "../../templates/funcs/getTemplate.js";
|
4
|
-
import getTableData from "./tableData.js";
|
5
|
-
|
6
|
-
export default async function tableDataId({ pg, params = {}, session = {}, user }, reply) {
|
7
|
-
const { name, id } = params;
|
8
|
-
|
9
|
-
const data = await getTemplate('pt', `${name}.pt`);
|
10
|
-
|
11
|
-
|
12
|
-
if (!data) {
|
13
|
-
return { message: `invalid template: ${name}.pt`, status: 400 };
|
14
|
-
}
|
15
|
-
debugger;
|
16
|
-
const { message, status = 500, rows = [] } = await getTableData({ pg, params: { name, id }, session, user });
|
17
|
-
if (message) {
|
18
|
-
return { message, status };
|
19
|
-
}
|
20
|
-
|
21
|
-
if (!rows.length) {
|
22
|
-
return { message: `data not found: ${name}/${id}`, status: 404 };
|
23
|
-
}
|
24
|
-
|
25
|
-
const htmlContent = await handlebars.compile(data)(rows[0]);
|
26
|
-
|
27
|
-
return reply.headers({ 'Content-Type': 'text/html; charset=utf-8' }).send(htmlContent);
|
1
|
+
import { handlebars } from "@opengis/fastify-table/utils.js";
|
2
|
+
|
3
|
+
import getTemplate from "../../templates/funcs/getTemplate.js";
|
4
|
+
import getTableData from "./tableData.js";
|
5
|
+
|
6
|
+
export default async function tableDataId({ pg, params = {}, session = {}, user }, reply) {
|
7
|
+
const { name, id } = params;
|
8
|
+
|
9
|
+
const data = await getTemplate('pt', `${name}.pt`);
|
10
|
+
|
11
|
+
|
12
|
+
if (!data) {
|
13
|
+
return { message: `invalid template: ${name}.pt`, status: 400 };
|
14
|
+
}
|
15
|
+
debugger;
|
16
|
+
const { message, status = 500, rows = [] } = await getTableData({ pg, params: { name, id }, session, user });
|
17
|
+
if (message) {
|
18
|
+
return { message, status };
|
19
|
+
}
|
20
|
+
|
21
|
+
if (!rows.length) {
|
22
|
+
return { message: `data not found: ${name}/${id}`, status: 404 };
|
23
|
+
}
|
24
|
+
|
25
|
+
const htmlContent = await handlebars.compile(data)(rows[0]);
|
26
|
+
|
27
|
+
return reply.headers({ 'Content-Type': 'text/html; charset=utf-8' }).send(htmlContent);
|
28
28
|
}
|
@@ -1,10 +1,10 @@
|
|
1
|
-
import { getOpt, getToken } from "@opengis/fastify-table/utils.js";
|
2
|
-
|
3
|
-
export default async function tokenInfo(req) {
|
4
|
-
|
5
|
-
const { params = {}, user } = req;
|
6
|
-
if (user.user_type !== 'admin') return { status: 403, message: 'access restricted' }
|
7
|
-
const tokenData = await getToken({ uid: user.uid, token: params.token, }) || await getOpt(params.token, user.uid)
|
8
|
-
return tokenData;
|
9
|
-
|
1
|
+
import { getOpt, getToken } from "@opengis/fastify-table/utils.js";
|
2
|
+
|
3
|
+
export default async function tokenInfo(req) {
|
4
|
+
|
5
|
+
const { params = {}, user } = req;
|
6
|
+
if (user.user_type !== 'admin') return { status: 403, message: 'access restricted' }
|
7
|
+
const tokenData = await getToken({ uid: user.uid, token: params.token, }) || await getOpt(params.token, user.uid)
|
8
|
+
return tokenData;
|
9
|
+
|
10
10
|
}
|
@@ -1,31 +1,31 @@
|
|
1
|
-
import { config, setToken } from "@opengis/fastify-table/utils.js";
|
2
|
-
|
3
|
-
export default function assignTokens({
|
4
|
-
rows = [], ispublic, uid, loadTable = {},
|
5
|
-
}) {
|
6
|
-
if (config?.security?.disableToken) return;
|
7
|
-
|
8
|
-
if (!config?.auth?.disable && !ispublic && !uid) throw new Error('empty user');
|
9
|
-
if (!loadTable?.table || !(loadTable?.form || loadTable?.add_form)) return null;
|
10
|
-
|
11
|
-
const form = loadTable?.form || loadTable?.add_form;
|
12
|
-
const addTokens = setToken({
|
13
|
-
ids: [JSON.stringify({ add: loadTable.table, form })],
|
14
|
-
mode: 'a',
|
15
|
-
uid: config?.auth?.disable || ispublic ? '1' : uid,
|
16
|
-
array: 1,
|
17
|
-
});
|
18
|
-
if (!rows.length) return addTokens[0];
|
19
|
-
|
20
|
-
rows.forEach((row) => {
|
21
|
-
const editTokens = setToken({
|
22
|
-
ids: [JSON.stringify({ id: row.id, table: loadTable.table, form })],
|
23
|
-
mode: 'w',
|
24
|
-
uid: config?.auth?.disable || ispublic ? '1' : uid,
|
25
|
-
array: 1,
|
26
|
-
});
|
27
|
-
Object.assign(row, { token: editTokens[0] });
|
28
|
-
});
|
29
|
-
return addTokens[0];
|
30
|
-
|
1
|
+
import { config, setToken } from "@opengis/fastify-table/utils.js";
|
2
|
+
|
3
|
+
export default function assignTokens({
|
4
|
+
rows = [], ispublic, uid, loadTable = {},
|
5
|
+
}) {
|
6
|
+
if (config?.security?.disableToken) return;
|
7
|
+
|
8
|
+
if (!config?.auth?.disable && !ispublic && !uid) throw new Error('empty user');
|
9
|
+
if (!loadTable?.table || !(loadTable?.form || loadTable?.add_form)) return null;
|
10
|
+
|
11
|
+
const form = loadTable?.form || loadTable?.add_form;
|
12
|
+
const addTokens = setToken({
|
13
|
+
ids: [JSON.stringify({ add: loadTable.table, form })],
|
14
|
+
mode: 'a',
|
15
|
+
uid: config?.auth?.disable || ispublic ? '1' : uid,
|
16
|
+
array: 1,
|
17
|
+
});
|
18
|
+
if (!rows.length) return addTokens[0];
|
19
|
+
|
20
|
+
rows.forEach((row) => {
|
21
|
+
const editTokens = setToken({
|
22
|
+
ids: [JSON.stringify({ id: row.id, table: loadTable.table, form })],
|
23
|
+
mode: 'w',
|
24
|
+
uid: config?.auth?.disable || ispublic ? '1' : uid,
|
25
|
+
array: 1,
|
26
|
+
});
|
27
|
+
Object.assign(row, { token: editTokens[0] });
|
28
|
+
});
|
29
|
+
return addTokens[0];
|
30
|
+
|
31
31
|
}
|
@@ -1,21 +1,21 @@
|
|
1
|
-
function onCheck(rule, data) {
|
2
|
-
const val = data[rule[0]];
|
3
|
-
// console.log(val, rule[1], rule[2])
|
4
|
-
if (rule[1] === '==') return val === rule[2];
|
5
|
-
if (rule[1] === '!=') return val !== rule[2];
|
6
|
-
if (rule[1] === 'in' && rule[2].split) return rule[2].split(',').includes(val);
|
7
|
-
if (rule[1] === 'in' && rule[2].includes) return rule[2].includes(val);
|
8
|
-
|
9
|
-
if (rule[1] === 'not in' && rule[2].split) return !rule[2].split(',').includes(val);
|
10
|
-
if (rule[1] === 'not in' && rule[2].includes) return !rule[2].includes(val);
|
11
|
-
|
12
|
-
if (rule[1] === '>') return val > rule[2];
|
13
|
-
if (rule[1] === '<') return val < rule[2];
|
14
|
-
}
|
15
|
-
export default function conditions(rules, data) {
|
16
|
-
if (!rules?.length) return true;
|
17
|
-
const result = Array.isArray(rules[0]) ? !rules.filter(el => !onCheck(el, data)).length : onCheck(rules, data)
|
18
|
-
// console.log(rules, result)
|
19
|
-
return result;
|
20
|
-
|
1
|
+
function onCheck(rule, data) {
|
2
|
+
const val = data[rule[0]];
|
3
|
+
// console.log(val, rule[1], rule[2])
|
4
|
+
if (rule[1] === '==') return val === rule[2];
|
5
|
+
if (rule[1] === '!=') return val !== rule[2];
|
6
|
+
if (rule[1] === 'in' && rule[2].split) return rule[2].split(',').includes(val);
|
7
|
+
if (rule[1] === 'in' && rule[2].includes) return rule[2].includes(val);
|
8
|
+
|
9
|
+
if (rule[1] === 'not in' && rule[2].split) return !rule[2].split(',').includes(val);
|
10
|
+
if (rule[1] === 'not in' && rule[2].includes) return !rule[2].includes(val);
|
11
|
+
|
12
|
+
if (rule[1] === '>') return val > rule[2];
|
13
|
+
if (rule[1] === '<') return val < rule[2];
|
14
|
+
}
|
15
|
+
export default function conditions(rules, data) {
|
16
|
+
if (!rules?.length) return true;
|
17
|
+
const result = Array.isArray(rules[0]) ? !rules.filter(el => !onCheck(el, data)).length : onCheck(rules, data)
|
18
|
+
// console.log(rules, result)
|
19
|
+
return result;
|
20
|
+
|
21
21
|
}
|
@@ -1,9 +1,9 @@
|
|
1
|
-
import { getTemplate } from "@opengis/fastify-table/utils.js";
|
2
|
-
|
3
|
-
export default async function getColumns({
|
4
|
-
columns = [], params = {}, opt = {}, loadTable = {}, form, table, dbColumns = [], mode = 'table',
|
5
|
-
}) {
|
6
|
-
const columnList = dbColumns.map((el) => el.name || el).join(',');
|
7
|
-
const cols = columns.filter((el) => columnList.includes(el?.name) && el?.name !== 'geom').map((el) => el?.name || el).join(',');
|
8
|
-
return { cols, columnList };
|
1
|
+
import { getTemplate } from "@opengis/fastify-table/utils.js";
|
2
|
+
|
3
|
+
export default async function getColumns({
|
4
|
+
columns = [], params = {}, opt = {}, loadTable = {}, form, table, dbColumns = [], mode = 'table',
|
5
|
+
}) {
|
6
|
+
const columnList = dbColumns.map((el) => el.name || el).join(',');
|
7
|
+
const cols = columns.filter((el) => columnList.includes(el?.name) && el?.name !== 'geom').map((el) => el?.name || el).join(',');
|
8
|
+
return { cols, columnList };
|
9
9
|
}
|
@@ -1,20 +1,20 @@
|
|
1
|
-
|
2
|
-
import tableData from "./controllers/tableData.js";
|
3
|
-
import tokenInfo from "./controllers/tokenInfo.js";
|
4
|
-
// import tableDataId from "./controllers/tableDataId.js";
|
5
|
-
import cardData from "./controllers/cardData.js";
|
6
|
-
import cardTabData from './controllers/cardTabData.js';
|
7
|
-
import tableFilter from "./controllers/tableFilter.js";
|
8
|
-
|
9
|
-
import { tableDataSchema, tableDataIdSchema, tableFilterSchema, cardTabDataSchema } from './schema.js';
|
10
|
-
import tableInfo from "./controllers/tableInfo.js";
|
11
|
-
|
12
|
-
export default async function route(fastify) {
|
13
|
-
const policy = ['user'];
|
14
|
-
fastify.get(`/token-info/:token`, { config: { policy: ['admin'] } }, tokenInfo);
|
15
|
-
fastify.get(`/table-data/:table`, { config: { policy: ['user', 'no-sql'] }, schema: tableDataSchema }, tableData);
|
16
|
-
fastify.get(`/card-data/:token`, { config: { policy }, scheme: cardTabDataSchema }, cardTabData);
|
17
|
-
fastify.get(`/table-data/:table/:id`, { config: { policy }, schema: tableDataIdSchema }, cardData);
|
18
|
-
fastify.get(`/table-filter/:table`, { config: { policy }, schema: tableFilterSchema }, tableFilter);
|
19
|
-
fastify.get(`/table-info/:table/:id?`, { config: { policy }, schema: tableDataSchema }, tableInfo);
|
20
|
-
}
|
1
|
+
|
2
|
+
import tableData from "./controllers/tableData.js";
|
3
|
+
import tokenInfo from "./controllers/tokenInfo.js";
|
4
|
+
// import tableDataId from "./controllers/tableDataId.js";
|
5
|
+
import cardData from "./controllers/cardData.js";
|
6
|
+
import cardTabData from './controllers/cardTabData.js';
|
7
|
+
import tableFilter from "./controllers/tableFilter.js";
|
8
|
+
|
9
|
+
import { tableDataSchema, tableDataIdSchema, tableFilterSchema, cardTabDataSchema } from './schema.js';
|
10
|
+
import tableInfo from "./controllers/tableInfo.js";
|
11
|
+
|
12
|
+
export default async function route(fastify) {
|
13
|
+
const policy = ['user'];
|
14
|
+
fastify.get(`/token-info/:token`, { config: { policy: ['admin'] } }, tokenInfo);
|
15
|
+
fastify.get(`/table-data/:table`, { config: { policy: ['user', 'no-sql'] }, schema: tableDataSchema }, tableData);
|
16
|
+
fastify.get(`/card-data/:token`, { config: { policy }, scheme: cardTabDataSchema }, cardTabData);
|
17
|
+
fastify.get(`/table-data/:table/:id`, { config: { policy }, schema: tableDataIdSchema }, cardData);
|
18
|
+
fastify.get(`/table-filter/:table`, { config: { policy }, schema: tableFilterSchema }, tableFilter);
|
19
|
+
fastify.get(`/table-info/:table/:id?`, { config: { policy }, schema: tableDataSchema }, tableInfo);
|
20
|
+
}
|
@@ -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,18 +1,18 @@
|
|
1
|
-
export default async function readNotifications({
|
2
|
-
pg, params = {}, query = {}, user = {},
|
3
|
-
}, reply) {
|
4
|
-
const { uid } = user || {};
|
5
|
-
|
6
|
-
if (!uid) {
|
7
|
-
return reply.status(401).send('access restricted: user ');
|
8
|
-
}
|
9
|
-
|
10
|
-
const q = `update crm.notifications set read=true where read is not true
|
11
|
-
and ${params?.id ? 'notification_id=$2' : '1=1'} and addressee_id=$1`;
|
12
|
-
|
13
|
-
if (query.sql) return q;
|
14
|
-
|
15
|
-
const { rowCount = 0 } = await pg.query(q, [uid, params?.id].filter((el) => el));
|
16
|
-
|
17
|
-
return reply.status(200).send(`${rowCount} unread notifications marked as read`);
|
18
|
-
}
|
1
|
+
export default async function readNotifications({
|
2
|
+
pg, params = {}, query = {}, user = {},
|
3
|
+
}, reply) {
|
4
|
+
const { uid } = user || {};
|
5
|
+
|
6
|
+
if (!uid) {
|
7
|
+
return reply.status(401).send('access restricted: user ');
|
8
|
+
}
|
9
|
+
|
10
|
+
const q = `update crm.notifications set read=true where read is not true
|
11
|
+
and ${params?.id ? 'notification_id=$2' : '1=1'} and addressee_id=$1`;
|
12
|
+
|
13
|
+
if (query.sql) return q;
|
14
|
+
|
15
|
+
const { rowCount = 0 } = await pg.query(q, [uid, params?.id].filter((el) => el));
|
16
|
+
|
17
|
+
return reply.status(200).send(`${rowCount} unread notifications marked as read`);
|
18
|
+
}
|
@@ -1,35 +1,35 @@
|
|
1
|
-
import { config } from '@opengis/fastify-table/utils.js';
|
2
|
-
|
3
|
-
import { sendNotification } from '../../../../utils.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 '@opengis/fastify-table/utils.js';
|
2
|
+
|
3
|
+
import { sendNotification } from '../../../../utils.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 = [] } = pg.pk?.['crm.notifications'] ? 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 = [] } = pg.pk?.['crm.notifications'] ? 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
|
+
}
|