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.
Files changed (169) hide show
  1. package/.github/workflows/engine-cyberia.cd.yml +6 -0
  2. package/.github/workflows/npmpkg.ci.yml +1 -0
  3. package/.github/workflows/pwa-microservices-template-test.ci.yml +1 -1
  4. package/.github/workflows/release.cd.yml +1 -0
  5. package/.vscode/extensions.json +9 -9
  6. package/.vscode/settings.json +20 -4
  7. package/CHANGELOG.md +213 -1
  8. package/CLI-HELP.md +92 -23
  9. package/README.md +190 -348
  10. package/bin/build.js +24 -8
  11. package/bin/build.template.js +187 -0
  12. package/bin/cyberia.js +229 -52
  13. package/bin/deploy.js +12 -2
  14. package/bin/index.js +229 -52
  15. package/bump.config.js +26 -0
  16. package/conf.js +130 -24
  17. package/deployment.yaml +4 -2
  18. package/hardhat/package-lock.json +113 -144
  19. package/hardhat/package.json +4 -3
  20. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +1 -1
  21. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +1 -1
  22. package/manifests/deployment/dd-cyberia-development/deployment.yaml +4 -2
  23. package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
  24. package/manifests/deployment/dd-test-development/deployment.yaml +4 -2
  25. package/manifests/kind-config-dev.yaml +8 -0
  26. package/manifests/lxd/lxd-admin-profile.yaml +12 -3
  27. package/manifests/mongodb/pv-pvc.yaml +44 -8
  28. package/manifests/mongodb/statefulset.yaml +55 -68
  29. package/manifests/mongodb-4.4/headless-service.yaml +10 -0
  30. package/manifests/mongodb-4.4/kustomization.yaml +3 -1
  31. package/manifests/mongodb-4.4/mongodb-nodeport.yaml +17 -0
  32. package/manifests/mongodb-4.4/pv-pvc.yaml +10 -14
  33. package/manifests/mongodb-4.4/statefulset.yaml +79 -0
  34. package/manifests/mongodb-4.4/storage-class.yaml +9 -0
  35. package/manifests/valkey/statefulset.yaml +1 -1
  36. package/manifests/valkey/valkey-nodeport.yaml +17 -0
  37. package/package.json +27 -15
  38. package/scripts/ipxe-setup.sh +52 -49
  39. package/scripts/k3s-node-setup.sh +81 -46
  40. package/scripts/lxd-vm-setup.sh +193 -8
  41. package/scripts/maas-nat-firewalld.sh +145 -0
  42. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +38 -33
  43. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +16 -16
  44. package/src/api/core/core.router.js +19 -14
  45. package/src/api/core/core.service.js +5 -5
  46. package/src/api/crypto/crypto.router.js +18 -12
  47. package/src/api/crypto/crypto.service.js +3 -3
  48. package/src/api/cyberia-action/cyberia-action.model.js +1 -1
  49. package/src/api/cyberia-action/cyberia-action.router.js +22 -18
  50. package/src/api/cyberia-action/cyberia-action.service.js +5 -5
  51. package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +74 -0
  52. package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +99 -0
  53. package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +98 -0
  54. package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +152 -0
  55. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +25 -20
  56. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +6 -6
  57. package/src/api/cyberia-entity/cyberia-entity.router.js +22 -18
  58. package/src/api/cyberia-entity/cyberia-entity.service.js +5 -5
  59. package/src/api/cyberia-instance/cyberia-fallback-world.js +79 -4
  60. package/src/api/cyberia-instance/cyberia-instance.router.js +57 -52
  61. package/src/api/cyberia-instance/cyberia-instance.service.js +10 -10
  62. package/src/api/cyberia-instance/cyberia-world-generator.js +3 -3
  63. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +14 -48
  64. package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +22 -18
  65. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +5 -5
  66. package/src/api/cyberia-map/cyberia-map.router.js +35 -30
  67. package/src/api/cyberia-map/cyberia-map.service.js +7 -7
  68. package/src/api/cyberia-quest/cyberia-quest.model.js +1 -1
  69. package/src/api/cyberia-quest/cyberia-quest.router.js +22 -18
  70. package/src/api/cyberia-quest/cyberia-quest.service.js +5 -5
  71. package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +22 -18
  72. package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +5 -5
  73. package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +451 -0
  74. package/src/api/default/default.router.js +22 -18
  75. package/src/api/default/default.service.js +5 -5
  76. package/src/api/document/document.router.js +28 -23
  77. package/src/api/document/document.service.js +100 -23
  78. package/src/api/file/file.router.js +19 -13
  79. package/src/api/file/file.service.js +9 -7
  80. package/src/api/instance/instance.router.js +29 -24
  81. package/src/api/instance/instance.service.js +6 -6
  82. package/src/api/ipfs/ipfs.router.js +21 -16
  83. package/src/api/ipfs/ipfs.service.js +8 -8
  84. package/src/api/object-layer/object-layer.router.js +512 -507
  85. package/src/api/object-layer/object-layer.service.js +17 -14
  86. package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +22 -18
  87. package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +5 -5
  88. package/src/api/test/test.router.js +17 -12
  89. package/src/api/types.js +24 -0
  90. package/src/api/user/guest.service.js +5 -4
  91. package/src/api/user/user.router.js +297 -288
  92. package/src/api/user/user.service.js +100 -35
  93. package/src/cli/baremetal.js +132 -101
  94. package/src/cli/cluster.js +700 -232
  95. package/src/cli/db.js +59 -60
  96. package/src/cli/deploy.js +216 -137
  97. package/src/cli/fs.js +13 -3
  98. package/src/cli/index.js +80 -15
  99. package/src/cli/ipfs.js +4 -6
  100. package/src/cli/kubectl.js +4 -1
  101. package/src/cli/lxd.js +1099 -223
  102. package/src/cli/monitor.js +9 -3
  103. package/src/cli/release.js +334 -140
  104. package/src/cli/repository.js +68 -23
  105. package/src/cli/run.js +193 -49
  106. package/src/cli/secrets.js +11 -2
  107. package/src/cli/test.js +9 -3
  108. package/src/client/Default.index.js +9 -3
  109. package/src/client/components/core/Auth.js +5 -0
  110. package/src/client/components/core/ClientEvents.js +76 -0
  111. package/src/client/components/core/EventBus.js +4 -0
  112. package/src/client/components/core/Modal.js +82 -41
  113. package/src/client/components/core/PanelForm.js +56 -52
  114. package/src/client/components/core/Worker.js +162 -363
  115. package/src/client/components/cyberia/MapEngineCyberia.js +1 -1
  116. package/src/client/components/cyberia/SharedDefaultsCyberia.js +330 -0
  117. package/src/client/public/cyberia-docs/ARCHITECTURE.md +50 -410
  118. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +114 -327
  119. package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +200 -222
  120. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +203 -185
  121. package/src/client/public/cyberia-docs/CYBERIA.md +259 -0
  122. package/src/client/public/cyberia-docs/OFF-CHAIN-ECONOMY.md +2 -2
  123. package/src/client/public/cyberia-docs/ROADMAP.md +1 -1
  124. package/src/client/public/cyberia-docs/UNDERPOST-PLATFORM.md +106 -0
  125. package/src/client/public/cyberia-docs/WHITE-PAPER.md +1 -1
  126. package/src/client/services/cyberia-client-hints/cyberia-client-hints.service.js +99 -0
  127. package/src/client/ssr/views/CyberiaServerMetrics.js +982 -0
  128. package/src/client/sw/core.sw.js +174 -112
  129. package/src/db/DataBaseProvider.js +115 -15
  130. package/src/db/mariadb/MariaDB.js +2 -1
  131. package/src/db/mongo/MongoBootstrap.js +657 -0
  132. package/src/db/mongo/MongooseDB.js +129 -21
  133. package/src/grpc/cyberia/grpc-server.js +25 -57
  134. package/src/index.js +1 -1
  135. package/src/runtime/cyberia-client/Dockerfile +24 -3
  136. package/src/runtime/cyberia-client/Dockerfile.dev +82 -0
  137. package/src/runtime/cyberia-server/Dockerfile +29 -4
  138. package/src/runtime/cyberia-server/Dockerfile.dev +71 -0
  139. package/src/runtime/express/Express.js +2 -2
  140. package/src/runtime/wp/Wp.js +8 -5
  141. package/src/server/auth.js +2 -2
  142. package/src/server/client-build-docs.js +1 -1
  143. package/src/server/client-build.js +94 -129
  144. package/src/server/conf.js +86 -83
  145. package/src/server/process.js +180 -19
  146. package/src/server/proxy.js +9 -2
  147. package/src/server/runtime.js +1 -1
  148. package/src/server/start.js +17 -5
  149. package/src/server/valkey.js +2 -0
  150. package/src/ws/IoInterface.js +16 -16
  151. package/src/ws/core/channels/core.ws.chat.js +11 -11
  152. package/src/ws/core/channels/core.ws.mailer.js +29 -29
  153. package/src/ws/core/channels/core.ws.stream.js +19 -19
  154. package/src/ws/core/core.ws.connection.js +8 -8
  155. package/src/ws/core/core.ws.server.js +6 -5
  156. package/src/ws/default/channels/default.ws.main.js +10 -10
  157. package/src/ws/default/default.ws.connection.js +4 -4
  158. package/src/ws/default/default.ws.server.js +4 -3
  159. package/bin/file.js +0 -202
  160. package/bin/vs.js +0 -74
  161. package/bin/zed.js +0 -84
  162. package/src/api/cyberia-instance-conf/cyberia-instance-conf.defaults.js +0 -574
  163. package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +0 -467
  164. package/src/client/ssr/email/DefaultRecoverEmail.js +0 -21
  165. package/src/client/ssr/email/DefaultVerifyEmail.js +0 -17
  166. package/src/client/ssr/pages/CyberiaServerMetrics.js +0 -461
  167. /package/src/client/ssr/{offline → views}/Maintenance.js +0 -0
  168. /package/src/client/ssr/{offline → views}/NoNetworkConnection.js +0 -0
  169. /package/src/client/ssr/{pages → views}/Test.js +0 -0
