@opengis/admin 0.3.7 → 0.3.8

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.
Files changed (115) hide show
  1. package/README.md +97 -97
  2. package/config.js +4 -4
  3. package/dist/{add-page-i3ZTPwFT.js → add-page-DMsSz4BX.js} +1 -1
  4. package/dist/{admin-interface-D4WmyK_a.js → admin-interface-C6JnkqkU.js} +2 -2
  5. package/dist/{admin-view-CtP2Odsd.js → admin-view-OtkR46LJ.js} +2 -2
  6. package/dist/admin.js +1 -1
  7. package/dist/admin.umd.cjs +73 -73
  8. package/dist/assets/logo.svg +41 -41
  9. package/dist/{card-view-DRjzckF0.js → card-view-C4bA9n9d.js} +1 -1
  10. package/dist/{edit-page-CMWN-PzD.js → edit-page-B5Az0o6m.js} +1 -1
  11. package/dist/{import-file-BB2rbY9W.js → import-file-DD8pTAeM.js} +11240 -11229
  12. package/dist/{profile-page-DebNblRZ.js → profile-page-V4LrOFzf.js} +1 -1
  13. package/dist/style.css +1 -1
  14. package/module/settings/card/admin.accounts.table/index.yml +7 -7
  15. package/module/settings/card/admin.accounts.table/rules.hbs +18 -18
  16. package/module/settings/card/admin.accounts.table/users.hbs +13 -13
  17. package/module/settings/card/admin.routes.table/groups.hbs +11 -11
  18. package/module/settings/card/admin.routes.table/users.hbs +16 -16
  19. package/module/settings/cls/core.actions.json +17 -17
  20. package/module/settings/cls/core.scope.json +13 -13
  21. package/module/settings/cls/properties.site_status.json +13 -13
  22. package/module/settings/cls/properties.widget_status.json +13 -13
  23. package/module/settings/cls/users.user_type.json +13 -13
  24. package/module/settings/cls/yes_no.json +11 -11
  25. package/module/settings/form/admin.accounts.form.json +13 -13
  26. package/module/settings/form/admin.properties.form.json +15 -15
  27. package/module/settings/form/admin.roles.form.json +21 -21
  28. package/module/settings/form/admin.user_properties.form.json +15 -15
  29. package/module/settings/form/admin.user_roles_card.form.json +13 -13
  30. package/module/settings/interface/admin.properties.json +4 -4
  31. package/module/settings/interface/admin.roles.json +4 -4
  32. package/module/settings/interface/admin.routes.json +4 -4
  33. package/module/settings/interface/admin.users.json +4 -4
  34. package/module/settings/select/core.routes.sql +1 -1
  35. package/module/settings/select/core.user_mentioned.sql +1 -1
  36. package/module/settings/select/core.user_uid.sql +1 -1
  37. package/module/settings/table/admin.properties.table.json +39 -39
  38. package/module/settings/table/admin.user_properties.table.json +34 -34
  39. package/package.json +1 -1
  40. package/server/helpers/core/badge.js +16 -16
  41. package/server/helpers/core/buttonHelper.js +21 -21
  42. package/server/helpers/core/coalesce.js +7 -7
  43. package/server/helpers/core/select.js +48 -48
  44. package/server/helpers/core/token.js +18 -18
  45. package/server/helpers/list/buttonHelper.js +21 -21
  46. package/server/helpers/list/utils/button.js +5 -5
  47. package/server/helpers/temp/contentList.js +58 -58
  48. package/server/helpers/temp/ifCond.js +101 -101
  49. package/server/helpers/utils/button.js +5 -5
  50. package/server/helpers/utils/mdToHTML.js +17 -17
  51. package/server/plugins/access/index.mjs +6 -6
  52. package/server/plugins/adminHook.js +81 -81
  53. package/server/plugins/cron.js +10 -10
  54. package/server/plugins/docs.js +28 -28
  55. package/server/routes/access/controllers/access.group.js +29 -29
  56. package/server/routes/access/controllers/access.group.post.js +54 -54
  57. package/server/routes/access/index.mjs +11 -11
  58. package/server/routes/access/schema.mjs +67 -67
  59. package/server/routes/calendar/controllers/calendar.data.js +125 -125
  60. package/server/routes/calendar/index.mjs +7 -7
  61. package/server/routes/calendar/schema.js +21 -21
  62. package/server/routes/data/controllers/cardTabData.js +49 -49
  63. package/server/routes/data/controllers/funcs/getFilterSQL/index.js +92 -92
  64. package/server/routes/data/controllers/funcs/getFilterSQL/util/formatValue.js +170 -170
  65. package/server/routes/data/controllers/funcs/getFilterSQL/util/getCustomQuery.js +13 -13
  66. package/server/routes/data/controllers/funcs/getFilterSQL/util/getFilterQuery.js +64 -64
  67. package/server/routes/data/controllers/funcs/getFilterSQL/util/getOptimizedQuery.js +12 -12
  68. package/server/routes/data/controllers/funcs/getFilterSQL/util/getTableSql.js +34 -34
  69. package/server/routes/data/controllers/tableData.js +31 -31
  70. package/server/routes/data/controllers/tableDataId.js +27 -27
  71. package/server/routes/data/controllers/tokenInfo.js +9 -9
  72. package/server/routes/data/controllers/utils/assignTokens.js +30 -30
  73. package/server/routes/data/controllers/utils/conditions.js +20 -20
  74. package/server/routes/data/controllers/utils/getColumns.js +8 -8
  75. package/server/routes/data/index.mjs +20 -20
  76. package/server/routes/data/schema.js +54 -54
  77. package/server/routes/notifications/controllers/readNotifications.js +27 -27
  78. package/server/routes/notifications/controllers/testEmail.js +35 -35
  79. package/server/routes/notifications/controllers/userNotifications.js +53 -53
  80. package/server/routes/notifications/funcs/addNotification.js +21 -21
  81. package/server/routes/notifications/funcs/sendNotification.js +92 -92
  82. package/server/routes/notifications/hook/onWidgetSet.js +56 -56
  83. package/server/routes/notifications/index.mjs +26 -26
  84. package/server/routes/notifications/schema.js +16 -16
  85. package/server/routes/print/controllers/cardPrint.js +135 -135
  86. package/server/routes/properties/schema.js +10 -10
  87. package/server/routes/report/controllers/data.js +76 -76
  88. package/server/routes/report/controllers/list.js +18 -18
  89. package/server/routes/report/index.mjs +7 -7
  90. package/server/routes/report/utils/formatValue.js +179 -179
  91. package/server/routes/root.mjs +3 -3
  92. package/server/routes/templates/controllers/getTemplate.js +49 -49
  93. package/server/routes/templates/index.mjs +16 -16
  94. package/server/routes/templates/schema.js +8 -8
  95. package/server/routes/user/controllers/user.cls.id.js +14 -14
  96. package/server/routes/user/controllers/user.cls.js +71 -71
  97. package/server/routes/user/controllers/user.info.js +17 -17
  98. package/server/routes/user/schema.js +14 -14
  99. package/server/routes/widget/controllers/widget.del.js +47 -47
  100. package/server/routes/widget/controllers/widget.set.js +84 -84
  101. package/server/routes/widget/hook/onWidgetSet.js +12 -12
  102. package/server/routes/widget/index.mjs +16 -16
  103. package/server/routes/widget/schema.js +12 -12
  104. package/server/templates/cls/itree.recrzone_category.json +73 -73
  105. package/server/templates/cls/test.json +9 -9
  106. package/server/templates/form/admin.user_cls.data.form.json +49 -49
  107. package/server/templates/form/admin.user_group_rel.form.json +21 -21
  108. package/server/templates/form/form-user-pass.json +10 -10
  109. package/server/templates/form/form-user_group.json +39 -39
  110. package/server/templates/form/form-users.json +156 -156
  111. package/server/templates/form/user_group_access.form.json +22 -22
  112. package/server/templates/select/account_id.json +2 -2
  113. package/server/templates/table/gis.dataset.table.json +43 -43
  114. package/server/templates/table/management.user_group.table.json +112 -112
  115. package/server/templates/table/management.users.table.json +126 -126
