@opengis/cms 0.0.3 → 0.0.4

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 (144) hide show
  1. package/dist/cms.js +5900 -0
  2. package/dist/cms.umd.cjs +19 -0
  3. package/package.json +4 -1
  4. package/.gitlab-ci.yml +0 -36
  5. package/config.example +0 -21
  6. package/docs/.vitepress/abbr.mjs +0 -26
  7. package/docs/.vitepress/config.mjs +0 -119
  8. package/docs/.vitepress/navigation.mjs +0 -82
  9. package/docs/.vitepress/theme/Layout.vue +0 -17
  10. package/docs/.vitepress/theme/components/NavigationLinks.vue +0 -102
  11. package/docs/.vitepress/theme/components/Panzoom.vue +0 -169
  12. package/docs/.vitepress/theme/index.mjs +0 -15
  13. package/docs/.vitepress/theme/style.scss +0 -136
  14. package/docs/abbr.json +0 -4
  15. package/docs/api/builder/cms.builder.delete.md +0 -65
  16. package/docs/api/builder/cms.builder.get.md +0 -70
  17. package/docs/api/builder/cms.builder.list.md +0 -98
  18. package/docs/api/builder/cms.builder.post.md +0 -72
  19. package/docs/api/builder/cms.builder.put.md +0 -88
  20. package/docs/api/category/cms.category.delete.md +0 -60
  21. package/docs/api/category/cms.category.get.md +0 -61
  22. package/docs/api/category/cms.category.list.md +0 -77
  23. package/docs/api/category/cms.category.post.md +0 -62
  24. package/docs/api/category/cms.category.put.md +0 -78
  25. package/docs/api/index.md +0 -50
  26. package/docs/api/manager/cms.manager.delete.md +0 -64
  27. package/docs/api/manager/cms.manager.get.md +0 -72
  28. package/docs/api/manager/cms.manager.list.md +0 -96
  29. package/docs/api/manager/cms.manager.post.md +0 -70
  30. package/docs/api/manager/cms.manager.put.md +0 -86
  31. package/docs/api/media/del.md +0 -64
  32. package/docs/api/media/edit.md +0 -92
  33. package/docs/api/media/list.md +0 -70
  34. package/docs/api/media/metadata.md +0 -57
  35. package/docs/api/media/preview.md +0 -33
  36. package/docs/api/media/upload.md +0 -84
  37. package/docs/db/erd.md +0 -173
  38. package/docs/db/index.md +0 -7
  39. package/docs/index.md +0 -39
  40. package/docs/public/logo-dark.svg +0 -24
  41. package/docs/public/logo-light.svg +0 -24
  42. package/docs/public/logo-short.svg +0 -15
  43. package/docs/public/logo.svg +0 -19
  44. package/docs/readme/index.md +0 -6
  45. package/docs/src/vs-button.vue +0 -157
  46. package/docs/vue/basic/button.md +0 -144
  47. package/docs/vue/index.md +0 -9
  48. package/index.html +0 -14
  49. package/server/app.js +0 -25
  50. package/server/config.js +0 -5
  51. package/server/index.js +0 -23
  52. package/server/migrations/media.sql +0 -30
  53. package/server/plugins/hook.js +0 -91
  54. package/server/plugins/vite.js +0 -80
  55. package/server/routes/builder/controllers/cms.builder.delete.js +0 -21
  56. package/server/routes/builder/controllers/cms.builder.get.js +0 -17
  57. package/server/routes/builder/controllers/cms.builder.list.js +0 -16
  58. package/server/routes/builder/controllers/cms.builder.post.js +0 -21
  59. package/server/routes/builder/controllers/cms.builder.put.js +0 -23
  60. package/server/routes/builder/index.mjs +0 -22
  61. package/server/routes/category/controllers/cms.category.delete.js +0 -21
  62. package/server/routes/category/controllers/cms.category.get.js +0 -17
  63. package/server/routes/category/controllers/cms.category.list.js +0 -16
  64. package/server/routes/category/controllers/cms.category.post.js +0 -21
  65. package/server/routes/category/controllers/cms.category.put.js +0 -23
  66. package/server/routes/category/index.mjs +0 -22
  67. package/server/routes/manager/controllers/cms.manager.delete.js +0 -22
  68. package/server/routes/manager/controllers/cms.manager.get.js +0 -21
  69. package/server/routes/manager/controllers/cms.manager.list.js +0 -31
  70. package/server/routes/manager/controllers/cms.manager.post.js +0 -28
  71. package/server/routes/manager/controllers/cms.manager.put.js +0 -23
  72. package/server/routes/manager/index.mjs +0 -22
  73. package/server/routes/media/controllers/delete.js +0 -59
  74. package/server/routes/media/controllers/edit.js +0 -94
  75. package/server/routes/media/controllers/list.js +0 -74
  76. package/server/routes/media/controllers/metadata.js +0 -51
  77. package/server/routes/media/controllers/preview.js +0 -47
  78. package/server/routes/media/controllers/upload.js +0 -79
  79. package/server/routes/media/index.mjs +0 -16
  80. package/server/routes/root.mjs +0 -15
  81. package/server/templates/cls/cms.category_type.json +0 -10
  82. package/server/templates/cls/cms.content_review_status.json +0 -10
  83. package/server/templates/cls/cms.content_status.json +0 -10
  84. package/server/templates/cls/cms.content_type.json +0 -10
  85. package/server/templates/cls/cms.lang.json +0 -10
  86. package/server/templates/page/login.html +0 -59
  87. package/server/templates/select/cms.category_id.sql +0 -1
  88. package/server/templates/select/cms.type_id.sql +0 -1
  89. package/src/App.vue +0 -4
  90. package/src/assets/tailwind/tailwind.js +0 -62
  91. package/src/assets/vue.svg +0 -1
  92. package/src/components/builder/vs-builder-content.vue +0 -163
  93. package/src/components/builder/vs-builder-menu.vue +0 -142
  94. package/src/components/formats/index.js +0 -8
  95. package/src/components/formats/vs-manager-table-date.vue +0 -29
  96. package/src/components/formats/vs-manager-table-switch.vue +0 -16
  97. package/src/components/icons/icon-actions.vue +0 -24
  98. package/src/components/icons/icon-arrow-left.vue +0 -19
  99. package/src/components/icons/icon-check.vue +0 -23
  100. package/src/components/icons/icon-chewron-right.vue +0 -16
  101. package/src/components/icons/icon-close.vue +0 -22
  102. package/src/components/icons/icon-edit.vue +0 -22
  103. package/src/components/icons/icon-folder.vue +0 -18
  104. package/src/components/icons/icon-folder2.vue +0 -17
  105. package/src/components/icons/icon-home.vue +0 -16
  106. package/src/components/icons/icon-image.vue +0 -18
  107. package/src/components/icons/icon-logo.vue +0 -22
  108. package/src/components/icons/icon-media.vue +0 -22
  109. package/src/components/icons/icon-point.vue +0 -11
  110. package/src/components/icons/icon-search.vue +0 -22
  111. package/src/components/icons/icon-table.vue +0 -22
  112. package/src/components/icons/icon-users.vue +0 -18
  113. package/src/components/icons/icon.plus.vue +0 -18
  114. package/src/components/manager/children/vs-manager-collection-content.vue +0 -55
  115. package/src/components/manager/children/vs-manager-collection-item-content.vue +0 -116
  116. package/src/components/manager/children/vs-manager-single-content.vue +0 -112
  117. package/src/components/manager/manager-table/vs-manager-colection-table-add.vue +0 -84
  118. package/src/components/manager/manager-table/vs-manager-collection-table.vue +0 -59
  119. package/src/components/manager/vs-manager-menu.vue +0 -73
  120. package/src/components/media/Breadcrumb.vue +0 -73
  121. package/src/components/shared-components/vs-not-data.vue +0 -213
  122. package/src/components/vs-main-menu.vue +0 -53
  123. package/src/helpers/debounce.js +0 -10
  124. package/src/helpers/translite.js +0 -19
  125. package/src/main.js +0 -30
  126. package/src/misc/import-file.js +0 -32
  127. package/src/pages/vs-builder.vue +0 -22
  128. package/src/pages/vs-layout.vue +0 -17
  129. package/src/pages/vs-manager.vue +0 -30
  130. package/src/pages/vs-media.vue +0 -398
  131. package/src/router/router.js +0 -9
  132. package/src/router/routes.config.js +0 -40
  133. package/src/style.css +0 -0
  134. package/src/templates/form-columns.js +0 -70
  135. package/src/templates/form-template.js +0 -22
  136. package/test/config.js +0 -17
  137. package/test/files/eye.svg +0 -4
  138. package/test/helper.js +0 -30
  139. package/test/routes/builder.test.js +0 -99
  140. package/test/routes/category.test.js +0 -97
  141. package/test/routes/manager.test.js +0 -103
  142. package/test/routes/media.test.js +0 -252
  143. package/vite.config.js +0 -37
  144. /package/{public → dist}/vite.svg +0 -0
