@opengis/cms 0.0.26 → 0.0.28

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 (90) hide show
  1. package/README.md +98 -98
  2. package/dist/index-W-qQIppj-DunG40EG.js +2452 -0
  3. package/dist/index.html +28 -28
  4. package/dist/index.js +12683 -6702
  5. package/dist/index.umd.cjs +87 -41
  6. package/dist/style.css +1 -0
  7. package/package.json +68 -68
  8. package/plugin.js +76 -76
  9. package/server/app.js +35 -35
  10. package/server/config.js +4 -4
  11. package/server/functions/getDraftKey.js +22 -22
  12. package/server/index.js +22 -22
  13. package/server/migrations/fixes.sql +123 -123
  14. package/server/migrations/site.sql +545 -545
  15. package/server/plugins/adminHook.js +78 -78
  16. package/server/plugins/hook.js +59 -59
  17. package/server/plugins/vite.js +84 -84
  18. package/server/routes/category/controllers/cms.category.delete.js +21 -21
  19. package/server/routes/category/controllers/cms.category.get.js +17 -17
  20. package/server/routes/category/controllers/cms.category.list.js +16 -16
  21. package/server/routes/category/controllers/cms.category.post.js +21 -21
  22. package/server/routes/category/controllers/cms.category.put.js +23 -23
  23. package/server/routes/category/index.mjs +22 -22
  24. package/server/routes/cms/controllers/cmsStat.js +55 -55
  25. package/server/routes/cms/controllers/cmsSuggest.js +57 -57
  26. package/server/routes/cms/controllers/deleteContent.js +114 -114
  27. package/server/routes/cms/controllers/deleteMedia.js +75 -75
  28. package/server/routes/cms/controllers/downloadMedia.js +48 -48
  29. package/server/routes/cms/controllers/getContent.js +110 -110
  30. package/server/routes/cms/controllers/getContentBySlug.js +95 -95
  31. package/server/routes/cms/controllers/getPermissions.js +15 -15
  32. package/server/routes/cms/controllers/insertContent.js +218 -218
  33. package/server/routes/cms/controllers/listMedia.js +93 -93
  34. package/server/routes/cms/controllers/metadataMedia.js +38 -38
  35. package/server/routes/cms/controllers/properties.get.js +53 -53
  36. package/server/routes/cms/controllers/properties.post.js +99 -99
  37. package/server/routes/cms/controllers/searchContent.js +205 -205
  38. package/server/routes/cms/controllers/setPermissions.js +49 -49
  39. package/server/routes/cms/controllers/translate.js +89 -89
  40. package/server/routes/cms/controllers/updateContent.js +238 -238
  41. package/server/routes/cms/controllers/uploadMedia.js +78 -78
  42. package/server/routes/cms/index.mjs +114 -114
  43. package/server/routes/cms/utils/additionalData.js +35 -35
  44. package/server/routes/cms/utils/getCollection.js +81 -81
  45. package/server/routes/cms/utils/getSingle.js +187 -187
  46. package/server/routes/cms/utils/insertContentLocalization.js +86 -86
  47. package/server/routes/cms/utils/requestTranslation.js +85 -85
  48. package/server/routes/cms/utils/updateLocalization.js +47 -47
  49. package/server/routes/cmsSpace/controllers/deleteSpace.js +25 -25
  50. package/server/routes/cmsSpace/controllers/getSpaces.js +27 -27
  51. package/server/routes/cmsSpace/controllers/insertSpace.js +21 -21
  52. package/server/routes/cmsSpace/controllers/updateSpace.js +23 -23
  53. package/server/routes/cmsSpace/index.mjs +20 -20
  54. package/server/routes/contentType/controllers/addContentType.js +162 -162
  55. package/server/routes/contentType/controllers/contentTypeList.js +54 -54
  56. package/server/routes/contentType/controllers/delContentType.js +75 -75
  57. package/server/routes/contentType/controllers/editContentType.js +61 -61
  58. package/server/routes/contentType/controllers/getContentType.js +37 -37
  59. package/server/routes/contentType/index.mjs +35 -35
  60. package/server/routes/contentType/utils/updateContents.js +28 -28
  61. package/server/routes/contentType/utils/updateCustomContentTable.js +55 -55
  62. package/server/routes/feedback/controllers/email.list.js +24 -24
  63. package/server/routes/feedback/controllers/feedback.js +48 -48
  64. package/server/routes/feedback/controllers/feedback.list.js +37 -37
  65. package/server/routes/feedback/controllers/news.subscriptions.js +44 -44
  66. package/server/routes/feedback/index.mjs +71 -71
  67. package/server/routes/logs/controllers/export.user.logs.js +77 -77
  68. package/server/routes/logs/controllers/user.logs.js +44 -44
  69. package/server/routes/logs/index.mjs +9 -9
  70. package/server/routes/menu/controllers/addMenu.js +37 -37
  71. package/server/routes/menu/controllers/delMenu.js +31 -31
  72. package/server/routes/menu/controllers/editMenu.js +41 -41
  73. package/server/routes/menu/controllers/getMenu.js +42 -42
  74. package/server/routes/menu/index.mjs +13 -13
  75. package/server/routes/migration/controllers/collectionToCustom.js +137 -137
  76. package/server/routes/migration/index.mjs +8 -8
  77. package/server/routes/root.mjs +8 -8
  78. package/server/routes/tags/controllers/add.tags.js +24 -24
  79. package/server/routes/tags/controllers/del.tags.js +19 -19
  80. package/server/routes/tags/controllers/edit.tags.js +25 -25
  81. package/server/routes/tags/controllers/get.tags.js +15 -15
  82. package/server/routes/tags/index.mjs +14 -14
  83. package/server/templates/cls/cms.category_type.json +9 -9
  84. package/server/templates/cls/cms.content_review_status.json +9 -9
  85. package/server/templates/cls/cms.content_status.json +9 -9
  86. package/server/templates/cls/cms.content_type.json +9 -9
  87. package/server/templates/cls/cms.lang.json +9 -9
  88. package/server/templates/page/login.html +126 -126
  89. package/server/templates/select/core.user_mentioned.sql +1 -1
  90. package/dist/index-W-qQIppj-DRzFSjU1.js +0 -2452
