cyberia 3.2.5 → 3.2.9

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 (301) hide show
  1. package/.github/workflows/engine-cyberia.cd.yml +2 -2
  2. package/.github/workflows/release.cd.yml +1 -2
  3. package/CHANGELOG.md +351 -1
  4. package/CLI-HELP.md +40 -13
  5. package/Dockerfile +0 -4
  6. package/README.md +242 -497
  7. package/bin/build.js +19 -5
  8. package/bin/cyberia.js +1149 -240
  9. package/bin/deploy.js +570 -1
  10. package/bin/file.js +6 -0
  11. package/bin/index.js +1149 -240
  12. package/bin/vs.js +1 -1
  13. package/conf.js +67 -89
  14. package/deployment.yaml +4 -222
  15. package/hardhat/package-lock.json +32 -32
  16. package/hardhat/package.json +3 -3
  17. package/jsconfig.json +1 -1
  18. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +2 -2
  19. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +2 -2
  20. package/manifests/deployment/dd-cyberia-development/deployment.yaml +4 -222
  21. package/manifests/deployment/dd-cyberia-development/proxy.yaml +10 -118
  22. package/manifests/deployment/dd-default-development/deployment.yaml +2 -6
  23. package/manifests/deployment/dd-test-development/deployment.yaml +136 -66
  24. package/manifests/deployment/dd-test-development/proxy.yaml +41 -5
  25. package/package.json +23 -14
  26. package/proxy.yaml +10 -118
  27. package/scripts/k3s-node-setup.sh +2 -2
  28. package/scripts/nat-iptables.sh +103 -18
  29. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +18 -18
  30. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +7 -14
  31. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +76 -21
  32. package/src/api/core/core.controller.js +10 -10
  33. package/src/api/core/core.service.js +10 -10
  34. package/src/api/crypto/crypto.controller.js +8 -8
  35. package/src/api/crypto/crypto.service.js +8 -8
  36. package/src/api/cyberia-action/cyberia-action.controller.js +74 -0
  37. package/src/api/cyberia-action/cyberia-action.model.js +87 -0
  38. package/src/api/cyberia-action/cyberia-action.router.js +27 -0
  39. package/src/api/cyberia-action/cyberia-action.service.js +42 -0
  40. package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +13 -13
  41. package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +11 -11
  42. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +2 -2
  43. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +16 -16
  44. package/src/api/cyberia-entity/cyberia-entity.controller.js +10 -10
  45. package/src/api/cyberia-entity/cyberia-entity.service.js +10 -10
  46. package/src/api/cyberia-instance/cyberia-fallback-world.js +19 -209
  47. package/src/api/cyberia-instance/cyberia-instance.controller.js +14 -14
  48. package/src/api/cyberia-instance/cyberia-instance.model.js +3 -0
  49. package/src/api/cyberia-instance/cyberia-instance.service.js +22 -57
  50. package/src/api/cyberia-instance/cyberia-portal-connector.js +20 -246
  51. package/src/api/cyberia-instance/cyberia-world-generator.js +505 -0
  52. package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +10 -10
  53. package/src/api/cyberia-instance-conf/cyberia-instance-conf.defaults.js +216 -55
  54. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +4 -1
  55. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +18 -14
  56. package/src/api/cyberia-map/cyberia-map.controller.js +10 -10
  57. package/src/api/cyberia-map/cyberia-map.service.js +10 -10
  58. package/src/api/cyberia-quest/cyberia-quest.controller.js +74 -0
  59. package/src/api/cyberia-quest/cyberia-quest.model.js +67 -0
  60. package/src/api/cyberia-quest/cyberia-quest.router.js +27 -0
  61. package/src/api/cyberia-quest/cyberia-quest.service.js +42 -0
  62. package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +74 -0
  63. package/src/api/cyberia-quest-progress/cyberia-quest-progress.model.js +49 -0
  64. package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +27 -0
  65. package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +42 -0
  66. package/src/api/default/default.controller.js +10 -10
  67. package/src/api/default/default.service.js +10 -10
  68. package/src/api/document/document.controller.js +12 -12
  69. package/src/api/document/document.model.js +10 -16
  70. package/src/api/file/file.controller.js +8 -8
  71. package/src/api/file/file.model.js +10 -10
  72. package/src/api/file/file.service.js +36 -36
  73. package/src/api/instance/instance.controller.js +10 -10
  74. package/src/api/instance/instance.model.js +4 -10
  75. package/src/api/instance/instance.service.js +10 -10
  76. package/src/api/ipfs/ipfs.controller.js +12 -12
  77. package/src/api/ipfs/ipfs.model.js +4 -13
  78. package/src/api/ipfs/ipfs.service.js +14 -28
  79. package/src/api/object-layer/object-layer.controller.js +12 -12
  80. package/src/api/object-layer/object-layer.model.js +4 -17
  81. package/src/api/object-layer/object-layer.service.js +12 -12
  82. package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +10 -10
  83. package/src/api/object-layer-render-frames/object-layer-render-frames.model.js +6 -16
  84. package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +18 -14
  85. package/src/api/test/test.controller.js +8 -8
  86. package/src/api/test/test.service.js +8 -8
  87. package/src/api/user/guest.service.js +99 -0
  88. package/src/api/user/user.controller.js +6 -6
  89. package/src/api/user/user.model.js +8 -13
  90. package/src/api/user/user.service.js +3 -20
  91. package/src/cli/cluster.js +61 -14
  92. package/src/cli/db.js +47 -2
  93. package/src/cli/deploy.js +67 -35
  94. package/src/cli/fs.js +79 -8
  95. package/src/cli/image.js +43 -1
  96. package/src/cli/index.js +26 -1
  97. package/src/cli/release.js +57 -1
  98. package/src/cli/repository.js +69 -31
  99. package/src/cli/run.js +415 -36
  100. package/src/cli/ssh.js +1 -1
  101. package/src/cli/static.js +43 -115
  102. package/src/client/Cryptokoyn.index.js +18 -21
  103. package/src/client/CyberiaPortal.index.js +19 -23
  104. package/src/client/Default.index.js +21 -33
  105. package/src/client/Itemledger.index.js +20 -26
  106. package/src/client/Underpost.index.js +19 -23
  107. package/src/client/components/core/404.js +4 -4
  108. package/src/client/components/core/500.js +4 -4
  109. package/src/client/components/core/Account.js +73 -60
  110. package/src/client/components/core/AgGrid.js +23 -33
  111. package/src/client/components/core/Alert.js +12 -13
  112. package/src/client/components/core/AppStore.js +1 -1
  113. package/src/client/components/core/Auth.js +35 -37
  114. package/src/client/components/core/Badge.js +7 -13
  115. package/src/client/components/core/BtnIcon.js +15 -17
  116. package/src/client/components/core/CalendarCore.js +42 -63
  117. package/src/client/components/core/Chat.js +13 -15
  118. package/src/client/components/core/ClientEvents.js +87 -0
  119. package/src/client/components/core/ColorPaletteElement.js +309 -0
  120. package/src/client/components/core/Content.js +17 -14
  121. package/src/client/components/core/Css.js +15 -71
  122. package/src/client/components/core/CssCore.js +12 -16
  123. package/src/client/components/core/D3Chart.js +4 -4
  124. package/src/client/components/core/Docs.js +64 -91
  125. package/src/client/components/core/DropDown.js +69 -91
  126. package/src/client/components/core/EventBus.js +92 -0
  127. package/src/client/components/core/EventsUI.js +14 -17
  128. package/src/client/components/core/FileExplorer.js +96 -228
  129. package/src/client/components/core/FullScreen.js +47 -75
  130. package/src/client/components/core/Input.js +24 -69
  131. package/src/client/components/core/Keyboard.js +25 -18
  132. package/src/client/components/core/KeyboardAvoidance.js +145 -0
  133. package/src/client/components/core/LoadingAnimation.js +25 -31
  134. package/src/client/components/core/LogIn.js +41 -41
  135. package/src/client/components/core/LogOut.js +23 -14
  136. package/src/client/components/core/Modal.js +462 -178
  137. package/src/client/components/core/NotificationManager.js +14 -18
  138. package/src/client/components/core/Panel.js +54 -50
  139. package/src/client/components/core/PanelForm.js +25 -125
  140. package/src/client/components/core/Polyhedron.js +110 -214
  141. package/src/client/components/core/PublicProfile.js +39 -32
  142. package/src/client/components/core/Recover.js +48 -44
  143. package/src/client/components/core/Responsive.js +88 -32
  144. package/src/client/components/core/RichText.js +9 -18
  145. package/src/client/components/core/Router.js +24 -3
  146. package/src/client/components/core/SearchBox.js +37 -37
  147. package/src/client/components/core/SignUp.js +39 -30
  148. package/src/client/components/core/SocketIo.js +31 -2
  149. package/src/client/components/core/SocketIoHandler.js +6 -6
  150. package/src/client/components/core/ToggleSwitch.js +8 -20
  151. package/src/client/components/core/ToolTip.js +5 -17
  152. package/src/client/components/core/Translate.js +56 -59
  153. package/src/client/components/core/Validator.js +26 -16
  154. package/src/client/components/core/Wallet.js +15 -26
  155. package/src/client/components/core/Worker.js +163 -27
  156. package/src/client/components/core/windowGetDimensions.js +7 -7
  157. package/src/client/components/cryptokoyn/{MenuCryptokoyn.js → AppShellCryptokoyn.js} +57 -57
  158. package/src/client/components/cryptokoyn/CssCryptokoyn.js +15 -15
  159. package/src/client/components/cryptokoyn/LogInCryptokoyn.js +6 -4
  160. package/src/client/components/cryptokoyn/LogOutCryptokoyn.js +6 -4
  161. package/src/client/components/cryptokoyn/RouterCryptokoyn.js +37 -0
  162. package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +4 -4
  163. package/src/client/components/cryptokoyn/SignUpCryptokoyn.js +6 -4
  164. package/src/client/components/cyberia/InstanceEngineCyberia.js +141 -60
  165. package/src/client/components/cyberia/MapEngineCyberia.js +691 -214
  166. package/src/client/components/cyberia/ObjectLayerEngine.js +19 -0
  167. package/src/client/components/cyberia/ObjectLayerEngineModal.js +1204 -94
  168. package/src/client/components/cyberia/ObjectLayerEngineViewer.js +196 -298
  169. package/src/client/components/cyberia-portal/{MenuCyberiaPortal.js → AppShellCyberiaPortal.js} +102 -102
  170. package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +305 -61
  171. package/src/client/components/cyberia-portal/CssCyberiaPortal.js +15 -15
  172. package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +6 -4
  173. package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +6 -4
  174. package/src/client/components/cyberia-portal/MainBodyCyberiaPortal.js +4 -4
  175. package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +60 -0
  176. package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +4 -4
  177. package/src/client/components/cyberia-portal/SignUpCyberiaPortal.js +6 -4
  178. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +4 -4
  179. package/src/client/components/default/{MenuDefault.js → AppShellDefault.js} +87 -87
  180. package/src/client/components/default/CssDefault.js +12 -12
  181. package/src/client/components/default/LogInDefault.js +6 -4
  182. package/src/client/components/default/LogOutDefault.js +6 -4
  183. package/src/client/components/default/RouterDefault.js +47 -0
  184. package/src/client/components/default/SettingsDefault.js +4 -4
  185. package/src/client/components/default/SignUpDefault.js +6 -4
  186. package/src/client/components/default/TranslateDefault.js +3 -3
  187. package/src/client/components/itemledger/{MenuItemledger.js → AppShellItemledger.js} +57 -57
  188. package/src/client/components/itemledger/CssItemledger.js +15 -15
  189. package/src/client/components/itemledger/LogInItemledger.js +6 -4
  190. package/src/client/components/itemledger/LogOutItemledger.js +6 -4
  191. package/src/client/components/itemledger/RouterItemledger.js +38 -0
  192. package/src/client/components/itemledger/SettingsItemledger.js +4 -4
  193. package/src/client/components/itemledger/SignUpItemledger.js +6 -4
  194. package/src/client/components/itemledger/TranslateItemledger.js +3 -3
  195. package/src/client/components/underpost/{MenuUnderpost.js → AppShellUnderpost.js} +88 -88
  196. package/src/client/components/underpost/CssUnderpost.js +14 -14
  197. package/src/client/components/underpost/CyberpunkBloggerUnderpost.js +4 -4
  198. package/src/client/components/underpost/DocumentSearchProvider.js +1 -1
  199. package/src/client/components/underpost/LabGalleryUnderpost.js +12 -15
  200. package/src/client/components/underpost/LogInUnderpost.js +6 -4
  201. package/src/client/components/underpost/LogOutUnderpost.js +6 -4
  202. package/src/client/components/underpost/RouterUnderpost.js +45 -0
  203. package/src/client/components/underpost/SettingsUnderpost.js +4 -4
  204. package/src/client/components/underpost/SignUpUnderpost.js +6 -4
  205. package/src/client/components/underpost/TranslateUnderpost.js +4 -4
  206. package/src/client/public/cyberia-docs/ACTION-SYSTEM.md +235 -0
  207. package/src/client/public/cyberia-docs/ARCHITECTURE.md +443 -0
  208. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +417 -0
  209. package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +313 -0
  210. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +260 -0
  211. package/src/client/public/cyberia-docs/ENTITY-PROFILE.md +241 -0
  212. package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +300 -0
  213. package/src/client/public/cyberia-docs/OFF-CHAIN-ECONOMY.md +279 -0
  214. package/src/client/public/cyberia-docs/QUEST-SYSTEM.md +206 -0
  215. package/src/client/public/cyberia-docs/ROADMAP.md +240 -0
  216. package/src/client/public/cyberia-docs/WHITE-PAPER.md +732 -0
  217. package/src/client/services/atlas-sprite-sheet/atlas-sprite-sheet.service.js +14 -20
  218. package/src/client/services/core/core.service.js +17 -49
  219. package/src/client/services/crypto/crypto.service.js +8 -13
  220. package/src/client/services/cyberia-action/cyberia-action.service.js +99 -0
  221. package/src/client/services/cyberia-dialogue/cyberia-dialogue.service.js +10 -16
  222. package/src/client/services/cyberia-entity/cyberia-entity.management.js +5 -5
  223. package/src/client/services/cyberia-entity/cyberia-entity.service.js +10 -16
  224. package/src/client/services/cyberia-instance/cyberia-instance.management.js +6 -6
  225. package/src/client/services/cyberia-instance/cyberia-instance.service.js +12 -18
  226. package/src/client/services/cyberia-instance-conf/cyberia-instance-conf.service.js +10 -16
  227. package/src/client/services/cyberia-map/cyberia-map.management.js +6 -6
  228. package/src/client/services/cyberia-map/cyberia-map.service.js +12 -18
  229. package/src/client/services/cyberia-quest/cyberia-quest.service.js +99 -0
  230. package/src/client/services/cyberia-quest-progress/cyberia-quest-progress.service.js +99 -0
  231. package/src/client/services/default/default.management.js +159 -267
  232. package/src/client/services/default/default.service.js +10 -16
  233. package/src/client/services/document/document.service.js +14 -19
  234. package/src/client/services/file/file.service.js +8 -13
  235. package/src/client/services/instance/instance.management.js +5 -5
  236. package/src/client/services/instance/instance.service.js +10 -15
  237. package/src/client/services/ipfs/ipfs.service.js +12 -18
  238. package/src/client/services/object-layer/object-layer.management.js +12 -12
  239. package/src/client/services/object-layer/object-layer.service.js +20 -26
  240. package/src/client/services/object-layer-render-frames/object-layer-render-frames.service.js +10 -16
  241. package/src/client/services/test/test.service.js +8 -13
  242. package/src/client/services/user/guest.service.js +86 -0
  243. package/src/client/services/user/user.management.js +5 -5
  244. package/src/client/services/user/user.service.js +14 -20
  245. package/src/client/ssr/body/404.js +3 -3
  246. package/src/client/ssr/body/500.js +3 -3
  247. package/src/client/ssr/body/CacheControl.js +5 -2
  248. package/src/client/ssr/body/DefaultSplashScreen.js +19 -12
  249. package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +13 -6
  250. package/src/client/ssr/head/PwaItemledger.js +197 -60
  251. package/src/client/ssr/mailer/DefaultRecoverEmail.js +19 -20
  252. package/src/client/ssr/mailer/DefaultVerifyEmail.js +15 -16
  253. package/src/client/ssr/offline/Maintenance.js +12 -11
  254. package/src/client/ssr/offline/NoNetworkConnection.js +3 -3
  255. package/src/client/ssr/pages/Test.js +2 -2
  256. package/src/client/sw/core.sw.js +212 -0
  257. package/src/grpc/cyberia/grpc-server.js +179 -67
  258. package/src/index.js +1 -1
  259. package/src/runtime/cyberia-client/Dockerfile +80 -0
  260. package/src/runtime/cyberia-server/Dockerfile +37 -0
  261. package/src/runtime/express/Dockerfile +4 -4
  262. package/src/runtime/lampp/Dockerfile +8 -7
  263. package/src/runtime/wp/Dockerfile +11 -17
  264. package/src/server/atlas-sprite-sheet-generator.js +4 -2
  265. package/src/server/client-build-docs.js +45 -46
  266. package/src/server/client-build.js +334 -60
  267. package/src/server/client-formatted.js +47 -16
  268. package/src/server/conf.js +5 -4
  269. package/src/server/data-query.js +32 -20
  270. package/src/server/dns.js +22 -0
  271. package/src/server/ipfs-client.js +232 -91
  272. package/src/server/object-layer.js +1 -6
  273. package/src/server/process.js +13 -27
  274. package/src/server/semantic-layer-generator-floor.js +11 -51
  275. package/src/server/semantic-layer-generator-resource.js +259 -0
  276. package/src/server/semantic-layer-generator-skin.js +41 -171
  277. package/src/server/semantic-layer-generator.js +122 -14
  278. package/src/server/shape-generator.js +108 -0
  279. package/src/server/start.js +17 -3
  280. package/src/server/valkey.js +141 -235
  281. package/tsconfig.docs.json +15 -0
  282. package/typedoc.dd-cyberia.json +29 -0
  283. package/typedoc.json +29 -0
  284. package/WHITE-PAPER.md +0 -1540
  285. package/hardhat/README.md +0 -531
  286. package/hardhat/WHITE-PAPER.md +0 -1540
  287. package/jsdoc.dd-cyberia.json +0 -68
  288. package/jsdoc.json +0 -68
  289. package/src/api/object-layer/README.md +0 -672
  290. package/src/client/components/core/ColorPalette.js +0 -5267
  291. package/src/client/components/core/JoyStick.js +0 -80
  292. package/src/client/components/cryptokoyn/RoutesCryptokoyn.js +0 -39
  293. package/src/client/components/cyberia-portal/RoutesCyberiaPortal.js +0 -62
  294. package/src/client/components/cyberia-portal/ServerCyberiaPortal.js +0 -136
  295. package/src/client/components/default/RoutesDefault.js +0 -49
  296. package/src/client/components/itemledger/RoutesItemledger.js +0 -40
  297. package/src/client/components/underpost/RoutesUnderpost.js +0 -47
  298. package/src/client/sw/default.sw.js +0 -127
  299. package/src/client/sw/template.sw.js +0 -84
  300. package/src/grpc/cyberia/OFF_CHAIN_ECONOMY.md +0 -305
  301. package/src/grpc/cyberia/README.md +0 -326
