@opengis/cms 0.0.61 → 0.0.62
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.
- package/README.md +131 -131
- package/dist/{EditCollectionPage-3Q57ptN3.js → EditCollectionPage-C4uNmBJf.js} +1 -1
- package/dist/{contentForm-CLStrfSg.js → contentForm-CcFbUeal.js} +144 -146
- package/dist/index.js +1 -1
- package/dist/{vs-builder-preview-BH4VAM3a.js → vs-builder-preview-DL3RYMp7.js} +11 -12
- package/dist/vs-form-custom-datatable-D880w8gx.js +493 -0
- package/input-types.json +9 -9
- package/locales/en.json +815 -815
- package/locales/uk.json +813 -813
- package/module/cms/cls/content.status.json +17 -17
- package/module/cms/cls/user_type.json +9 -9
- package/module/cms/form/admin.users.form.json +77 -77
- package/module/cms/select/cms.page_type.sql +1 -1
- package/module/cms/select/news_tag_id.sql +11 -11
- package/module/cms/table/admin.users.table.json +53 -53
- package/module/cms/table/collection.default.table.json +96 -96
- package/module/cms/table/single.default.table.json +116 -116
- package/package.json +69 -69
- package/plugin.js +43 -43
- package/server/app.js +35 -35
- package/server/config.js +4 -4
- package/server/functions/getContent.js +45 -45
- package/server/functions/getDraftKey.js +22 -22
- package/server/functions/getSearchData.js +31 -31
- package/server/functions/getTags.js +30 -30
- package/server/functions/getUser.js +27 -27
- package/server/functions/utils/mock.reply.js +55 -55
- package/server/index.js +22 -22
- package/server/migrations/fixes.sql +132 -132
- package/server/migrations/site.sql +596 -596
- package/server/plugins/adminHook.js +78 -78
- package/server/plugins/hook.js +59 -59
- package/server/plugins/vite.js +75 -75
- package/server/routes/category/controllers/cms.category.delete.js +21 -21
- package/server/routes/category/controllers/cms.category.get.js +17 -17
- package/server/routes/category/controllers/cms.category.list.js +16 -16
- package/server/routes/category/controllers/cms.category.post.js +21 -21
- package/server/routes/category/controllers/cms.category.put.js +23 -23
- package/server/routes/category/index.mjs +22 -22
- package/server/routes/cms/controllers/cmsStat.js +55 -55
- package/server/routes/cms/controllers/cmsSuggest.js +57 -57
- package/server/routes/cms/controllers/deleteContent.js +113 -113
- package/server/routes/cms/controllers/deleteMedia.js +76 -76
- package/server/routes/cms/controllers/downloadMedia.js +84 -84
- package/server/routes/cms/controllers/getContent.js +113 -113
- package/server/routes/cms/controllers/getContentBySlug.js +93 -93
- package/server/routes/cms/controllers/insertContent.js +226 -226
- package/server/routes/cms/controllers/listMedia.js +155 -155
- package/server/routes/cms/controllers/metadataMedia.js +39 -39
- package/server/routes/cms/controllers/properties.get.js +18 -18
- package/server/routes/cms/controllers/properties.post.js +99 -99
- package/server/routes/cms/controllers/searchContent.js +214 -214
- package/server/routes/cms/controllers/translate.js +89 -89
- package/server/routes/cms/controllers/updateContent.js +231 -231
- package/server/routes/cms/controllers/uploadMedia.js +79 -79
- package/server/routes/cms/functions/getSettings.js +48 -48
- package/server/routes/cms/index.mjs +112 -112
- package/server/routes/cms/utils/additionalData.js +35 -35
- package/server/routes/cms/utils/getCollection.js +89 -89
- package/server/routes/cms/utils/getSingle.js +188 -188
- package/server/routes/cms/utils/inputTypes.js +5 -5
- package/server/routes/cms/utils/insertContentLocalization.js +104 -104
- package/server/routes/cms/utils/requestTranslation.js +135 -135
- package/server/routes/cms/utils/updateLocalization.js +42 -42
- package/server/routes/cmsSpace/controllers/deleteSpace.js +26 -26
- package/server/routes/cmsSpace/controllers/getSpaces.js +28 -28
- package/server/routes/cmsSpace/controllers/insertSpace.js +22 -22
- package/server/routes/cmsSpace/controllers/updateSpace.js +24 -24
- package/server/routes/cmsSpace/index.mjs +20 -20
- package/server/routes/contentType/controllers/addContentType.js +160 -160
- package/server/routes/contentType/controllers/contentTypeList.js +47 -47
- package/server/routes/contentType/controllers/delContentType.js +75 -75
- package/server/routes/contentType/controllers/editContentType.js +70 -70
- package/server/routes/contentType/controllers/getContentType.js +57 -57
- package/server/routes/contentType/index.mjs +35 -35
- package/server/routes/contentType/utils/updateContents.js +44 -44
- package/server/routes/contentType/utils/updateCustomContentTable.js +53 -53
- package/server/routes/feedback/controllers/email.list.js +24 -24
- package/server/routes/feedback/controllers/feedback.js +48 -48
- package/server/routes/feedback/controllers/feedback.list.js +37 -37
- package/server/routes/feedback/controllers/news.subscriptions.js +44 -44
- package/server/routes/feedback/index.mjs +71 -71
- package/server/routes/logs/controllers/export.user.logs.js +77 -77
- package/server/routes/logs/controllers/user.logs.js +44 -44
- package/server/routes/logs/index.mjs +9 -9
- package/server/routes/menu/controllers/addMenu.js +37 -37
- package/server/routes/menu/controllers/delMenu.js +31 -31
- package/server/routes/menu/controllers/editMenu.js +41 -41
- package/server/routes/menu/controllers/getMenu.js +24 -24
- package/server/routes/menu/functions/getMenu.js +50 -50
- package/server/routes/menu/index.mjs +13 -13
- package/server/routes/migration/controllers/collectionToCustom.js +137 -137
- package/server/routes/migration/index.mjs +8 -8
- package/server/routes/root.mjs +8 -8
- package/server/routes/tags/controllers/add.tags.js +24 -24
- package/server/routes/tags/controllers/del.tags.js +19 -19
- package/server/routes/tags/controllers/edit.tags.js +25 -25
- package/server/routes/tags/controllers/get.tags.js +15 -15
- package/server/routes/tags/index.mjs +14 -14
- package/server/templates/cls/cms.category_type.json +9 -9
- package/server/templates/cls/cms.content_review_status.json +9 -9
- package/server/templates/cls/cms.content_status.json +9 -9
- package/server/templates/cls/cms.content_type.json +9 -9
- package/server/templates/cls/cms.lang.json +9 -9
- package/server/templates/page/login.html +126 -126
- package/utils.d.ts +52 -52
- package/utils.js +8 -8
- package/dist/getField-CpwVE28P.js +0 -179
- package/dist/vs-form-custom-datatable-BDZo48w3.js +0 -317
|
@@ -1,49 +1,49 @@
|
|
|
1
|
-
import { pgClients, dataInsert, 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 feedback({ body = {}, pg = pgClients.client, headers, params }, reply) {
|
|
12
|
-
reply
|
|
13
|
-
.header('Access-Control-Allow-Origin', '*')
|
|
14
|
-
.header('Access-Control-Allow-Methods', 'POST, OPTIONS')
|
|
15
|
-
.header('Access-Control-Allow-Headers', 'Content-Type');
|
|
16
|
-
|
|
17
|
-
if (!checkReferer(headers)) {
|
|
18
|
-
return reply.status(403).send('access restricted');
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
if ((params?.type !== 'vacancy') && (!body?.message_text || !body?.email)) {
|
|
22
|
-
return reply.status(400).send('message_text and email is required');
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
if ((params?.type === 'vacancy') && !body?.user_name) {
|
|
26
|
-
return reply.status(400).send('user_name is required');
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const allowedFields = ['title', 'message_text', 'email', 'phone', 'user_name', 'resume_link', 'linkedin_link', 'portfolio_link', 'telegram_link'];
|
|
30
|
-
const data = Object.fromEntries(
|
|
31
|
-
Object.entries(body).filter(([key]) => allowedFields.includes(key))
|
|
32
|
-
);
|
|
33
|
-
data["feedback_type"] = params?.type;
|
|
34
|
-
|
|
35
|
-
const { rows } = await dataInsert({
|
|
36
|
-
table: 'site.feedback',
|
|
37
|
-
data: {
|
|
38
|
-
...data,
|
|
39
|
-
headers
|
|
40
|
-
},
|
|
41
|
-
pg
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
if (!rows?.length) {
|
|
45
|
-
return reply.status(500).send('insert error');
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
return reply.status(200).send('Звернення додано успішно');
|
|
1
|
+
import { pgClients, dataInsert, 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 feedback({ body = {}, pg = pgClients.client, headers, params }, reply) {
|
|
12
|
+
reply
|
|
13
|
+
.header('Access-Control-Allow-Origin', '*')
|
|
14
|
+
.header('Access-Control-Allow-Methods', 'POST, OPTIONS')
|
|
15
|
+
.header('Access-Control-Allow-Headers', 'Content-Type');
|
|
16
|
+
|
|
17
|
+
if (!checkReferer(headers)) {
|
|
18
|
+
return reply.status(403).send('access restricted');
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if ((params?.type !== 'vacancy') && (!body?.message_text || !body?.email)) {
|
|
22
|
+
return reply.status(400).send('message_text and email is required');
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
if ((params?.type === 'vacancy') && !body?.user_name) {
|
|
26
|
+
return reply.status(400).send('user_name is required');
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const allowedFields = ['title', 'message_text', 'email', 'phone', 'user_name', 'resume_link', 'linkedin_link', 'portfolio_link', 'telegram_link'];
|
|
30
|
+
const data = Object.fromEntries(
|
|
31
|
+
Object.entries(body).filter(([key]) => allowedFields.includes(key))
|
|
32
|
+
);
|
|
33
|
+
data["feedback_type"] = params?.type;
|
|
34
|
+
|
|
35
|
+
const { rows } = await dataInsert({
|
|
36
|
+
table: 'site.feedback',
|
|
37
|
+
data: {
|
|
38
|
+
...data,
|
|
39
|
+
headers
|
|
40
|
+
},
|
|
41
|
+
pg
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
if (!rows?.length) {
|
|
45
|
+
return reply.status(500).send('insert error');
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return reply.status(200).send('Звернення додано успішно');
|
|
49
49
|
}
|
|
@@ -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
|
}
|