@@ -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,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
+ }
@@ -1,92 +1,92 @@
1
- // eslint-disable-next-line max-len, no-control-regex
2
- const emailReg = /(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/g;
3
-
4
- import sendEmail from './utils/sendEmail.js';
5
-
6
- import { handlebars, pgClients, getTemplate, getRedis, logger } from '@opengis/fastify-table/utils.js';
7
-
8
- async function generateNotificationContent({
9
- pg, table, template, id, message, data: data1,
10
- }) {
11
- if (template) {
12
- const data = table && id ? await pg.one(`select * from ${table} where ${pg.pk[table]}=$1`, [id]) : data1;
13
- // console.log(data);
14
- const body = await getTemplate('pt', template);
15
- // console.log(body);
16
- const html = handlebars.compile(body || template || 'template not found')(data || {});
17
- // console.log(html);
18
- return html;
19
- }
20
- return message;
21
- }
22
-
23
- // to do: refactor fastify-file to remove funcs completely
24
- export default async function notification({
25
- pg = pgClients.client,
26
- provider = ['email'],
27
- from,
28
- to,
29
- template,
30
- table,
31
- message,
32
- title,
33
- file,
34
- data,
35
- id,
36
- nocache,
37
- }) {
38
- const rclient = getRedis();
39
-
40
- if (!pg) throw new Error('need pg');
41
-
42
- if (pg?.readonly) {
43
- return null;
44
- }
45
-
46
- const keyTo = `${pg.options?.database}:mail:${provider[0]}:${to || ''}${id || ''}${table || ''}${title || ''}`;
47
- const uniqueTo = await rclient.setnx(keyTo, 1);
48
-
49
-
50
- if (!uniqueTo && !nocache) {
51
- logger.file('notification/sent', { keyTo, send: uniqueTo, nocache });
52
- return `already sent: ${keyTo}`;
53
- }
54
- await rclient.expire(keyTo, 1000 * 600);
55
-
56
- if (!to.length) {
57
- return null;
58
- }
59
-
60
- if (!(Array.isArray(provider) && provider.length)) {
61
- return 'notification provider - must be array and not empty';
62
- }
63
-
64
- const html = await generateNotificationContent({
65
- pg, table, template, id, message, data,
66
- });
67
-
68
- if (provider.includes('email')) {
69
- const files = Array.isArray(file) ? file : [file];
70
- const attachments = files?.length && false ? await Promise.all(files?.filter((el) => el).map(async (el) => {
71
- /* const content = await downloadFile(el, { buffer: true }); // ?
72
- return {
73
- filename: el.split('/').pop(),
74
- encoding: 'base64',
75
- content,
76
- }; */
77
- })) : [];
78
-
79
- const toEmail = Array.isArray(to) ? to.map((emails) => emails.match(emailReg)?.join(',')) : to;
80
-
81
- const result = await sendEmail({
82
- attachments,
83
- html,
84
- subject: title,
85
- from,
86
- to: toEmail,
87
- });
88
-
89
- return result;
90
- }
91
- return null;
92
- }
1
+ // eslint-disable-next-line max-len, no-control-regex
2
+ const emailReg = /(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/g;
3
+
4
+ import sendEmail from './utils/sendEmail.js';
5
+
6
+ import { handlebars, pgClients, getTemplate, getRedis, logger } from '@opengis/fastify-table/utils.js';
7
+
8
+ async function generateNotificationContent({
9
+ pg, table, template, id, message, data: data1,
10
+ }) {
11
+ if (template) {
12
+ const data = table && id ? await pg.one(`select * from ${table} where ${pg.pk[table]}=$1`, [id]) : data1;
13
+ // console.log(data);
14
+ const body = await getTemplate('pt', template);
15
+ // console.log(body);
16
+ const html = handlebars.compile(body || template || 'template not found')(data || {});
17
+ // console.log(html);
18
+ return html;
19
+ }
20
+ return message;
21
+ }
22
+
23
+ // to do: refactor fastify-file to remove funcs completely
24
+ export default async function notification({
25
+ pg = pgClients.client,
26
+ provider = ['email'],
27
+ from,
28
+ to,
29
+ template,
30
+ table,
31
+ message,
32
+ title,
33
+ file,
34
+ data,
35
+ id,
36
+ nocache,
37
+ }) {
38
+ const rclient = getRedis();
39
+
40
+ if (!pg) throw new Error('need pg');
41
+
42
+ if (pg?.readonly) {
43
+ return null;
44
+ }
45
+
46
+ const keyTo = `${pg.options?.database}:mail:${provider[0]}:${to || ''}${id || ''}${table || ''}${title || ''}`;
47
+ const uniqueTo = await rclient.setnx(keyTo, 1);
48
+
49
+
50
+ if (!uniqueTo && !nocache) {
51
+ logger.file('notification/sent', { keyTo, send: uniqueTo, nocache });
52
+ return `already sent: ${keyTo}`;
53
+ }
54
+ await rclient.expire(keyTo, 1000 * 600);
55
+
56
+ if (!to.length) {
57
+ return null;
58
+ }
59
+
60
+ if (!(Array.isArray(provider) && provider.length)) {
61
+ return 'notification provider - must be array and not empty';
62
+ }
63
+
64
+ const html = await generateNotificationContent({
65
+ pg, table, template, id, message, data,
66
+ });
67
+
68
+ if (provider.includes('email')) {
69
+ const files = Array.isArray(file) ? file : [file];
70
+ const attachments = files?.length && false ? await Promise.all(files?.filter((el) => el).map(async (el) => {
71
+ /* const content = await downloadFile(el, { buffer: true }); // ?
72
+ return {
73
+ filename: el.split('/').pop(),
74
+ encoding: 'base64',
75
+ content,
76
+ }; */
77
+ })) : [];
78
+
79
+ const toEmail = Array.isArray(to) ? to.map((emails) => emails.match(emailReg)?.join(',')) : to;
80
+
81
+ const result = await sendEmail({
82
+ attachments,
83
+ html,
84
+ subject: title,
85
+ from,
86
+ to: toEmail,
87
+ });
88
+
89
+ return result;
90
+ }
91
+ return null;
92
+ }