@@ -1,14 +1,23 @@
1
1
  /**
2
2
  * Canonical default values and type definitions for a CyberiaInstanceConf document.
3
3
  *
4
- * Single source of truth used by:
4
+ * Canonical config defaults used by:
5
5
  * - cyberia-instance-conf.model.js — Mongoose schema `default:` declarations
6
6
  * - grpc-server.js — FALLBACK_CONFIG_DEFAULTS for missing instances
7
- * - bin/cyberia.js — imports ITEM_TYPES for asset type enumeration
7
+ *
8
+ * The canonical entity-type ↔ item-type relationship lives in:
9
+ * - src/client/components/cyberia-portal/CommonCyberiaPortal.js
10
+ *
11
+ * This file derives its item/entity type enums from that shared module.
8
12
  *
9
13
  * @module src/api/cyberia-instance-conf/cyberia-instance-conf.defaults.js
10
14
  */
11
15
 
16
+ import {
17
+ ITEM_TYPES as SHARED_ITEM_TYPES,
18
+ ENTITY_TYPES as SHARED_ENTITY_TYPES,
19
+ } from '../../client/components/cyberia-portal/CommonCyberiaPortal.js';
20
+
12
21
  // ── Item type registry ───────────────────────────────────────────────────────
13
22
  /**
14
23
  * Canonical set of ObjectLayer item type names, used as asset directory names
@@ -19,16 +28,10 @@
19
28
  * determined separately by `get_priority_for_type()` in entity_render.c.
20
29
  *
21
30
  * @constant
22
- * @type {Readonly<{floor:string, skin:string, breastplate:string, weapon:string, skill:string, coin:string}>}
31
+ * @type {Readonly<Record<string, string>>}
23
32
  */
