@opengis/cms 0.0.42 → 0.0.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.
Files changed (95) hide show
  1. package/README.md +98 -98
  2. package/dist/{en-CzEziHMG.js → en-OTy187va.js} +1 -0
  3. package/dist/index.html +29 -29
  4. package/dist/index.js +6266 -15660
  5. package/dist/index.umd.cjs +75 -77
  6. package/dist/{uk-TyVZmyOZ.js → uk-Dy2psXBp.js} +1 -0
  7. package/input-types.json +10 -0
  8. package/module/cms/cls/content.status.json +17 -17
  9. package/module/cms/cls/user_type.json +9 -9
  10. package/module/cms/form/admin.users.form.json +77 -77
  11. package/module/cms/select/cms.page_type.sql +1 -1
  12. package/module/cms/select/news_tag_id.sql +11 -11
  13. package/module/cms/table/admin.users.table.json +53 -53
  14. package/module/cms/table/collection.default.table.json +96 -96
  15. package/module/cms/table/single.default.table.json +116 -114
  16. package/package.json +65 -71
  17. package/plugin.js +43 -76
  18. package/server/app.js +35 -35
  19. package/server/config.js +4 -4
  20. package/server/functions/getDraftKey.js +22 -22
  21. package/server/index.js +22 -22
  22. package/server/migrations/fixes.sql +124 -124
  23. package/server/migrations/site.sql +595 -595
  24. package/server/plugins/adminHook.js +78 -78
  25. package/server/plugins/hook.js +59 -59
  26. package/server/plugins/vite.js +75 -75
  27. package/server/routes/category/controllers/cms.category.delete.js +21 -21
  28. package/server/routes/category/controllers/cms.category.get.js +17 -17
  29. package/server/routes/category/controllers/cms.category.list.js +16 -16
  30. package/server/routes/category/controllers/cms.category.post.js +21 -21
  31. package/server/routes/category/controllers/cms.category.put.js +23 -23
  32. package/server/routes/category/index.mjs +22 -22
  33. package/server/routes/cms/controllers/cmsStat.js +55 -55
  34. package/server/routes/cms/controllers/cmsSuggest.js +57 -57
  35. package/server/routes/cms/controllers/deleteContent.js +113 -113
  36. package/server/routes/cms/controllers/getContent.js +110 -110
  37. package/server/routes/cms/controllers/getContentBySlug.js +93 -95
  38. package/server/routes/cms/controllers/getPermissions.js +15 -15
  39. package/server/routes/cms/controllers/insertContent.js +217 -218
  40. package/server/routes/cms/controllers/properties.get.js +53 -53
  41. package/server/routes/cms/controllers/properties.post.js +99 -99
  42. package/server/routes/cms/controllers/searchContent.js +205 -205
  43. package/server/routes/cms/controllers/setPermissions.js +49 -49
  44. package/server/routes/cms/controllers/translate.js +89 -89
  45. package/server/routes/cms/controllers/updateContent.js +238 -240
  46. package/server/routes/cms/index.mjs +112 -114
  47. package/server/routes/cms/utils/additionalData.js +35 -35
  48. package/server/routes/cms/utils/getCollection.js +82 -82
  49. package/server/routes/cms/utils/getSingle.js +187 -189
  50. package/server/routes/cms/utils/inputTypes.js +6 -0
  51. package/server/routes/cms/utils/insertContentLocalization.js +86 -86
  52. package/server/routes/cms/utils/requestTranslation.js +85 -85
  53. package/server/routes/cms/utils/updateLocalization.js +47 -47
  54. package/server/routes/cmsSpace/controllers/deleteSpace.js +25 -25
  55. package/server/routes/cmsSpace/controllers/getSpaces.js +27 -27
  56. package/server/routes/cmsSpace/controllers/insertSpace.js +21 -21
  57. package/server/routes/cmsSpace/controllers/updateSpace.js +23 -23
  58. package/server/routes/cmsSpace/index.mjs +20 -20
  59. package/server/routes/contentType/controllers/addContentType.js +162 -162
  60. package/server/routes/contentType/controllers/contentTypeList.js +54 -54
  61. package/server/routes/contentType/controllers/delContentType.js +75 -75
  62. package/server/routes/contentType/controllers/editContentType.js +61 -61
  63. package/server/routes/contentType/controllers/getContentType.js +37 -37
  64. package/server/routes/contentType/index.mjs +35 -35
  65. package/server/routes/contentType/utils/updateContents.js +28 -28
  66. package/server/routes/contentType/utils/updateCustomContentTable.js +53 -55
  67. package/server/routes/feedback/controllers/email.list.js +24 -24
  68. package/server/routes/feedback/controllers/feedback.js +48 -48
  69. package/server/routes/feedback/controllers/feedback.list.js +37 -37
  70. package/server/routes/feedback/controllers/news.subscriptions.js +44 -44
  71. package/server/routes/feedback/index.mjs +71 -71
  72. package/server/routes/logs/controllers/export.user.logs.js +77 -77
  73. package/server/routes/logs/controllers/user.logs.js +44 -44
  74. package/server/routes/logs/index.mjs +9 -9
  75. package/server/routes/menu/controllers/addMenu.js +37 -37
  76. package/server/routes/menu/controllers/delMenu.js +31 -31
  77. package/server/routes/menu/controllers/editMenu.js +41 -41
  78. package/server/routes/menu/controllers/getMenu.js +42 -42
  79. package/server/routes/menu/index.mjs +13 -13
  80. package/server/routes/migration/controllers/collectionToCustom.js +137 -137
  81. package/server/routes/migration/index.mjs +8 -8
  82. package/server/routes/root.mjs +8 -8
  83. package/server/routes/tags/controllers/add.tags.js +24 -24
  84. package/server/routes/tags/controllers/del.tags.js +19 -19
  85. package/server/routes/tags/controllers/edit.tags.js +25 -25
  86. package/server/routes/tags/controllers/get.tags.js +15 -15
  87. package/server/routes/tags/index.mjs +14 -14
  88. package/server/templates/cls/cms.category_type.json +9 -9
  89. package/server/templates/cls/cms.content_review_status.json +9 -9
  90. package/server/templates/cls/cms.content_status.json +9 -9
  91. package/server/templates/cls/cms.content_type.json +9 -9
  92. package/server/templates/cls/cms.lang.json +9 -9
  93. package/server/templates/page/login.html +126 -126
  94. package/server/templates/select/core.user_mentioned.sql +1 -1
  95. package/dist/index-W-qQIppj-DRzFSjU1.js +0 -2452