@@ -1,38 +1,38 @@
1
- import { getFilterSQL } from '@opengis/fastify-table/utils.js';
2
-
3
- export default async function feedbackList(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: 'site.feedback'
13
- });
14
-
15
- const { total, filtered } = await pg.one(`select count(*)::int as total, (count(*) filter(where ${filterQuery ? `${filterQuery}` : '1=1'}))::int as filtered from site.feedback`)
16
-
17
- const { rows = [] } = await pg.query(`
18
- select
19
- row_number() over(order by created_at desc) as num,
20
- email,
21
- message_id,
22
- user_name,
23
- message_text,
24
- feedback_type,
25
- phone,
26
- created_at,
27
- linkedin_link,
28
- portfolio_link,
29
- telegram_link
30
- from site.feedback
31
- where created_at is not null ${filterQuery ? `and ${filterQuery}` : ''}
32
- order by created_at desc
33
- limit ${limit} offset ${offset}
34
- `);
35
-
36
- const status = rows?.length ? 200 : 204;
37
- 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 feedbackList(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: 'site.feedback'
13
+ });
14
+
15
+ const { total, filtered } = await pg.one(`select count(*)::int as total, (count(*) filter(where ${filterQuery ? `${filterQuery}` : '1=1'}))::int as filtered from site.feedback`)
16
+
17
+ const { rows = [] } = await pg.query(`
18
+ select
19
+ row_number() over(order by created_at desc) as num,
20
+ email,
21
+ message_id,
22
+ user_name,
23
+ message_text,
24
+ feedback_type,
25
+ phone,
26
+ created_at,
27
+ linkedin_link,
28
+ portfolio_link,
29
+ telegram_link
30
+ from site.feedback
31
+ where created_at is not null ${filterQuery ? `and ${filterQuery}` : ''}
32
+ order by created_at desc
33
+ limit ${limit} offset ${offset}
34
+ `);
35
+
36
+ const status = rows?.length ? 200 : 204;
37
+ return reply.code(status).send({ message: { total, filtered, rows }, status })
38
38
  }