@@ -0,0 +1,145 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ # MAAS NAT + firewall helper
5
+ # - Enables IPv4 forwarding and masquerading for the MAAS/provisioning subnet
6
+ # - Opens the MAAS API on the uplink zone when requested
7
+ # - Opens provisioning and optional NFS services on the zone bound to MAAS_LAN_CIDR
8
+ #
9
+ # Usage examples:
10
+ # sudo MAAS_LAN_CIDR="192.168.1.0/24" PUBLIC_ZONE="public" ./maas-nat-firewalld.sh
11
+ # sudo NFS_MODE="v3" CONFIGURE_NFS_V3_PORTS="true" ./maas-nat-firewalld.sh
12
+
13
+ MAAS_LAN_CIDR="${MAAS_LAN_CIDR:-192.168.1.0/24}"
14
+ PUBLIC_ZONE="${PUBLIC_ZONE:-public}"
15
+ TRUSTED_ZONE="${TRUSTED_ZONE:-trusted}"
16
+ NFS_MODE="${NFS_MODE:-v4}" # v4 or v3
17
+ CONFIGURE_NFS_V3_PORTS="${CONFIGURE_NFS_V3_PORTS:-false}"
18
+ EXPOSE_MAAS_API_PUBLIC="${EXPOSE_MAAS_API_PUBLIC:-true}"
19
+
20
+ # Fixed NFSv3 ports (only used when CONFIGURE_NFS_V3_PORTS=true)
21
+ NFS_MOUNTD_PORT="${NFS_MOUNTD_PORT:-20048}"
22
+ NFS_STATD_PORT="${NFS_STATD_PORT:-32765}"
23
+ # Outgoing port must differ from the listen port; rpc.statd exits 255 if they match.
24
+ NFS_STATD_OUTGOING_PORT="${NFS_STATD_OUTGOING_PORT:-32766}"
25
+ NFS_LOCKD_PORT="${NFS_LOCKD_PORT:-32803}"
26
+ NFS_LOCKD_UDP_PORT="${NFS_LOCKD_UDP_PORT:-${NFS_LOCKD_PORT}}"
27
+ NFS_CONF_DROPIN="/etc/nfs.conf.d/99-maas-nfs-v3-ports.conf"
28
+
29
+ case "${NFS_MODE}" in
30
+ v3|v4) ;;
31
+ *)
32
+ echo "[ERROR] NFS_MODE must be 'v3' or 'v4'." >&2
33
+ exit 1
34
+ ;;
35
+ esac
36
+
37
+ # Ensure the kernel NFS server is enabled and actually running. `exportfs -rav` only populates the
38
+ # export table; it does not start nfsd, and `systemctl try-restart` is a no-op when the unit is
39
+ # stopped. Without this, clients hang on mount because nothing listens on 2049/mountd.
40
+ ensure_nfs_server_running() {
41
+ if [[ "${NFS_MODE}" == "v3" ]]; then
42
+ # NFSv3 depends on the portmapper and the status monitor.
43
+ sudo systemctl enable --now rpcbind 2>/dev/null || true
44
+ sudo systemctl enable --now rpc-statd 2>/dev/null || true
45
+ fi
46
+
47
+ local unit=""
48
+ for candidate in nfs-server nfs-kernel-server; do
49
+ if systemctl cat "${candidate}.service" >/dev/null 2>&1; then
50
+ unit="${candidate}"
51
+ break
52
+ fi
53
+ done
54
+ if [[ -z "${unit}" ]]; then
55
+ echo "[ERROR] No NFS server unit found (nfs-server/nfs-kernel-server). Install nfs-utils or nfs-kernel-server." >&2
56
+ return 1
57
+ fi
58
+
59
+ echo "[INFO] Enabling and (re)starting ${unit} to apply exports and fixed ports..."
60
+ sudo systemctl enable "${unit}" 2>/dev/null || true
61
+ sudo systemctl restart "${unit}"
62
+ }
63
+
64
+ echo "[INFO] Enabling firewalld..."
65
+ sudo systemctl enable --now firewalld
66
+
67
+ echo "[INFO] Enabling kernel forwarding..."
68
+ sudo tee /etc/sysctl.d/99-maas-nat.conf >/dev/null <<'EOF'
69
+ net.ipv4.ip_forward = 1
70
+ EOF
71
+
72
+ sudo sysctl --system >/dev/null
73
+
74
+ echo "[INFO] Allowing NAT for the MAAS LAN..."
75
+ sudo firewall-cmd --permanent --zone="${PUBLIC_ZONE}" --add-masquerade
76
+ sudo firewall-cmd --permanent --zone="${TRUSTED_ZONE}" --add-source="${MAAS_LAN_CIDR}"
77
+
78
+ echo "[INFO] Opening MAAS services on the MAAS LAN zone..."
79
+ sudo firewall-cmd --permanent --zone="${TRUSTED_ZONE}" --add-port=5240/tcp
80
+ for service in dns dhcp tftp; do
81
+ sudo firewall-cmd --permanent --zone="${TRUSTED_ZONE}" --add-service="${service}"
82
+ done
83
+
84
+ if [[ "${EXPOSE_MAAS_API_PUBLIC}" == "true" ]]; then
85
+ echo "[INFO] Opening MAAS API on the uplink zone..."
86
+ sudo firewall-cmd --permanent --zone="${PUBLIC_ZONE}" --add-port=5240/tcp
87
+ fi
88
+
89
+ echo "[INFO] Opening NFS ports on the MAAS LAN zone..."
90
+
91
+ if [[ "${NFS_MODE}" == "v4" ]]; then
92
+ # NFSv4 normally needs only TCP 2049.
93
+ sudo firewall-cmd --permanent --zone="${TRUSTED_ZONE}" --add-port=2049/tcp
94
+ else
95
+ # NFSv3 side-band daemons need fixed ports for deterministic firewall rules.
96
+ if [[ "${CONFIGURE_NFS_V3_PORTS}" != "true" ]]; then
97
+ echo "[ERROR] NFSv3 requires CONFIGURE_NFS_V3_PORTS=true for consistent firewalld rules." >&2
98
+ echo "[ERROR] Re-run with CONFIGURE_NFS_V3_PORTS=true or switch to NFS_MODE=v4." >&2
99
+ exit 1
100
+ fi
101
+
102
+ echo "[INFO] Writing fixed NFSv3 port configuration..."
103
+ sudo install -d -m 0755 /etc/nfs.conf.d
104
+ sudo tee "${NFS_CONF_DROPIN}" >/dev/null <<EOF
105
+ [nfsd]
106
+ vers3=y
107
+
108
+ [mountd]
109
+ port=${NFS_MOUNTD_PORT}
110
+
111
+ [statd]
112
+ port=${NFS_STATD_PORT}
113
+ outgoing-port=${NFS_STATD_OUTGOING_PORT}
114
+
115
+ [lockd]
116
+ port=${NFS_LOCKD_PORT}
117
+ udp-port=${NFS_LOCKD_UDP_PORT}
118
+ EOF
119
+
120
+ sudo firewall-cmd --permanent --zone="${TRUSTED_ZONE}" --add-service=rpc-bind
121
+ sudo firewall-cmd --permanent --zone="${TRUSTED_ZONE}" --add-port=2049/tcp
122
+ for proto in tcp udp; do
123
+ sudo firewall-cmd --permanent --zone="${TRUSTED_ZONE}" --add-port="${NFS_MOUNTD_PORT}/${proto}"
124
+ sudo firewall-cmd --permanent --zone="${TRUSTED_ZONE}" --add-port="${NFS_STATD_PORT}/${proto}"
125
+ # Outgoing port is the fixed source for SM_NOTIFY; peers need to reach it.
126
+ sudo firewall-cmd --permanent --zone="${TRUSTED_ZONE}" --add-port="${NFS_STATD_OUTGOING_PORT}/${proto}"
127
+ done
128
+ sudo firewall-cmd --permanent --zone="${TRUSTED_ZONE}" --add-port="${NFS_LOCKD_PORT}/tcp"
129
+ sudo firewall-cmd --permanent --zone="${TRUSTED_ZONE}" --add-port="${NFS_LOCKD_UDP_PORT}/udp"
130
+ fi
131
+
132
+ ensure_nfs_server_running
133
+
134
+ echo "[INFO] Reloading firewall..."
135
+ sudo firewall-cmd --reload
136
+
137
+ echo
138
+ echo "[INFO] Firewall status:"
139
+ sudo firewall-cmd --zone="${PUBLIC_ZONE}" --list-all
140
+ echo
141
+ echo "[INFO] MAAS LAN zone (${TRUSTED_ZONE}):"
142
+ sudo firewall-cmd --zone="${TRUSTED_ZONE}" --list-all
143
+
144
+ echo
145
+ echo "[INFO] MAAS NAT + firewall configuration completed."
@@ -4,39 +4,44 @@ import express from 'express';
4
4
 
