@opengis/cms 0.0.57 → 0.0.58

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 (149) hide show
  1. package/README.md +131 -131
  2. package/dist/AddNewItemInTree-05PSSEFi.js +76 -0
  3. package/dist/ArticlesPage-CFjE_cw_.js +298 -0
  4. package/dist/CollectionsBreadcrumb-BCxeRikP.js +4 -0
  5. package/dist/CollectionsBreadcrumb.vue_vue_type_script_setup_true_lang-umRzB5mY.js +53 -0
  6. package/dist/CollectionsPage-DHfPNql6.js +124 -0
  7. package/dist/{CreateForm-BMOBeP4G.js → CreateForm-5FvT45vH.js} +1 -1
  8. package/dist/Dashboard-C1eGscNd.js +358 -0
  9. package/dist/EditCollectionPage-DIr1tdtn.js +187 -0
  10. package/dist/{EmptyData-DaZt_nAm.js → EmptyData-DxPrSXhV.js} +1 -1
  11. package/dist/{MenuAddPage-Bf48Z-ah.js → MenuAddPage-D-p3gFgm.js} +40 -35
  12. package/dist/MenuBody-rN5j4YBu.js +125 -0
  13. package/dist/MenuItemPage-BoJw885D.js +1027 -0
  14. package/dist/MenuList-DFEBS0NB.js +172 -0
  15. package/dist/MenuPage-BCZB_S8j.js +107 -0
  16. package/dist/MenuWrapper-AZ_8s-zd.js +12 -0
  17. package/dist/MonacoEditor-Db-3Jc3E.js +4 -0
  18. package/dist/{UniversalTable.vue_vue_type_script_setup_true_lang-CJGTsd1V.js → UniversalTable-CzqPG-tY.js} +12 -12
  19. package/dist/{UniversalTablePagination.vue_vue_type_script_setup_true_lang-GYZd_gkA.js → UniversalTablePagination-4gL47A7I.js} +1 -1
  20. package/dist/VsFormTags-CMjiu9sY.js +114 -0
  21. package/dist/VsPreview-DwETkOpb.js +63 -0
  22. package/dist/contentForm-CtMhQTG0.js +489 -0
  23. package/dist/getField-CpwVE28P.js +179 -0
  24. package/dist/index.d.ts +8 -0
  25. package/dist/index.html +29 -29
  26. package/dist/index.js +72 -71
  27. package/dist/style.css +1 -1
  28. package/dist/vs-builder-edit-D-q1o8tF.js +604 -0
  29. package/dist/vs-builder-monaco-B3Jj0V31.js +33 -0
  30. package/dist/vs-builder-preview-BH4VAM3a.js +44 -0
  31. package/dist/vs-form-custom-datatable-BDZo48w3.js +317 -0
  32. package/dist/vs-form-integer-BZ855R3g.js +61 -0
  33. package/dist/vs-form-media-select-NY27EaG1.js +837 -0
  34. package/dist/vs-form-reference-list-Dtv8fJJU.js +1536 -0
  35. package/dist/vs-form-reletion-link-BhzNQszm.js +34 -0
  36. package/dist/vs-form-tiptap-DDFQjRjY.js +4 -0
  37. package/dist/vs-form-tiptap.vue_vue_type_script_setup_true_lang-DGgsqXwg.js +11 -0
  38. package/dist/vs-richtext-md-C098v_6Q.js +4 -0
  39. package/dist/vs-richtext-md.vue_vue_type_script_setup_true_lang-Ct8uTV-J.js +14 -0
  40. package/input-types.json +9 -9
  41. package/locales/en.json +815 -814
  42. package/locales/uk.json +813 -812
  43. package/module/cms/cls/content.status.json +17 -17
  44. package/module/cms/cls/user_type.json +9 -9
  45. package/module/cms/form/admin.users.form.json +77 -77
  46. package/module/cms/select/cms.page_type.sql +1 -1
  47. package/module/cms/select/news_tag_id.sql +11 -11
  48. package/module/cms/table/admin.users.table.json +53 -53
  49. package/module/cms/table/collection.default.table.json +96 -96
  50. package/module/cms/table/single.default.table.json +116 -116
  51. package/package.json +68 -68
  52. package/plugin.js +43 -43
  53. package/server/app.js +35 -35
  54. package/server/config.js +4 -4
  55. package/server/functions/getContent.js +45 -45
  56. package/server/functions/getDraftKey.js +22 -22
  57. package/server/functions/getSearchData.js +31 -31
  58. package/server/functions/getTags.js +30 -30
  59. package/server/functions/getUser.js +27 -27
  60. package/server/functions/utils/mock.reply.js +55 -55
  61. package/server/index.js +22 -22
  62. package/server/migrations/fixes.sql +129 -129
  63. package/server/migrations/site.sql +595 -595
  64. package/server/plugins/adminHook.js +78 -78
  65. package/server/plugins/hook.js +59 -59
  66. package/server/plugins/vite.js +75 -75
  67. package/server/routes/category/controllers/cms.category.delete.js +21 -21
  68. package/server/routes/category/controllers/cms.category.get.js +17 -17
  69. package/server/routes/category/controllers/cms.category.list.js +16 -16
  70. package/server/routes/category/controllers/cms.category.post.js +21 -21
  71. package/server/routes/category/controllers/cms.category.put.js +23 -23
  72. package/server/routes/category/index.mjs +22 -22
  73. package/server/routes/cms/controllers/cmsStat.js +55 -55
  74. package/server/routes/cms/controllers/cmsSuggest.js +57 -57
  75. package/server/routes/cms/controllers/deleteContent.js +113 -113
  76. package/server/routes/cms/controllers/deleteMedia.js +76 -76
  77. package/server/routes/cms/controllers/downloadMedia.js +84 -84
  78. package/server/routes/cms/controllers/getContent.js +113 -113
  79. package/server/routes/cms/controllers/getContentBySlug.js +93 -93
  80. package/server/routes/cms/controllers/insertContent.js +217 -217
  81. package/server/routes/cms/controllers/listMedia.js +155 -155
  82. package/server/routes/cms/controllers/metadataMedia.js +39 -39
  83. package/server/routes/cms/controllers/properties.get.js +18 -18
  84. package/server/routes/cms/controllers/properties.post.js +99 -99
  85. package/server/routes/cms/controllers/searchContent.js +214 -214
  86. package/server/routes/cms/controllers/translate.js +89 -89
  87. package/server/routes/cms/controllers/updateContent.js +266 -266
  88. package/server/routes/cms/controllers/uploadMedia.js +79 -79
  89. package/server/routes/cms/functions/getSettings.js +48 -48
  90. package/server/routes/cms/index.mjs +112 -112
  91. package/server/routes/cms/utils/additionalData.js +35 -35
  92. package/server/routes/cms/utils/getCollection.js +89 -89
  93. package/server/routes/cms/utils/getSingle.js +188 -188
  94. package/server/routes/cms/utils/inputTypes.js +5 -5
  95. package/server/routes/cms/utils/insertContentLocalization.js +104 -104
  96. package/server/routes/cms/utils/requestTranslation.js +85 -85
  97. package/server/routes/cms/utils/updateLocalization.js +47 -47
  98. package/server/routes/cmsSpace/controllers/deleteSpace.js +25 -25
  99. package/server/routes/cmsSpace/controllers/getSpaces.js +27 -27
  100. package/server/routes/cmsSpace/controllers/insertSpace.js +21 -21
  101. package/server/routes/cmsSpace/controllers/updateSpace.js +23 -23
  102. package/server/routes/cmsSpace/index.mjs +20 -20
  103. package/server/routes/contentType/controllers/addContentType.js +160 -160
  104. package/server/routes/contentType/controllers/contentTypeList.js +54 -54
  105. package/server/routes/contentType/controllers/delContentType.js +75 -75
  106. package/server/routes/contentType/controllers/editContentType.js +88 -88
  107. package/server/routes/contentType/controllers/getContentType.js +65 -65
  108. package/server/routes/contentType/index.mjs +35 -35
  109. package/server/routes/contentType/utils/updateContents.js +44 -44
  110. package/server/routes/contentType/utils/updateCustomContentTable.js +53 -53
  111. package/server/routes/feedback/controllers/email.list.js +24 -24
  112. package/server/routes/feedback/controllers/feedback.js +48 -48
  113. package/server/routes/feedback/controllers/feedback.list.js +37 -37
  114. package/server/routes/feedback/controllers/news.subscriptions.js +44 -44
  115. package/server/routes/feedback/index.mjs +71 -71
  116. package/server/routes/logs/controllers/export.user.logs.js +77 -77
  117. package/server/routes/logs/controllers/user.logs.js +44 -44
  118. package/server/routes/logs/index.mjs +9 -9
  119. package/server/routes/menu/controllers/addMenu.js +37 -37
  120. package/server/routes/menu/controllers/delMenu.js +31 -31
  121. package/server/routes/menu/controllers/editMenu.js +41 -41
  122. package/server/routes/menu/controllers/getMenu.js +24 -24
  123. package/server/routes/menu/functions/getMenu.js +50 -50
  124. package/server/routes/menu/index.mjs +13 -13
  125. package/server/routes/migration/controllers/collectionToCustom.js +137 -137
  126. package/server/routes/migration/index.mjs +8 -8
  127. package/server/routes/root.mjs +8 -8
  128. package/server/routes/tags/controllers/add.tags.js +24 -24
  129. package/server/routes/tags/controllers/del.tags.js +19 -19
  130. package/server/routes/tags/controllers/edit.tags.js +25 -25
  131. package/server/routes/tags/controllers/get.tags.js +15 -15
  132. package/server/routes/tags/index.mjs +14 -14
  133. package/server/templates/cls/cms.category_type.json +9 -9
  134. package/server/templates/cls/cms.content_review_status.json +9 -9
  135. package/server/templates/cls/cms.content_status.json +9 -9
  136. package/server/templates/cls/cms.content_type.json +9 -9
  137. package/server/templates/cls/cms.lang.json +9 -9
  138. package/server/templates/page/login.html +126 -126
  139. package/utils.d.ts +52 -52
  140. package/utils.js +8 -8
  141. package/dist/ArticlesPage-BcR1hbds.js +0 -286
  142. package/dist/BuilderPage-CK_osM89.js +0 -386
  143. package/dist/CollectionsBreadcrumb.vue_vue_type_script_setup_true_lang-CnOe9ORD.js +0 -45
  144. package/dist/CollectionsPage-JfmrHNR_.js +0 -110
  145. package/dist/EditCollectionPage-Cw3GQYRe.js +0 -809
  146. package/dist/MenuItemPage-CXn5HC8j.js +0 -1366
  147. package/dist/MenuPage-tJZtK46W.js +0 -106
  148. package/dist/contentForm-B6gHgGkz.js +0 -586
  149. package/dist/getField-Y5WXnRR0.js +0 -2948
