cyberia 3.2.22 → 3.2.70

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 (185) hide show
  1. package/.env.example +127 -68
  2. package/.github/workflows/cyberia-client.cd.yml +40 -0
  3. package/.github/workflows/cyberia-server.cd.yml +40 -0
  4. package/.github/workflows/docker-image.cyberia-client.ci.yml +49 -0
  5. package/.github/workflows/docker-image.cyberia-client.dev.ci.yml +48 -0
  6. package/.github/workflows/docker-image.cyberia-server.ci.yml +69 -0
  7. package/.github/workflows/docker-image.cyberia-server.dev.ci.yml +69 -0
  8. package/.github/workflows/docker-image.engine-cyberia.ci.yml +52 -0
  9. package/.github/workflows/docker-image.engine-cyberia.dev.ci.yml +52 -0
  10. package/.github/workflows/engine-cyberia.cd.yml +33 -24
  11. package/.github/workflows/engine-cyberia.ci.yml +13 -3
  12. package/.github/workflows/ghpkg.ci.yml +88 -1
  13. package/.github/workflows/gitlab.ci.yml +1 -1
  14. package/.github/workflows/hardhat.ci.yml +1 -1
  15. package/.github/workflows/npmpkg.ci.yml +10 -7
  16. package/.github/workflows/publish.ci.yml +2 -2
  17. package/.github/workflows/publish.cyberia.ci.yml +5 -16
  18. package/.github/workflows/pwa-microservices-template-page.cd.yml +1 -8
  19. package/.github/workflows/pwa-microservices-template-test.ci.yml +1 -1
  20. package/CHANGELOG.md +301 -1
  21. package/CLI-HELP.md +71 -6
  22. package/Dockerfile +141 -43
  23. package/Dockerfile.dev +143 -0
  24. package/Dockerfile.test +165 -0
  25. package/README.md +1 -1
  26. package/baremetal/commission-workflows.json +1 -0
  27. package/bin/build.js +31 -0
  28. package/bin/cyberia.js +1080 -184
  29. package/bin/deploy.js +2 -2
  30. package/bin/index.js +1080 -184
  31. package/bump.config.js +1 -0
  32. package/compose.env +131 -0
  33. package/conf.js +18 -1
  34. package/deployment.yaml +2 -2
  35. package/docker-compose.yml +316 -0
  36. package/hardhat/hardhat.config.js +2 -2
  37. package/hardhat/package-lock.json +620 -2041
  38. package/hardhat/package.json +7 -5
  39. package/hardhat/scripts/deployObjectLayerToken.js +18 -18
  40. package/hardhat/test/ObjectLayerToken.js +378 -274
  41. package/ipfs/configure-ipfs.sh +13 -0
  42. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +1 -1
  43. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +1 -1
  44. package/manifests/deployment/dd-cyberia-development/deployment.yaml +2 -2
  45. package/manifests/deployment/dd-cyberia-development/grpc-service.yaml +17 -0
  46. package/manifests/deployment/dd-cyberia-development/pv-pvc.yaml +32 -0
  47. package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
  48. package/mongodb/entrypoint.sh +76 -0
  49. package/nginx.conf +87 -0
  50. package/package.json +31 -19
  51. package/pv-pvc.yaml +32 -0
  52. package/scripts/disk-clean.sh +85 -60
  53. package/scripts/kubeadm-node-setup.sh +317 -0
  54. package/scripts/rocky-kickstart.sh +877 -185
  55. package/scripts/rpmfusion-ffmpeg-setup.sh +26 -50
  56. package/scripts/test-monitor.sh +3 -5
  57. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +43 -7
  58. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +17 -25
  59. package/src/api/cyberia-action/cyberia-action.controller.js +19 -0
  60. package/src/api/cyberia-action/cyberia-action.model.js +21 -29
  61. package/src/api/cyberia-action/cyberia-action.router.js +42 -7
  62. package/src/api/cyberia-action/cyberia-action.service.js +20 -4
  63. package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +58 -57
  64. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +37 -6
  65. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +8 -2
  66. package/src/api/cyberia-entity/cyberia-entity.router.js +39 -7
  67. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.controller.js +74 -0
  68. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.model.js +67 -0
  69. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.router.js +63 -0
  70. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.service.js +46 -0
  71. package/src/api/cyberia-instance/cyberia-fallback-world.js +62 -10
  72. package/src/api/cyberia-instance/cyberia-instance.model.js +32 -2
  73. package/src/api/cyberia-instance/cyberia-instance.router.js +6 -6
  74. package/src/api/cyberia-instance/cyberia-world-generator.js +116 -3
  75. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +3 -0
  76. package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +39 -7
  77. package/src/api/cyberia-map/cyberia-map.router.js +21 -6
  78. package/src/api/cyberia-quest/cyberia-quest.controller.js +38 -0
  79. package/src/api/cyberia-quest/cyberia-quest.router.js +47 -7
  80. package/src/api/cyberia-quest/cyberia-quest.service.js +59 -4
  81. package/src/api/cyberia-saga/cyberia-saga.controller.js +74 -0
  82. package/src/api/cyberia-saga/cyberia-saga.model.js +59 -0
  83. package/src/api/cyberia-saga/cyberia-saga.router.js +63 -0
  84. package/src/api/cyberia-saga/cyberia-saga.service.js +42 -0
  85. package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +551 -129
  86. package/src/api/cyberia-skill/cyberia-skill.controller.js +74 -0
  87. package/src/api/cyberia-skill/cyberia-skill.model.js +50 -0
  88. package/src/api/cyberia-skill/cyberia-skill.router.js +63 -0
  89. package/src/api/cyberia-skill/cyberia-skill.service.js +42 -0
  90. package/src/api/ipfs/ipfs.service.js +28 -15
  91. package/src/api/object-layer/object-layer.router.js +25 -15
  92. package/src/api/object-layer/object-layer.service.js +15 -20
  93. package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +39 -7
  94. package/src/cli/baremetal.js +717 -16
  95. package/src/cli/cluster.js +80 -5
  96. package/src/cli/deploy.js +127 -11
  97. package/src/cli/docker-compose.js +648 -0
  98. package/src/cli/env.js +11 -2
  99. package/src/cli/fs.js +75 -30
  100. package/src/cli/image.js +129 -51
  101. package/src/cli/index.js +110 -6
  102. package/src/cli/kickstart.js +142 -20
  103. package/src/cli/release.js +46 -4
  104. package/src/cli/repository.js +238 -33
  105. package/src/cli/run.js +520 -114
  106. package/src/cli/secrets.js +82 -48
  107. package/src/cli/ssh.js +234 -0
  108. package/src/cli/static.js +2 -2
  109. package/src/client/components/cyberia/ActionEngineCyberia.js +1867 -0
  110. package/src/client/components/cyberia/EntityEngineCyberia.js +585 -0
  111. package/src/client/components/cyberia/InstanceEngineCyberia.js +219 -13
  112. package/src/client/components/cyberia/MapEngineCyberia.js +154 -71
  113. package/src/client/components/cyberia/ObjectLayerEngineModal.js +40 -63
  114. package/src/client/components/cyberia/ObjectLayerEngineViewer.js +34 -20
  115. package/src/client/components/cyberia/SharedDefaultsCyberia.js +195 -4
  116. package/src/client/components/cyberia-portal/AppShellCyberiaPortal.js +66 -0
  117. package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +8 -0
  118. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +8 -0
  119. package/src/client/public/cyberia-docs/ACTION-SYSTEM.md +45 -27
  120. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +3 -3
  121. package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +39 -22
  122. package/src/client/public/cyberia-docs/CYBERIA-LORE.md +88 -0
  123. package/src/client/public/cyberia-docs/CYBERIA-SAGA.md +394 -0
  124. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +8 -1
  125. package/src/client/public/cyberia-docs/CYBERIA.md +1 -1
  126. package/src/client/public/cyberia-docs/QUEST-SYSTEM.md +5 -5
  127. package/src/client/public/cyberia-docs/ROADMAP.md +1 -1
  128. package/src/client/public/cyberia-docs/WHITE-PAPER.md +1 -1
  129. package/src/client/services/cyberia-entity-type-default/cyberia-entity-type-default.service.js +99 -0
  130. package/src/client/services/cyberia-instance/cyberia-instance.management.js +2 -2
  131. package/src/client/services/cyberia-map/cyberia-map.management.js +2 -2
  132. package/src/client/services/cyberia-saga/cyberia-saga.service.js +99 -0
  133. package/src/client/services/cyberia-skill/cyberia-skill.service.js +99 -0
  134. package/src/client/services/object-layer/object-layer.management.js +6 -6
  135. package/src/{server → client-builder}/client-build-docs.js +15 -5
  136. package/src/{server → client-builder}/client-build-live.js +3 -3
  137. package/src/{server → client-builder}/client-build.js +25 -22
  138. package/src/{server → client-builder}/client-dev-server.js +3 -3
  139. package/src/{server → client-builder}/client-icons.js +2 -2
  140. package/src/{server → client-builder}/ssr.js +5 -5
  141. package/src/client.build.js +1 -3
  142. package/src/client.dev.js +1 -1
  143. package/src/db/mongo/MongoBootstrap.js +12 -12
  144. package/src/grpc/cyberia/grpc-server.js +255 -70
  145. package/src/index.js +12 -1
  146. package/src/mailer/EmailRender.js +1 -1
  147. package/src/{server → projects/cyberia}/atlas-sprite-sheet-generator.js +2 -2
  148. package/src/{server → projects/cyberia}/besu-genesis-generator.js +3 -3
  149. package/src/projects/cyberia/catalog-cyberia.js +81 -0
  150. package/src/projects/cyberia/gemini-client.js +175 -0
  151. package/src/projects/cyberia/generate-saga.js +2107 -0
  152. package/src/{server → projects/cyberia}/ipfs-client.js +2 -2
  153. package/src/{server → projects/cyberia}/object-layer.js +12 -108
  154. package/src/{server → projects/cyberia}/semantic-layer-generator-floor.js +1 -1
  155. package/src/{server → projects/cyberia}/semantic-layer-generator-resource.js +1 -1
  156. package/src/{server → projects/cyberia}/semantic-layer-generator-skin.js +1 -1
  157. package/src/{server → projects/cyberia}/semantic-layer-generator.js +2 -2
  158. package/src/{server → projects/cyberia}/shape-generator.js +2 -2
  159. package/src/{server → projects/underpost}/catalog-underpost.js +1 -2
  160. package/src/runtime/cyberia-client/Dockerfile +27 -61
  161. package/src/runtime/cyberia-client/Dockerfile.dev +20 -12
  162. package/src/runtime/cyberia-server/Dockerfile +21 -20
  163. package/src/runtime/cyberia-server/Dockerfile.dev +17 -8
  164. package/src/runtime/engine-cyberia/Dockerfile +143 -0
  165. package/src/runtime/engine-cyberia/Dockerfile.dev +143 -0
  166. package/src/runtime/engine-cyberia/Dockerfile.test +165 -0
  167. package/src/runtime/engine-cyberia/compose.env +131 -0
  168. package/src/runtime/engine-cyberia/docker-compose.yml +316 -0
  169. package/src/runtime/engine-cyberia/ipfs/configure-ipfs.sh +13 -0
  170. package/src/runtime/engine-cyberia/mongodb/entrypoint.sh +76 -0
  171. package/src/runtime/engine-cyberia/nginx.conf +87 -0
  172. package/src/runtime/express/Express.js +2 -2
  173. package/src/runtime/nginx/Nginx.js +250 -0
  174. package/src/server/catalog.js +9 -14
  175. package/src/server/conf.js +3 -6
  176. package/src/server/runtime-status.js +18 -1
  177. package/src/server/start.js +12 -2
  178. package/src/server.js +6 -2
  179. package/test/cyberia-instance-conf-defaults.test.js +140 -0
  180. package/test/deploy-monitor.test.js +26 -10
  181. package/test/shape-generator.test.js +7 -1
  182. package/typedoc.dd-cyberia.json +3 -1
  183. package/typedoc.json +3 -1
  184. /package/src/client/ssr/{Render.js → RootDocument.js} +0 -0
  185. /package/src/{server → client-builder}/client-formatted.js +0 -0
