@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,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
|
+
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import getMenu from './controllers/getMenu.js';
|
|
2
|
-
import addMenu from './controllers/addMenu.js';
|
|
3
|
-
import editMenu from './controllers/editMenu.js';
|
|
4
|
-
import delMenu from './controllers/delMenu.js';
|
|
5
|
-
|
|
6
|
-
const params = { config: { policy: ['public'] } };
|
|
7
|
-
|
|
8
|
-
export default async function route(app) {
|
|
9
|
-
app.post('/cms-menu/:id?', params, addMenu);
|
|
10
|
-
app.put('/cms-menu/:id', params, editMenu);
|
|
11
|
-
app.delete('/cms-menu/:id', params, delMenu);
|
|
12
|
-
app.get('/cms-menu/:id?', params, getMenu);
|
|
13
|
-
}
|
|
1
|
+
import getMenu from './controllers/getMenu.js';
|
|
2
|
+
import addMenu from './controllers/addMenu.js';
|
|
3
|
+
import editMenu from './controllers/editMenu.js';
|
|
4
|
+
import delMenu from './controllers/delMenu.js';
|
|
5
|
+
|
|
6
|
+
const params = { config: { policy: ['public'] } };
|
|
7
|
+
|
|
8
|
+
export default async function route(app) {
|
|
9
|
+
app.post('/cms-menu/:id?', params, addMenu);
|
|
10
|
+
app.put('/cms-menu/:id', params, editMenu);
|
|
11
|
+
app.delete('/cms-menu/:id', params, delMenu);
|
|
12
|
+
app.get('/cms-menu/:id?', params, getMenu);
|
|
13
|
+
}
|