@@ -1,50 +1,50 @@
1
- import { logger, pgClients, dataInsert } from '@opengis/fastify-table/utils.js';
2
-
3
- export default async function setPermissions(req, reply) {
4
- const { pg = pgClients.client, params = {}, user = {}, body = {} } = req;
5
-
6
- if (!user?.uid) {
7
- return reply.status(401).send('unauthorized');
8
- }
9
-
10
- if (!params.id) {
11
- return reply.status(400).send('not enough params: id');
12
- }
13
-
14
- const client = await pg.connect()
15
- const result = {};
16
- try {
17
- await client.query('BEGIN');
18
-
19
- const { rowCount = 0 } = await client.query(
20
- `delete from site.permissions where user_id=$1`,
21
- [params.id].filter(Boolean),
22
- );
23
-
24
- Object.assign(result, { deleted: rowCount });
25
-
26
- if (Array.isArray(body.permissions) && body.permissions?.length) {
27
- body.permissions.forEach((el) => {
28
- Object.assign(el, { user_id: el.user_id || params.id });
29
- });
30
-
31
- await Promise.all(body.permissions.map(async (el) => dataInsert({
32
- pg: client,
33
- table: 'site.permissions',
34
- data: el,
35
- uid: user.uid,
36
- })));
37
-
38
- Object.assign(result, { inserted: body.permissions.length });
39
- }
40
-
41
- await client.query('COMMIT');
42
- return reply.status(200).send(result);
43
- } catch (err) {
44
- await client.query('ROLLBACK');
45
- logger.file('cms/permissions', { error: err.toString(), stack: err.stack });
46
- return reply.status(500).send('set permissions error');
47
- } finally {
48
- client.release();
49
- }
1
+ import { logger, pgClients, dataInsert } from '@opengis/fastify-table/utils.js';
2
+
3
+ export default async function setPermissions(req, reply) {
4
+ const { pg = pgClients.client, params = {}, user = {}, body = {} } = req;
5
+
6
+ if (!user?.uid) {
7
+ return reply.status(401).send('unauthorized');
8
+ }
9
+
10
+ if (!params.id) {
11
+ return reply.status(400).send('not enough params: id');
12
+ }
13
+
14
+ const client = await pg.connect()
15
+ const result = {};
16
+ try {
17
+ await client.query('BEGIN');
18
+
19
+ const { rowCount = 0 } = await client.query(
20
+ `delete from site.permissions where user_id=$1`,
21
+ [params.id].filter(Boolean),
22
+ );
23
+
24
+ Object.assign(result, { deleted: rowCount });
25
+
26
+ if (Array.isArray(body.permissions) && body.permissions?.length) {
27
+ body.permissions.forEach((el) => {
28
+ Object.assign(el, { user_id: el.user_id || params.id });
29
+ });
30
+
31
+ await Promise.all(body.permissions.map(async (el) => dataInsert({
32
+ pg: client,
33
+ table: 'site.permissions',
34
+ data: el,
35
+ uid: user.uid,
36
+ })));
37
+
38
+ Object.assign(result, { inserted: body.permissions.length });
39
+ }
40
+
41
+ await client.query('COMMIT');
42
+ return reply.status(200).send(result);
43
+ } catch (err) {
44
+ await client.query('ROLLBACK');
45
+ logger.file('cms/permissions', { error: err.toString(), stack: err.stack });
46
+ return reply.status(500).send('set permissions error');
47
+ } finally {
48
+ client.release();
49
+ }
50
50
  }
@@ -1,90 +1,90 @@
1
- import { pgClients, eventStream } from "@opengis/fastify-table/utils.js";
2
-
3
- import insertContentLocalization from "../utils/insertContentLocalization.js";
4
-
5
- const getCollectionId = async (id, pg) => pg.query(`select content_type_id as id, table_name as table, columns FROM site.content_types
6
- where $1 in (content_type_id, name)`, [id]).then(el => el.rows?.[0] || {});
7
-
8
- function sequence(arr, data, fn) {
9
- return arr.reduce((promise, id) => promise.then(() => fn({
10
- ...data, id,
11
- })), Promise.resolve());
12
- }
13
-
14
- export async function translateContent({
15
- pg = pgClients.client, query, user,
16
- }, reply) {
17
- if (!query.id) {
18
- return reply.status(400).send({ error: 'not enough query params: id', code: 400 });
19
- }
20
- if (!query.to) {
21
- return reply.status(400).send({ error: 'not enough query params: to', code: 400 });
22
- }
23
-
24
- const { id, collection = 'pages', from = 'uk', to, nocache } = query;
25
- const { id: collectionId, table, columns = [] } = await getCollectionId(collection, pg);
26
-
27
- if (!collectionId) {
28
- return reply.status(404).send({ error: 'collection not found', code: 404 });
29
- }
30
-
31
- const schemaKeys = columns.filter(el => el.name && el.localization).map(el => el.name);
32
-
33
- if (!schemaKeys.length) {
34
- return reply.status(400).send({ error: 'collection does not contain any fields with localization enabled', code: 400 });
35
- }
36
-
37
- const result = await insertContentLocalization({ table, id, from, to, nocache, schemaKeys, user }, pg);
38
-
39
- if (result?.error) {
40
- return reply.status(result.code).send(result);
41
- }
42
-
43
- return result;
44
- }
45
-
46
- export async function translateCollection({
47
- pg = pgClients.client, params, query, user,
48
- }, reply) {
49
- if (!query.to) {
50
- return reply.status(400).send({ error: 'not enough query params: to', code: 400 });
51
- }
52
-
53
- const { id: collectionId, table, columns = [] } = await getCollectionId(params.id, pg);
54
-
55
- if (!collectionId) {
56
- return reply.status(404).send({ error: 'collection not found', code: 404 });
57
- }
58
-
59
- const schemaKeys = columns.filter(el => el.name && el.localization).map(el => el.name);
60
-
61
- if (!schemaKeys.length) {
62
- return reply.status(400).send({ error: 'collection does not contain any fields with localization enabled', code: 400 });
63
- }
64
-
65
- const { from = 'uk', to, nocache, debug } = query;
66
-
67
- const send = eventStream(reply);
68
-
69
- send(`target localization: ${to}`);
70
- send(`skip existing: ${!nocache}`);
71
- send('localization enabled for schema keys: ' + schemaKeys.join(','));
72
-
73
- try {
74
- const ids = !table
75
- ? await pg.query(`select array_agg(content_id) from site.contents where content_type_id=$1`, [collectionId]).then(el => el.rows?.[0]?.array_agg || [])
76
- : await pg.query(`select array_agg(id) from data."${table}"`).then(el => el.rows?.[0]?.array_agg || []);
77
-
78
- const skip = await pg.query('select array_agg(object_id) from site.localization where object_id=any($1::text[]) and split_part(field_key,\':\',2)=$2', [ids, to]).then(el => el.rows?.[0]?.array_agg || []);
79
- const filteredIds = nocache ? ids : ids.filter(id => !skip.includes(id));
80
-
81
- send(`target localization already exists for ${ids.length - filteredIds.length}/${ids.length} rows`);
82
-
83
- await sequence(debug ? filteredIds.slice(0, 1) : filteredIds, { send, pg, from, to, table, nocache: true, schemaKeys, user }, insertContentLocalization);
84
- return send('translation complete', true);
85
- } catch (err) {
86
- return send(err.toString(), true);
87
- }
88
- }
89
-
1
+ import { pgClients, eventStream } from "@opengis/fastify-table/utils.js";
2
+
3
+ import insertContentLocalization from "../utils/insertContentLocalization.js";
4
+
5
+ const getCollectionId = async (id, pg) => pg.query(`select content_type_id as id, table_name as table, columns FROM site.content_types
6
+ where $1 in (content_type_id, name)`, [id]).then(el => el.rows?.[0] || {});
7
+
8
+ function sequence(arr, data, fn) {
9
+ return arr.reduce((promise, id) => promise.then(() => fn({
10
+ ...data, id,
11
+ })), Promise.resolve());
12
+ }
13
+
14
+ export async function translateContent({
15
+ pg = pgClients.client, query, user,
16
+ }, reply) {
17
+ if (!query.id) {
18
+ return reply.status(400).send({ error: 'not enough query params: id', code: 400 });
19
+ }
20
+ if (!query.to) {
21
+ return reply.status(400).send({ error: 'not enough query params: to', code: 400 });
22
+ }
23
+
24
+ const { id, collection = 'pages', from = 'uk', to, nocache } = query;
25
+ const { id: collectionId, table, columns = [] } = await getCollectionId(collection, pg);
26
+
27
+ if (!collectionId) {
28
+ return reply.status(404).send({ error: 'collection not found', code: 404 });
29
+ }
30
+
31
+ const schemaKeys = columns.filter(el => el.name && el.localization).map(el => el.name);
32
+
33
+ if (!schemaKeys.length) {
34
+ return reply.status(400).send({ error: 'collection does not contain any fields with localization enabled', code: 400 });
35
+ }
36
+
37
+ const result = await insertContentLocalization({ table, id, from, to, nocache, schemaKeys, user }, pg);
38
+
39
+ if (result?.error) {
40
+ return reply.status(result.code).send(result);
41
+ }
42
+
43
+ return result;
44
+ }
45
+
46
+ export async function translateCollection({
47
+ pg = pgClients.client, params, query, user,
48
+ }, reply) {
49
+ if (!query.to) {
50
+ return reply.status(400).send({ error: 'not enough query params: to', code: 400 });
51
+ }
52
+
53
+ const { id: collectionId, table, columns = [] } = await getCollectionId(params.id, pg);
54
+
55
+ if (!collectionId) {
56
+ return reply.status(404).send({ error: 'collection not found', code: 404 });
57
+ }
58
+
59
+ const schemaKeys = columns.filter(el => el.name && el.localization).map(el => el.name);
60
+
61
+ if (!schemaKeys.length) {
62
+ return reply.status(400).send({ error: 'collection does not contain any fields with localization enabled', code: 400 });
63
+ }
64
+
65
+ const { from = 'uk', to, nocache, debug } = query;
66
+
67
+ const send = eventStream(reply);
68
+
69
+ send(`target localization: ${to}`);
70
+ send(`skip existing: ${!nocache}`);
71
+ send('localization enabled for schema keys: ' + schemaKeys.join(','));
72
+
73
+ try {
74
+ const ids = !table
75
+ ? await pg.query(`select array_agg(content_id) from site.contents where content_type_id=$1`, [collectionId]).then(el => el.rows?.[0]?.array_agg || [])
76
+ : await pg.query(`select array_agg(id) from data."${table}"`).then(el => el.rows?.[0]?.array_agg || []);
77
+
78
+ const skip = await pg.query('select array_agg(object_id) from site.localization where object_id=any($1::text[]) and split_part(field_key,\':\',2)=$2', [ids, to]).then(el => el.rows?.[0]?.array_agg || []);
79
+ const filteredIds = nocache ? ids : ids.filter(id => !skip.includes(id));
80
+
81
+ send(`target localization already exists for ${ids.length - filteredIds.length}/${ids.length} rows`);
82
+
83
+ await sequence(debug ? filteredIds.slice(0, 1) : filteredIds, { send, pg, from, to, table, nocache: true, schemaKeys, user }, insertContentLocalization);
84
+ return send('translation complete', true);
85
+ } catch (err) {
86
+ return send(err.toString(), true);
87
+ }
88
+ }
89
+
90
90
  export default null;