@@ -1,44 +1,44 @@
1
- import { pgClients, config } from '@opengis/fastify-table/utils.js';
2
-
3
- const refererAllow = config?.refererAllow || ['127.0.0.1', 'localhost', 'softpro.ua', 'opengis.info'];
4
-
5
- function checkReferer(headers) {
6
- if (config?.local) return true;
7
- if (!headers?.referer) return false;
8
- return refererAllow.some(allowed => headers.referer.includes(allowed));
9
- }
10
-
11
- export default async function subscribeToNews({
12
- body = {},
13
- pg = pgClients.client,
14
- headers
15
- }, reply) {
16
- reply
17
- .header('Access-Control-Allow-Origin', '*')
18
- .header('Access-Control-Allow-Methods', 'POST, OPTIONS')
19
- .header('Access-Control-Allow-Headers', 'Content-Type');
20
-
21
- if (!checkReferer(headers)) {
22
- return reply.status(403).send('access restricted');
23
- }
24
-
25
- const { email } = body;
26
- if (!email) return reply.status(400).send('email is required');
27
-
28
- const { rows: subscriptions } = await pg.query(`
29
- SELECT subscription_id
30
- FROM site.subscription
31
- WHERE email = $1
32
- LIMIT 1
33
- `, [email]);
34
-
35
- if (subscriptions?.length === 0) {
36
- await pg.query(`
37
- INSERT INTO site.subscription (email)
38
- VALUES ($1)
39
- `, [email]);
40
-
41
- }
42
-
43
- return reply.status(200).send('Успішно');
44
- }
1
+ import { pgClients, config } from '@opengis/fastify-table/utils.js';
2
+
3
+ const refererAllow = config?.refererAllow || ['127.0.0.1', 'localhost', 'softpro.ua', 'opengis.info'];
4
+
5
+ function checkReferer(headers) {
6
+ if (config?.local) return true;
7
+ if (!headers?.referer) return false;
8
+ return refererAllow.some(allowed => headers.referer.includes(allowed));
9
+ }
10
+
11
+ export default async function subscribeToNews({
12
+ body = {},
13
+ pg = pgClients.client,
14
+ headers
15
+ }, reply) {
16
+ reply
17
+ .header('Access-Control-Allow-Origin', '*')
18
+ .header('Access-Control-Allow-Methods', 'POST, OPTIONS')
19
+ .header('Access-Control-Allow-Headers', 'Content-Type');
20
+
21
+ if (!checkReferer(headers)) {
22
+ return reply.status(403).send('access restricted');
23
+ }
24
+
25
+ const { email } = body;
26
+ if (!email) return reply.status(400).send('email is required');
27
+
28
+ const { rows: subscriptions } = await pg.query(`
29
+ SELECT subscription_id
30
+ FROM site.subscription
31
+ WHERE email = $1
32
+ LIMIT 1
33
+ `, [email]);
34
+
35
+ if (subscriptions?.length === 0) {
36
+ await pg.query(`
37
+ INSERT INTO site.subscription (email)
38
+ VALUES ($1)
39
+ `, [email]);
40
+
41
+ }
42
+
43
+ return reply.status(200).send('Успішно');
44
+ }
@@ -1,72 +1,72 @@
1
- import feedback from './controllers/feedback.js';
2
- import newsSubs from './controllers/news.subscriptions.js';
3
- import feedbackList from './controllers/feedback.list.js';
4
- import emailList from './controllers/email.list.js';
5
-
6
- export default async function route(fastify) {
7
- fastify.route({
8
- method: 'POST',
9
- url: '/cms-feedback/:type',
10
- handler: feedback,
11
- config: {
12
- policy: ['public'],
13
- },
14
- });
15
-
16
- fastify.route({
17
- method: 'GET',
18
- url: '/feedback',
19
- handler: feedbackList,
20
- config: {
21
- policy: ['public'],
22
- },
23
- });
24
-
25
- fastify.route({
26
- method: 'GET',
27
- url: '/email-list',
28
- handler: emailList,
29
- config: {
30
- policy: ['public'],
31
- },
32
- });
33
-
34
- fastify.route({
35
- method: 'OPTIONS',
36
- url: '/cms-feedback/:type',
37
- handler: (req, reply) => {
38
- reply
39
- .header('Access-Control-Allow-Origin', '*')
40
- .header('Access-Control-Allow-Methods', 'POST, OPTIONS')
41
- .header('Access-Control-Allow-Headers', 'Content-Type')
42
- .send();
43
- },
44
- config: {
45
- policy: ['public'],
46
- },
47
- });
48
-
49
- fastify.route({
50
- method: 'POST',
51
- url: '/cms-subscribtion',
52
- handler: newsSubs,
53
- config: {
54
- policy: ['public'],
55
- },
56
- });
57
-
58
- fastify.route({
59
- method: 'OPTIONS',
60
- url: '/cms-subscribtion',
61
- handler: (req, reply) => {
62
- reply
63
- .header('Access-Control-Allow-Origin', '*')
64
- .header('Access-Control-Allow-Methods', 'POST, OPTIONS')
65
- .header('Access-Control-Allow-Headers', 'Content-Type')
66
- .send();
67
- },
68
- config: {
69
- policy: ['public'],
70
- },
71
- });
1
+ import feedback from './controllers/feedback.js';
2
+ import newsSubs from './controllers/news.subscriptions.js';
3
+ import feedbackList from './controllers/feedback.list.js';
4
+ import emailList from './controllers/email.list.js';
5
+
6
+ export default async function route(fastify) {
7
+ fastify.route({
8
+ method: 'POST',
9
+ url: '/cms-feedback/:type',
10
+ handler: feedback,
11
+ config: {
12
+ policy: ['public'],
13
+ },
14
+ });
15
+
16
+ fastify.route({
17
+ method: 'GET',
18
+ url: '/feedback',
19
+ handler: feedbackList,
20
+ config: {
21
+ policy: ['public'],
22
+ },
23
+ });
24
+
25
+ fastify.route({
26
+ method: 'GET',
27
+ url: '/email-list',
28
+ handler: emailList,
29
+ config: {
30
+ policy: ['public'],
31
+ },
32
+ });
33
+
34
+ fastify.route({
35
+ method: 'OPTIONS',
36
+ url: '/cms-feedback/:type',
37
+ handler: (req, reply) => {
38
+ reply
39
+ .header('Access-Control-Allow-Origin', '*')
40
+ .header('Access-Control-Allow-Methods', 'POST, OPTIONS')
41
+ .header('Access-Control-Allow-Headers', 'Content-Type')
42
+ .send();
43
+ },
44
+ config: {
45
+ policy: ['public'],
46
+ },
47
+ });
48
+
49
+ fastify.route({
50
+ method: 'POST',
51
+ url: '/cms-subscribtion',
52
+ handler: newsSubs,
53
+ config: {
54
+ policy: ['public'],
55
+ },
56
+ });
57
+
58
+ fastify.route({
59
+ method: 'OPTIONS',
60
+ url: '/cms-subscribtion',
61
+ handler: (req, reply) => {
62
+ reply
63
+ .header('Access-Control-Allow-Origin', '*')
64
+ .header('Access-Control-Allow-Methods', 'POST, OPTIONS')
65
+ .header('Access-Control-Allow-Headers', 'Content-Type')
66
+ .send();
67
+ },
68
+ config: {
69
+ policy: ['public'],
70
+ },
71
+ });
72
72
  }
@@ -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
  }