@@ -1,18 +1,35 @@
1
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
+ import { DefaultCyberiaQuests } from '../cyberia-server-defaults/cyberia-server-defaults.js';
4
5
 
5
6
  const logger = loggerFactory(import.meta);
6
7
 
8
+ // A step may not repeat the same (type, itemId) objective combination.
9
+ const validateQuestObjectives = (body) => {
10
+ for (const [stepIndex, step] of (body?.steps || []).entries()) {
11
+ const seen = new Set();
12
+ for (const objective of step?.objectives || []) {
13
+ const key = `${objective?.type}::${objective?.itemId}`;
14
+ if (seen.has(key))
15
+ throw new Error(
16
+ `Duplicate objective "${objective?.type}" for itemId "${objective?.itemId}" in step ${stepIndex + 1}.`,
17
+ );
18
+ seen.add(key);
19
+ }
20
+ }
21
+ };
22
+
7
23
  class CyberiaQuestService {
8
24
  static post = async (req, res, options) => {
9
25
  /** @type {import('./cyberia-quest.model.js').CyberiaQuestModel} */
10
- const CyberiaQuest = DataBaseProviderService.getModel("CyberiaQuest", options);
26
+ const CyberiaQuest = DataBaseProviderService.getModel('CyberiaQuest', options);
27
+ validateQuestObjectives(req.body);
11
28
  return await new CyberiaQuest(req.body).save();
12
29
  };
13
30
  static get = async (req, res, options) => {
14
31
  /** @type {import('./cyberia-quest.model.js').CyberiaQuestModel} */
15
- const CyberiaQuest = DataBaseProviderService.getModel("CyberiaQuest", options);
32
+ const CyberiaQuest = DataBaseProviderService.getModel('CyberiaQuest', options);
16
33
  if (req.params.id) return await CyberiaQuest.findById(req.params.id);
17
34
 
18
35
  // Parse query parameters using DataQuery helper
@@ -26,14 +43,52 @@ class CyberiaQuestService {
26
43
  const totalPages = Math.ceil(total / limit);
27
44
  return { data, total, page, totalPages };
28
45
  };
46
+ static getByCode = async (req, res, options) => {
47
+ /** @type {import('./cyberia-quest.model.js').CyberiaQuestModel} */
48
+ const CyberiaQuest = DataBaseProviderService.getModel('CyberiaQuest', options);
49
+ const { code } = req.params;
50
+ if (!code) throw new Error('code parameter is required');
51
+ const data = await CyberiaQuest.findOne({ code }).lean();
52
+ if (data) return data;
53
+ // Fallback world delivers quests to the Go server via gRPC from the
54
+ // canonical defaults without persisting them. Serve those same defaults so
55
+ // the client can resolve metadata even when Mongo has no seeded quest.
56
+ const fallback = DefaultCyberiaQuests.find((q) => q.code === code);
57
+ if (fallback) return fallback;
58
+ throw new Error(`No quest found for code: ${code}`);
59
+ };
60
+ // Quest OFFERS are located by the quest's own (sourceMapCode, sourceCellX,
61
+ // sourceCellY). The client queries this with the interacted entity's binding
62
+ // cell — no dependency on CyberiaAction. Full docs are returned so the client
63
+ // populates its quest metadata cache in a single request.
64
+ static getByCell = async (req, res, options) => {
65
+ /** @type {import('./cyberia-quest.model.js').CyberiaQuestModel} */
66
+ const CyberiaQuest = DataBaseProviderService.getModel('CyberiaQuest', options);
67
+ const { mapCode } = req.params;
68
+ const cellX = parseInt(req.params.cellX);
69
+ const cellY = parseInt(req.params.cellY);
70
+ if (!mapCode || Number.isNaN(cellX) || Number.isNaN(cellY))
71
+ throw new Error('mapCode, cellX and cellY parameters are required');
72
+ const docs = await CyberiaQuest.find({ sourceMapCode: mapCode, sourceCellX: cellX, sourceCellY: cellY }).lean();
73
+ const seen = new Set(docs.map((d) => d.code));
74
+ // Fallback-world quests are served from the canonical defaults, not Mongo.
75
+ for (const q of DefaultCyberiaQuests) {
76
+ if (q.sourceMapCode === mapCode && q.sourceCellX === cellX && q.sourceCellY === cellY && !seen.has(q.code)) {
77
+ docs.push(q);
78
+ seen.add(q.code);
79
+ }
80
+ }
81
+ return docs;
82
+ };
29
83
  static put = async (req, res, options) => {
30
84
  /** @type {import('./cyberia-quest.model.js').CyberiaQuestModel} */
31
- const CyberiaQuest = DataBaseProviderService.getModel("CyberiaQuest", options);
85
+ const CyberiaQuest = DataBaseProviderService.getModel('CyberiaQuest', options);
86
+ validateQuestObjectives(req.body);
32
87
  return await CyberiaQuest.findByIdAndUpdate(req.params.id, req.body);
33
88
  };
34
89
  static delete = async (req, res, options) => {
35
90
  /** @type {import('./cyberia-quest.model.js').CyberiaQuestModel} */
36
- const CyberiaQuest = DataBaseProviderService.getModel("CyberiaQuest", options);
91
+ const CyberiaQuest = DataBaseProviderService.getModel('CyberiaQuest', options);
37
92
  if (req.params.id) return await CyberiaQuest.findByIdAndDelete(req.params.id);
38
93
  else return await CyberiaQuest.deleteMany();
39
94
  };
@@ -0,0 +1,74 @@
1
+ import { loggerFactory } from '../../server/logger.js';
2
+ import { CyberiaSagaService } from './cyberia-saga.service.js';
3
+
4
+ const logger = loggerFactory(import.meta);
5
+
6
+ class CyberiaSagaController {
7
+ static post = async (req, res, options) => {
8
+ try {
9
+ const result = await CyberiaSagaService.post(req, res, options);
10
+ return res.status(200).json({
11
+ status: 'success',
12
+ data: result,
13
+ });
14
+ } catch (error) {
15
+ logger.error(error, error.stack);
16
+ return res.status(400).json({
17
+ status: 'error',
18
+ message: error.message,
19
+ });
20
+ }
21
+ };
22
+ static get = async (req, res, options) => {
23
+ try {
24
+ const { page, limit } = req.query;
25
+ const result = await CyberiaSagaService.get(
26
+ { ...req, query: { ...req.query, page: parseInt(page), limit: parseInt(limit) } },
27
+ res,
28
+ options,
29
+ );
30
+ return res.status(200).json({
31
+ status: 'success',
32
+ data: result,
33
+ });
34
+ } catch (error) {
35
+ logger.error(error, error.stack);
36
+ return res.status(400).json({
37
+ status: 'error',
38
+ message: error.message,
39
+ });
40
+ }
41
+ };
42
+ static put = async (req, res, options) => {
43
+ try {
44
+ const result = await CyberiaSagaService.put(req, res, options);
45
+ return res.status(200).json({
46
+ status: 'success',
47
+ data: result,
48
+ });
49
+ } catch (error) {
50
+ logger.error(error, error.stack);
51
+ return res.status(400).json({
52
+ status: 'error',
53
+ message: error.message,
54
+ });
55
+ }
56
+ };
57
+ static delete = async (req, res, options) => {
58
+ try {
59
+ const result = await CyberiaSagaService.delete(req, res, options);
60
+ return res.status(200).json({
61
+ status: 'success',
62
+ data: result,
63
+ });
64
+ } catch (error) {
65
+ logger.error(error, error.stack);
66
+ return res.status(400).json({
67
+ status: 'error',
68
+ message: error.message,
69
+ });
70
+ }
71
+ };
72
+ }
73
+
74
+ export { CyberiaSagaController };
@@ -0,0 +1,59 @@
1
+ import { Schema, model } from 'mongoose';
2
+
3
+ const CyberiaSagaSchema = new Schema(
4
+ {
5
+ // Unique thematic namespace identifier.
6
+ // Example: "cyberia-saga-neon-frontier"
7
+ code: { type: String, required: true, unique: true, trim: true },
8
+
9
+ // Human-readable saga name.
10
+ name: { type: String, required: true },
11
+
12
+ // Optional description of the saga, its setting, or narrative theme.
13
+ description: { type: String, default: '' },
14
+
15
+ // Complete set of map identifiers that belong to this saga.
16
+ // Any map outside this list is considered external to the saga.
17
+ mapCodes: { type: [String], default: [] },
18
+
19
+ // Complete set of item identifiers associated with this saga.
20
+ itemIds: { type: [String], default: [] },
21
+
22
+ // Quests that belong to this saga, each paired with the NPC skin item that
23
+ // provides it (the bot whose interaction opens or advances the quest).
24
+ questCodes: {
25
+ type: [
26
+ {
27
+ providerSkinItemId: { type: String, required: true },
28
+ questCode: { type: String, required: true },
29
+ },
30
+ ],
31
+ default: [],
32
+ },
33
+
34
+ // Actions that belong to this saga, each paired with the NPC skin item the
35
+ // action is mounted on (the bot the action represents).
36
+ actionCodes: {
37
+ type: [
38
+ {
39
+ providerSkinItemId: { type: String, required: true },
40
+ actionCode: { type: String, required: true },
41
+ },
42
+ ],
43
+ default: [],
44
+ },
45
+
46
+ // Publication or visibility status.
47
+ status: { type: String, default: 'unlisted' },
48
+
49
+ // User who created the saga.
50
+ creator: { type: Schema.Types.ObjectId, ref: 'User' },
51
+ },
52
+ { timestamps: true },
53
+ );
54
+
55
+ const CyberiaSagaModel = model('CyberiaSaga', CyberiaSagaSchema);
56
+
57
+ const ProviderSchema = CyberiaSagaSchema;
58
+
59
+ export { CyberiaSagaSchema, CyberiaSagaModel, ProviderSchema };
@@ -0,0 +1,63 @@
1
+ import { loggerFactory } from '../../server/logger.js';
2
+ import { CyberiaSagaController } from './cyberia-saga.controller.js';
3
+ import express from 'express';
4
+ import { moderatorGuard, adminGuard } from '../../server/auth.js';
5
+
6
+ const logger = loggerFactory(import.meta);
7
+
8
+ class CyberiaSagaRouter {
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(
16
+ `/:id`,
17
+ options.authMiddleware,
18
+ moderatorGuard,
19
+ async (req, res) => await CyberiaSagaController.post(req, res, options),
20
+ );
21
+ router.post(
22
+ `/`,
23
+ options.authMiddleware,
24
+ moderatorGuard,
25
+ async (req, res) => await CyberiaSagaController.post(req, res, options),
26
+ );
27
+ router.get(
28
+ `/:id`,
29
+ // options.authMiddleware,
30
+ async (req, res) => await CyberiaSagaController.get(req, res, options),
31
+ );
32
+ router.get(`/`, async (req, res) => await CyberiaSagaController.get(req, res, options));
33
+ router.put(
34
+ `/:id`,
35
+ options.authMiddleware,
36
+ moderatorGuard,
37
+ async (req, res) => await CyberiaSagaController.put(req, res, options),
38
+ );
39
+ router.put(
40
+ `/`,
41
+ options.authMiddleware,
42
+ moderatorGuard,
43
+ async (req, res) => await CyberiaSagaController.put(req, res, options),
44
+ );
45
+ router.delete(
46
+ `/:id`,
47
+ options.authMiddleware,
48
+ moderatorGuard,
49
+ async (req, res) => await CyberiaSagaController.delete(req, res, options),
50
+ );
51
+ router.delete(
52
+ `/`,
53
+ options.authMiddleware,
54
+ adminGuard,
55
+ async (req, res) => await CyberiaSagaController.delete(req, res, options),
56
+ );
57
+ return router;
58
+ }
59
+ }
60
+
61
+ const ApiRouter = (options) => CyberiaSagaRouter.router(options);
62
+
63
+ export { ApiRouter, CyberiaSagaRouter };
@@ -0,0 +1,42 @@
1
+ import { DataBaseProviderService } from '../../db/DataBaseProvider.js';
2
+ import { loggerFactory } from '../../server/logger.js';
3
+ import { DataQuery } from '../../server/data-query.js';
4
+
5
+ const logger = loggerFactory(import.meta);
6
+
7
+ class CyberiaSagaService {
8
+ static post = async (req, res, options) => {
9
+ /** @type {import('./cyberia-saga.model.js').CyberiaSagaModel} */
10
+ const CyberiaSaga = DataBaseProviderService.getModel("CyberiaSaga", options);
11
+ return await new CyberiaSaga(req.body).save();
12
+ };
13
+ static get = async (req, res, options) => {
14
+ /** @type {import('./cyberia-saga.model.js').CyberiaSagaModel} */
15
+ const CyberiaSaga = DataBaseProviderService.getModel("CyberiaSaga", options);
16
+ if (req.params.id) return await CyberiaSaga.findById(req.params.id);
17
+
18
+ // Parse query parameters using DataQuery helper
19
+ const { query, sort, skip, limit, page } = DataQuery.parse(req.query);
20
+
21
+ const [data, total] = await Promise.all([
22
+ CyberiaSaga.find(query).sort(sort).limit(limit).skip(skip),
23
+ CyberiaSaga.countDocuments(query),
24
+ ]);
25
+
26
+ const totalPages = Math.ceil(total / limit);
27
+ return { data, total, page, totalPages };
28
+ };
29
+ static put = async (req, res, options) => {
30
+ /** @type {import('./cyberia-saga.model.js').CyberiaSagaModel} */
31
+ const CyberiaSaga = DataBaseProviderService.getModel("CyberiaSaga", options);
32
+ return await CyberiaSaga.findByIdAndUpdate(req.params.id, req.body);
33
+ };
34
+ static delete = async (req, res, options) => {
35
+ /** @type {import('./cyberia-saga.model.js').CyberiaSagaModel} */
36
+ const CyberiaSaga = DataBaseProviderService.getModel("CyberiaSaga", options);
37
+ if (req.params.id) return await CyberiaSaga.findByIdAndDelete(req.params.id);
38
+ else return await CyberiaSaga.deleteMany();
39
+ };
40
+ }
41
+
42
+ export { CyberiaSagaService };