@opengis/fastify-table 1.1.51 → 1.1.52

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 (218) hide show
  1. package/.eslintrc.cjs +42 -42
  2. package/.gitlab-ci.yml +18 -18
  3. package/Changelog.md +352 -352
  4. package/README.md +26 -26
  5. package/config.js +10 -10
  6. package/cron/controllers/cronApi.js +22 -22
  7. package/cron/controllers/utils/cronList.js +1 -1
  8. package/cron/funcs/addCron.js +132 -132
  9. package/cron/index.js +12 -10
  10. package/cron/schema.js +8 -0
  11. package/crud/controllers/deleteCrud.js +36 -36
  12. package/crud/controllers/insert.js +71 -71
  13. package/crud/controllers/update.js +76 -76
  14. package/crud/controllers/utils/xssInjection.js +72 -72
  15. package/crud/funcs/dataDelete.js +19 -19
  16. package/crud/funcs/dataInsert.js +30 -30
  17. package/crud/funcs/dataUpdate.js +48 -48
  18. package/crud/funcs/getAccess.js +46 -46
  19. package/crud/funcs/getOpt.js +10 -10
  20. package/crud/funcs/getToken.js +27 -27
  21. package/crud/funcs/isFileExists.js +13 -13
  22. package/crud/funcs/setOpt.js +16 -16
  23. package/crud/funcs/setToken.js +53 -53
  24. package/crud/funcs/utils/getFolder.js +9 -9
  25. package/crud/funcs/utils/logChanges.js +62 -62
  26. package/crud/index.js +31 -36
  27. package/crud/schema.js +11 -0
  28. package/docs/.vitepress/abbr.mjs +26 -26
  29. package/docs/.vitepress/config.mjs +127 -127
  30. package/docs/.vitepress/navigation.mjs +82 -82
  31. package/docs/.vitepress/theme/Layout.vue +17 -17
  32. package/docs/.vitepress/theme/components/NavigationLinks.vue +102 -102
  33. package/docs/.vitepress/theme/components/Panzoom.vue +169 -169
  34. package/docs/.vitepress/theme/index.mjs +15 -15
  35. package/docs/.vitepress/theme/style.scss +163 -163
  36. package/docs/abbr.json +4 -4
  37. package/docs/api/cron/cronApi.md +56 -56
  38. package/docs/api/crud/deleteCrud.md +58 -58
  39. package/docs/api/crud/insert.md +82 -82
  40. package/docs/api/crud/update.md +85 -85
  41. package/docs/api/index.md +47 -47
  42. package/docs/api/notification/testEmail.md +91 -91
  43. package/docs/api/table/card.md +73 -73
  44. package/docs/api/table/data.md +134 -134
  45. package/docs/api/table/export.md +60 -60
  46. package/docs/api/table/filter.md +104 -104
  47. package/docs/api/table/form.md +126 -126
  48. package/docs/api/table/search.md +123 -123
  49. package/docs/api/table/suggest.md +156 -156
  50. package/docs/api/table/table.md +107 -107
  51. package/docs/api/user/user.cls.id.md +77 -77
  52. package/docs/api/user/user.cls.md +49 -49
  53. package/docs/api/user/user.cls.post.md +62 -62
  54. package/docs/api/user/user.info.md +37 -37
  55. package/docs/api/utils/logger.file.md +60 -60
  56. package/docs/api/utils/next.id.md +34 -34
  57. package/docs/api/utils/properties.add.md +127 -127
  58. package/docs/api/utils/properties.get.md +73 -73
  59. package/docs/api/utils/status.monitor.md +36 -36
  60. package/docs/api/widget/widget.del.md +76 -76
  61. package/docs/api/widget/widget.get.md +233 -233
  62. package/docs/api/widget/widget.set.md +88 -88
  63. package/docs/db/admin.md +947 -947
  64. package/docs/db/crm.md +564 -564
  65. package/docs/db/index.md +9 -9
  66. package/docs/db/log.md +204 -204
  67. package/docs/hook/card/afterCard.md +20 -20
  68. package/docs/hook/card/preCard.md +25 -25
  69. package/docs/hook/data/afterData.md +26 -26
  70. package/docs/hook/data/preData.md +26 -26
  71. package/docs/hook/deleteCrud/afterDelete.md +21 -21
  72. package/docs/hook/deleteCrud/preDelete.md +26 -26
  73. package/docs/hook/form/afterForm.md +19 -19
  74. package/docs/hook/form/preForm.md +26 -26
  75. package/docs/hook/getTemplate/afterTemplate.md +24 -24
  76. package/docs/hook/getTemplate/preTemplate.md +29 -29
  77. package/docs/hook/index.md +45 -45
  78. package/docs/hook/insert/afterInsert.md +41 -41
  79. package/docs/hook/insert/preInsert.md +25 -25
  80. package/docs/hook/table/afterTable.md +20 -20
  81. package/docs/hook/table/preTable.md +25 -25
  82. package/docs/hook/update/afterUpdate.md +41 -41
  83. package/docs/hook/update/preUpdate.md +25 -25
  84. package/docs/index.md +42 -42
  85. package/docs/public/fastify-dark.svg +3 -3
  86. package/docs/public/logo-short-dark.svg +11 -11
  87. package/docs/public/logo-short.svg +10 -10
  88. package/docs/public/logo.svg +19 -19
  89. package/docs/readme/index.md +121 -121
  90. package/docs/templates/card.md +83 -83
  91. package/docs/templates/cls.md +29 -29
  92. package/docs/templates/filters.md +91 -91
  93. package/docs/templates/forms.md +139 -139
  94. package/docs/templates/index.md +28 -28
  95. package/docs/templates/select.md +90 -90
  96. package/docs/templates/table.md +162 -162
  97. package/docs/utils/cron/addCron.md +29 -29
  98. package/docs/utils/crud/dataInsert.md +51 -51
  99. package/docs/utils/crud/dataUpdate.md +52 -52
  100. package/docs/utils/crud/getOpt.md +33 -33
  101. package/docs/utils/crud/isFileExists.md +37 -37
  102. package/docs/utils/crud/setOpt.md +37 -37
  103. package/docs/utils/hook/addHook.md +74 -74
  104. package/docs/utils/hook/applyHook.md +64 -64
  105. package/docs/utils/index.md +47 -47
  106. package/docs/utils/notification/addNotification.md +28 -28
  107. package/docs/utils/notification/notification.md +41 -41
  108. package/docs/utils/pg/autoIndex.md +22 -22
  109. package/docs/utils/pg/getMeta.md +58 -58
  110. package/docs/utils/pg/getPG.md +34 -34
  111. package/docs/utils/pg/init.md +29 -29
  112. package/docs/utils/pg/pg.md +70 -70
  113. package/docs/utils/redis/getRedis.md +36 -36
  114. package/docs/utils/redis/rclient.md +74 -74
  115. package/docs/utils/table/getForm.md +68 -68
  116. package/docs/utils/table/getMeta.md +55 -55
  117. package/docs/utils/table/getSelect.md +38 -38
  118. package/docs/utils/table/getSelectMeta.md +46 -46
  119. package/docs/utils/table/getTable.md +77 -77
  120. package/helper.js +30 -30
  121. package/index.js +105 -105
  122. package/migration/exec.migrations.js +79 -79
  123. package/module/core/select/core.user_mentioned.sql +1 -1
  124. package/module/test/cls/itree.composition.json +25 -25
  125. package/module/test/table/test.rest_zone.table.json +265 -265
  126. package/notification/controllers/readNotifications.js +27 -30
  127. package/notification/controllers/testEmail.js +46 -50
  128. package/notification/controllers/userNotifications.js +61 -64
  129. package/notification/funcs/addNotification.js +21 -21
  130. package/notification/funcs/sendNotification.js +112 -112
  131. package/notification/index.js +3 -8
  132. package/notification/schema.js +10 -0
  133. package/package.json +41 -41
  134. package/pg/funcs/getMeta.js +29 -29
  135. package/pg/funcs/getPG.js +30 -30
  136. package/pg/pgClients.js +20 -20
  137. package/policy/funcs/checkPolicy.js +92 -92
  138. package/policy/funcs/sqlInjection.js +33 -33
  139. package/policy/index.js +14 -14
  140. package/redis/client.js +8 -8
  141. package/redis/funcs/getRedis.js +23 -23
  142. package/redis/funcs/redisClients.js +2 -2
  143. package/redis/index.js +19 -19
  144. package/server/migrations/0.sql +78 -78
  145. package/server/migrations/cls.sql +39 -39
  146. package/server/migrations/log.sql +80 -80
  147. package/server/migrations/properties.sql +144 -144
  148. package/server/migrations/roles.sql +172 -172
  149. package/server/migrations/users.sql +168 -168
  150. package/server.js +26 -26
  151. package/table/controllers/data.js +157 -150
  152. package/table/controllers/filter.js +61 -50
  153. package/table/controllers/form.js +42 -42
  154. package/table/controllers/search.js +76 -80
  155. package/table/controllers/suggest.js +79 -79
  156. package/table/controllers/table.js +83 -83
  157. package/table/controllers/utils/addTemplateDir.js +8 -8
  158. package/table/controllers/utils/getSelect.js +19 -19
  159. package/table/controllers/utils/getSelectMeta.js +66 -66
  160. package/table/controllers/utils/getTemplate_old.js +28 -28
  161. package/table/controllers/utils/getTemplates.js +18 -18
  162. package/table/controllers/utils/gisIRColumn.js +72 -67
  163. package/table/controllers/utils/loadTemplate.js +1 -1
  164. package/table/controllers/utils/loadTemplatePath.js +1 -1
  165. package/table/controllers/utils/userTemplateDir.js +1 -1
  166. package/table/funcs/getFilterSQL/index.js +94 -94
  167. package/table/funcs/getFilterSQL/util/formatValue.js +170 -170
  168. package/table/funcs/getFilterSQL/util/getCustomQuery.js +13 -13
  169. package/table/funcs/getFilterSQL/util/getFilterQuery.js +66 -66
  170. package/table/funcs/getFilterSQL/util/getOptimizedQuery.js +12 -12
  171. package/table/funcs/getFilterSQL/util/getTableSql.js +34 -34
  172. package/table/funcs/metaFormat/getSelectVal.js +21 -21
  173. package/table/funcs/metaFormat/index.js +28 -28
  174. package/table/index.js +37 -37
  175. package/table/schema.js +64 -54
  176. package/test/api/applyHook.test.js +95 -95
  177. package/test/api/crud.test.js +89 -89
  178. package/test/api/crud.xss.test.js +80 -80
  179. package/test/api/suggest.test.js +66 -66
  180. package/test/api/table.test.js +134 -134
  181. package/test/api/user.test.js +85 -85
  182. package/test/api/widget.test.js +117 -117
  183. package/test/config.example +18 -18
  184. package/test/funcs/pg.test.js +34 -34
  185. package/test/funcs/redis.test.js +19 -19
  186. package/test/helper/formatDate.test.js +62 -62
  187. package/test/templates/cls/test.json +9 -9
  188. package/test/templates/form/cp_building.form.json +32 -32
  189. package/test/templates/select/account_id.json +3 -3
  190. package/test/templates/select/storage.data.json +2 -2
  191. package/test/templates/select/test.storage.data.json +3 -3
  192. package/test/templates/select/test.suggest.ato_new.json +3 -3
  193. package/test/templates/select/test.suggest.ato_new.sql +25 -25
  194. package/test/templates/select/test.suggest.data.json +4 -4
  195. package/test/templates/select/test.suggest.parent.sql +1 -1
  196. package/test/templates/table/gis.dataset.table.json +20 -20
  197. package/user/controllers/user.cls.id.js +14 -14
  198. package/user/controllers/user.cls.js +71 -75
  199. package/user/controllers/user.cls.post.js +52 -55
  200. package/user/controllers/user.info.js +17 -21
  201. package/user/index.js +7 -36
  202. package/user/schema.js +17 -0
  203. package/util/controllers/logger.file.js +91 -91
  204. package/util/controllers/next.id.js +4 -4
  205. package/util/controllers/properties.add.js +56 -60
  206. package/util/controllers/properties.get.js +16 -19
  207. package/util/controllers/status.monitor.js +8 -8
  208. package/util/controllers/utils/checkUserAccess.js +20 -17
  209. package/util/controllers/utils/getRootDir.js +25 -25
  210. package/util/index.js +19 -23
  211. package/util/schema.js +19 -0
  212. package/utils.js +106 -104
  213. package/widget/controllers/utils/historyFormat.js +76 -76
  214. package/widget/controllers/utils/obj2db.js +13 -13
  215. package/widget/controllers/widget.del.js +41 -44
  216. package/widget/controllers/widget.get.js +96 -102
  217. package/widget/controllers/widget.set.js +74 -79
  218. package/widget/index.js +40 -40