5
5
  const logger = loggerFactory(import.meta);
6
6
 
7
- const AtlasSpriteSheetRouter = (options) => {
8
- const router = express.Router();
9
- const authMiddleware = options.authMiddleware;
10
- router.post(
11
- `/generate/:id`,
12
- authMiddleware,
13
- async (req, res) => await AtlasSpriteSheetController.generate(req, res, options),
14
- );
15
- router.delete(
16
- `/object-layer/:id`,
17
- authMiddleware,
18
- async (req, res) => await AtlasSpriteSheetController.deleteByObjectLayerId(req, res, options),
19
- );
20
- router.post(`/:id`, authMiddleware, async (req, res) => await AtlasSpriteSheetController.post(req, res, options));
21
- router.post(`/`, authMiddleware, async (req, res) => await AtlasSpriteSheetController.post(req, res, options));
22
- router.get(`/blob/:itemKey`, async (req, res) => await AtlasSpriteSheetController.blob(req, res, options));
23
- // Metadata endpoints: returns itemKey, atlasWidth, atlasHeight, cellPixelDim, frames (no fileId).
24
- // Client fetches /metadata/:itemKey once, caches it, then fetches /blob/:itemKey for the PNG.
25
- router.get(`/metadata/:itemKey`, async (req, res) => await AtlasSpriteSheetController.getMetadata(req, res, options));
26
- router.get(`/metadata`, async (req, res) => await AtlasSpriteSheetController.getMetadata(req, res, options));
27
- router.get(
28
- `/:id`,
29
- // authMiddleware,
30
- async (req, res) => await AtlasSpriteSheetController.get(req, res, options),
31
- );
32
- router.get(`/`, async (req, res) => await AtlasSpriteSheetController.get(req, res, options));
33
- router.put(`/:id`, authMiddleware, async (req, res) => await AtlasSpriteSheetController.put(req, res, options));
34
- router.put(`/`, authMiddleware, async (req, res) => await AtlasSpriteSheetController.put(req, res, options));
35
- router.delete(`/:id`, authMiddleware, async (req, res) => await AtlasSpriteSheetController.delete(req, res, options));
36
- router.delete(`/`, authMiddleware, async (req, res) => await AtlasSpriteSheetController.delete(req, res, options));
37
- return router;
38
- };
7
+ class AtlasSpriteSheetRouter {
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(
15
+ `/generate/:id`,
16
+ options.authMiddleware,
17
+ async (req, res) => await AtlasSpriteSheetController.generate(req, res, options),
18
+ );
19
+ router.delete(
20
+ `/object-layer/:id`,
21
+ options.authMiddleware,
22
+ async (req, res) => await AtlasSpriteSheetController.deleteByObjectLayerId(req, res, options),
23
+ );
24
+ router.post(`/:id`, options.authMiddleware, async (req, res) => await AtlasSpriteSheetController.post(req, res, options));
25
+ router.post(`/`, options.authMiddleware, async (req, res) => await AtlasSpriteSheetController.post(req, res, options));
26
+ router.get(`/blob/:itemKey`, async (req, res) => await AtlasSpriteSheetController.blob(req, res, options));
27
+ // Metadata endpoints: returns itemKey, atlasWidth, atlasHeight, cellPixelDim, frames (no fileId).
28
+ // Client fetches /metadata/:itemKey once, caches it, then fetches /blob/:itemKey for the PNG.
29
+ router.get(`/metadata/:itemKey`, async (req, res) => await AtlasSpriteSheetController.getMetadata(req, res, options));
30
+ router.get(`/metadata`, async (req, res) => await AtlasSpriteSheetController.getMetadata(req, res, options));
31
+ router.get(
32
+ `/:id`,
33
+ // options.authMiddleware,
34
+ async (req, res) => await AtlasSpriteSheetController.get(req, res, options),
35
+ );
36
+ router.get(`/`, async (req, res) => await AtlasSpriteSheetController.get(req, res, options));
37
+ router.put(`/:id`, options.authMiddleware, async (req, res) => await AtlasSpriteSheetController.put(req, res, options));
38
+ router.put(`/`, options.authMiddleware, async (req, res) => await AtlasSpriteSheetController.put(req, res, options));
39
+ router.delete(`/:id`, options.authMiddleware, async (req, res) => await AtlasSpriteSheetController.delete(req, res, options));
40
+ router.delete(`/`, options.authMiddleware, async (req, res) => await AtlasSpriteSheetController.delete(req, res, options));
41
+ return router;
42
+ }
43
+ }
39
44
 