24
- export const ITEM_TYPES = Object.freeze({
25
- floor: 'floor',
26
- skin: 'skin',
27
- breastplate: 'breastplate',
28
- weapon: 'weapon',
29
- skill: 'skill',
30
- coin: 'coin',
31
- });
33
+ export const ITEM_TYPES = SHARED_ITEM_TYPES;
34
+ export const ENTITY_TYPES = SHARED_ENTITY_TYPES;
32
35
 
33
36
  // ── Entity Status Indicator (ESI) registry ───────────────────────────────────
34
37
  /**
@@ -46,7 +49,7 @@ export const ITEM_TYPES = Object.freeze({
46
49
  * UO: skull for murderers, shield for invulnerables
47
50
  *
48
51
  * IMPORTANT: The numeric IDs MUST stay in sync with:
49
- * - Go: cyberia-server/src/entity_status.go (StatusNone … StatusDead)
52
+ * - Go: cyberia-server/src/entity_status.go (StatusNone … StatusResourceExtracted)
50
53
  *
51
54
  * @constant
52
55
  */
@@ -99,6 +102,30 @@ export const STATUS_ICONS = Object.freeze([
99
102
  borderColor: { r: 160, g: 130, b: 200, a: 200 },
100
103
  description: 'Entity is dead / respawning',
101
104
  },
105
+ {
106
+ id: 6,
107
+ name: 'resource',
108
+ iconId: 'arrow-down-gray',
109
+ bounce: false,
110
+ borderColor: { r: 100, g: 180, b: 80, a: 220 },
111
+ description: 'Resource entity — static, exploitable (wood, minerals, etc.)',
112
+ },
113
+ {
114
+ id: 7,
115
+ name: 'resource-extracted',
116
+ iconId: 'clock',
117
+ bounce: false,
118
+ borderColor: { r: 160, g: 130, b: 200, a: 200 },
119
+ description: 'Resource entity extracted/depleted (dead state)',
120
+ },
121
+ {
122
+ id: 8,
123
+ name: 'action-provider',
124
+ iconId: 'chat',
125
+ bounce: true,
126
+ borderColor: { r: 220, g: 190, b: 60, a: 240 },
127
+ description: 'Bot with available quest-talk/shop/storage/craft actions',
128
+ },
102
129
  ]);