@@ -1,78 +1,78 @@
1
- import path from 'node:path';
2
- import { mkdir, writeFile } from 'node:fs/promises';
3
- import { createReadStream } from 'node:fs';
4
- import { config, getFolder, jsonToCsv, getFilterSQL } from '@opengis/fastify-table/utils.js';
5
-
6
- const rootDir = getFolder(config, 'local');
7
-
8
- export default async function exportUserLogs(req, reply) {
9
- const { pg, query, user = {} } = req;
10
- const { uid } = user;
11
- if (!uid) return reply.code(401).send({ message: 'Not authorized', status: 401 });
12
-
13
- const { filter = null } = query;
14
-
15
- const { q: filterQuery } = await getFilterSQL({
16
- filter, table: 'log.table_changes'
17
- });
18
-
19
- const { rows = [] } = await pg.query(`
20
- select
21
- row_number() over(order by cdate desc) as num,
22
- change_id,
23
- change_type,
24
- cdate,
25
- entity_type,
26
- entity_id,
27
- b.data_log
28
- from log.table_changes a
29
- left join lateral (
30
- select json_agg(
31
- row_to_json(q)
32
- ) as data_log
33
- from log.table_changes_data q
34
- where change_id=a.change_id
35
-
36
- )b on 1=1
37
-
38
- where change_user_id='${uid}'
39
- ${filterQuery ? `and ${filterQuery}` : ''}
40
- order by cdate desc
41
- `);
42
-
43
- const filePath = path.join(rootDir, `/files/tmp/logs_${uid}.csv`);
44
- const ext = path.extname(filePath);
45
- const filePathJSON = filePath.replace(ext, '.json');
46
-
47
- await mkdir(path.dirname(filePathJSON), { recursive: true });
48
- await writeFile(filePathJSON, JSON.stringify(rows));
49
-
50
- await jsonToCsv({
51
- filePath: filePathJSON,
52
- colmodel: [
53
- { name: 'num', title: '№', ua: '№' },
54
- { name: 'change_id', title: 'Ідентифікатор зміни', ua: 'Ідентифікатор зміни' },
55
- { name: 'change_type', title: 'Тип зміни', ua: 'Тип зміни' },
56
- { name: 'cdate', title: 'Дата та час зміни', ua: 'Дата та час зміни' },
57
- { name: 'entity_type', title: 'Тип об\'єкта', ua: 'Тип об\'єкта' },
58
- { name: 'entity_id', title: 'Ідентифікатор об\'єкта', ua: 'Ідентифікатор об\'єкта' },
59
- { name: 'data_log', title: 'Дані зміни', ua: 'Дані зміни' }
60
- ],
61
- columnList: [
62
- 'num',
63
- 'change_id',
64
- 'change_type',
65
- 'cdate',
66
- 'entity_type',
67
- 'entity_id',
68
- 'data_log'
69
- ],
70
- });
71
-
72
- reply.header('Content-Disposition', `attachment; filename=${encodeURIComponent(path.basename(filePath))}`);
73
- reply.header('Content-Type', 'text/csv');
74
-
75
- const fileStream = createReadStream(filePath);
76
- return reply.send(fileStream);
77
-
1
+ import path from 'node:path';
2
+ import { mkdir, writeFile } from 'node:fs/promises';
3
+ import { createReadStream } from 'node:fs';
4
+ import { config, getFolder, jsonToCsv, getFilterSQL } from '@opengis/fastify-table/utils.js';
5
+
6
+ const rootDir = getFolder(config, 'local');
7
+
8
+ export default async function exportUserLogs(req, reply) {
9
+ const { pg, query, user = {} } = req;
10
+ const { uid } = user;
11
+ if (!uid) return reply.code(401).send({ message: 'Not authorized', status: 401 });
12
+
13
+ const { filter = null } = query;
14
+
15
+ const { q: filterQuery } = await getFilterSQL({
16
+ filter, table: 'log.table_changes'
17
+ });
18
+
19
+ const { rows = [] } = await pg.query(`
20
+ select
21
+ row_number() over(order by cdate desc) as num,
22
+ change_id,
23
+ change_type,
24
+ cdate,
25
+ entity_type,
26
+ entity_id,
27
+ b.data_log
28
+ from log.table_changes a
29
+ left join lateral (
30
+ select json_agg(
31
+ row_to_json(q)
32
+ ) as data_log
33
+ from log.table_changes_data q
34
+ where change_id=a.change_id
35
+
36
+ )b on 1=1
37
+
38
+ where change_user_id='${uid}'
39
+ ${filterQuery ? `and ${filterQuery}` : ''}
40
+ order by cdate desc
41
+ `);
42
+
43
+ const filePath = path.join(rootDir, `/files/tmp/logs_${uid}.csv`);
44
+ const ext = path.extname(filePath);
45
+ const filePathJSON = filePath.replace(ext, '.json');
46
+
47
+ await mkdir(path.dirname(filePathJSON), { recursive: true });
48
+ await writeFile(filePathJSON, JSON.stringify(rows));
49
+
50
+ await jsonToCsv({
51
+ filePath: filePathJSON,
52
+ colmodel: [
53
+ { name: 'num', title: '№', ua: '№' },
54
+ { name: 'change_id', title: 'Ідентифікатор зміни', ua: 'Ідентифікатор зміни' },
55
+ { name: 'change_type', title: 'Тип зміни', ua: 'Тип зміни' },
56
+ { name: 'cdate', title: 'Дата та час зміни', ua: 'Дата та час зміни' },
57
+ { name: 'entity_type', title: 'Тип об\'єкта', ua: 'Тип об\'єкта' },
58
+ { name: 'entity_id', title: 'Ідентифікатор об\'єкта', ua: 'Ідентифікатор об\'єкта' },
59
+ { name: 'data_log', title: 'Дані зміни', ua: 'Дані зміни' }
60
+ ],
61
+ columnList: [
62
+ 'num',
63
+ 'change_id',
64
+ 'change_type',
65
+ 'cdate',
66
+ 'entity_type',
67
+ 'entity_id',
68
+ 'data_log'
69
+ ],
70
+ });
71
+
72
+ reply.header('Content-Disposition', `attachment; filename=${encodeURIComponent(path.basename(filePath))}`);
73
+ reply.header('Content-Type', 'text/csv');
74
+
75
+ const fileStream = createReadStream(filePath);
76
+ return reply.send(fileStream);
77
+
78
78
  }
@@ -1,45 +1,45 @@
1
- import { getFilterSQL } from '@opengis/fastify-table/utils.js';
2
-
3
- export default async function userLogs(req, reply) {
4
- const { pg, user = {}, query } = req;
5
- const { uid } = user;
6
- if (!uid) return reply.code(401).send({ message: 'Not authorized', status: 401 });
7
-
8
- const { page = 1, limit = 16, filter = null } = query;
9
- const offset = limit * (page - 1) || 0;
10
-
11
- const { q: filterQuery } = await getFilterSQL({
12
- filter, table: 'log.table_changes', filterList: [{ name: 'cdate', type: 'date' }, { name: 'change_type', type: 'check' }]
13
- });
14
- //return filterData
15
-
16
- const { total, filtered } = await pg.one(`select count(*)::int as total, (count(*) filter(where ${filterQuery ? `${filterQuery}` : '1=1'}))::int as filtered from log.table_changes where change_user_id=$1`, [uid])
17
-
18
- const { rows = [] } = await pg.query(`
19
- select
20
- row_number() over(order by cdate desc) as num,
21
- change_id,
22
- change_type,
23
- cdate,
24
- entity_type,
25
- entity_id,
26
- b.data_log
27
- from log.table_changes a
28
- left join lateral (
29
- select json_agg(
30
- row_to_json(q)
31
- ) as data_log
32
- from log.table_changes_data q
33
- where change_id=a.change_id
34
-
35
- )b on 1=1
36
-
37
- where change_user_id='${uid}'
38
- ${filterQuery ? `and ${filterQuery}` : ''}
39
- order by cdate desc
40
- limit ${limit} offset ${offset}
41
- `);
42
-
43
- const status = rows?.length ? 200 : 204;
44
- return reply.code(status).send({ message: { total, filtered, rows }, status })
1
+ import { getFilterSQL } from '@opengis/fastify-table/utils.js';
2
+
3
+ export default async function userLogs(req, reply) {
4
+ const { pg, user = {}, query } = req;
5
+ const { uid } = user;
6
+ if (!uid) return reply.code(401).send({ message: 'Not authorized', status: 401 });
7
+
8
+ const { page = 1, limit = 16, filter = null } = query;
9
+ const offset = limit * (page - 1) || 0;
10
+
11
+ const { q: filterQuery } = await getFilterSQL({
12
+ filter, table: 'log.table_changes', filterList: [{ name: 'cdate', type: 'date' }, { name: 'change_type', type: 'check' }]
13
+ });
14
+ //return filterData
15
+
16
+ const { total, filtered } = await pg.one(`select count(*)::int as total, (count(*) filter(where ${filterQuery ? `${filterQuery}` : '1=1'}))::int as filtered from log.table_changes where change_user_id=$1`, [uid])
17
+
18
+ const { rows = [] } = await pg.query(`
19
+ select
20
+ row_number() over(order by cdate desc) as num,
21
+ change_id,
22
+ change_type,
23
+ cdate,
24
+ entity_type,
25
+ entity_id,
26
+ b.data_log
27
+ from log.table_changes a
28
+ left join lateral (
29
+ select json_agg(
30
+ row_to_json(q)
31
+ ) as data_log
32
+ from log.table_changes_data q
33
+ where change_id=a.change_id
34
+
35
+ )b on 1=1
36
+
37
+ where change_user_id='${uid}'
38
+ ${filterQuery ? `and ${filterQuery}` : ''}
39
+ order by cdate desc
40
+ limit ${limit} offset ${offset}
41
+ `);
42
+
43
+ const status = rows?.length ? 200 : 204;
44
+ return reply.code(status).send({ message: { total, filtered, rows }, status })
45
45
  }
@@ -1,9 +1,9 @@
1
- import userLogs from './controllers/user.logs.js';
2
- import exportUserLogs from './controllers/export.user.logs.js';
3
-
4
- const params = { config: { policy: ['public'] } };
5
-
6
- export default async function route(app) {
7
- app.get('/user-logs', params, userLogs);
8
- app.get('/export-user-logs', params, exportUserLogs);
9
- }
1
+ import userLogs from './controllers/user.logs.js';
2
+ import exportUserLogs from './controllers/export.user.logs.js';
3
+
4
+ const params = { config: { policy: ['public'] } };
5
+
6
+ export default async function route(app) {
7
+ app.get('/user-logs', params, userLogs);
8
+ app.get('/export-user-logs', params, exportUserLogs);
9
+ }
@@ -1,38 +1,38 @@
1
- import { dataInsert, yml2json, json2yml } from "@opengis/fastify-table/utils.js";
2
-
3
- export default async function addMenu(req, reply) {
4
- const { pg = pgClients.client, params = {}, user = {}, headers = {}, body = {} } = req;
5
-
6
- if (!pg?.pk) {
7
- return reply.status(400).send('empty pg');
8
- }
9
-
10
- if (!pg?.pk?.['site.menus']) {
11
- return reply.status(404).send('table not found');
12
- }
13
-
14
- if (!body.name) {
15
- return reply.status(404).send('not enough body params: name');
16
- }
17
-
18
- if (typeof body.content === 'string') {
19
- body.items = yml2json(body.content);
20
- } else if (body.items && typeof body.items === 'object') {
21
- body.content = json2yml(body.items);
22
- }
23
-
24
- const res = await dataInsert({
25
- pg,
26
- table: 'site.menus',
27
- id: params.id,
28
- data: body,
29
- referer: headers.referer,
30
- uid: user.uid,
31
- }).then(el => el.rows[0]);
32
-
33
- if (!res) {
34
- return reply.status(500).send('insert menu error');
35
- }
36
-
37
- return reply.status(200).send(res);
1
+ import { dataInsert, yml2json, json2yml } from "@opengis/fastify-table/utils.js";
2
+
3
+ export default async function addMenu(req, reply) {
4
+ const { pg = pgClients.client, params = {}, user = {}, headers = {}, body = {} } = req;
5
+
6
+ if (!pg?.pk) {
7
+ return reply.status(400).send('empty pg');
8
+ }
9
+
10
+ if (!pg?.pk?.['site.menus']) {
11
+ return reply.status(404).send('table not found');
12
+ }
13
+
14
+ if (!body.name) {
15
+ return reply.status(404).send('not enough body params: name');
16
+ }
17
+
18
+ if (typeof body.content === 'string') {
19
+ body.items = yml2json(body.content);
20
+ } else if (body.items && typeof body.items === 'object') {
21
+ body.content = json2yml(body.items);
22
+ }
23
+
24
+ const res = await dataInsert({
25
+ pg,
26
+ table: 'site.menus',
27
+ id: params.id,
28
+ data: body,
29
+ referer: headers.referer,
30
+ uid: user.uid,
31
+ }).then(el => el.rows[0]);
32
+
33
+ if (!res) {
34
+ return reply.status(500).send('insert menu error');
35
+ }
36
+
37
+ return reply.status(200).send(res);
38
38
  }
@@ -1,32 +1,32 @@
1
- import { dataDelete } from "@opengis/fastify-table/utils.js";
2
-
3
- export default async function delMenu(req, reply) {
4
- const { pg = pgClients.client, params = {}, user = {}, headers = {}, body = {} } = req;
5
-
6
- if (!pg?.pk) {
7
- return reply.status(400).send('empty pg');
8
- }
9
-
10
- if (!pg?.pk?.['site.menus']) {
11
- return reply.status(404).send('table not found');
12
- }
13
-
14
- if (!params.id) {
15
- return reply.status(400).send('not enough params: id');
16
- }
17
-
18
- const res = await dataDelete({
19
- pg,
20
- table: 'site.menus',
21
- id: params.id,
22
- data: body,
23
- referer: headers.referer,
24
- uid: user.uid,
25
- });
26
-
27
- if (!res) {
28
- return reply.status(500).send('delete menu error');
29
- }
30
-
31
- return reply.status(200).send(res);
1
+ import { dataDelete } from "@opengis/fastify-table/utils.js";
2
+
3
+ export default async function delMenu(req, reply) {
4
+ const { pg = pgClients.client, params = {}, user = {}, headers = {}, body = {} } = req;
5
+
6
+ if (!pg?.pk) {
7
+ return reply.status(400).send('empty pg');
8
+ }
9
+
10
+ if (!pg?.pk?.['site.menus']) {
11
+ return reply.status(404).send('table not found');
12
+ }
13
+
14
+ if (!params.id) {
15
+ return reply.status(400).send('not enough params: id');
16
+ }
17
+
18
+ const res = await dataDelete({
19
+ pg,
20
+ table: 'site.menus',
21
+ id: params.id,
22
+ data: body,
23
+ referer: headers.referer,
24
+ uid: user.uid,
25
+ });
26
+
27
+ if (!res) {
28
+ return reply.status(500).send('delete menu error');
29
+ }
30
+
31
+ return reply.status(200).send(res);
32
32
  }
@@ -1,42 +1,42 @@
1
- import { dataUpdate, yml2json, json2yml } from "@opengis/fastify-table/utils.js";
2
-
3
- export default async function editMenu(req, reply) {
4
- const { pg = pgClients.client, params = {}, user = {}, headers = {}, body = {} } = req;
5
-
6
- if (!pg?.pk) {
7
- return reply.status(400).send('empty pg');
8
- }
9
-
10
- if (!pg?.pk?.['site.menus']) {
11
- return reply.status(404).send('table not found');
12
- }
13
-
14
- if (!params.id) {
15
- return reply.status(400).send('not enough params: id');
16
- }
17
-
18
- if (typeof body.content === 'string') {
19
- body.items = yml2json(body.content || '');
20
- } else if (body.items && typeof body.items === 'object') {
21
- body.content = json2yml(body.items || {});
22
- }
23
-
24
- if (!Object.keys(body.items || {}).length) {
25
- return reply.status(400).send('access restricted: empty json items / invalid yml content');
26
- }
27
-
28
- const res = await dataUpdate({
29
- pg,
30
- table: 'site.menus',
31
- id: params.id,
32
- data: body,
33
- referer: headers.referer,
34
- uid: user.uid,
35
- });
36
-
37
- if (!res) {
38
- return reply.status(500).send('update menu error');
39
- }
40
-
41
- return reply.status(200).send(res);
1
+ import { dataUpdate, yml2json, json2yml } from "@opengis/fastify-table/utils.js";
2
+
3
+ export default async function editMenu(req, reply) {
4
+ const { pg = pgClients.client, params = {}, user = {}, headers = {}, body = {} } = req;
5
+
6
+ if (!pg?.pk) {
7
+ return reply.status(400).send('empty pg');
8
+ }
9
+
10
+ if (!pg?.pk?.['site.menus']) {
11
+ return reply.status(404).send('table not found');
12
+ }
13
+
14
+ if (!params.id) {
15
+ return reply.status(400).send('not enough params: id');
16
+ }
17
+
18
+ if (typeof body.content === 'string') {
19
+ body.items = yml2json(body.content || '');
20
+ } else if (body.items && typeof body.items === 'object') {
21
+ body.content = json2yml(body.items || {});
22
+ }
23
+
24
+ if (!Object.keys(body.items || {}).length) {
25
+ return reply.status(400).send('access restricted: empty json items / invalid yml content');
26
+ }
27
+
28
+ const res = await dataUpdate({
29
+ pg,
30
+ table: 'site.menus',
31
+ id: params.id,
32
+ data: body,
33
+ referer: headers.referer,
34
+ uid: user.uid,
35
+ });
36
+
37
+ if (!res) {
38
+ return reply.status(500).send('update menu error');
39
+ }
40
+
41
+ return reply.status(200).send(res);
42
42
  }
@@ -1,25 +1,25 @@
1
- import getMenu from "../functions/getMenu.js";
2
-
3
- const limit = 16;
4
-
5
- export default async function getMenuAPI(req, reply) {
6
- const { query = {}, params = {} } = req;
7
-
8
- const result = await getMenu(params.id, {
9
- locale: query.locale,
10
- page: query.page,
11
- limit: Math.min(query.limit || limit, limit),
12
- sql: query.sql,
13
- ttl: 0
14
- });
15
-
16
- if (result.error) {
17
- return reply.status(result.code || 500).send(result);
18
- }
19
-
20
- if (params.id) {
21
- return reply.status(200).send(result);
22
- }
23
-
24
- return reply.status(200).send({ cache: result.cache, rows: result.rows });
1
+ import getMenu from "../functions/getMenu.js";
2
+
3
+ const limit = 16;
4
+
5
+ export default async function getMenuAPI(req, reply) {
6
+ const { query = {}, params = {} } = req;
7
+
8
+ const result = await getMenu(params.id, {
9
+ locale: query.locale,
10
+ page: query.page,
11
+ limit: Math.min(query.limit || limit, limit),
12
+ sql: query.sql,
13
+ ttl: 0
14
+ });
15
+
16
+ if (result.error) {
17
+ return reply.status(result.code || 500).send(result);
18
+ }
19
+
20
+ if (params.id) {
21
+ return reply.status(200).send(result);
22
+ }
23
+
24
+ return reply.status(200).send({ cache: result.cache, rows: result.rows });
25
25
  }
@@ -1,50 +1,50 @@
1
- import { createHash } from 'node:crypto';
2
-
3
- import { config, pgClients, getRedis } from "@opengis/fastify-table/utils.js";
4
-
5
- const pg = pgClients.client;
6
- const rclient = getRedis();
7
-
8
- export default async function getMenu(name, { locale, ttl = 3600, page, limit = 16, sql } = {}) {
9
- if (!pg?.pk) {
10
- return { error: 'empty pg', code: 400 };
11
- }
12
-
13
- if (!pg?.pk?.['site.menus']) {
14
- return { error: 'table not found', code: 404 };
15
- }
16
-
17
- const crudInc = await rclient.get(`pg:${config.pg?.database}:site.menus:crud`) || 0;
18
- const cacheKey = createHash('md5').update([config.pg?.database, 'cms:menu', crudInc, name, locale, page, limit].filter(Boolean).join(':')).digest('hex');
19
-
20
- const cache = ttl === 0 ? null : await rclient.get(cacheKey);
21
-
22
- // return from cache
23
- if (cache) {
24
- return { cache: true, ...JSON.parse(cache) };
25
- }
26
-
27
- const offset = page && page > 0 ? (page - 1) * limit : 0;
28
- const args = name ? [name, locale].filter(Boolean) : [locale].filter(Boolean);
29
- const where = name ?
30
- `$1 in (menu_id, name) and ${locale ? `locale=$2` : 'true'}`
31
- : (locale ? `locale=$1` : 'true');
32
-
33
- const q = `select menu_id, name, locale, description ${name ? ', items::json, content' : ''}
34
- from site.menus
35
- where ${where}
36
- order by (case when locale='uk' then false else true end)
37
- limit ${limit}
38
- offset ${offset}`;
39
-
40
- if (sql) return q;
41
-
42
- const rows = pg ? await pg.query(q, args).then(el => el.rows || []) : [];
43
-
44
- const payload = name ? (rows[0] || { error: 'menu not found', code: 404 }) : { rows };
45
-
46
- // save to cache, default = 1 hour
47
- if (ttl) await rclient.set(cacheKey, JSON.stringify(payload), 'EX', ttl);
48
-
49
- return { cache: false, ...payload };
50
- }
1
+ import { createHash } from 'node:crypto';
2
+
3
+ import { config, pgClients, getRedis } from "@opengis/fastify-table/utils.js";
4
+
5
+ const pg = pgClients.client;
6
+ const rclient = getRedis();
7
+
8
+ export default async function getMenu(name, { locale, ttl = 3600, page, limit = 16, sql } = {}) {
9
+ if (!pg?.pk) {
10
+ return { error: 'empty pg', code: 400 };
11
+ }
12
+
13
+ if (!pg?.pk?.['site.menus']) {
14
+ return { error: 'table not found', code: 404 };
15
+ }
16
+
17
+ const crudInc = await rclient.get(`pg:${config.pg?.database}:site.menus:crud`) || 0;
18
+ const cacheKey = createHash('md5').update([config.pg?.database, 'cms:menu', crudInc, name, locale, page, limit].filter(Boolean).join(':')).digest('hex');
19
+
20
+ const cache = ttl === 0 ? null : await rclient.get(cacheKey);
21
+
22
+ // return from cache
23
+ if (cache) {
24
+ return { cache: true, ...JSON.parse(cache) };
25
+ }
26
+
27
+ const offset = page && page > 0 ? (page - 1) * limit : 0;
28
+ const args = name ? [name, locale].filter(Boolean) : [locale].filter(Boolean);
29
+ const where = name ?
30
+ `$1 in (menu_id, name) and ${locale ? `locale=$2` : 'true'}`
31
+ : (locale ? `locale=$1` : 'true');
32
+
33
+ const q = `select menu_id, name, locale, description ${name ? ', items::json, content' : ''}
34
+ from site.menus
35
+ where ${where}
36
+ order by (case when locale='uk' then false else true end)
37
+ limit ${limit}
38
+ offset ${offset}`;
39
+
40
+ if (sql) return q;
41
+
42
+ const rows = pg ? await pg.query(q, args).then(el => el.rows || []) : [];
43
+
44
+ const payload = name ? (rows[0] || { error: 'menu not found', code: 404 }) : { rows };
45
+
46
+ // save to cache, default = 1 hour
47
+ if (ttl) await rclient.set(cacheKey, JSON.stringify(payload), 'EX', ttl);
48
+
49
+ return { cache: false, ...payload };
50
+ }