@@ -1,23 +0,0 @@
1
- import { dataUpdate, getMeta } from '@opengis/fastify-table/utils.js';
2
-
3
- export default async function builderPut(req) {
4
- const { user = {}, body = {}, params = {} } = req;
5
- if (!params.id) {
6
- return { message: 'id is required', status: 400 };
7
- }
8
- const { pk } = await getMeta({ table: 'site.content_types' });
9
-
10
- if (!pk) {
11
- return { message: 'table not found', status: 404 };
12
- }
13
-
14
- const resData = await dataUpdate({
15
- table: 'site.content_types',
16
- data: body,
17
- id: params.id,
18
- });
19
- // console.log(resData)
20
- const res = resData;
21
-
22
- return { id: res.content_type_id, rows: [res] };
23
- }
@@ -1,22 +0,0 @@
1
- import cmsBuilderGet from './controllers/cms.builder.get.js';
2
- import cmsBuilderList from './controllers/cms.builder.list.js';
3
- import cmsBuilderPut from './controllers/cms.builder.put.js';
4
- import cmsBuilderPost from './controllers/cms.builder.post.js';
5
- import cmsBuilderDelete from './controllers/cms.builder.delete.js';
6
-
7
- export default async function route(app) {
8
- // builder add
9
- app.post('/cms-builder', { config: { policy: ['site'] }}, cmsBuilderPost);
10
-
11
- // builder edit
12
- app.put('/cms-builder/:id', { config: { policy: ['site'] }}, cmsBuilderPut);
13
-
14
- // builder list
15
- app.get('/cms-builder', { config: { policy: ['site'] }}, cmsBuilderList);
16
-
17
- // builder get
18
- app.get('/cms-builder/:id', { config: { policy: ['site'] }}, cmsBuilderGet);
19
-
20
- // builder delete
21
- app.delete('/cms-builder/:id', { config: { policy: ['site'] }}, cmsBuilderDelete);
22
- }
@@ -1,21 +0,0 @@
1
- import { dataDelete, getMeta } from '@opengis/fastify-table/utils.js';
2
-
3
- export default async function categoryDelete({ user = {}, params = {} }) {
4
-
5
- if (!params.id) {
6
- return { message: 'id is required', status: 400 };
7
- }
8
- const { pk } = await getMeta({ table: 'site.categories' });
9
-
10
- if (!pk) {
11
- return { message: 'table not found', status: 404 };
12
- }
13
-
14
- const res = await dataDelete({
15
- table: 'site.categories',
16
- id: params.id,
17
- uid: user?.uid
18
- });
19
-
20
- return { id: res.category_id, rows: [res] };
21
- }
@@ -1,17 +0,0 @@
1
- import { pgClients, getMeta, getTemplate } from '@opengis/fastify-table/utils.js';
2
-
3
- export default async function categoryGet({ pg = pgClients.client, params = {} }) {
4
-
5
- const { pk } = await getMeta({ table: 'site.categories' });
6
-
7
- if (!pk) {
8
- return { message: 'table not found', status: 404 };
9
- }
10
-
11
- const { rows, rowCount: total } = await pg.query(
12
- `select a.category_id as id, a.* FROM site.categories a
13
- where a.category_id=$1`,
14
- [params.id]
15
- );
16
- return { message: { total, rows }, status: 200 };
17
- }
@@ -1,16 +0,0 @@
1
- import { pgClients, getTemplate, getMeta } from '@opengis/fastify-table/utils.js';
2
-
3
- export default async function categoryList({ pg = pgClients.client, query = {} }) {
4
-
5
- const { pk } = await getMeta({ table: 'site.categories' });
6
-
7
- if (!pk) {
8
- return { message: 'table not found', status: 404 };
9
- }
10
- const sql = `select a.category_id as id, a.* FROM site.categories a
11
- where ${query.category_id ? 'category_id=$1' : '1=1'}`
12
-
13
- const { rows, rowCount: total } = await pg.query(sql, [query.category_id].filter((el) => el));
14
-
15
- return { message: { total, rows }, status: 200 };
16
- }
@@ -1,21 +0,0 @@
1
- import { dataInsert, getMeta } from "@opengis/fastify-table/utils.js";
2
-
3
- export default async function categoryPost(req) {
4
- const { user = {}, body = {} } = req;
5
-
6
- const { pk } = await getMeta({ table: "site.categories" });
7
-
8
- if (!pk) {
9
- return { message: "table not found", status: 404 };
10
- }
11
-
12
- const resData = await dataInsert({
13
- table: "site.categories",
14
- data: body,
15
- uid: user?.uid,
16
- });
17
- // console.log(resData);
18
- const res = resData?.rows[0];
19
-
20
- return { id: res.category_id, rows: [res] };
21
- }
@@ -1,23 +0,0 @@
1
- import { dataUpdate, getMeta } from '@opengis/fastify-table/utils.js';
2
-
3
- export default async function categoryPut({ body = {}, params = {} }) {
4
-
5
- if (!params.id) {
6
- return { message: 'id is required', status: 400 };
7
- }
8
- const { pk } = await getMeta({ table: 'site.categories' });
9
-
10
- if (!pk) {
11
- return { message: 'table not found', status: 404 };
12
- }
13
-
14
- const resData = await dataUpdate({
15
- table: 'site.categories',
16
- data: body,
17
- id: params.id,
18
- });
19
- // console.log(resData)
20
- const res = resData;
21
-
22
- return { id: res.category_id, rows: [res] };
23
- }
@@ -1,22 +0,0 @@
1
- import cmsCategoryGet from './controllers/cms.category.get.js';
2
- import cmsCategoryList from './controllers/cms.category.list.js';
3
- import cmsCategoryPut from './controllers/cms.category.put.js';
4
- import cmsCategoryPost from './controllers/cms.category.post.js';
5
- import cmsCategoryDelete from './controllers/cms.category.delete.js'
6
-
7
- export default async function route(app) {
8
- // category add
9
- app.post('/cms-category', {}, cmsCategoryPost);
10
-
11
- // category edit
12
- app.put('/cms-category/:id', {}, cmsCategoryPut);
13
-
14
- // category list
15
- app.get('/cms-category', { config: { policy: ['site'] }}, cmsCategoryList);
16
-
17
- // category get
18
- app.get('/cms-category/:id', {}, cmsCategoryGet);
19
-
20
- // category delete
21
- app.delete('/cms-category/:id', { config: { policy: ['site'] }}, cmsCategoryDelete);
22
- }
@@ -1,22 +0,0 @@
1
- import { dataDelete, getMeta } from '@opengis/fastify-table/utils.js';
2
-
3
- export default async function managerDelete({ user = {}, params = {} }) {
4
-
5
- if (!params.id) {
6
- return { message: 'id is required', status: 400 };
7
- }
8
- const { pk } = await getMeta({ table: 'site.contents' });
9
-
10
- if (!pk) {
11
- return { message: 'table not found', status: 404 };
12
- }
13
-
14
- const res = await dataDelete({
15
- table: 'site.contents',
16
- id: params.id,
17
- uid: user?.uid
18
- });
19
-
20
-
21
- return { id: res.content_id, rows: [res] };
22
- }
@@ -1,21 +0,0 @@
1
- import { pgClients, getMeta } from '@opengis/fastify-table/utils.js';
2
-
3
- export default async function managerGet({ pg = pgClients.client, params = {} }) {
4
-
5
- if (!params.template && params.id) return { message: 'bad request', status: 400 }
6
-
7
- const { pk } = await getMeta({ table: 'site.contents' });
8
-
9
- if (!pk) {
10
- return { message: 'table not found', status: 404 };
11
- }
12
-
13
- const { rows, rowCount: total } = await pg.query(
14
- `select a.content_id as id, a.* FROM site.contents a
15
- where template=$1 and content_id=$2`, [params.template, params.id]
16
- );
17
-
18
- const { rows: type } = await pg.query(`select name, template, description, type from site.content_types where template=$1`, [params.template])
19
-
20
- return { message: { total, rows, type: type[0] }, status: 200 };
21
- }
@@ -1,31 +0,0 @@
1
- import { pgClients, getMeta } from '@opengis/fastify-table/utils.js';
2
-
3
- const types = {
4
- enabled: 'Switcher'
5
- };
6
-
7
- export default async function builderList({ pg = pgClients.client, params = {} }) {
8
- if (!params.template) {
9
- return { message: 'not enougn params: template', status: 400 }
10
- }
11
-
12
- if (!pg.pk?.['site.contents']) {
13
- return { message: 'table not found', status: 404 };
14
- }
15
-
16
- const { columns = [] } = await getMeta({ table: 'site.contents' });
17
-
18
- const { rows, rowCount: total } = await pg.query(
19
- `select a.content_id as id, a.* FROM site.contents a
20
- where template=$1`, [params.template]
21
- );
22
-
23
- const { rows: type } = await pg.query(`select name, template, description, type, columns from site.content_types where template=$1`, [params.template])
24
-
25
- const columns1 = (type[0]?.columns || []).concat(
26
- columns
27
- .filter(el => !['cdate', 'editor_date', 'uid', 'editor_date'].includes(el.name))
28
- .map(({ title, name }) => ({ title, name, type: types[name] || 'Text' }))
29
- );
30
- return { message: { total, rows, type: type[0], columns: columns1 }, status: 200 };
31
- }
@@ -1,28 +0,0 @@
1
- import { dataInsert, getMeta } from "@opengis/fastify-table/utils.js";
2
-
3
- export default async function builderPost(req) {
4
- const { user = {}, params= {}, body = {} } = req;
5
-
6
- if (!params.template) return { message: 'bad request', status: 400 }
7
-
8
- const { pk } = await getMeta({ table: "site.contents" });
9
-
10
- if (!pk) {
11
- return { message: "table not found", status: 404 };
12
- }
13
-
14
- const bodyModified = Object.assign(body, {
15
- template: params.template
16
- });
17
-
18
-
19
- const resData = await dataInsert({
20
- table: "site.contents",
21
- data: bodyModified,
22
- uid: user?.uid,
23
- });
24
- // console.log(resData);
25
- const res = resData?.rows[0];
26
-
27
- return { id: res.content_id, rows: [res] };
28
- }
@@ -1,23 +0,0 @@
1
- import { dataUpdate, getMeta } from '@opengis/fastify-table/utils.js';
2
-
3
- export default async function managerPut({ body = {}, params = {} }) {
4
-
5
- if (!params.id) {
6
- return { message: 'id is required', status: 400 };
7
- }
8
- const { pk } = await getMeta({ table: 'site.contents' });
9
-
10
- if (!pk) {
11
- return { message: 'table not found', status: 404 };
12
- }
13
-
14
- const resData = await dataUpdate({
15
- table: 'site.contents',
16
- data: body,
17
- id: params.id,
18
- });
19
- // console.log(resData)
20
- const res = resData;
21
-
22
- return { id: res.content_id, rows: [res] };
23
- }
@@ -1,22 +0,0 @@
1
- import cmsManagerGet from './controllers/cms.manager.get.js';
2
- import cmsManagerList from './controllers/cms.manager.list.js';
3
- import cmsManagerPut from './controllers/cms.manager.put.js';
4
- import cmsManagerPost from './controllers/cms.manager.post.js';
5
- import cmsManagerDelete from './controllers/cms.manager.delete.js';
6
-
7
- export default async function route(app) {
8
- // manager add
9
- app.post('/cms-manager/:template', { config: { policy: ['site'] }}, cmsManagerPost);
10
-
11
- // manager edit
12
- app.put('/cms-manager/:id', { config: { policy: ['site'] }}, cmsManagerPut);
13
-
14
- // manager list
15
- app.get('/cms-manager/:template', { config: { policy: ['site'] }}, cmsManagerList);
16
-
17
- // manager get
18
- app.get('/cms-manager/:template/:id', { config: { policy: ['site'] }}, cmsManagerGet);
19
-
20
- // manager delete
21
- app.delete('/cms-manager/:id', { config: { policy: ['site'] }}, cmsManagerDelete);
22
- }
@@ -1,59 +0,0 @@
1
- import path from 'node:path';
2
- import { existsSync } from 'node:fs';
3
- import { rm } from 'node:fs/promises';
4
-
5
- import { config, getToken, dataDelete, getFolder, pgClients } from "@opengis/fastify-table/utils.js";
6
-
7
- const rootDir = getFolder(config, 'local');
8
-
9
- export default async function deleteMedia({
10
- pg = pgClients.client, params = {}, user = {},
11
- }, reply) {
12
-
13
- if (!params?.token) {
14
- return reply.status(400).send('not enough params: token');
15
- }
16
-
17
- const tokenData = await getToken({
18
- uid: user?.uid || 0,
19
- token: params.token,
20
- json: 1,
21
- });
22
-
23
- const { dir, name, relpath, id } = pg.pk?.['crm.media'] && tokenData?.type !== 'dir'
24
- ? await pg.query(`select media_id as id, uploaded_name as name, file_path as "relpath" from crm.media where $1 in (media_id, file_path)`, [tokenData?.id || tokenData?.relpath || params.token])
25
- .then(el => el.rows?.[0] || {})
26
- : tokenData;
27
-
28
- if (!dir && !(id && relpath)) {
29
- return reply.status(403).send('access restricted: root dir');
30
- }
31
-
32
- // delete file
33
- if (id && relpath) {
34
- const res = await dataDelete({
35
- id,
36
- table: 'crm.media',
37
- uid: user?.uid || 0,
38
- });
39
- const filepath = path.join(rootDir, relpath);
40
-
41
- if (existsSync(filepath)) {
42
- await rm(filepath, { recursive: true });
43
- }
44
-
45
- return {
46
- id: tokenData?.id || id,
47
- name: res?.uploaded_name,
48
- size: res?.size,
49
- extension: res?.ext,
50
- caption: res?.caption,
51
- altname: res?.altname,
52
- };
53
- }
54
-
55
- // delete directory
56
- const dirpath = path.join(rootDir, relpath);
57
- await rm(dirpath, { recursive: true });
58
- return reply.status(200).send({ name: path.basename(relpath) });
59
- }
@@ -1,94 +0,0 @@
1
- import path from 'node:path';
2
- import { rename, readdir } from 'node:fs/promises';
3
- import { existsSync } from 'node:fs';
4
-
5
- import { config, getToken, getFolder, dataUpdate, pgClients } from "@opengis/fastify-table/utils.js";
6
-
7
- const rootDir = getFolder(config, 'local');
8
-
9
- export default async function editMedia({
10
- pg = pgClients.client, params = {}, user = {}, body = {},
11
- }, reply) {
12
-
13
- const tokenData = await getToken({
14
- uid: user?.uid || 0,
15
- token: params.token,
16
- json: 1,
17
- });
18
-
19
- const objdata = pg.pk?.['crm.media'] && !tokenData
20
- ? await pg.query(`select media_id as id, uploaded_name as name, file_path as "relpath" from crm.media where media_id=$1`, [params.token]).then(el => el.rows?.[0] || {})
21
- : tokenData;
22
-
23
- const { id, name } = objdata;
24
- const relpath = (objdata?.relpath || tokenData?.relpath)?.replace(/\\/g, '/');
25
-
26
- if ((tokenData?.type === 'file' && !id) || !relpath) {
27
- return reply.status(400).send('invalid params: token');
28
- }
29
-
30
- const data = {};
31
- const oldfilepath = path.join(rootDir, relpath);
32
-
33
- if (tokenData?.type === 'dir' && !body?.name) {
34
- return reply.status(400).send('not enough body params: name');
35
- }
36
-
37
- if (body?.name) {
38
- const newfilepath = path.join(rootDir, path.dirname(relpath), body.name);
39
-
40
- if (!existsSync(oldfilepath)) {
41
- return reply.status(404).send('file / directory not found');
42
- }
43
-
44
- if (existsSync(newfilepath)) {
45
- return reply.status(400).send('file / directory with such name already exists');
46
- }
47
-
48
- // sync file path in db data
49
- const arr = tokenData?.type === 'dir' ? await readdir(oldfilepath, { withFileTypes: true }) : [];
50
-
51
- await rename(oldfilepath, newfilepath);
52
-
53
- if (tokenData?.type === 'dir') {
54
- const relpaths = arr.filter(el => el.isFile()).map(el => path.join(tokenData.relpath, el.name).replace(/\\/g, '/'));
55
- const { rows = [] } = pg.pk?.['crm.media'] ? await pg.query(`select media_id as id, file_path as relpath from crm.media where file_path=any($1::text[])`, [relpaths]) : {};
56
- await Promise.all(rows.map(async (el) => dataUpdate({
57
- id: el.id,
58
- table: 'crm.media',
59
- data: {
60
- file_path: el.relpath.replace(relpath.replace(/\\/g, '/'), path.join(path.dirname(relpath), body.name).replace(/\\/g, '/'))
61
- },
62
- uid: user?.uid || 0,
63
- })));
64
- return reply.status(200).send({
65
- name: body.name,
66
- relpath: path.join(path.dirname(relpath), body.name).replace(/\\/g, '/'),
67
- });
68
- }
69
- Object.assign(data, {
70
- uploaded_name: body.name,
71
- file_path: path.join(path.dirname(relpath), body.name).replace(/\\/g, '/'),
72
- });
73
- }
74
-
75
- if (body?.caption) Object.assign(data, { caption: body.caption });
76
- if (body?.altname) Object.assign(data, { altname: body.altname });
77
-
78
- const res = await dataUpdate({
79
- id,
80
- table: 'crm.media',
81
- data,
82
- uid: user?.uid || 0,
83
- });
84
-
85
- return {
86
- id: tokenData?.id || id,
87
- name: res?.uploaded_name,
88
- relpath: res?.file_path,
89
- size: res?.size,
90
- extension: res?.ext,
91
- caption: res?.caption,
92
- altname: res?.altname,
93
- };
94
- }
@@ -1,74 +0,0 @@
1
- import path from 'node:path';
2
- import { existsSync, mkdirSync } from 'node:fs';
3
- import { readdir, stat } from 'node:fs/promises';
4
-
5
- import { config, getFolder, pgClients, setToken } from '@opengis/fastify-table/utils.js';
6
-
7
- const rootDir = getFolder(config, 'local');
8
- mkdirSync(path.join(rootDir, 'media'), { recursive: true });
9
-
10
- export default async function listMedia(req, reply) {
11
- const { pg = pgClients.client, query = {}, user = {} } = req;
12
- const { dir } = query;
13
- const dirpath = path.join(rootDir, 'media', dir || '');
14
-
15
- if (dir && (typeof dir !== 'string' || dir.includes('..'))) {
16
- return reply.status(403).send('invalid params: dir');
17
- }
18
-
19
- if (!existsSync(dirpath)) {
20
- return { data: [], dir };
21
- }
22
-
23
- const token = setToken({
24
- ids: [JSON.stringify({ dir, name: dir, relpath: path.join('/media', dir || '').replace(/\\/g, '/') })],
25
- uid: user?.uid || 0,
26
- array: 1,
27
- })?.[0];
28
-
29
- const isDirectory = (await stat(dirpath)).isDirectory();
30
-
31
- const items = isDirectory ? await readdir(dirpath) : [];
32
-
33
- const relpaths = items.map(el => path.join('/media', dir || '', el).replace(/\\/g, '/'));
34
- const { rows = [] } = await pg.query(`select media_id as id, uploaded_name as name, file_path as relpath from crm.media where file_path = any($1::text[])`, [relpaths]);
35
- const ids = rows.reduce((acc, curr) => Object.assign(acc, { [curr.relpath]: curr.id }), {});
36
-
37
- const data = await Promise.all(items.map(async (item) => {
38
- const itempath = path.join(dirpath, item);
39
- const extension = path.extname(item) === '' ? null : path.extname(item).split('.').pop();
40
- const { ctime, mtime, size } = await stat(itempath);
41
- const type = (await stat(itempath)).isDirectory() ? 'dir' : 'file';
42
- const childList = type === 'dir' ? await readdir(itempath) : [];
43
- const count = type === 'dir' ? childList.length : undefined;
44
- return {
45
- id: ids[path.join('/media', dir || '', item).replace(/\\/g, '/')],
46
- name: item,
47
- type,
48
- count,
49
- size,
50
- extension,
51
- token: setToken({
52
- ids: [JSON.stringify({
53
- id: ids[path.join('/media', dir || '', item).replace(/\\/g, '/')],
54
- dir,
55
- relpath: path.join('/media', dir || '', item).replace(/\\/g, '/'),
56
- name: item,
57
- type,
58
- })],
59
- uid: user?.uid || 0,
60
- array: 1,
61
- })[0],
62
- ctime,
63
- mtime,
64
- };
65
- }));
66
-
67
- const result = { dir, token, data };
68
-
69
- if (config.debug) {
70
- Object.assign(result, { rootDir });
71
- }
72
-
73
- return result;
74
- }
@@ -1,51 +0,0 @@
1
- import path from 'node:path';
2
- import { stat } from 'node:fs/promises';
3
- import { existsSync } from 'node:fs';
4
-
5
- import { config, getToken, getFolder, pgClients } from "@opengis/fastify-table/utils.js";
6
-
7
- const rootDir = getFolder(config, 'local');
8
-
9
- export default async function metadataMedia({
10
- pg = pgClients.client, params = {}, user = {},
11
- }, reply) {
12
- if (!params.token) {
13
- return reply.status(400).send('not enough params: token');
14
- }
15
-
16
- const tokenData = await getToken({
17
- uid: user?.uid || 0,
18
- token: params.token,
19
- json: 1,
20
- });
21
-
22
- const { relpath, caption, altname, id } = !tokenData && pg.pk?.['crm.media']
23
- ? await pg.query(`select media_id as id, file_path as "relpath", caption from crm.media where media_id=$1`, [params.token]).then(el => el.rows?.[0] || {})
24
- : {};
25
-
26
- if ((!tokenData?.name || tokenData?.type !== 'file') && !relpath) {
27
- return reply.status(400).send('invalid params: token');
28
- }
29
-
30
- const filepath = tokenData?.name
31
- ? path.join(rootDir, 'media', tokenData.dir || '', tokenData.name)
32
- : path.join(rootDir, relpath);
33
-
34
- if (!existsSync(filepath)) {
35
- return reply.status(404).send('file not found');
36
- }
37
-
38
- const stats = await stat(filepath);
39
- const { ctime, mtime, size } = stats;
40
-
41
- return reply.status(200).send({
42
- id: tokenData?.id || id,
43
- name: path.basename(filepath),
44
- size,
45
- extension: path.extname(filepath)?.split?.('.')?.pop?.(),
46
- ctime, // creation timestamp
47
- mtime, // last modification timestamp
48
- caption,
49
- altname,
50
- });
51
- }
@@ -1,47 +0,0 @@
1
- import path from 'node:path';
2
- import { existsSync } from 'node:fs';
3
- import { readFile } from 'node:fs/promises';
4
-
5
- import { config, getToken, getFolder } from "@opengis/fastify-table/utils.js";
6
- import { getMimeType } from '@opengis/fastify-file/utils.js';
7
-
8
- const rootDir = getFolder(config, 'local');
9
-
10
- export default async function deleteMedia({
11
- params = {}, query = {}, user = {},
12
- }, reply) {
13
-
14
- if (!params?.token) {
15
- return reply.status(400).send('not enough params: token');
16
- }
17
-
18
- const tokenData = await getToken({
19
- uid: user?.uid || 0,
20
- token: params.token,
21
- json: 1,
22
- });
23
-
24
- const { relpath } = tokenData || {};
25
-
26
- if (!relpath) {
27
- return reply.status(403).send('invalid token');
28
- }
29
-
30
- const filepath = path.join(rootDir, relpath);
31
-
32
- if (!existsSync(filepath)) {
33
- return reply.status(404).send('file not found');
34
- }
35
-
36
- const buffer = await readFile(filepath, { buffer: true });
37
-
38
- if (query?.download) {
39
- const headers = {
40
- 'Content-Type': getMimeType(filepath),
41
- 'Content-Disposition': `attachment; filename=${path.basename(filepath)}`
42
- };
43
- return reply.headers(headers).send(buffer);
44
- }
45
-
46
- return reply.headers({ 'Content-Type': getMimeType(filepath) }).send(buffer);
47
- }