@@ -1,102 +1,96 @@
1
- import getToken from '../../crud/funcs/getToken.js';
2
- import getMeta from '../../pg/funcs/getMeta.js';
3
- import historyFormat from './utils/historyFormat.js';
4
-
5
- const galleryExtList = ['png', 'svg', 'jpg', 'jpeg', 'gif', 'mp4', 'mov', 'avi'];
6
-
7
- /**
8
- * Дістає CRM для widget
9
- *
10
- */
11
-
12
- export default async function widgetGet({
13
- pg, session = {}, params = {}, query = {},
14
- }) {
15
- const { user = {} } = session.passport || {};
16
-
17
- const param = user?.uid ? await getToken({
18
- token: params.objectid, mode: 'w', uid: user.uid,
19
- }) : null;
20
-
21
- const objectid = param ? JSON.parse(param)?.id : params.objectid;
22
-
23
- if (!objectid) return { error: 'id required', status: 400 };
24
-
25
- const sqls = {
26
- comment: pg.pk['admin.users']
27
- ? `select communication_id, entity_id, body, subject, c.cdate, c.uid,
28
- coalesce(user_name,' ')||' '||coalesce(sur_name,'') as username, avatar
29
- from crm.communications c left join admin.users u on u.uid=c.uid where entity_id=$1 order by cdate desc`
30
- : 'select communication_id, entity_id, body, subject, cdate, uid from crm.communications where entity_id=$1 order by cdate desc',
31
-
32
- history: `SELECT b.change_data_id, change_id, entity_id, entity_type, change_type, change_date, uid, cdate, b.entity_key, b.value_new, b.value_old FROM log.table_changes a
33
- left join lateral(
34
- select change_data_id, entity_key, value_new, value_old from log.table_changes_data where change_id=a.change_id
35
- )b on 1=1
36
- where (entity_id=$1 or entity_id in (
37
- select communication_id as comments from crm.communications where entity_id=$1
38
- union all select file_id from crm.files where entity_id=$1
39
- union all select checklist_id from crm.checklists where entity_id=$1)
40
- ) and b.change_data_id is not null order by cdate desc limit 100`,
41
-
42
- checklist: pg.pk['admin.users']
43
- ? `SELECT checklist_id, entity_id, subject, is_done, done_date, c.uid, c.cdate, coalesce(user_name,' ')||' '||coalesce(sur_name,'') as username,
44
- avatar FROM crm.checklists c left join admin.users u on u.uid=c.uid where entity_id=$1 order by cdate desc`
45
- : 'SELECT checklist_id, entity_id, subject, is_done, done_date, uid, cdate FROM crm.checklists where entity_id=$1 order by cdate desc',
46
-
47
- file: pg.pk['admin.users']
48
- ? `SELECT file_id, entity_id, entity_type, file_path, uploaded_name, ext, size, c.uid, c.cdate, file_type, c.ismain,
49
- coalesce(user_name,' ')||' '||coalesce(sur_name,'') as username, isverified,
50
- avatar, c.uid as author, file_status FROM crm.files c left join admin.users u on u.uid=c.uid
51
- where entity_id=$1 and file_status<>3 order by cdate desc`
52
- : `SELECT file_id, entity_id, entity_type, file_path, uploaded_name, ext, size, uid, cdate, file_type, ismain,
53
- isverified, uid as author, file_status FROM crm.files c where entity_id=$1 and file_status<>3 order by cdate desc`,
54
- gallery: pg.pk['admin.users']
55
- ? `SELECT file_id, entity_id, entity_type, file_path, uploaded_name, ext, size, c.uid, c.cdate, file_type, c.ismain,
56
- coalesce(user_name,' ')||' '||coalesce(sur_name,'') as username, isverified,
57
- avatar, c.uid as author, file_status FROM crm.files c left join admin.users u on u.uid=c.uid
58
- where entity_id=$1 and file_status<>3 and ext = any($2) order by cdate desc`
59
- : `SELECT file_id, entity_id, entity_type, file_path, uploaded_name, ext, size, c.uid, c.cdate, file_type, ismain,
60
- isverified, uid as author, file_status FROM crm.files c where entity_id=$1 and file_status<>3 and ext = any($2) order by cdate desc`,
61
-
62
- };
63
- const sql = sqls[params.type];
64
- if (!sql) {
65
- return { error: 'param type not valid', status: 400 };
66
- }
67
-
68
- try {
69
- /* data */
70
- const time = [Date.now()];
71
- const { rows } = await pg.query(sql, [objectid, params.type === 'gallery' ? galleryExtList : null].filter((el) => el));
72
- time.push(Date.now());
73
-
74
- /* Object info */
75
- const { tableName } = pg.pk['log.table_changes'] ? await pg.one('select entity_type as "tableName" from log.table_changes where entity_id=$1 limit 1', [objectid]) : {};
76
- const { pk } = await getMeta({ table: tableName });
77
-
78
- const q = tableName && pg.pk['admin.users'] ? `select coalesce(b.user_name,'')||coalesce(' '||b.sur_name,'') as author, a.cdate, a.editor_date from ${tableName} a
79
- left join admin.users b on a.uid=b.uid where a.${pk}=$1 limit 1` : undefined;
80
- const data = pk && q ? await pg.one(q, [objectid]) : {};
81
-
82
- if (query.debug && user?.user_type === 'admin') {
83
- return {
84
- sql, type: params.type, q, id: objectid, data,
85
- };
86
- }
87
-
88
- time.push(Date.now());
89
- return {
90
- time: { data: time[1] - time[0], format: time[2] - time[1] },
91
- rows: params.type === 'history' ? await historyFormat(rows, tableName, pg) : rows,
92
- user: { uid: user?.uid, name: user?.user_name },
93
- data: { author: data?.author, cdate: data?.cdate, edate: data?.editor_date },
94
- objectid: params.objectid,
95
- };
96
- }
97
- catch (err) {
98
- // 'history', 'file', 'checklist'
99
- /* 'document', 'image' - Макс на клиенте */
100
- return { message: err.toString(), status: 500 };
101
- }
102
- }
1
+ import getToken from '../../crud/funcs/getToken.js';
2
+ import getMeta from '../../pg/funcs/getMeta.js';
3
+ import historyFormat from './utils/historyFormat.js';
4
+
5
+ const galleryExtList = ['png', 'svg', 'jpg', 'jpeg', 'gif', 'mp4', 'mov', 'avi'];
6
+
7
+ /**
8
+ * Дістає CRM для widget
9
+ *
10
+ */
11
+
12
+ export default async function widgetGet({
13
+ pg, session = {}, params = {}, query = {},
14
+ }) {
15
+ const { user = {} } = session.passport || {};
16
+
17
+ const param = user?.uid ? await getToken({
18
+ token: params.objectid, mode: 'w', uid: user.uid,
19
+ }) : null;
20
+
21
+ const objectid = param ? JSON.parse(param)?.id : params.objectid;
22
+
23
+ if (!objectid) return { error: 'id required', status: 400 };
24
+
25
+ const sqls = {
26
+ comment: pg.pk['admin.users']
27
+ ? `select communication_id, entity_id, body, subject, c.cdate, c.uid,
28
+ coalesce(user_name,' ')||' '||coalesce(sur_name,'') as username, avatar
29
+ from crm.communications c left join admin.users u on u.uid=c.uid where entity_id=$1 order by cdate desc`
30
+ : 'select communication_id, entity_id, body, subject, cdate, uid from crm.communications where entity_id=$1 order by cdate desc',
31
+
32
+ history: `SELECT b.change_data_id, change_id, entity_id, entity_type, change_type, change_date, uid, cdate, b.entity_key, b.value_new, b.value_old FROM log.table_changes a
33
+ left join lateral(
34
+ select change_data_id, entity_key, value_new, value_old from log.table_changes_data where change_id=a.change_id
35
+ )b on 1=1
36
+ where (entity_id=$1 or entity_id in (
37
+ select communication_id as comments from crm.communications where entity_id=$1
38
+ union all select file_id from crm.files where entity_id=$1
39
+ union all select checklist_id from crm.checklists where entity_id=$1)
40
+ ) and b.change_data_id is not null order by cdate desc limit 100`,
41
+
42
+ checklist: pg.pk['admin.users']
43
+ ? `SELECT checklist_id, entity_id, subject, is_done, done_date, c.uid, c.cdate, coalesce(user_name,' ')||' '||coalesce(sur_name,'') as username,
44
+ avatar FROM crm.checklists c left join admin.users u on u.uid=c.uid where entity_id=$1 order by cdate desc`
45
+ : 'SELECT checklist_id, entity_id, subject, is_done, done_date, uid, cdate FROM crm.checklists where entity_id=$1 order by cdate desc',
46
+
47
+ file: pg.pk['admin.users']
48
+ ? `SELECT file_id, entity_id, entity_type, file_path, uploaded_name, ext, size, c.uid, c.cdate, file_type, c.ismain,
49
+ coalesce(user_name,' ')||' '||coalesce(sur_name,'') as username, isverified,
50
+ avatar, c.uid as author, file_status FROM crm.files c left join admin.users u on u.uid=c.uid
51
+ where entity_id=$1 and file_status<>3 order by cdate desc`
52
+ : `SELECT file_id, entity_id, entity_type, file_path, uploaded_name, ext, size, uid, cdate, file_type, ismain,
53
+ isverified, uid as author, file_status FROM crm.files c where entity_id=$1 and file_status<>3 order by cdate desc`,
54
+ gallery: pg.pk['admin.users']
55
+ ? `SELECT file_id, entity_id, entity_type, file_path, uploaded_name, ext, size, c.uid, c.cdate, file_type, c.ismain,
56
+ coalesce(user_name,' ')||' '||coalesce(sur_name,'') as username, isverified,
57
+ avatar, c.uid as author, file_status FROM crm.files c left join admin.users u on u.uid=c.uid
58
+ where entity_id=$1 and file_status<>3 and ext = any($2) order by cdate desc`
59
+ : `SELECT file_id, entity_id, entity_type, file_path, uploaded_name, ext, size, c.uid, c.cdate, file_type, ismain,
60
+ isverified, uid as author, file_status FROM crm.files c where entity_id=$1 and file_status<>3 and ext = any($2) order by cdate desc`,
61
+
62
+ };
63
+ const sql = sqls[params.type];
64
+ if (!sql) {
65
+ return { error: 'param type not valid', status: 400 };
66
+ }
67
+
68
+
69
+ /* data */
70
+ const time = [Date.now()];
71
+ const { rows } = await pg.query(sql, [objectid, params.type === 'gallery' ? galleryExtList : null].filter((el) => el));
72
+ time.push(Date.now());
73
+
74
+ /* Object info */
75
+ const { tableName } = pg.pk['log.table_changes'] ? await pg.one('select entity_type as "tableName" from log.table_changes where entity_id=$1 limit 1', [objectid]) : {};
76
+ const { pk } = await getMeta({ table: tableName });
77
+
78
+ const q = tableName && pg.pk['admin.users'] ? `select coalesce(b.user_name,'')||coalesce(' '||b.sur_name,'') as author, a.cdate, a.editor_date from ${tableName} a
79
+ left join admin.users b on a.uid=b.uid where a.${pk}=$1 limit 1` : undefined;
80
+ const data = pk && q ? await pg.one(q, [objectid]) : {};
81
+
82
+ if (query.debug && user?.user_type === 'admin') {
83
+ return {
84
+ sql, type: params.type, q, id: objectid, data,
85
+ };
86
+ }
87
+
88
+ time.push(Date.now());
89
+ return {
90
+ time: { data: time[1] - time[0], format: time[2] - time[1] },
91
+ rows: params.type === 'history' ? await historyFormat(rows, tableName, pg) : rows,
92
+ user: { uid: user?.uid, name: user?.user_name },
93
+ data: { author: data?.author, cdate: data?.cdate, edate: data?.editor_date },
94
+ objectid: params.objectid,
95
+ };
96
+ }
@@ -1,79 +1,74 @@
1
- import path from 'path';
2
-
3
- import {
4
- getMeta, dataInsert, dataUpdate, applyHook,
5
- } from '../../utils.js';
6
-
7
- const tableList = {
8
- comment: 'crm.communications',
9
- checklist: 'crm.checklists',
10
- };
11
- const pkList = {
12
- comment: 'communication_id',
13
- checklist: 'checklist_id',
14
- };
15
-
16
- const galleryExtList = ['png', 'svg', 'jpg', 'jpeg', 'gif', 'mp4', 'mov', 'avi'];
17
-
18
- export default async function widgetSet(req) {
19
- const {
20
- pg, params = {}, session = {}, body = {}, funcs, log,
21
- } = req;
22
- const { user = {} } = session.passport || {};
23
- const { type, id, objectid } = params;
24
- if (!['comment', 'checklist', 'file', 'gallery'].includes(type)) return { message: 'param type not valid', status: 400 };
25
- if (!objectid) return { message: 'id required', status: 400 };
26
-
27
- const table = tableList[type];
28
-
29
- try {
30
- if (['gallery', 'file'].includes(type)) {
31
- const file = await funcs.uploadMultiPart(req);
32
- const extName = path.extname(file.filepath).slice(1).toLowerCase();
33
-
34
- const data = {
35
- uploaded_name: file?.originalFilename?.toLocaleLowerCase()?.replace(/'/g, '\'\''),
36
- file_path: file?.relativeFilepath?.replace(/\\/g, '/'),
37
- ext: extName,
38
- size: file?.size,
39
- file_status: 1,
40
- uid: user?.uid || 1,
41
- entity_id: objectid,
42
- };
43
-
44
- if (type === 'gallery' && !galleryExtList.includes(extName.toLowerCase())) {
45
- return { message: 'invalid file extension', status: 400 };
46
- }
47
-
48
- const { rows = [] } = await dataInsert({
49
- table: 'crm.files', data, uid: user?.uid,
50
- });
51
- return {
52
- rowCount: 1, data: 'ok', command: 'UPLOAD', id: rows[0]?.file_id, entity_id: rows[0]?.entity_id,
53
- };
54
- }
55
- const { pk } = await getMeta({ pg, table });
56
- if (!pk) return { message: 'table not found', status: 404 };
57
-
58
- const data = { ...body, uid: user?.uid, entity_id: objectid };
59
-
60
- await applyHook('onWidgetSet', {
61
- link: req.path, session, log, type, payload: data,
62
- });
63
- const result = id
64
- ? await dataUpdate({
65
- table, data, id, uid: user?.uid,
66
- })
67
- : await dataInsert({
68
- table, data, uid: user?.uid,
69
- });
70
-
71
- return {
72
- rowCount: result.rowCount, data: 'ok', command: result.command, id: result.rows?.[0]?.[pkList[type]] || result?.[pkList[type]],
73
- };
74
- }
75
- catch (err) {
76
- log.error('widget/upload', { error: err.toString(), params });
77
- return { error: err.toString(), status: 500 };
78
- }
79
- }
1
+ import path from 'path';
2
+
3
+ import {
4
+ getMeta, dataInsert, dataUpdate, applyHook,
5
+ } from '../../utils.js';
6
+
7
+ const tableList = {
8
+ comment: 'crm.communications',
9
+ checklist: 'crm.checklists',
10
+ };
11
+ const pkList = {
12
+ comment: 'communication_id',
13
+ checklist: 'checklist_id',
14
+ };
15
+
16
+ const galleryExtList = ['png', 'svg', 'jpg', 'jpeg', 'gif', 'mp4', 'mov', 'avi'];
17
+
18
+ export default async function widgetSet(req) {
19
+ const {
20
+ pg, params = {}, session = {}, body = {}, funcs, log,
21
+ } = req;
22
+ const { user = {} } = session.passport || {};
23
+ const { type, id, objectid } = params;
24
+ if (!['comment', 'checklist', 'file', 'gallery'].includes(type)) return { message: 'param type not valid', status: 400 };
25
+ if (!objectid) return { message: 'id required', status: 400 };
26
+
27
+ const table = tableList[type];
28
+
29
+
30
+ if (['gallery', 'file'].includes(type)) {
31
+ const file = await funcs.uploadMultiPart(req);
32
+ const extName = path.extname(file.filepath).slice(1).toLowerCase();
33
+
34
+ const data = {
35
+ uploaded_name: file?.originalFilename?.toLocaleLowerCase()?.replace(/'/g, '\'\''),
36
+ file_path: file?.relativeFilepath?.replace(/\\/g, '/'),
37
+ ext: extName,
38
+ size: file?.size,
39
+ file_status: 1,
40
+ uid: user?.uid || 1,
41
+ entity_id: objectid,
42
+ };
43
+
44
+ if (type === 'gallery' && !galleryExtList.includes(extName.toLowerCase())) {
45
+ return { message: 'invalid file extension', status: 400 };
46
+ }
47
+
48
+ const { rows = [] } = await dataInsert({
49
+ table: 'crm.files', data, uid: user?.uid,
50
+ });
51
+ return {
52
+ rowCount: 1, data: 'ok', command: 'UPLOAD', id: rows[0]?.file_id, entity_id: rows[0]?.entity_id,
53
+ };
54
+ }
55
+ const { pk } = await getMeta({ pg, table });
56
+ if (!pk) return { message: 'table not found', status: 404 };
57
+
58
+ const data = { ...body, uid: user?.uid, entity_id: objectid };
59
+
60
+ await applyHook('onWidgetSet', {
61
+ link: req.path, session, log, type, payload: data,
62
+ });
63
+ const result = id
64
+ ? await dataUpdate({
65
+ table, data, id, uid: user?.uid,
66
+ })
67
+ : await dataInsert({
68
+ table, data, uid: user?.uid,
69
+ });
70
+
71
+ return {
72
+ rowCount: result.rowCount, data: 'ok', command: result.command, id: result.rows?.[0]?.[pkList[type]] || result?.[pkList[type]],
73
+ };
74
+ }
package/widget/index.js CHANGED
@@ -1,40 +1,40 @@
1
- import widgetDel from './controllers/widget.del.js';
2
- import widgetSet from './controllers/widget.set.js';
3
- import widgetGet from './controllers/widget.get.js';
4
-
5
- const tableSchema = {
6
- params: {
7
- // type: { type: 'string', pattern: '^([\\d\\w]+)$' },
8
- objectid: { type: 'string', pattern: '^([\\d\\w]+)$' },
9
- id: { type: 'string', pattern: '^([\\d\\w]+)$' },
10
- },
11
- querystring: {
12
- debug: { type: 'string', pattern: '^(\\d+)$' },
13
- },
14
- };
15
-
16
- async function route(fastify, opt) {
17
- const prefix = opt.prefix || '/api';
18
- fastify.route({
19
- method: 'DELETE',
20
- url: `${prefix}/widget/:type/:objectid/:id`,
21
- schema: tableSchema,
22
- handler: widgetDel,
23
- });
24
- fastify.route({
25
- method: 'POST',
26
- path: `${prefix}/widget/:type/:objectid/:id?`,
27
- schema: tableSchema,
28
- handler: widgetSet,
29
- });
30
- fastify.route({
31
- method: 'GET',
32
- path: `${prefix}/widget/:type/:objectid`,
33
- config: {
34
- policy: ['public'],
35
- },
36
- schema: tableSchema,
37
- handler: widgetGet,
38
- });
39
- }
40
- export default route;
1
+ import widgetDel from './controllers/widget.del.js';
2
+ import widgetSet from './controllers/widget.set.js';
3
+ import widgetGet from './controllers/widget.get.js';
4
+
5
+ const tableSchema = {
6
+ params: {
7
+ // type: { type: 'string', pattern: '^([\\d\\w]+)$' },
8
+ objectid: { type: 'string', pattern: '^([\\d\\w]+)$' },
9
+ id: { type: 'string', pattern: '^([\\d\\w]+)$' },
10
+ },
11
+ querystring: {
12
+ debug: { type: 'string', pattern: '^(\\d+)$' },
13
+ },
14
+ };
15
+
16
+ async function route(fastify, opt) {
17
+ const prefix = opt.prefix || '/api';
18
+ fastify.route({
19
+ method: 'DELETE',
20
+ url: `${prefix}/widget/:type/:objectid/:id`,
21
+ schema: tableSchema,
22
+ handler: widgetDel,
23
+ });
24
+ fastify.route({
25
+ method: 'POST',
26
+ path: `${prefix}/widget/:type/:objectid/:id?`,
27
+ schema: tableSchema,
28
+ handler: widgetSet,
29
+ });
30
+ fastify.route({
31
+ method: 'GET',
32
+ path: `${prefix}/widget/:type/:objectid`,
33
+ config: {
34
+ policy: ['public'],
35
+ },
36
+ schema: tableSchema,
37
+ handler: widgetGet,
38
+ });
39
+ }
40
+ export default route;