cyberia 3.2.9 → 3.2.12
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/.github/workflows/engine-cyberia.cd.yml +6 -0
- package/.github/workflows/npmpkg.ci.yml +1 -0
- package/.github/workflows/pwa-microservices-template-test.ci.yml +1 -1
- package/.github/workflows/release.cd.yml +1 -0
- package/.vscode/extensions.json +9 -9
- package/.vscode/settings.json +20 -4
- package/CHANGELOG.md +213 -1
- package/CLI-HELP.md +92 -23
- package/README.md +190 -348
- package/bin/build.js +24 -8
- package/bin/build.template.js +187 -0
- package/bin/cyberia.js +229 -52
- package/bin/deploy.js +12 -2
- package/bin/index.js +229 -52
- package/bump.config.js +26 -0
- package/conf.js +130 -24
- package/deployment.yaml +4 -2
- package/hardhat/package-lock.json +113 -144
- package/hardhat/package.json +4 -3
- package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +1 -1
- package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +1 -1
- package/manifests/deployment/dd-cyberia-development/deployment.yaml +4 -2
- package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
- package/manifests/deployment/dd-test-development/deployment.yaml +4 -2
- package/manifests/kind-config-dev.yaml +8 -0
- package/manifests/lxd/lxd-admin-profile.yaml +12 -3
- package/manifests/mongodb/pv-pvc.yaml +44 -8
- package/manifests/mongodb/statefulset.yaml +55 -68
- package/manifests/mongodb-4.4/headless-service.yaml +10 -0
- package/manifests/mongodb-4.4/kustomization.yaml +3 -1
- package/manifests/mongodb-4.4/mongodb-nodeport.yaml +17 -0
- package/manifests/mongodb-4.4/pv-pvc.yaml +10 -14
- package/manifests/mongodb-4.4/statefulset.yaml +79 -0
- package/manifests/mongodb-4.4/storage-class.yaml +9 -0
- package/manifests/valkey/statefulset.yaml +1 -1
- package/manifests/valkey/valkey-nodeport.yaml +17 -0
- package/package.json +27 -15
- package/scripts/ipxe-setup.sh +52 -49
- package/scripts/k3s-node-setup.sh +81 -46
- package/scripts/lxd-vm-setup.sh +193 -8
- package/scripts/maas-nat-firewalld.sh +145 -0
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +38 -33
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +16 -16
- package/src/api/core/core.router.js +19 -14
- package/src/api/core/core.service.js +5 -5
- package/src/api/crypto/crypto.router.js +18 -12
- package/src/api/crypto/crypto.service.js +3 -3
- package/src/api/cyberia-action/cyberia-action.model.js +1 -1
- package/src/api/cyberia-action/cyberia-action.router.js +22 -18
- package/src/api/cyberia-action/cyberia-action.service.js +5 -5
- package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +74 -0
- package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +99 -0
- package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +98 -0
- package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +152 -0
- package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +25 -20
- package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +6 -6
- package/src/api/cyberia-entity/cyberia-entity.router.js +22 -18
- package/src/api/cyberia-entity/cyberia-entity.service.js +5 -5
- package/src/api/cyberia-instance/cyberia-fallback-world.js +79 -4
- package/src/api/cyberia-instance/cyberia-instance.router.js +57 -52
- package/src/api/cyberia-instance/cyberia-instance.service.js +10 -10
- package/src/api/cyberia-instance/cyberia-world-generator.js +3 -3
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +14 -48
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +22 -18
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +5 -5
- package/src/api/cyberia-map/cyberia-map.router.js +35 -30
- package/src/api/cyberia-map/cyberia-map.service.js +7 -7
- package/src/api/cyberia-quest/cyberia-quest.model.js +1 -1
- package/src/api/cyberia-quest/cyberia-quest.router.js +22 -18
- package/src/api/cyberia-quest/cyberia-quest.service.js +5 -5
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +22 -18
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +5 -5
- package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +451 -0
- package/src/api/default/default.router.js +22 -18
- package/src/api/default/default.service.js +5 -5
- package/src/api/document/document.router.js +28 -23
- package/src/api/document/document.service.js +100 -23
- package/src/api/file/file.router.js +19 -13
- package/src/api/file/file.service.js +9 -7
- package/src/api/instance/instance.router.js +29 -24
- package/src/api/instance/instance.service.js +6 -6
- package/src/api/ipfs/ipfs.router.js +21 -16
- package/src/api/ipfs/ipfs.service.js +8 -8
- package/src/api/object-layer/object-layer.router.js +512 -507
- package/src/api/object-layer/object-layer.service.js +17 -14
- package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +22 -18
- package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +5 -5
- package/src/api/test/test.router.js +17 -12
- package/src/api/types.js +24 -0
- package/src/api/user/guest.service.js +5 -4
- package/src/api/user/user.router.js +297 -288
- package/src/api/user/user.service.js +100 -35
- package/src/cli/baremetal.js +132 -101
- package/src/cli/cluster.js +700 -232
- package/src/cli/db.js +59 -60
- package/src/cli/deploy.js +216 -137
- package/src/cli/fs.js +13 -3
- package/src/cli/index.js +80 -15
- package/src/cli/ipfs.js +4 -6
- package/src/cli/kubectl.js +4 -1
- package/src/cli/lxd.js +1099 -223
- package/src/cli/monitor.js +9 -3
- package/src/cli/release.js +334 -140
- package/src/cli/repository.js +68 -23
- package/src/cli/run.js +193 -49
- package/src/cli/secrets.js +11 -2
- package/src/cli/test.js +9 -3
- package/src/client/Default.index.js +9 -3
- package/src/client/components/core/Auth.js +5 -0
- package/src/client/components/core/ClientEvents.js +76 -0
- package/src/client/components/core/EventBus.js +4 -0
- package/src/client/components/core/Modal.js +82 -41
- package/src/client/components/core/PanelForm.js +56 -52
- package/src/client/components/core/Worker.js +162 -363
- package/src/client/components/cyberia/MapEngineCyberia.js +1 -1
- package/src/client/components/cyberia/SharedDefaultsCyberia.js +330 -0
- package/src/client/public/cyberia-docs/ARCHITECTURE.md +50 -410
- package/src/client/public/cyberia-docs/CYBERIA-CLI.md +114 -327
- package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +200 -222
- package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +203 -185
- package/src/client/public/cyberia-docs/CYBERIA.md +259 -0
- package/src/client/public/cyberia-docs/OFF-CHAIN-ECONOMY.md +2 -2
- package/src/client/public/cyberia-docs/ROADMAP.md +1 -1
- package/src/client/public/cyberia-docs/UNDERPOST-PLATFORM.md +106 -0
- package/src/client/public/cyberia-docs/WHITE-PAPER.md +1 -1
- package/src/client/services/cyberia-client-hints/cyberia-client-hints.service.js +99 -0
- package/src/client/ssr/views/CyberiaServerMetrics.js +982 -0
- package/src/client/sw/core.sw.js +174 -112
- package/src/db/DataBaseProvider.js +115 -15
- package/src/db/mariadb/MariaDB.js +2 -1
- package/src/db/mongo/MongoBootstrap.js +657 -0
- package/src/db/mongo/MongooseDB.js +129 -21
- package/src/grpc/cyberia/grpc-server.js +25 -57
- package/src/index.js +1 -1
- package/src/runtime/cyberia-client/Dockerfile +24 -3
- package/src/runtime/cyberia-client/Dockerfile.dev +82 -0
- package/src/runtime/cyberia-server/Dockerfile +29 -4
- package/src/runtime/cyberia-server/Dockerfile.dev +71 -0
- package/src/runtime/express/Express.js +2 -2
- package/src/runtime/wp/Wp.js +8 -5
- package/src/server/auth.js +2 -2
- package/src/server/client-build-docs.js +1 -1
- package/src/server/client-build.js +94 -129
- package/src/server/conf.js +86 -83
- package/src/server/process.js +180 -19
- package/src/server/proxy.js +9 -2
- package/src/server/runtime.js +1 -1
- package/src/server/start.js +17 -5
- package/src/server/valkey.js +2 -0
- package/src/ws/IoInterface.js +16 -16
- package/src/ws/core/channels/core.ws.chat.js +11 -11
- package/src/ws/core/channels/core.ws.mailer.js +29 -29
- package/src/ws/core/channels/core.ws.stream.js +19 -19
- package/src/ws/core/core.ws.connection.js +8 -8
- package/src/ws/core/core.ws.server.js +6 -5
- package/src/ws/default/channels/default.ws.main.js +10 -10
- package/src/ws/default/default.ws.connection.js +4 -4
- package/src/ws/default/default.ws.server.js +4 -3
- package/bin/file.js +0 -202
- package/bin/vs.js +0 -74
- package/bin/zed.js +0 -84
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.defaults.js +0 -574
- package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +0 -467
- package/src/client/ssr/email/DefaultRecoverEmail.js +0 -21
- package/src/client/ssr/email/DefaultVerifyEmail.js +0 -17
- package/src/client/ssr/pages/CyberiaServerMetrics.js +0 -461
- /package/src/client/ssr/{offline → views}/Maintenance.js +0 -0
- /package/src/client/ssr/{offline → views}/NoNetworkConnection.js +0 -0
- /package/src/client/ssr/{pages → views}/Test.js +0 -0
|
@@ -1,31 +1,36 @@
|
|
|
1
1
|
import { loggerFactory } from '../../server/logger.js';
|
|
2
2
|
import { DocumentController } from './document.controller.js';
|
|
3
3
|
import express from 'express';
|
|
4
|
-
|
|
4
|
+
|
|
5
5
|
const logger = loggerFactory(import.meta);
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
router
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
`/:id
|
|
21
|
-
authMiddleware,
|
|
22
|
-
async (req, res) => await DocumentController.patch(req, res, options)
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
7
|
+
class DocumentRouter {
|
|
8
|
+
/**
|
|
9
|
+
* @param {import('../types.js').RouterOptions} options
|
|
10
|
+
* @returns {import('express').Router}
|
|
11
|
+
*/
|
|
12
|
+
static router(options) {
|
|
13
|
+
const router = express.Router();
|
|
14
|
+
router.post(`/:id`, options.authMiddleware, async (req, res) => await DocumentController.post(req, res, options));
|
|
15
|
+
router.post(`/`, options.authMiddleware, async (req, res) => await DocumentController.post(req, res, options));
|
|
16
|
+
router.get(`/public/high`, async (req, res) => await DocumentController.get(req, res, options));
|
|
17
|
+
router.get(`/public`, async (req, res) => await DocumentController.get(req, res, options));
|
|
18
|
+
router.get(`/:id`, options.authMiddleware, async (req, res) => await DocumentController.get(req, res, options));
|
|
19
|
+
router.get(`/`, options.authMiddleware, async (req, res) => await DocumentController.get(req, res, options));
|
|
20
|
+
router.put(`/:id`, options.authMiddleware, async (req, res) => await DocumentController.put(req, res, options));
|
|
21
|
+
router.put(`/`, options.authMiddleware, async (req, res) => await DocumentController.put(req, res, options));
|
|
22
|
+
router.patch(`/:id/copy-share-link`, async (req, res) => await DocumentController.patch(req, res, options));
|
|
23
|
+
router.patch(
|
|
24
|
+
`/:id/toggle-public`,
|
|
25
|
+
options.authMiddleware,
|
|
26
|
+
async (req, res) => await DocumentController.patch(req, res, options),
|
|
27
|
+
);
|
|
28
|
+
router.delete(`/:id`, options.authMiddleware, async (req, res) => await DocumentController.delete(req, res, options));
|
|
29
|
+
router.delete(`/`, options.authMiddleware, async (req, res) => await DocumentController.delete(req, res, options));
|
|
30
|
+
return router;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
28
33
|
|
|
29
|
-
const ApiRouter = DocumentRouter;
|
|
34
|
+
const ApiRouter = (options) => DocumentRouter.router(options);
|
|
30
35
|
|
|
31
36
|
export { ApiRouter, DocumentRouter };
|
|
@@ -1,5 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Document service module for handling document CRUD operations.
|
|
3
|
+
* Provides REST API handlers for document management with security-aware
|
|
4
|
+
* public/private document access control, search, and file cleanup integration.
|
|
5
|
+
*
|
|
6
|
+
* @module src/api/document/document.service.js
|
|
7
|
+
* @namespace DocumentService
|
|
8
|
+
*/
|
|
9
|
+
|
|
1
10
|
import { loggerFactory } from '../../server/logger.js';
|
|
2
|
-
import {
|
|
11
|
+
import { DataBaseProviderService } from '../../db/DataBaseProvider.js';
|
|
3
12
|
import { DocumentDto } from './document.model.js';
|
|
4
13
|
import { uniqueArray } from '../../client/components/core/CommonJs.js';
|
|
5
14
|
import { getBearerToken, verifyJWT } from '../../server/auth.js';
|
|
@@ -8,10 +17,26 @@ import { FileCleanup } from '../file/file.service.js';
|
|
|
8
17
|
|
|
9
18
|
const logger = loggerFactory(import.meta);
|
|
10
19
|
|
|
11
|
-
|
|
12
|
-
|
|
20
|
+
/**
|
|
21
|
+
* Document Service for handling REST API document operations.
|
|
22
|
+
* Implements a security model for public/private document access control
|
|
23
|
+
* with support for high-query typeahead search, tag filtering, and pagination.
|
|
24
|
+
* @namespace DocumentService
|
|
25
|
+
*/
|
|
26
|
+
class DocumentService {
|
|
27
|
+
/**
|
|
28
|
+
* POST - Create a new document.
|
|
29
|
+
* @async
|
|
30
|
+
* @function post
|
|
31
|
+
* @memberof DocumentService
|
|
32
|
+
* @param {Object} req - Express request object.
|
|
33
|
+
* @param {Object} res - Express response object.
|
|
34
|
+
* @param {Object} options - Request options containing host and path.
|
|
35
|
+
* @returns {Promise<Object>} Created document object.
|
|
36
|
+
*/
|
|
37
|
+
static post = async (req, res, options) => {
|
|
13
38
|
/** @type {import('./document.model.js').DocumentModel} */
|
|
14
|
-
const Document =
|
|
39
|
+
const Document = DataBaseProviderService.getModel("Document", options);
|
|
15
40
|
|
|
16
41
|
switch (req.params.id) {
|
|
17
42
|
default:
|
|
@@ -25,14 +50,28 @@ const DocumentService = {
|
|
|
25
50
|
|
|
26
51
|
return await new Document(req.body).save();
|
|
27
52
|
}
|
|
28
|
-
}
|
|
29
|
-
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* GET - Retrieve documents.
|
|
57
|
+
* Supports public high-query search, public tag-filtered listing,
|
|
58
|
+
* and authenticated user document retrieval with pagination.
|
|
59
|
+
* @async
|
|
60
|
+
* @function get
|
|
61
|
+
* @memberof DocumentService
|
|
62
|
+
* @param {Object} req - Express request object.
|
|
63
|
+
* @param {Object} res - Express response object.
|
|
64
|
+
* @param {Object} options - Request options containing host and path.
|
|
65
|
+
* @returns {Promise<Object>} Document data with optional pagination metadata.
|
|
66
|
+
* @throws {Error} If search query is invalid or document not found.
|
|
67
|
+
*/
|
|
68
|
+
static get = async (req, res, options) => {
|
|
30
69
|
/** @type {import('./document.model.js').DocumentModel} */
|
|
31
|
-
const Document =
|
|
70
|
+
const Document = DataBaseProviderService.getModel("Document", options);
|
|
32
71
|
/** @type {import('../user/user.model.js').UserModel} */
|
|
33
|
-
const User =
|
|
72
|
+
const User = DataBaseProviderService.getModel("User", options);
|
|
34
73
|
/** @type {import('../file/file.model.js').FileModel} */
|
|
35
|
-
const File =
|
|
74
|
+
const File = DataBaseProviderService.getModel("File", options);
|
|
36
75
|
|
|
37
76
|
// High-query endpoint for typeahead search
|
|
38
77
|
//
|
|
@@ -436,12 +475,24 @@ const DocumentService = {
|
|
|
436
475
|
};
|
|
437
476
|
}
|
|
438
477
|
}
|
|
439
|
-
}
|
|
440
|
-
|
|
478
|
+
};
|
|
479
|
+
|
|
480
|
+
/**
|
|
481
|
+
* DELETE - Remove a document and its associated files.
|
|
482
|
+
* @async
|
|
483
|
+
* @function delete
|
|
484
|
+
* @memberof DocumentService
|
|
485
|
+
* @param {Object} req - Express request object.
|
|
486
|
+
* @param {Object} res - Express response object.
|
|
487
|
+
* @param {Object} options - Request options containing host and path.
|
|
488
|
+
* @returns {Promise<Object>} Deleted document object.
|
|
489
|
+
* @throws {Error} If document not found or user not authorized.
|
|
490
|
+
*/
|
|
491
|
+
static delete = async (req, res, options) => {
|
|
441
492
|
/** @type {import('./document.model.js').DocumentModel} */
|
|
442
|
-
const Document =
|
|
493
|
+
const Document = DataBaseProviderService.getModel("Document", options);
|
|
443
494
|
/** @type {import('../file/file.model.js').FileModel} */
|
|
444
|
-
const File =
|
|
495
|
+
const File = DataBaseProviderService.getModel("File", options);
|
|
445
496
|
|
|
446
497
|
switch (req.params.id) {
|
|
447
498
|
default: {
|
|
@@ -460,12 +511,25 @@ const DocumentService = {
|
|
|
460
511
|
return await Document.findByIdAndDelete(req.params.id);
|
|
461
512
|
}
|
|
462
513
|
}
|
|
463
|
-
}
|
|
464
|
-
|
|
514
|
+
};
|
|
515
|
+
|
|
516
|
+
/**
|
|
517
|
+
* PUT - Update a document.
|
|
518
|
+
* Cleans up replaced files and handles tag-based isPublic extraction.
|
|
519
|
+
* @async
|
|
520
|
+
* @function put
|
|
521
|
+
* @memberof DocumentService
|
|
522
|
+
* @param {Object} req - Express request object.
|
|
523
|
+
* @param {Object} res - Express response object.
|
|
524
|
+
* @param {Object} options - Request options containing host and path.
|
|
525
|
+
* @returns {Promise<Object>} Updated document object.
|
|
526
|
+
* @throws {Error} If document not found.
|
|
527
|
+
*/
|
|
528
|
+
static put = async (req, res, options) => {
|
|
465
529
|
/** @type {import('./document.model.js').DocumentModel} */
|
|
466
|
-
const Document =
|
|
530
|
+
const Document = DataBaseProviderService.getModel("Document", options);
|
|
467
531
|
/** @type {import('../file/file.model.js').FileModel} */
|
|
468
|
-
const File =
|
|
532
|
+
const File = DataBaseProviderService.getModel("File", options);
|
|
469
533
|
|
|
470
534
|
switch (req.params.id) {
|
|
471
535
|
default: {
|
|
@@ -500,10 +564,23 @@ const DocumentService = {
|
|
|
500
564
|
return await Document.findByIdAndUpdate(req.params.id, req.body, { returnDocument: 'after' });
|
|
501
565
|
}
|
|
502
566
|
}
|
|
503
|
-
}
|
|
504
|
-
|
|
567
|
+
};
|
|
568
|
+
|
|
569
|
+
/**
|
|
570
|
+
* PATCH - Partially update a document.
|
|
571
|
+
* Supports toggle-public and copy-share-link operations.
|
|
572
|
+
* @async
|
|
573
|
+
* @function patch
|
|
574
|
+
* @memberof DocumentService
|
|
575
|
+
* @param {Object} req - Express request object.
|
|
576
|
+
* @param {Object} res - Express response object.
|
|
577
|
+
* @param {Object} options - Request options containing host and path.
|
|
578
|
+
* @returns {Promise<Object>} Updated document or result object.
|
|
579
|
+
* @throws {Error} If document not found or invalid patch endpoint.
|
|
580
|
+
*/
|
|
581
|
+
static patch = async (req, res, options) => {
|
|
505
582
|
/** @type {import('./document.model.js').DocumentModel} */
|
|
506
|
-
const Document =
|
|
583
|
+
const Document = DataBaseProviderService.getModel("Document", options);
|
|
507
584
|
|
|
508
585
|
if (req.path.includes('/toggle-public')) {
|
|
509
586
|
const document = await Document.findById(req.params.id);
|
|
@@ -550,7 +627,7 @@ const DocumentService = {
|
|
|
550
627
|
}
|
|
551
628
|
|
|
552
629
|
throw new Error('Invalid patch endpoint');
|
|
553
|
-
}
|
|
554
|
-
}
|
|
630
|
+
};
|
|
631
|
+
}
|
|
555
632
|
|
|
556
|
-
export { DocumentService };
|
|
633
|
+
export { DocumentService };
|
|
@@ -2,21 +2,27 @@ import { adminGuard } from '../../server/auth.js';
|
|
|
2
2
|
import { loggerFactory } from '../../server/logger.js';
|
|
3
3
|
import { FileController } from './file.controller.js';
|
|
4
4
|
import express from 'express';
|
|
5
|
+
|
|
5
6
|
const logger = loggerFactory(import.meta);
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
router
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
8
|
+
class FileRouter {
|
|
9
|
+
/**
|
|
10
|
+
* @param {import('../types.js').RouterOptions} options
|
|
11
|
+
* @returns {import('express').Router}
|
|
12
|
+
*/
|
|
13
|
+
static router(options) {
|
|
14
|
+
const router = express.Router();
|
|
15
|
+
router.post(`/:id`, options.authMiddleware, async (req, res) => await FileController.post(req, res, options));
|
|
16
|
+
router.post(`/`, options.authMiddleware, async (req, res) => await FileController.post(req, res, options));
|
|
17
|
+
router.get(`/blob/:id`, async (req, res) => await FileController.get(req, res, options));
|
|
18
|
+
router.get(`/:id`, async (req, res) => await FileController.get(req, res, options));
|
|
19
|
+
router.get(`/`, async (req, res) => await FileController.get(req, res, options));
|
|
20
|
+
router.delete(`/:id`, options.authMiddleware, adminGuard, async (req, res) => await FileController.delete(req, res, options));
|
|
21
|
+
router.delete(`/`, options.authMiddleware, adminGuard, async (req, res) => await FileController.delete(req, res, options));
|
|
22
|
+
return router;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
19
25
|
|
|
20
|
-
const ApiRouter = FileRouter;
|
|
26
|
+
const ApiRouter = (options) => FileRouter.router(options);
|
|
21
27
|
|
|
22
28
|
export { ApiRouter, FileRouter };
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* @namespace FileServiceServer
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import {
|
|
9
|
+
import { DataBaseProviderService } from '../../db/DataBaseProvider.js';
|
|
10
10
|
import { getBearerToken, jwtVerify } from '../../server/auth.js';
|
|
11
11
|
import { loggerFactory } from '../../server/logger.js';
|
|
12
12
|
import crypto from 'crypto';
|
|
@@ -266,7 +266,9 @@ class FileCleanup {
|
|
|
266
266
|
const newFileId = newData[field];
|
|
267
267
|
|
|
268
268
|
// If field has old file and new data changes or removes it
|
|
269
|
-
|
|
269
|
+
// newFileId === null means client explicitly wants to remove the file
|
|
270
|
+
// newFileId === undefined means field was not included in request (no change)
|
|
271
|
+
if (oldFileId && newFileId !== undefined && (newFileId === null || String(oldFileId) !== String(newFileId))) {
|
|
270
272
|
try {
|
|
271
273
|
const file = await File.findOne({ _id: oldFileId });
|
|
272
274
|
if (file) {
|
|
@@ -345,7 +347,7 @@ class FileService {
|
|
|
345
347
|
}
|
|
346
348
|
|
|
347
349
|
/** @type {import('./file.model.js').FileModel} */
|
|
348
|
-
const File =
|
|
350
|
+
const File = DataBaseProviderService.getModel("File", options);
|
|
349
351
|
|
|
350
352
|
const uploadedFiles = await FileFactory.upload(req, File);
|
|
351
353
|
return FileServiceDto.toMetadataArray(uploadedFiles);
|
|
@@ -367,11 +369,11 @@ class FileService {
|
|
|
367
369
|
*/
|
|
368
370
|
static get = async (req, res, options) => {
|
|
369
371
|
/** @type {import('./file.model.js').FileModel} */
|
|
370
|
-
const File =
|
|
372
|
+
const File = DataBaseProviderService.getModel("File", options);
|
|
371
373
|
/** @type {import('../document/document.model.js').DocumentModel} */
|
|
372
|
-
const Document =
|
|
374
|
+
const Document = DataBaseProviderService.getModel("Document", options);
|
|
373
375
|
/** @type {import('../user/user.model.js').User} */
|
|
374
|
-
const User =
|
|
376
|
+
const User = DataBaseProviderService.getModel("User", options);
|
|
375
377
|
|
|
376
378
|
const isFileAuthorized = async (fileId) => {
|
|
377
379
|
try {
|
|
@@ -482,7 +484,7 @@ class FileService {
|
|
|
482
484
|
*/
|
|
483
485
|
static delete = async (req, res, options) => {
|
|
484
486
|
/** @type {import('./file.model.js').FileModel} */
|
|
485
|
-
const File =
|
|
487
|
+
const File = DataBaseProviderService.getModel("File", options);
|
|
486
488
|
|
|
487
489
|
const result = await File.findByIdAndDelete(req.params.id);
|
|
488
490
|
|
|
@@ -5,30 +5,35 @@ import express from 'express';
|
|
|
5
5
|
|
|
6
6
|
const logger = loggerFactory(import.meta);
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
router
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
authMiddleware,
|
|
20
|
-
adminGuard,
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
8
|
+
class InstanceRouter {
|
|
9
|
+
/**
|
|
10
|
+
* @param {import('../types.js').RouterOptions} options
|
|
11
|
+
* @returns {import('express').Router}
|
|
12
|
+
*/
|
|
13
|
+
static router(options) {
|
|
14
|
+
const router = express.Router();
|
|
15
|
+
router.post(`/:id`, options.authMiddleware, adminGuard, async (req, res) => await InstanceController.post(req, res, options));
|
|
16
|
+
router.post(`/`, options.authMiddleware, adminGuard, async (req, res) => await InstanceController.post(req, res, options));
|
|
17
|
+
router.get(`/:id`, options.authMiddleware, adminGuard, async (req, res) => await InstanceController.get(req, res, options));
|
|
18
|
+
router.get(`/`, options.authMiddleware, async (req, res) => await InstanceController.get(req, res, options));
|
|
19
|
+
router.put(`/:id`, options.authMiddleware, adminGuard, async (req, res) => await InstanceController.put(req, res, options));
|
|
20
|
+
router.put(`/`, options.authMiddleware, adminGuard, async (req, res) => await InstanceController.put(req, res, options));
|
|
21
|
+
router.delete(
|
|
22
|
+
`/:id`,
|
|
23
|
+
options.authMiddleware,
|
|
24
|
+
adminGuard,
|
|
25
|
+
async (req, res) => await InstanceController.delete(req, res, options),
|
|
26
|
+
);
|
|
27
|
+
router.delete(
|
|
28
|
+
`/`,
|
|
29
|
+
options.authMiddleware,
|
|
30
|
+
adminGuard,
|
|
31
|
+
async (req, res) => await InstanceController.delete(req, res, options),
|
|
32
|
+
);
|
|
33
|
+
return router;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
31
36
|
|
|
32
|
-
const ApiRouter = InstanceRouter;
|
|
37
|
+
const ApiRouter = (options) => InstanceRouter.router(options);
|
|
33
38
|
|
|
34
39
|
export { ApiRouter, InstanceRouter };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DataBaseProviderService } from '../../db/DataBaseProvider.js';
|
|
2
2
|
import { loggerFactory } from '../../server/logger.js';
|
|
3
3
|
import { DataQuery } from '../../server/data-query.js';
|
|
4
4
|
import { InstanceDto } from './instance.model.js';
|
|
@@ -8,15 +8,15 @@ const logger = loggerFactory(import.meta);
|
|
|
8
8
|
class InstanceService {
|
|
9
9
|
static post = async (req, res, options) => {
|
|
10
10
|
/** @type {import('./instance.model.js').InstanceModel} */
|
|
11
|
-
const Instance =
|
|
11
|
+
const Instance = DataBaseProviderService.getModel("Instance", options);
|
|
12
12
|
return await new Instance(req.body).save();
|
|
13
13
|
};
|
|
14
14
|
static get = async (req, res, options) => {
|
|
15
15
|
/** @type {import('./instance.model.js').InstanceModel} */
|
|
16
|
-
const Instance =
|
|
16
|
+
const Instance = DataBaseProviderService.getModel("Instance", options);
|
|
17
17
|
|
|
18
18
|
/** @type {import('../user/user.model.js').UserModel} */
|
|
19
|
-
const User =
|
|
19
|
+
const User = DataBaseProviderService.getModel("User", options);
|
|
20
20
|
|
|
21
21
|
const user = await User.findOne({
|
|
22
22
|
_id: req.auth.user._id,
|
|
@@ -61,12 +61,12 @@ class InstanceService {
|
|
|
61
61
|
};
|
|
62
62
|
static put = async (req, res, options) => {
|
|
63
63
|
/** @type {import('./instance.model.js').InstanceModel} */
|
|
64
|
-
const Instance =
|
|
64
|
+
const Instance = DataBaseProviderService.getModel("Instance", options);
|
|
65
65
|
return await Instance.findByIdAndUpdate(req.params.id, req.body);
|
|
66
66
|
};
|
|
67
67
|
static delete = async (req, res, options) => {
|
|
68
68
|
/** @type {import('./instance.model.js').InstanceModel} */
|
|
69
|
-
const Instance =
|
|
69
|
+
const Instance = DataBaseProviderService.getModel("Instance", options);
|
|
70
70
|
if (req.params.id) return await Instance.findByIdAndDelete(req.params.id);
|
|
71
71
|
else return await Instance.deleteMany();
|
|
72
72
|
};
|
|
@@ -5,22 +5,27 @@ import express from 'express';
|
|
|
5
5
|
|
|
6
6
|
const logger = loggerFactory(import.meta);
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
router
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
8
|
+
class IpfsRouter {
|
|
9
|
+
/**
|
|
10
|
+
* @param {import('../types.js').RouterOptions} options
|
|
11
|
+
* @returns {import('express').Router}
|
|
12
|
+
*/
|
|
13
|
+
static router(options) {
|
|
14
|
+
const router = express.Router();
|
|
15
|
+
// Health / audit — must come before /:id to avoid matching conflicts.
|
|
16
|
+
router.get(`/verify`, options.authMiddleware, adminGuard, async (req, res) => await IpfsController.verify(req, res, options));
|
|
17
|
+
router.post(`/:id`, options.authMiddleware, adminGuard, async (req, res) => await IpfsController.post(req, res, options));
|
|
18
|
+
router.post(`/`, options.authMiddleware, adminGuard, async (req, res) => await IpfsController.post(req, res, options));
|
|
19
|
+
router.get(`/:id`, options.authMiddleware, adminGuard, async (req, res) => await IpfsController.get(req, res, options));
|
|
20
|
+
router.get(`/`, options.authMiddleware, adminGuard, async (req, res) => await IpfsController.get(req, res, options));
|
|
21
|
+
router.put(`/:id`, options.authMiddleware, adminGuard, async (req, res) => await IpfsController.put(req, res, options));
|
|
22
|
+
router.put(`/`, options.authMiddleware, adminGuard, async (req, res) => await IpfsController.put(req, res, options));
|
|
23
|
+
router.delete(`/:id`, options.authMiddleware, adminGuard, async (req, res) => await IpfsController.delete(req, res, options));
|
|
24
|
+
router.delete(`/`, options.authMiddleware, adminGuard, async (req, res) => await IpfsController.delete(req, res, options));
|
|
25
|
+
return router;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
23
28
|
|
|
24
|
-
const ApiRouter = IpfsRouter;
|
|
29
|
+
const ApiRouter = (options) => IpfsRouter.router(options);
|
|
25
30
|
|
|
26
31
|
export { ApiRouter, IpfsRouter };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DataBaseProviderService } from '../../db/DataBaseProvider.js';
|
|
2
2
|
import { loggerFactory } from '../../server/logger.js';
|
|
3
3
|
import { DataQuery } from '../../server/data-query.js';
|
|
4
4
|
import { IpfsClient } from '../../server/ipfs-client.js';
|
|
@@ -17,7 +17,7 @@ const logger = loggerFactory(import.meta);
|
|
|
17
17
|
* @returns {Promise<import('mongoose').Document>}
|
|
18
18
|
*/
|
|
19
19
|
const createPinRecord = async ({ cid, resourceType, mfsPath = '', options }) => {
|
|
20
|
-
const Ipfs =
|
|
20
|
+
const Ipfs = DataBaseProviderService.getModel("Ipfs", options);
|
|
21
21
|
const record = await Ipfs.findOneAndUpdate(
|
|
22
22
|
{ cid, resourceType },
|
|
23
23
|
{ cid, resourceType, mfsPath },
|
|
@@ -35,7 +35,7 @@ const createPinRecord = async ({ cid, resourceType, mfsPath = '', options }) =>
|
|
|
35
35
|
* @returns {Promise<void>}
|
|
36
36
|
*/
|
|
37
37
|
const removePinRecordsAndUnpin = async (cid, options) => {
|
|
38
|
-
const Ipfs =
|
|
38
|
+
const Ipfs = DataBaseProviderService.getModel("Ipfs", options);
|
|
39
39
|
await Ipfs.deleteMany({ cid });
|
|
40
40
|
logger.info(`Removed IPFS registry entries for CID: ${cid}`);
|
|
41
41
|
try {
|
|
@@ -52,11 +52,11 @@ class IpfsService {
|
|
|
52
52
|
// Standard CRUD
|
|
53
53
|
// ──────────────────────────────────────────────
|
|
54
54
|
static post = async (req, res, options) => {
|
|
55
|
-
const Ipfs =
|
|
55
|
+
const Ipfs = DataBaseProviderService.getModel("Ipfs", options);
|
|
56
56
|
return await new Ipfs(req.body).save();
|
|
57
57
|
};
|
|
58
58
|
static get = async (req, res, options) => {
|
|
59
|
-
const Ipfs =
|
|
59
|
+
const Ipfs = DataBaseProviderService.getModel("Ipfs", options);
|
|
60
60
|
if (req.params.id) {
|
|
61
61
|
return await Ipfs.findById(req.params.id).select(IpfsDto.select.get());
|
|
62
62
|
}
|
|
@@ -69,11 +69,11 @@ class IpfsService {
|
|
|
69
69
|
return { data, total, page, totalPages };
|
|
70
70
|
};
|
|
71
71
|
static put = async (req, res, options) => {
|
|
72
|
-
const Ipfs =
|
|
72
|
+
const Ipfs = DataBaseProviderService.getModel("Ipfs", options);
|
|
73
73
|
return await Ipfs.findByIdAndUpdate(req.params.id, req.body, { returnDocument: 'after' });
|
|
74
74
|
};
|
|
75
75
|
static delete = async (req, res, options) => {
|
|
76
|
-
const Ipfs =
|
|
76
|
+
const Ipfs = DataBaseProviderService.getModel("Ipfs", options);
|
|
77
77
|
if (req.params.id) {
|
|
78
78
|
const record = await Ipfs.findById(req.params.id);
|
|
79
79
|
if (record) {
|
|
@@ -107,7 +107,7 @@ class IpfsService {
|
|
|
107
107
|
* { total, pinned, unpinned, errors, entries: [{ cid, resourceType, mfsPath, pinned, error? }] }
|
|
108
108
|
*/
|
|
109
109
|
static verify = async (req, res, options) => {
|
|
110
|
-
const Ipfs =
|
|
110
|
+
const Ipfs = DataBaseProviderService.getModel("Ipfs", options);
|
|
111
111
|
const records = await Ipfs.find({}).select(IpfsDto.select.get()).lean();
|
|
112
112
|
let pinned = 0;
|
|
113
113
|
let unpinned = 0;
|