103
130
 
104
131
  // ── Equipment rules ──────────────────────────────────────────────────────────
@@ -122,7 +149,7 @@ export const STATUS_ICONS = Object.freeze([
122
149
  export const EQUIPMENT_RULES_DEFAULTS = Object.freeze({
123
150
  // Item types that players are allowed to activate (equip).
124
151
  // Types not in this list are non-activable (coins, floors, etc.).
125
- activeItemTypes: ['skin', 'breastplate', 'weapon'],
152
+ activeItemTypes: [ITEM_TYPES.skin, ITEM_TYPES.breastplate, ITEM_TYPES.weapon],
126
153
  // Enforce at most one active item per item type.
127
154
  onePerType: true,
128
155
  // Require at least one active skin when the player owns any skin.
@@ -144,6 +171,9 @@ export const EQUIPMENT_RULES_DEFAULTS = Object.freeze({
144
171
  * deadItemIds — Array of ObjectLayer item IDs for the dead / ghost / respawning
145
172
  * state. Empty array = no dead-state OL; same solid fill as live.
146
173
  * Replaces the old flat ghostItemId field for players.
174
+ * dropItemIds — Array of ObjectLayer item IDs granted to the extractor when
175
+ * a resource-type entity is depleted. These are inventory/drop
176
+ * items only and are NOT auto-activated on the entity itself.
147
177
  * colorKey — Named palette colour key (see colors in CYBERIA_INSTANCE_CONF_DEFAULTS).
148
178
  * Used as solid-colour fallback when the entity carries NO active
149
179
  * ObjectLayer items, or while atlas textures are still loading.
@@ -165,12 +195,34 @@ export const EQUIPMENT_RULES_DEFAULTS = Object.freeze({
165
195
  * floor / obstacle / portal / foreground
166
196
  *
167
197
  * @constant
168
- * @type {ReadonlyArray<{entityType:string, liveItemIds:string[], deadItemIds:string[], colorKey:string}>}
198
+ * @type {ReadonlyArray<{entityType:string, liveItemIds:string[], deadItemIds:string[], dropItemIds:string[], colorKey:string}>}
169
199
  */
200
+ export const RESOURCE_ENTITY_TYPE_DEFAULTS = Object.freeze([
201
+ Object.freeze({
202
+ entityType: ENTITY_TYPES.resource,
203
+ liveItemIds: ['wood-1'],
204
+ deadItemIds: ['wood-extracted-1'],
205
+ // Until dedicated resource-drop OLs are authored, reuse the wood stack item.
206
+ dropItemIds: ['wood-drop-1'],
207
+ colorKey: 'RESOURCE',
208
+ defaultObjectLayers: [],
209
+ }),
210
+ Object.freeze({
211
+ entityType: ENTITY_TYPES.resource,
212
+ liveItemIds: ['wood-2'],
213
+ deadItemIds: ['wood-extracted-2'],
214
+ dropItemIds: ['wood-drop-2'],
215
+ colorKey: 'RESOURCE',
216
+ defaultObjectLayers: [],
217
+ }),
218
+ ]);
219
+
220
+ export const RESOURCE_ENTITY_TYPE_DEFAULT = RESOURCE_ENTITY_TYPE_DEFAULTS[0];
221
+
170
222
  export const ENTITY_TYPE_DEFAULTS = Object.freeze([
171
223
  // ── Characters ─────────────────────────────────────────────────────────
172
224
  {
173
- entityType: 'player',
225
+ entityType: ENTITY_TYPES.player,
174
226
  liveItemIds: ['anon', 'atlas_pistol_mk2'],
175
227
  deadItemIds: ['ghost'],
176
228
  colorKey: 'PLAYER',
@@ -180,48 +232,50 @@ export const ENTITY_TYPE_DEFAULTS = Object.freeze([
180
232
  defaultObjectLayers: [
181
233
  { itemId: 'anon', active: true, quantity: 1 },
182
234
  { itemId: 'atlas_pistol_mk2', active: true, quantity: 1 },
183
- { itemId: 'purple', active: false, quantity: 1 },
235
+ // { itemId: 'purple', active: false, quantity: 1 },
184
236
  { itemId: 'ghost', active: false, quantity: 1 },
185
- { itemId: 'atlas_pistol_mk2_bullet', active: false, quantity: 5 },
186
- { itemId: 'lain', active: false, quantity: 1 },
187
- { itemId: 'hatchet', active: false, quantity: 1 },
188
- { itemId: 'wason', active: false, quantity: 1 },
189
- { itemId: 'scp-2040', active: false, quantity: 1 },
190
- { itemId: 'punk', active: false, quantity: 1 },
191
- { itemId: 'kaneki', active: false, quantity: 1 },
192
- { itemId: 'junko', active: false, quantity: 1 },
193
- { itemId: 'eiri', active: false, quantity: 1 },
194
- { itemId: 'alex', active: false, quantity: 1 },
195
- { itemId: 'agent', active: false, quantity: 1 },
237
+ // { itemId: 'gp1', active: false, quantity: 1 },
238
+ // { itemId: 'gp2', active: false, quantity: 1 },
239
+ // { itemId: 'lain', active: false, quantity: 1 },
240
+ // { itemId: 'hatchet', active: false, quantity: 1 },
241
+ // { itemId: 'wason', active: false, quantity: 1 },
242
+ // { itemId: 'scp-2040', active: false, quantity: 1 },
243
+ // { itemId: 'punk', active: false, quantity: 1 },
244
+ // { itemId: 'kaneki', active: false, quantity: 1 },
245
+ // { itemId: 'junko', active: false, quantity: 1 },
246
+ // { itemId: 'eiri', active: false, quantity: 1 },
247
+ // { itemId: 'alex', active: false, quantity: 1 },
248
+ // { itemId: 'agent', active: false, quantity: 1 },
196
249
  { itemId: 'coin', active: false, quantity: 0 },
197
250
  ],
198
251
  },
199
252
  {
200
- entityType: 'other_player',
253
+ entityType: ENTITY_TYPES.other_player,
201
254
  liveItemIds: ['anon', 'atlas_pistol_mk2'],
202
255
  deadItemIds: ['ghost'],
203
256
  colorKey: 'OTHER_PLAYER',
204
257
  defaultObjectLayers: [
205
258
  { itemId: 'anon', active: true, quantity: 1 },
206
259
  { itemId: 'atlas_pistol_mk2', active: true, quantity: 1 },
207
- { itemId: 'purple', active: false, quantity: 1 },
260
+ // { itemId: 'purple', active: false, quantity: 1 },
208
261
  { itemId: 'ghost', active: false, quantity: 1 },
209
- { itemId: 'atlas_pistol_mk2_bullet', active: false, quantity: 5 },
210
- { itemId: 'lain', active: false, quantity: 1 },
211
- { itemId: 'hatchet', active: false, quantity: 1 },
212
- { itemId: 'wason', active: false, quantity: 1 },
213
- { itemId: 'scp-2040', active: false, quantity: 1 },
214
- { itemId: 'punk', active: false, quantity: 1 },
215
- { itemId: 'kaneki', active: false, quantity: 1 },
216
- { itemId: 'junko', active: false, quantity: 1 },
217
- { itemId: 'eiri', active: false, quantity: 1 },
218
- { itemId: 'alex', active: false, quantity: 1 },
219
- { itemId: 'agent', active: false, quantity: 1 },
262
+ // { itemId: 'gp1', active: false, quantity: 1 },
263
+ // { itemId: 'gp2', active: false, quantity: 1 },
264
+ // { itemId: 'lain', active: false, quantity: 1 },
265
+ // { itemId: 'hatchet', active: false, quantity: 1 },
266
+ // { itemId: 'wason', active: false, quantity: 1 },
267
+ // { itemId: 'scp-2040', active: false, quantity: 1 },
268
+ // { itemId: 'punk', active: false, quantity: 1 },
269
+ // { itemId: 'kaneki', active: false, quantity: 1 },
270
+ // { itemId: 'junko', active: false, quantity: 1 },
271
+ // { itemId: 'eiri', active: false, quantity: 1 },
272
+ // { itemId: 'alex', active: false, quantity: 1 },
273
+ // { itemId: 'agent', active: false, quantity: 1 },
220
274
  { itemId: 'coin', active: false, quantity: 0 },
221
275
  ],
222
276
  },
223
277
  {
224
- entityType: 'bot',
278
+ entityType: ENTITY_TYPES.bot,
225
279
  liveItemIds: ['purple'],
226
280
  deadItemIds: ['ghost'],
227
281
  colorKey: 'BOT',
@@ -231,28 +285,89 @@ export const ENTITY_TYPE_DEFAULTS = Object.freeze([
231
285
  ],
232
286
  },
233
287
  {
234
- entityType: 'skill',
288
+ entityType: ENTITY_TYPES.skill,
235
289
  liveItemIds: ['atlas_pistol_mk2_bullet'],
236
290
  deadItemIds: [],
237
291
  colorKey: 'SKILL',
238
292
  defaultObjectLayers: [{ itemId: 'atlas_pistol_mk2_bullet', active: true, quantity: 1 }],
239
293
  },
240
294
  {
241
- entityType: 'coin',
295
+ entityType: ENTITY_TYPES.coin,
242
296
  liveItemIds: ['coin'],
243
297
  deadItemIds: [],
244
298
  colorKey: 'COIN',
245
299
  defaultObjectLayers: [{ itemId: 'coin', active: true, quantity: 1 }],
246
300
  },
247
301
  // ── World objects ───────────────────────────────────────────────────────
248
- { entityType: 'floor', liveItemIds: ['grass'], deadItemIds: [], colorKey: 'FLOOR', defaultObjectLayers: [] },
249
- { entityType: 'obstacle', liveItemIds: [], deadItemIds: [], colorKey: 'OBSTACLE', defaultObjectLayers: [] },
250
- { entityType: 'portal', liveItemIds: [], deadItemIds: [], colorKey: 'PORTAL', defaultObjectLayers: [] },
251
- { entityType: 'portal', liveItemIds: [], deadItemIds: [], colorKey: 'PORTAL_INTER_PORTAL', defaultObjectLayers: [] },
252
- { entityType: 'portal', liveItemIds: [], deadItemIds: [], colorKey: 'PORTAL_INTER_RANDOM', defaultObjectLayers: [] },
253
- { entityType: 'portal', liveItemIds: [], deadItemIds: [], colorKey: 'PORTAL_INTRA_RANDOM', defaultObjectLayers: [] },
254
- { entityType: 'portal', liveItemIds: [], deadItemIds: [], colorKey: 'PORTAL_INTRA_PORTAL', defaultObjectLayers: [] },
255
- { entityType: 'foreground', liveItemIds: [], deadItemIds: [], colorKey: 'FOREGROUND', defaultObjectLayers: [] },
302
+ {
303
+ entityType: ENTITY_TYPES.floor,
304
+ liveItemIds: ['grass'],
305
+ deadItemIds: [],
306
+ dropItemIds: [],
307
+ colorKey: 'FLOOR',
308
+ defaultObjectLayers: [],
309
+ },
310
+ {
311
+ entityType: ENTITY_TYPES.obstacle,
312
+ liveItemIds: [],
313
+ deadItemIds: [],
314
+ dropItemIds: [],
315
+ colorKey: 'OBSTACLE',
316
+ defaultObjectLayers: [],
317
+ },
318
+ {
319
+ entityType: ENTITY_TYPES.portal,
320
+ liveItemIds: [],
321
+ deadItemIds: [],
322
+ dropItemIds: [],
323
+ colorKey: 'PORTAL',
324
+ defaultObjectLayers: [],
325
+ },
326
+ {
327
+ entityType: ENTITY_TYPES.portal,
328
+ liveItemIds: [],
329
+ deadItemIds: [],
330
+ dropItemIds: [],
331
+ colorKey: 'PORTAL_INTER_PORTAL',
332
+ defaultObjectLayers: [],
333
+ },
334
+ {
335
+ entityType: ENTITY_TYPES.portal,
336
+ liveItemIds: [],
337
+ deadItemIds: [],
338
+ dropItemIds: [],
339
+ colorKey: 'PORTAL_INTER_RANDOM',
340
+ defaultObjectLayers: [],
341
+ },
342
+ {
343
+ entityType: ENTITY_TYPES.portal,
344
+ liveItemIds: [],
345
+ deadItemIds: [],
346
+ dropItemIds: [],
347
+ colorKey: 'PORTAL_INTRA_RANDOM',
348
+ defaultObjectLayers: [],
349
+ },
350
+ {
351
+ entityType: 'portal',
352
+ liveItemIds: [],
353
+ deadItemIds: [],
354
+ dropItemIds: [],
355
+ colorKey: 'PORTAL_INTRA_PORTAL',
356
+ defaultObjectLayers: [],
357
+ },
358
+ {
359
+ entityType: ENTITY_TYPES.foreground,
360
+ liveItemIds: [],
361
+ deadItemIds: [],
362
+ dropItemIds: [],
363
+ colorKey: 'FOREGROUND',
364
+ defaultObjectLayers: [],
365
+ },
366
+ // ── Resource entities ────────────────────────────────────────────
367
+ // Static, exploitable map objects (wood, minerals, organic matter, etc.).
368
+ // liveItemIds render while alive, deadItemIds while depleted, and dropItemIds
369
+ // are transferred to the extractor. On respawn, original live OLs are restored.
370
+ ...RESOURCE_ENTITY_TYPE_DEFAULTS,
256
371
  ]);
257
372
 
258
373
  // ── Instance configuration defaults ─────────────────────────────────────────
@@ -295,6 +410,7 @@ export const CYBERIA_INSTANCE_CONF_DEFAULTS = {
295
410
  { key: 'GHOST', r: 200, g: 200, b: 255, a: 100 }, // rgba(200, 200, 255, 0.39)
296
411
  { key: 'COIN', r: 255, g: 215, b: 0, a: 255 }, // rgba(255, 215, 0, 1)
297
412
  { key: 'SKILL', r: 255, g: 255, b: 50, a: 255 }, // rgba(255, 255, 50, 1)
413
+ { key: 'RESOURCE', r: 100, g: 180, b: 80, a: 255 }, // rgba(100, 180, 80, 1)
298
414
  // ── UI-only ────────────────────────────────────────────────────
299
415
  { key: 'WEAPON', r: 180, g: 50, b: 50, a: 255 }, // rgba(180, 50, 50, 1)
300
416
  // ── Interaction overlay — self-player bubble/panel border ──────
@@ -378,7 +494,7 @@ export const CYBERIA_INSTANCE_CONF_DEFAULTS = {
378
494
  // Replaces flat fields: userDefaultItemId, botDefaultItemId, ghostItemId,
379
495
  // coinItemId, defaultFloorItemId, weaponDefaultItemId.
380
496
  // See ENTITY_TYPE_DEFAULTS for documentation of each field.
381
- // liveItemIds / deadItemIds are arrays of ObjectLayer item IDs.
497
+ // liveItemIds / deadItemIds / dropItemIds are arrays of ObjectLayer item IDs.
382
498
  entityDefaults: ENTITY_TYPE_DEFAULTS.map((e) => ({ ...e })),
383
499
 
384
500
  // ── Entity Status Indicators (ESI) ─────────────────────────────────
@@ -389,9 +505,54 @@ export const CYBERIA_INSTANCE_CONF_DEFAULTS = {
389
505
 
390
506
  // ── Skill system ───────────────────────────────────────────────────
391
507
  skillConfig: [
392
- { triggerItemId: 'atlas_pistol_mk2', logicEventIds: ['atlas_pistol_mk2_logic'] },
393
- { triggerItemId: 'coin', logicEventIds: ['coin_drop_or_transaction'] },
394
- { triggerItemId: 'anon', logicEventIds: ['doppelganger'] },
508
+ {
509
+ triggerItemId: 'atlas_pistol_mk2',
510
+ skills: [
511
+ {
512
+ logicEventId: 'projectile',
513
+ name: 'Projectile',
514
+ description:
515
+ 'Fires a projectile in the direction of the tap. Spawn chance and lifetime scale with Intelligence and Range.',
516
+ summonedEntityItemId: 'atlas_pistol_mk2_bullet',
517
+ },
518
+ ],
519
+ },
520
+ {
521
+ triggerItemId: 'coin',
522
+ skills: [
523
+ {
524
+ logicEventId: 'coin_drop_or_transaction',
525
+ name: 'Coin Drop',
526
+ description:
527
+ 'Coins are dropped automatically when an entity is killed. Transfer amount scales with kill percent rules.',
528
+ summonedEntityItemId: 'coin',
529
+ },
530
+ ],
531
+ },
532
+ {
533
+ triggerItemId: 'anon',
534
+ skills: [
535
+ {
536
+ logicEventId: 'doppelganger',
537
+ name: 'Doppelganger',
538
+ description:
539
+ 'Summons a passive clone of yourself that wanders nearby. Spawn chance scales with Intelligence.',
540
+ summonedEntityItemId: '$active_skin',
541
+ },
542
+ ],
543
+ },
544
+ {
545
+ triggerItemId: 'hatchet',
546
+ skills: [
547
+ {
548
+ logicEventId: 'projectile',
549
+ name: 'Projectile',
550
+ description:
551
+ 'Fires a projectile in the direction of the tap. Spawn chance and lifetime scale with Intelligence and Range.',
552
+ summonedEntityItemId: 'hatchet-skill',
553
+ },
554
+ ],
555
+ },
395
556
  ],
396
557
 
397
558
  skillRules: {
@@ -32,6 +32,9 @@ const EntityDefaultSchema = new Schema(
32
32
  // Default ObjectLayer item IDs for the dead / ghost / respawning state.
33
33
  // Empty array = use liveItemIds solid fill color.
34
34
  deadItemIds: { type: [String], default: [] },
35
+ // Resource-only inventory items granted on extraction/depletion.
36
+ // These are not auto-activated on the entity itself.
37
+ dropItemIds: { type: [String], default: [] },
35
38
  // Palette key for solid-color fallback when no OL items are assigned.
36
39
  colorKey: { type: String, default: '' },
37
40
  // Full default ObjectLayer inventory for this entity type.
@@ -197,7 +200,7 @@ const CyberiaInstanceConfSchema = new Schema(
197
200
  // ── Entity type rendering defaults ───────────────────────────────
198
201
  // Replaces flat fields: userDefaultItemId, botDefaultItemId, ghostItemId,
199
202
  // coinItemId, defaultFloorItemId, weaponDefaultItemId.
200
- // Each entry: { entityType, liveItemIds, deadItemIds, colorKey }.
203
+ // Each entry: { entityType, liveItemIds, deadItemIds, dropItemIds, colorKey }.
201
204
  entityDefaults: { type: [EntityDefaultSchema], default: D.entityDefaults },
202
205
 
203
206
  // ── Entity Status Indicators ────────────────────────────────────
@@ -4,15 +4,17 @@ import { DataQuery } from '../../server/data-query.js';
4
4
 
5
5
  const logger = loggerFactory(import.meta);
6
6
 
7
- const CyberiaInstanceConfService = {
8
- post: async (req, res, options) => {
7
+ class CyberiaInstanceConfService {
8
+ static post = async (req, res, options) => {
9
9
  /** @type {import('./cyberia-instance-conf.model.js').CyberiaInstanceConfModel} */
10
- const CyberiaInstanceConf = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaInstanceConf;
10
+ const CyberiaInstanceConf =
11
+ DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaInstanceConf;
11
12
  return await new CyberiaInstanceConf(req.body).save();
12
- },
13
- get: async (req, res, options) => {
13
+ };
14
+ static get = async (req, res, options) => {
14
15
  /** @type {import('./cyberia-instance-conf.model.js').CyberiaInstanceConfModel} */
15
- const CyberiaInstanceConf = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaInstanceConf;
16
+ const CyberiaInstanceConf =
17
+ DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaInstanceConf;
16
18
  if (req.params.id) return await CyberiaInstanceConf.findById(req.params.id);
17
19
 
18
20
  // Parse query parameters using DataQuery helper
@@ -25,18 +27,20 @@ const CyberiaInstanceConfService = {
25
27
 
26
28
  const totalPages = Math.ceil(total / limit);
27
29
  return { data, total, page, totalPages };
28
- },
29
- put: async (req, res, options) => {
30
+ };
31
+ static put = async (req, res, options) => {
30
32
  /** @type {import('./cyberia-instance-conf.model.js').CyberiaInstanceConfModel} */
31
- const CyberiaInstanceConf = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaInstanceConf;
33
+ const CyberiaInstanceConf =
34
+ DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaInstanceConf;
32
35
  return await CyberiaInstanceConf.findByIdAndUpdate(req.params.id, req.body);
33
- },
34
- delete: async (req, res, options) => {
36
+ };
37
+ static delete = async (req, res, options) => {
35
38
  /** @type {import('./cyberia-instance-conf.model.js').CyberiaInstanceConfModel} */
36
- const CyberiaInstanceConf = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaInstanceConf;
39
+ const CyberiaInstanceConf =
40
+ DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaInstanceConf;
37
41
  if (req.params.id) return await CyberiaInstanceConf.findByIdAndDelete(req.params.id);
38
42
  else return await CyberiaInstanceConf.deleteMany();
39
- },
40
- };
43
+ };
44
+ }
41
45
 
42
46
  export { CyberiaInstanceConfService };
@@ -3,8 +3,8 @@ import { CyberiaMapService } from './cyberia-map.service.js';
3
3
 
4
4
  const logger = loggerFactory(import.meta);
5
5
 
6
- const CyberiaMapController = {
7
- post: async (req, res, options) => {
6
+ class CyberiaMapController {
7
+ static post = async (req, res, options) => {
8
8
  try {
9
9
  const result = await CyberiaMapService.post(req, res, options);
10
10
  return res.status(200).json({
@@ -18,8 +18,8 @@ const CyberiaMapController = {
18
18
  message: error.message,
19
19
  });
20
20
  }
21
- },
22
- get: async (req, res, options) => {
21
+ };
22
+ static get = async (req, res, options) => {
23
23
  try {
24
24
  const { page, limit } = req.query;
25
25
  const result = await CyberiaMapService.get(
@@ -43,8 +43,8 @@ const CyberiaMapController = {
43
43
  message: error.message,
44
44
  });
45
45
  }
46
- },
47
- put: async (req, res, options) => {
46
+ };
47
+ static put = async (req, res, options) => {
48
48
  try {
49
49
  const result = await CyberiaMapService.put(req, res, options);
50
50
  return res.status(200).json({
@@ -58,8 +58,8 @@ const CyberiaMapController = {
58
58
  message: error.message,
59
59
  });
60
60
  }
61
- },
62
- delete: async (req, res, options) => {
61
+ };
62
+ static delete = async (req, res, options) => {
63
63
  try {
64
64
  const result = await CyberiaMapService.delete(req, res, options);
65
65
  return res.status(200).json({
@@ -73,7 +73,7 @@ const CyberiaMapController = {
73
73
  message: error.message,
74
74
  });
75
75
  }
76
- },
77
- };
76
+ };
77
+ }
78
78
 
79
79
  export { CyberiaMapController };
@@ -4,14 +4,14 @@ import { DataQuery } from '../../server/data-query.js';
4
4
 
5
5
  const logger = loggerFactory(import.meta);
6
6
 
7
- const CyberiaMapService = {
8
- post: async (req, res, options) => {
7
+ class CyberiaMapService {
8
+ static post = async (req, res, options) => {
9
9
  /** @type {import('./cyberia-map.model.js').CyberiaMapModel} */
10
10
  const CyberiaMap = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaMap;
11
11
  if (req.auth && req.auth.user) req.body.creator = req.auth.user._id;
12
12
  return await new CyberiaMap(req.body).save();
13
- },
14
- get: async (req, res, options) => {
13
+ };
14
+ static get = async (req, res, options) => {
15
15
  /** @type {import('./cyberia-map.model.js').CyberiaMapModel} */
16
16
  const CyberiaMap = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaMap;
17
17
  const populateCreator = { path: 'creator', model: 'User', select: '_id username' };
@@ -40,8 +40,8 @@ const CyberiaMapService = {
40
40
 
41
41
  const totalPages = Math.ceil(total / limit);
42
42
  return { data, total, page, totalPages };
43
- },
44
- put: async (req, res, options) => {
43
+ };
44
+ static put = async (req, res, options) => {
45
45
  /** @type {import('./cyberia-map.model.js').CyberiaMapModel} */
46
46
  const CyberiaMap = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaMap;
47
47
  const map = await CyberiaMap.findById(req.params.id);
@@ -53,8 +53,8 @@ const CyberiaMapService = {
53
53
  await File.findByIdAndDelete(map.thumbnail);
54
54
  }
55
55
  return await CyberiaMap.findByIdAndUpdate(req.params.id, req.body, { returnDocument: 'after' });
56
- },
57
- delete: async (req, res, options) => {
56
+ };
57
+ static delete = async (req, res, options) => {
58
58
  /** @type {import('./cyberia-map.model.js').CyberiaMapModel} */
59
59
  const CyberiaMap = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.CyberiaMap;
60
60
  if (req.params.id) {
@@ -68,7 +68,7 @@ const CyberiaMapService = {
68
68
  }
69
69
  return await CyberiaMap.findByIdAndDelete(req.params.id);
70
70
  } else return await CyberiaMap.deleteMany();
71
- },
72
- };
71
+ };
72
+ }
73
73
 
74
74
  export { CyberiaMapService };
@@ -0,0 +1,74 @@
1
+ import { loggerFactory } from '../../server/logger.js';
2
+ import { CyberiaQuestService } from './cyberia-quest.service.js';
3
+
4
+ const logger = loggerFactory(import.meta);
5
+
6
+ class CyberiaQuestController {
7
+ static post = async (req, res, options) => {
8
+ try {
9
+ const result = await CyberiaQuestService.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 CyberiaQuestService.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 CyberiaQuestService.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 CyberiaQuestService.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 { CyberiaQuestController };