40
- const ApiRouter = AtlasSpriteSheetRouter;
45
+ const ApiRouter = (options) => AtlasSpriteSheetRouter.router(options);
41
46
 
42
47
  export { ApiRouter, AtlasSpriteSheetRouter };
@@ -1,4 +1,4 @@
1
- import { DataBaseProvider } from '../../db/DataBaseProvider.js';
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 { AtlasSpriteSheetGenerator } from '../../server/atlas-sprite-sheet-generator.js';
@@ -55,9 +55,9 @@ class AtlasSpriteSheetService {
55
55
  static blob = async (req, res, options) => {
56
56
  /** @type {import('./atlas-sprite-sheet.model.js').AtlasSpriteSheetModel} */
57
57
  const AtlasSpriteSheet =
58
- DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.AtlasSpriteSheet;
58
+ DataBaseProviderService.getModel("AtlasSpriteSheet", options);
59
59
  /** @type {import('../file/file.model.js').FileModel} */
60
- const File = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.File;
60
+ const File = DataBaseProviderService.getModel("File", options);
61
61
 
62
62
  const itemKey = req.params.itemKey;
63
63
  const atlasDoc = await AtlasSpriteSheet.findOne({ 'metadata.itemKey': itemKey }).lean();
@@ -70,12 +70,12 @@ class AtlasSpriteSheetService {
70
70
  };
71
71
  static generate = async (req, res, options, generateOptions = {}) => {
72
72
  /** @type {import('../object-layer/object-layer.model.js').ObjectLayerModel} */
73
- const ObjectLayer = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayer;
73
+ const ObjectLayer = DataBaseProviderService.getModel("ObjectLayer", options);
74
74
  /** @type {import('../file/file.model.js').FileModel} */
75
- const File = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.File;
75
+ const File = DataBaseProviderService.getModel("File", options);
76
76
  /** @type {import('./atlas-sprite-sheet.model.js').AtlasSpriteSheetModel} */
77
77
  const AtlasSpriteSheet =
78
- DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.AtlasSpriteSheet;
78
+ DataBaseProviderService.getModel("AtlasSpriteSheet", options);
79
79
 
80
80
  let objectLayer = req.objectLayer;
81
81
 
@@ -195,12 +195,12 @@ class AtlasSpriteSheetService {
195
195
  };
196
196
  static deleteByObjectLayerId = async (req, res, options) => {
197
197
  /** @type {import('../object-layer/object-layer.model.js').ObjectLayerModel} */
198
- const ObjectLayer = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayer;
198
+ const ObjectLayer = DataBaseProviderService.getModel("ObjectLayer", options);
199
199
  /** @type {import('../file/file.model.js').FileModel} */
200
- const File = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.File;
200
+ const File = DataBaseProviderService.getModel("File", options);
201
201
  /** @type {import('./atlas-sprite-sheet.model.js').AtlasSpriteSheetModel} */
202
202
  const AtlasSpriteSheet =
203
- DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.AtlasSpriteSheet;
203
+ DataBaseProviderService.getModel("AtlasSpriteSheet", options);
204
204
 
205
205
  const objectLayer = await ObjectLayer.findById(req.params.id);
206
206
  if (!objectLayer) {
@@ -255,13 +255,13 @@ class AtlasSpriteSheetService {
255
255
  static post = async (req, res, options) => {
256
256
  /** @type {import('./atlas-sprite-sheet.model.js').AtlasSpriteSheetModel} */
257
257
  const AtlasSpriteSheet =
258
- DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.AtlasSpriteSheet;
258
+ DataBaseProviderService.getModel("AtlasSpriteSheet", options);
259
259
  return await new AtlasSpriteSheet(req.body).save();
260
260
  };
261
261
  static get = async (req, res, options) => {
262
262
  /** @type {import('./atlas-sprite-sheet.model.js').AtlasSpriteSheetModel} */
263
263
  const AtlasSpriteSheet =
264
- DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.AtlasSpriteSheet;
264
+ DataBaseProviderService.getModel("AtlasSpriteSheet", options);
265
265
  if (req.params.id)
266
266
  return await AtlasSpriteSheet.findById(req.params.id)
267
267
  .select(AtlasSpriteSheetDto.select.get())
@@ -287,10 +287,10 @@ class AtlasSpriteSheetService {
287
287
  // Client fetches this once per itemKey, caches it, then fetches the PNG blob.
288
288
  static getMetadata = async (req, res, options) => {
289
289
  /** @type {import('../object-layer/object-layer.model.js').ObjectLayerModel} */
290
- const ObjectLayer = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayer;
290
+ const ObjectLayer = DataBaseProviderService.getModel("ObjectLayer", options);
291
291
  /** @type {import('./atlas-sprite-sheet.model.js').AtlasSpriteSheetModel} */
292
292
  const AtlasSpriteSheet =
293
- DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.AtlasSpriteSheet;
293
+ DataBaseProviderService.getModel("AtlasSpriteSheet", options);
294
294
 
295
295
  if (req.params.itemKey) {
296
296
  const doc = await AtlasSpriteSheet.findOne({ 'metadata.itemKey': req.params.itemKey })
@@ -329,15 +329,15 @@ class AtlasSpriteSheetService {
329
329
  static put = async (req, res, options) => {
330
330
  /** @type {import('./atlas-sprite-sheet.model.js').AtlasSpriteSheetModel} */
331
331
  const AtlasSpriteSheet =
332
- DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.AtlasSpriteSheet;
332
+ DataBaseProviderService.getModel("AtlasSpriteSheet", options);
333
333
  return await AtlasSpriteSheet.findByIdAndUpdate(req.params.id, req.body);
334
334
  };
335
335
  static delete = async (req, res, options) => {
336
336
  /** @type {import('./atlas-sprite-sheet.model.js').AtlasSpriteSheetModel} */
337
337
  const AtlasSpriteSheet =
338
- DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.AtlasSpriteSheet;
338
+ DataBaseProviderService.getModel("AtlasSpriteSheet", options);
339
339
  /** @type {import('../file/file.model.js').FileModel} */
340
- const File = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.File;
340
+ const File = DataBaseProviderService.getModel("File", options);
341
341
 
342
342
  if (req.params.id) {
343
343
  const atlasDoc = await AtlasSpriteSheet.findById(req.params.id);
@@ -5,20 +5,25 @@ import express from 'express';
5
5
 
6
6
  const logger = loggerFactory(import.meta);
7
7
 
8
- const CoreRouter = (options) => {
9
- const router = express.Router();
10
- const authMiddleware = options.authMiddleware;
11
- router.post(`/:id`, authMiddleware, adminGuard, async (req, res) => await CoreController.post(req, res, options));
12
- router.post(`/`, authMiddleware, adminGuard, async (req, res) => await CoreController.post(req, res, options));
13
- router.get(`/:id`, authMiddleware, adminGuard, async (req, res) => await CoreController.get(req, res, options));
14
- router.get(`/`, authMiddleware, adminGuard, async (req, res) => await CoreController.get(req, res, options));
15
- router.put(`/:id`, authMiddleware, adminGuard, async (req, res) => await CoreController.put(req, res, options));
16
- router.put(`/`, authMiddleware, adminGuard, async (req, res) => await CoreController.put(req, res, options));
17
- router.delete(`/:id`, authMiddleware, adminGuard, async (req, res) => await CoreController.delete(req, res, options));
18
- router.delete(`/`, authMiddleware, adminGuard, async (req, res) => await CoreController.delete(req, res, options));
19
- return router;
20
- };
8
+ class CoreRouter {
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 CoreController.post(req, res, options));
16
+ router.post(`/`, options.authMiddleware, adminGuard, async (req, res) => await CoreController.post(req, res, options));
17
+ router.get(`/:id`, options.authMiddleware, adminGuard, async (req, res) => await CoreController.get(req, res, options));
18
+ router.get(`/`, options.authMiddleware, adminGuard, async (req, res) => await CoreController.get(req, res, options));
19
+ router.put(`/:id`, options.authMiddleware, adminGuard, async (req, res) => await CoreController.put(req, res, options));
20
+ router.put(`/`, options.authMiddleware, adminGuard, async (req, res) => await CoreController.put(req, res, options));
21
+ router.delete(`/:id`, options.authMiddleware, adminGuard, async (req, res) => await CoreController.delete(req, res, options));
22
+ router.delete(`/`, options.authMiddleware, adminGuard, async (req, res) => await CoreController.delete(req, res, options));
23
+ return router;
24
+ }
25
+ }
21
26
 
22
- const ApiRouter = CoreRouter;
27
+ const ApiRouter = (options) => CoreRouter.router(options);
23
28
 
24
29
  export { ApiRouter, CoreRouter };
@@ -1,4 +1,4 @@
1
- import { DataBaseProvider } from '../../db/DataBaseProvider.js';
1
+ import { DataBaseProviderService } from '../../db/DataBaseProvider.js';
2
2
  import { loggerFactory } from '../../server/logger.js';
3
3
  import { shellExec } from '../../server/process.js';
4
4
 
@@ -7,22 +7,22 @@ const logger = loggerFactory(import.meta);
7
7
  class CoreService {
8
8
  static post = async (req, res, options) => {
9
9
  /** @type {import('./core.model.js').CoreModel} */
10
- const Core = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.Core;
10
+ const Core = DataBaseProviderService.getModel("Core", options);
11
11
  return await new Core(req.body).save();
12
12
  };
13
13
  static get = async (req, res, options) => {
14
14
  /** @type {import('./core.model.js').CoreModel} */
15
- const Core = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.Core;
15
+ const Core = DataBaseProviderService.getModel("Core", options);
16
16
  return await Core.findById(req.params.id);
17
17
  };
18
18
  static put = async (req, res, options) => {
19
19
  /** @type {import('./core.model.js').CoreModel} */
20
- const Core = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.Core;
20
+ const Core = DataBaseProviderService.getModel("Core", options);
21
21
  return await Core.findByIdAndUpdate(req.params.id, req.body);
22
22
  };
23
23
  static delete = async (req, res, options) => {
24
24
  /** @type {import('./core.model.js').CoreModel} */
25
- const Core = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.Core;
25
+ const Core = DataBaseProviderService.getModel("Core", options);
26
26
  return await Core.findByIdAndDelete(req.params.id);
27
27
  };
28
28
  }
@@ -1,20 +1,26 @@
1
1
  import { loggerFactory } from '../../server/logger.js';
2
2
  import { CryptoController } from './crypto.controller.js';
3
3
  import express from 'express';
4
+
4
5
  const logger = loggerFactory(import.meta);
5
6
 
6
- const CryptoRouter = (options) => {
7
- const router = express.Router();
8
- const authMiddleware = options.authMiddleware;
9
- router.post(`/:id`, async (req, res) => await CryptoController.post(req, res, options));
10
- router.post(`/`, authMiddleware, async (req, res) => await CryptoController.post(req, res, options));
11
- router.get(`/:id`, async (req, res) => await CryptoController.get(req, res, options));
12
- router.get(`/`, async (req, res) => await CryptoController.get(req, res, options));
13
- router.delete(`/:id`, async (req, res) => await CryptoController.delete(req, res, options));
14
- router.delete(`/`, async (req, res) => await CryptoController.delete(req, res, options));
15
- return router;
16
- };
7
+ class CryptoRouter {
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`, async (req, res) => await CryptoController.post(req, res, options));
15
+ router.post(`/`, options.authMiddleware, async (req, res) => await CryptoController.post(req, res, options));
16
+ router.get(`/:id`, async (req, res) => await CryptoController.get(req, res, options));
17
+ router.get(`/`, async (req, res) => await CryptoController.get(req, res, options));
18
+ router.delete(`/:id`, async (req, res) => await CryptoController.delete(req, res, options));
19
+ router.delete(`/`, async (req, res) => await CryptoController.delete(req, res, options));
20
+ return router;
21
+ }
22
+ }
17
23
 
18
- const ApiRouter = CryptoRouter;
24
+ const ApiRouter = (options) => CryptoRouter.router(options);
19
25
 
20
26
  export { ApiRouter, CryptoRouter };
@@ -1,14 +1,14 @@
1
1
  import { loggerFactory } from '../../server/logger.js';
2
2
  import crypto from 'crypto';
3
- import { DataBaseProvider } from '../../db/DataBaseProvider.js';
3
+ import { DataBaseProviderService } from '../../db/DataBaseProvider.js';
4
4
  const logger = loggerFactory(import.meta);
5
5
 
6
6
  class CryptoService {
7
7
  static post = async (req, res, options) => {
8
8
  /** @type {import('./crypto.model.js').CryptoModel} */
9
- const Crypto = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.Crypto;
9
+ const Crypto = DataBaseProviderService.getModel("Crypto", options);
10
10
  /** @type {import('../user/user.model.js').UserModel} */
11
- const User = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.User;
11
+ const User = DataBaseProviderService.getModel("User", options);
12
12
 
13
13
  switch (req.params.id) {
14
14
  case 'verify': {
@@ -1,5 +1,5 @@
1
1
  import { Schema, model } from 'mongoose';
2
- import { CYBERIA_ACTION_TYPES } from '../../client/components/cyberia-portal/CommonCyberiaPortal.js';
2
+ import { CYBERIA_ACTION_TYPES } from '../../client/components/cyberia/SharedDefaultsCyberia.js';
3
3
 
4
4
  // https://mongoosejs.com/docs/2.7.x/docs/schematypes.html
5
5
 
@@ -4,24 +4,28 @@ import express from 'express';
4
4
 
5
5
  const logger = loggerFactory(import.meta);
6
6
 
7
- const CyberiaActionRouter = (options) => {
8
- const router = express.Router();
9
- const authMiddleware = options.authMiddleware;
10
- router.post(`/:id`, async (req, res) => await CyberiaActionController.post(req, res, options));
11
- router.post(`/`, async (req, res) => await CyberiaActionController.post(req, res, options));
12
- router.get(
13
- `/:id`,
14
- // authMiddleware,
15
- async (req, res) => await CyberiaActionController.get(req, res, options),
16
- );
17
- router.get(`/`, async (req, res) => await CyberiaActionController.get(req, res, options));
18
- router.put(`/:id`, async (req, res) => await CyberiaActionController.put(req, res, options));
19
- router.put(`/`, async (req, res) => await CyberiaActionController.put(req, res, options));
20
- router.delete(`/:id`, async (req, res) => await CyberiaActionController.delete(req, res, options));
21
- router.delete(`/`, async (req, res) => await CyberiaActionController.delete(req, res, options));
22
- return router;
23
- };
7
+ class CyberiaActionRouter {
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`, async (req, res) => await CyberiaActionController.post(req, res, options));
15
+ router.post(`/`, async (req, res) => await CyberiaActionController.post(req, res, options));
16
+ router.get(`/:id`,
17
+ // options.authMiddleware,
18
+ async (req, res) => await CyberiaActionController.get(req, res, options),
19
+ );
20
+ router.get(`/`, async (req, res) => await CyberiaActionController.get(req, res, options));
21
+ router.put(`/:id`, async (req, res) => await CyberiaActionController.put(req, res, options));
22
+ router.put(`/`, async (req, res) => await CyberiaActionController.put(req, res, options));
23
+ router.delete(`/:id`, async (req, res) => await CyberiaActionController.delete(req, res, options));
24
+ router.delete(`/`, async (req, res) => await CyberiaActionController.delete(req, res, options));
25
+ return router;
26
+ }
27
+ }
24
28
 
25
- const ApiRouter = CyberiaActionRouter;
29
+ const ApiRouter = (options) => CyberiaActionRouter.router(options);
26
30
 
27
31
  export { ApiRouter, CyberiaActionRouter };
@@ -1,4 +1,4 @@
1
- import { DataBaseProvider } from '../../db/DataBaseProvider.js';
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
 
@@ -7,12 +7,12 @@ const logger = loggerFactory(import.meta);
7
7
  class CyberiaActionService {
8
8
  static post = async (req, res, options) => {
9
9
  /** @type {import('./cyberia-action.model.js').CyberiaActionModel} */
10
- const CyberiaAction = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaAction;
10
+ const CyberiaAction = DataBaseProviderService.getModel("CyberiaAction", options);
11
11
  return await new CyberiaAction(req.body).save();
12
12
  };
13
13
  static get = async (req, res, options) => {
14
14
  /** @type {import('./cyberia-action.model.js').CyberiaActionModel} */
15
- const CyberiaAction = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaAction;
15
+ const CyberiaAction = DataBaseProviderService.getModel("CyberiaAction", options);
16
16
  if (req.params.id) return await CyberiaAction.findById(req.params.id);
17
17
 
18
18
  // Parse query parameters using DataQuery helper
@@ -28,12 +28,12 @@ class CyberiaActionService {
28
28
  };
29
29
  static put = async (req, res, options) => {
30
30
  /** @type {import('./cyberia-action.model.js').CyberiaActionModel} */
31
- const CyberiaAction = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaAction;
31
+ const CyberiaAction = DataBaseProviderService.getModel("CyberiaAction", options);
32
32
  return await CyberiaAction.findByIdAndUpdate(req.params.id, req.body);
33
33
  };
34
34
  static delete = async (req, res, options) => {
35
35
  /** @type {import('./cyberia-action.model.js').CyberiaActionModel} */
36
- const CyberiaAction = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaAction;
36
+ const CyberiaAction = DataBaseProviderService.getModel("CyberiaAction", options);
37
37
  if (req.params.id) return await CyberiaAction.findByIdAndDelete(req.params.id);
38
38
  else return await CyberiaAction.deleteMany();
39
39
  };
@@ -0,0 +1,74 @@
1
+ import { loggerFactory } from '../../server/logger.js';
2
+ import { CyberiaClientHintsService } from './cyberia-client-hints.service.js';
3
+
4
+ const logger = loggerFactory(import.meta);
5
+
6
+ class CyberiaClientHintsController {
7
+ static post = async (req, res, options) => {
8
+ try {
9
+ const result = await CyberiaClientHintsService.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 CyberiaClientHintsService.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 CyberiaClientHintsService.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 CyberiaClientHintsService.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 { CyberiaClientHintsController };