@underpostnet/cyberia 3.2.80
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.dockerignore +14 -0
- package/.env.example +144 -0
- package/.github/workflows/cyberia-client.cd.yml +40 -0
- package/.github/workflows/cyberia-server.cd.yml +40 -0
- package/.github/workflows/docker-image.cyberia-client.ci.yml +71 -0
- package/.github/workflows/docker-image.cyberia-client.dev.ci.yml +70 -0
- package/.github/workflows/docker-image.cyberia-server.ci.yml +71 -0
- package/.github/workflows/docker-image.cyberia-server.dev.ci.yml +71 -0
- package/.github/workflows/docker-image.engine-cyberia.ci.yml +53 -0
- package/.github/workflows/docker-image.engine-cyberia.dev.ci.yml +53 -0
- package/.github/workflows/engine-cyberia.cd.yml +157 -0
- package/.github/workflows/engine-cyberia.ci.yml +125 -0
- package/.github/workflows/ghpkg.ci.yml +160 -0
- package/.github/workflows/gitlab.ci.yml +20 -0
- package/.github/workflows/hardhat.ci.yml +82 -0
- package/.github/workflows/npmpkg.ci.yml +126 -0
- package/.github/workflows/publish.ci.yml +87 -0
- package/.github/workflows/publish.cyberia.ci.yml +79 -0
- package/.github/workflows/pwa-microservices-template-page.cd.yml +65 -0
- package/.github/workflows/pwa-microservices-template-test.ci.yml +33 -0
- package/.github/workflows/release.cd.yml +46 -0
- package/.nycrc +9 -0
- package/.prettierignore +12 -0
- package/.prettierrc +9 -0
- package/.vscode/extensions.json +10 -0
- package/.vscode/settings.json +26 -0
- package/CHANGELOG.md +2516 -0
- package/CLI-HELP.md +1099 -0
- package/Dockerfile +161 -0
- package/Dockerfile.dev +161 -0
- package/Dockerfile.test +165 -0
- package/LICENSE +21 -0
- package/README.md +259 -0
- package/baremetal/commission-workflows.json +211 -0
- package/baremetal/packer-workflows.json +24 -0
- package/bin/build.js +261 -0
- package/bin/build.template.js +33 -0
- package/bin/cyberia.js +5627 -0
- package/bin/deploy.js +1547 -0
- package/bin/index.js +5627 -0
- package/bump.config.js +27 -0
- package/compose.env +144 -0
- package/conf.js +952 -0
- package/deployment.yaml +418 -0
- package/docker-compose.yml +434 -0
- package/examples/static-page/README.md +150 -0
- package/examples/static-page/ssr-components/CustomPage.js +554 -0
- package/examples/static-page/static-config-example.json +57 -0
- package/hardhat/.env.example +31 -0
- package/hardhat/contracts/ObjectLayerToken.sol +391 -0
- package/hardhat/deployments/.gitkeep +0 -0
- package/hardhat/deployments/hardhat-ObjectLayerToken.json +11 -0
- package/hardhat/hardhat.config.js +136 -0
- package/hardhat/ignition/modules/.gitkeep +0 -0
- package/hardhat/ignition/modules/ObjectLayerToken.js +21 -0
- package/hardhat/networks/besu-object-layer.network.json +138 -0
- package/hardhat/package-lock.json +2871 -0
- package/hardhat/package.json +43 -0
- package/hardhat/scripts/deployObjectLayerToken.js +98 -0
- package/hardhat/test/ObjectLayerToken.js +696 -0
- package/hardhat/types/ethers-contracts/ObjectLayerToken.ts +690 -0
- package/hardhat/types/ethers-contracts/common.ts +92 -0
- package/hardhat/types/ethers-contracts/factories/ObjectLayerToken__factory.ts +1055 -0
- package/hardhat/types/ethers-contracts/factories/index.ts +4 -0
- package/hardhat/types/ethers-contracts/hardhat.d.ts +47 -0
- package/hardhat/types/ethers-contracts/index.ts +6 -0
- package/ipfs/configure-ipfs.sh +13 -0
- package/jsconfig.json +9 -0
- package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +48 -0
- package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +48 -0
- package/manifests/deployment/adminer/deployment.yaml +32 -0
- package/manifests/deployment/adminer/kustomization.yaml +7 -0
- package/manifests/deployment/adminer/service.yaml +13 -0
- package/manifests/deployment/dd-cyberia-development/deployment.yaml +418 -0
- package/manifests/deployment/dd-cyberia-development/grpc-service.yaml +17 -0
- package/manifests/deployment/dd-cyberia-development/proxy.yaml +189 -0
- package/manifests/deployment/dd-cyberia-development/pv-pvc.yaml +164 -0
- package/manifests/deployment/dd-default-development/deployment.yaml +163 -0
- package/manifests/deployment/dd-default-development/proxy.yaml +46 -0
- package/manifests/deployment/fastapi/backend-deployment.yml +120 -0
- package/manifests/deployment/fastapi/backend-service.yml +19 -0
- package/manifests/deployment/fastapi/frontend-deployment.yml +54 -0
- package/manifests/deployment/fastapi/frontend-service.yml +15 -0
- package/manifests/deployment/fastapi/initial_data.sh +8 -0
- package/manifests/deployment/kafka/deployment.yaml +67 -0
- package/manifests/deployment/mongo-express/deployment.yaml +62 -0
- package/manifests/deployment/phpmyadmin/deployment.yaml +54 -0
- package/manifests/deployment/playwright/deployment.yaml +52 -0
- package/manifests/deployment/spark/spark-pi-py.yaml +20 -0
- package/manifests/deployment/tensorflow/tf-gpu-test.yaml +63 -0
- package/manifests/envoy-service-nodeport.yaml +22 -0
- package/manifests/grafana/deployment.yaml +64 -0
- package/manifests/grafana/kustomization.yaml +7 -0
- package/manifests/grafana/pvc.yaml +12 -0
- package/manifests/grafana/service.yaml +14 -0
- package/manifests/grafana/storage-class.yaml +9 -0
- package/manifests/ipfs/configmap.yaml +64 -0
- package/manifests/ipfs/headless-service.yaml +35 -0
- package/manifests/ipfs/kustomization.yaml +8 -0
- package/manifests/ipfs/statefulset.yaml +149 -0
- package/manifests/ipfs/storage-class.yaml +9 -0
- package/manifests/kind-config-dev.yaml +20 -0
- package/manifests/kind-config.yaml +12 -0
- package/manifests/kubeadm-calico-config.yaml +14 -0
- package/manifests/letsencrypt-prod.yaml +14 -0
- package/manifests/lxd/lxd-admin-profile.yaml +26 -0
- package/manifests/lxd/lxd-preseed.yaml +30 -0
- package/manifests/mariadb/kustomization.yaml +9 -0
- package/manifests/mariadb/pv.yaml +12 -0
- package/manifests/mariadb/pvc.yaml +10 -0
- package/manifests/mariadb/service.yaml +10 -0
- package/manifests/mariadb/statefulset.yaml +56 -0
- package/manifests/mariadb/storage-class.yaml +10 -0
- package/manifests/mongodb/headless-service.yaml +10 -0
- package/manifests/mongodb/kustomization.yaml +11 -0
- package/manifests/mongodb/pv-pvc.yaml +59 -0
- package/manifests/mongodb/statefulset.yaml +113 -0
- package/manifests/mongodb/storage-class.yaml +9 -0
- package/manifests/mongodb-4.4/headless-service.yaml +10 -0
- package/manifests/mongodb-4.4/kustomization.yaml +9 -0
- package/manifests/mongodb-4.4/mongodb-nodeport.yaml +17 -0
- package/manifests/mongodb-4.4/pv-pvc.yaml +19 -0
- package/manifests/mongodb-4.4/service-deployment.yaml +61 -0
- package/manifests/mongodb-4.4/statefulset.yaml +79 -0
- package/manifests/mongodb-4.4/storage-class.yaml +9 -0
- package/manifests/mysql/kustomization.yaml +7 -0
- package/manifests/mysql/pv-pvc.yaml +27 -0
- package/manifests/mysql/statefulset.yaml +55 -0
- package/manifests/postgresql/configmap.yaml +9 -0
- package/manifests/postgresql/kustomization.yaml +10 -0
- package/manifests/postgresql/pv.yaml +15 -0
- package/manifests/postgresql/pvc.yaml +13 -0
- package/manifests/postgresql/service.yaml +10 -0
- package/manifests/postgresql/statefulset.yaml +37 -0
- package/manifests/prometheus/deployment.yaml +82 -0
- package/manifests/pv-pvc-dd.yaml +34 -0
- package/manifests/valkey/kustomization.yaml +7 -0
- package/manifests/valkey/service.yaml +10 -0
- package/manifests/valkey/statefulset.yaml +37 -0
- package/manifests/valkey/valkey-nodeport.yaml +17 -0
- package/mongodb/entrypoint.sh +76 -0
- package/nginx.conf +128 -0
- package/nodemon.json +6 -0
- package/package.json +101 -0
- package/packer/images/Rocky9Amd64/Makefile +62 -0
- package/packer/images/Rocky9Amd64/QUICKSTART.md +113 -0
- package/packer/images/Rocky9Amd64/README.md +122 -0
- package/packer/images/Rocky9Amd64/http/rocky9.ks.pkrtpl.hcl +114 -0
- package/packer/images/Rocky9Amd64/rocky9.pkr.hcl +164 -0
- package/packer/images/Rocky9Arm64/Makefile +69 -0
- package/packer/images/Rocky9Arm64/README.md +122 -0
- package/packer/images/Rocky9Arm64/http/rocky9.ks.pkrtpl.hcl +114 -0
- package/packer/images/Rocky9Arm64/rocky9.pkr.hcl +171 -0
- package/packer/scripts/fuse-nbd +64 -0
- package/packer/scripts/fuse-tar-root +63 -0
- package/proxy.yaml +189 -0
- package/pv-pvc.yaml +164 -0
- package/scripts/device-scan.sh +65 -0
- package/scripts/disk-clean.sh +182 -0
- package/scripts/disk-devices.sh +13 -0
- package/scripts/gen-fqdns.sh +14 -0
- package/scripts/gpu-diag.sh +19 -0
- package/scripts/ip-info.sh +118 -0
- package/scripts/ipxe-setup.sh +200 -0
- package/scripts/k3s-node-setup.sh +124 -0
- package/scripts/kubeadm-node-setup.sh +317 -0
- package/scripts/link-local-underpost-cli.sh +6 -0
- package/scripts/lxd-vm-setup.sh +208 -0
- package/scripts/maas-nat-firewalld.sh +145 -0
- package/scripts/maas-setup.sh +135 -0
- package/scripts/maas-upload-boot-resource.sh +183 -0
- package/scripts/nat-iptables.sh +111 -0
- package/scripts/nvim.sh +91 -0
- package/scripts/packer-init-vars-file.sh +40 -0
- package/scripts/packer-setup.sh +289 -0
- package/scripts/ports-ls.sh +33 -0
- package/scripts/quick-tftp.sh +19 -0
- package/scripts/rhel-grpc-setup.sh +56 -0
- package/scripts/rocky-kickstart.sh +986 -0
- package/scripts/rocky-pwa.sh +200 -0
- package/scripts/rocky-setup.sh +106 -0
- package/scripts/rpmfusion-ffmpeg-setup.sh +32 -0
- package/scripts/ssl.sh +170 -0
- package/scripts/test-monitor.sh +248 -0
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +30 -0
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +155 -0
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +39 -0
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +382 -0
- package/src/api/core/core.controller.js +8 -0
- package/src/api/core/core.model.js +11 -0
- package/src/api/core/core.router.js +23 -0
- package/src/api/core/core.service.js +30 -0
- package/src/api/crypto/crypto.controller.js +10 -0
- package/src/api/crypto/crypto.model.js +23 -0
- package/src/api/crypto/crypto.router.js +23 -0
- package/src/api/crypto/crypto.service.js +64 -0
- package/src/api/cyberia-action/cyberia-action.controller.js +8 -0
- package/src/api/cyberia-action/cyberia-action.model.js +79 -0
- package/src/api/cyberia-action/cyberia-action.router.js +21 -0
- package/src/api/cyberia-action/cyberia-action.service.js +58 -0
- package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +27 -0
- package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +100 -0
- package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +70 -0
- package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +152 -0
- package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +8 -0
- package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +36 -0
- package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +20 -0
- package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +57 -0
- package/src/api/cyberia-entity/cyberia-entity.controller.js +6 -0
- package/src/api/cyberia-entity/cyberia-entity.model.js +25 -0
- package/src/api/cyberia-entity/cyberia-entity.router.js +17 -0
- package/src/api/cyberia-entity/cyberia-entity.service.js +42 -0
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.controller.js +6 -0
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.model.js +67 -0
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.router.js +17 -0
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.service.js +46 -0
- package/src/api/cyberia-instance/cyberia-fallback-world.js +337 -0
- package/src/api/cyberia-instance/cyberia-instance-boot.service.js +57 -0
- package/src/api/cyberia-instance/cyberia-instance-map.service.js +583 -0
- package/src/api/cyberia-instance/cyberia-instance.controller.js +42 -0
- package/src/api/cyberia-instance/cyberia-instance.model.js +117 -0
- package/src/api/cyberia-instance/cyberia-instance.router.js +75 -0
- package/src/api/cyberia-instance/cyberia-instance.service.js +190 -0
- package/src/api/cyberia-instance/cyberia-portal-connector.js +260 -0
- package/src/api/cyberia-instance/cyberia-world-generator.js +618 -0
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +6 -0
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +200 -0
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +17 -0
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +46 -0
- package/src/api/cyberia-map/cyberia-map.controller.js +6 -0
- package/src/api/cyberia-map/cyberia-map.model.js +33 -0
- package/src/api/cyberia-map/cyberia-map.router.js +19 -0
- package/src/api/cyberia-map/cyberia-map.service.js +76 -0
- package/src/api/cyberia-quest/cyberia-quest.controller.js +9 -0
- package/src/api/cyberia-quest/cyberia-quest.model.js +67 -0
- package/src/api/cyberia-quest/cyberia-quest.router.js +26 -0
- package/src/api/cyberia-quest/cyberia-quest.service.js +97 -0
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +6 -0
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.model.js +49 -0
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +21 -0
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +42 -0
- package/src/api/cyberia-saga/cyberia-saga.controller.js +6 -0
- package/src/api/cyberia-saga/cyberia-saga.model.js +59 -0
- package/src/api/cyberia-saga/cyberia-saga.router.js +17 -0
- package/src/api/cyberia-saga/cyberia-saga.service.js +42 -0
- package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +1076 -0
- package/src/api/cyberia-skill/cyberia-skill.controller.js +6 -0
- package/src/api/cyberia-skill/cyberia-skill.model.js +50 -0
- package/src/api/cyberia-skill/cyberia-skill.router.js +17 -0
- package/src/api/cyberia-skill/cyberia-skill.service.js +42 -0
- package/src/api/default/default.controller.js +6 -0
- package/src/api/default/default.model.js +20 -0
- package/src/api/default/default.router.js +21 -0
- package/src/api/default/default.service.js +42 -0
- package/src/api/document/document.controller.js +9 -0
- package/src/api/document/document.model.js +95 -0
- package/src/api/document/document.router.js +32 -0
- package/src/api/document/document.service.js +633 -0
- package/src/api/file/file.controller.js +15 -0
- package/src/api/file/file.model.js +127 -0
- package/src/api/file/file.ref.json +39 -0
- package/src/api/file/file.router.js +36 -0
- package/src/api/file/file.service.js +499 -0
- package/src/api/instance/instance.controller.js +8 -0
- package/src/api/instance/instance.model.js +34 -0
- package/src/api/instance/instance.router.js +27 -0
- package/src/api/instance/instance.service.js +75 -0
- package/src/api/ipfs/ipfs.controller.js +8 -0
- package/src/api/ipfs/ipfs.model.js +77 -0
- package/src/api/ipfs/ipfs.router.js +26 -0
- package/src/api/ipfs/ipfs.service.js +145 -0
- package/src/api/object-layer/object-layer.controller.js +18 -0
- package/src/api/object-layer/object-layer.model.js +200 -0
- package/src/api/object-layer/object-layer.router.js +729 -0
- package/src/api/object-layer/object-layer.service.js +894 -0
- package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +6 -0
- package/src/api/object-layer-render-frames/object-layer-render-frames.model.js +93 -0
- package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +17 -0
- package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +46 -0
- package/src/api/test/test.controller.js +14 -0
- package/src/api/test/test.model.js +14 -0
- package/src/api/test/test.router.js +23 -0
- package/src/api/test/test.service.js +35 -0
- package/src/api/types.js +24 -0
- package/src/api/user/guest.service.js +100 -0
- package/src/api/user/postman_collection.json +216 -0
- package/src/api/user/user.build.js +16 -0
- package/src/api/user/user.controller.js +35 -0
- package/src/api/user/user.model.js +142 -0
- package/src/api/user/user.router.js +367 -0
- package/src/api/user/user.service.js +582 -0
- package/src/api.js +23 -0
- package/src/cli/baremetal.js +3947 -0
- package/src/cli/cloud-init.js +673 -0
- package/src/cli/cluster.js +1395 -0
- package/src/cli/db.js +1533 -0
- package/src/cli/deploy.js +1542 -0
- package/src/cli/docker-compose.js +802 -0
- package/src/cli/env.js +177 -0
- package/src/cli/fs.js +380 -0
- package/src/cli/image.js +389 -0
- package/src/cli/index.js +1059 -0
- package/src/cli/ipfs.js +182 -0
- package/src/cli/kickstart.js +271 -0
- package/src/cli/kubectl.js +214 -0
- package/src/cli/lxd.js +1232 -0
- package/src/cli/monitor.js +659 -0
- package/src/cli/release.js +595 -0
- package/src/cli/repository.js +1969 -0
- package/src/cli/run.js +3326 -0
- package/src/cli/secrets.js +151 -0
- package/src/cli/ssh.js +975 -0
- package/src/cli/static.js +653 -0
- package/src/cli/system.js +332 -0
- package/src/cli/test.js +176 -0
- package/src/client/Cryptokoyn.index.js +30 -0
- package/src/client/CyberiaPortal.index.js +31 -0
- package/src/client/Default.index.js +77 -0
- package/src/client/Itemledger.index.js +35 -0
- package/src/client/Underpost.index.js +31 -0
- package/src/client/components/core/404.js +20 -0
- package/src/client/components/core/500.js +20 -0
- package/src/client/components/core/Account.js +630 -0
- package/src/client/components/core/AgGrid.js +238 -0
- package/src/client/components/core/Alert.js +76 -0
- package/src/client/components/core/AppStore.js +69 -0
- package/src/client/components/core/Auth.js +353 -0
- package/src/client/components/core/Badge.js +26 -0
- package/src/client/components/core/Blockchain.js +41 -0
- package/src/client/components/core/Blog.js +9 -0
- package/src/client/components/core/BtnIcon.js +109 -0
- package/src/client/components/core/CalendarCore.js +437 -0
- package/src/client/components/core/Chat.js +62 -0
- package/src/client/components/core/ClientEvents.js +163 -0
- package/src/client/components/core/ColorPaletteElement.js +309 -0
- package/src/client/components/core/CommonJs.js +1014 -0
- package/src/client/components/core/Content.js +349 -0
- package/src/client/components/core/Css.js +1134 -0
- package/src/client/components/core/CssCore.js +881 -0
- package/src/client/components/core/D3Chart.js +44 -0
- package/src/client/components/core/Docs.js +478 -0
- package/src/client/components/core/DropDown.js +321 -0
- package/src/client/components/core/EventBus.js +96 -0
- package/src/client/components/core/EventsUI.js +130 -0
- package/src/client/components/core/FileExplorer.js +1406 -0
- package/src/client/components/core/FullScreen.js +201 -0
- package/src/client/components/core/Input.js +537 -0
- package/src/client/components/core/Keyboard.js +80 -0
- package/src/client/components/core/KeyboardAvoidance.js +145 -0
- package/src/client/components/core/LoadingAnimation.js +152 -0
- package/src/client/components/core/LogIn.js +212 -0
- package/src/client/components/core/LogOut.js +72 -0
- package/src/client/components/core/Logger.js +22 -0
- package/src/client/components/core/Modal.js +2956 -0
- package/src/client/components/core/NotificationManager.js +80 -0
- package/src/client/components/core/Pagination.js +252 -0
- package/src/client/components/core/Panel.js +1308 -0
- package/src/client/components/core/PanelForm.js +915 -0
- package/src/client/components/core/Polyhedron.js +947 -0
- package/src/client/components/core/PublicProfile.js +895 -0
- package/src/client/components/core/Recover.js +211 -0
- package/src/client/components/core/Responsive.js +146 -0
- package/src/client/components/core/RichText.js +33 -0
- package/src/client/components/core/Router.js +523 -0
- package/src/client/components/core/Scroll.js +76 -0
- package/src/client/components/core/SearchBox.js +1007 -0
- package/src/client/components/core/SignUp.js +153 -0
- package/src/client/components/core/SocketIo.js +163 -0
- package/src/client/components/core/SocketIoHandler.js +75 -0
- package/src/client/components/core/Stream.js +161 -0
- package/src/client/components/core/ToggleSwitch.js +89 -0
- package/src/client/components/core/ToolTip.js +78 -0
- package/src/client/components/core/Translate.js +694 -0
- package/src/client/components/core/Validator.js +140 -0
- package/src/client/components/core/VanillaJs.js +485 -0
- package/src/client/components/core/Wallet.js +95 -0
- package/src/client/components/core/WebComponent.js +44 -0
- package/src/client/components/core/Webhook.js +58 -0
- package/src/client/components/core/Worker.js +313 -0
- package/src/client/components/core/windowGetDimensions.js +269 -0
- package/src/client/components/cryptokoyn/AppShellCryptokoyn.js +352 -0
- package/src/client/components/cryptokoyn/AppStoreCryptokoyn.js +5 -0
- package/src/client/components/cryptokoyn/CssCryptokoyn.js +212 -0
- package/src/client/components/cryptokoyn/LogInCryptokoyn.js +16 -0
- package/src/client/components/cryptokoyn/LogOutCryptokoyn.js +12 -0
- package/src/client/components/cryptokoyn/RouterCryptokoyn.js +37 -0
- package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +16 -0
- package/src/client/components/cryptokoyn/SignUpCryptokoyn.js +11 -0
- package/src/client/components/cryptokoyn/SocketIoCryptokoyn.js +6 -0
- package/src/client/components/cyberia/ActionEngineCyberia.js +1867 -0
- package/src/client/components/cyberia/EntityEngineCyberia.js +585 -0
- package/src/client/components/cyberia/InstanceEngineCyberia.js +1088 -0
- package/src/client/components/cyberia/InstanceSelectionView.js +900 -0
- package/src/client/components/cyberia/MapEngineCyberia.js +1976 -0
- package/src/client/components/cyberia/ObjectLayerEngine.js +1540 -0
- package/src/client/components/cyberia/ObjectLayerEngineModal.js +2420 -0
- package/src/client/components/cyberia/ObjectLayerEngineViewer.js +1522 -0
- package/src/client/components/cyberia/SharedDefaultsCyberia.js +528 -0
- package/src/client/components/cyberia-portal/AppShellCyberiaPortal.js +772 -0
- package/src/client/components/cyberia-portal/AppStoreCyberiaPortal.js +5 -0
- package/src/client/components/cyberia-portal/CssCyberiaPortal.js +254 -0
- package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +21 -0
- package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +16 -0
- package/src/client/components/cyberia-portal/MainBodyCyberiaPortal.js +518 -0
- package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +72 -0
- package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +16 -0
- package/src/client/components/cyberia-portal/SignUpCyberiaPortal.js +13 -0
- package/src/client/components/cyberia-portal/SocketIoCyberiaPortal.js +6 -0
- package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +48 -0
- package/src/client/components/default/AppShellDefault.js +765 -0
- package/src/client/components/default/AppStoreDefault.js +5 -0
- package/src/client/components/default/CommonDefault.js +29 -0
- package/src/client/components/default/CssDefault.js +27 -0
- package/src/client/components/default/LogInDefault.js +16 -0
- package/src/client/components/default/LogOutDefault.js +12 -0
- package/src/client/components/default/RouterDefault.js +47 -0
- package/src/client/components/default/SettingsDefault.js +16 -0
- package/src/client/components/default/SignUpDefault.js +11 -0
- package/src/client/components/default/SocketIoDefault.js +6 -0
- package/src/client/components/default/TranslateDefault.js +7 -0
- package/src/client/components/itemledger/AppShellItemledger.js +353 -0
- package/src/client/components/itemledger/AppStoreItemledger.js +5 -0
- package/src/client/components/itemledger/CssItemledger.js +212 -0
- package/src/client/components/itemledger/LogInItemledger.js +17 -0
- package/src/client/components/itemledger/LogOutItemledger.js +12 -0
- package/src/client/components/itemledger/RouterItemledger.js +38 -0
- package/src/client/components/itemledger/SettingsItemledger.js +16 -0
- package/src/client/components/itemledger/SignUpItemledger.js +11 -0
- package/src/client/components/itemledger/SocketIoItemledger.js +6 -0
- package/src/client/components/itemledger/TranslateItemledger.js +7 -0
- package/src/client/components/underpost/AppShellUnderpost.js +691 -0
- package/src/client/components/underpost/AppStoreUnderpost.js +5 -0
- package/src/client/components/underpost/CssUnderpost.js +281 -0
- package/src/client/components/underpost/CyberpunkBloggerUnderpost.js +879 -0
- package/src/client/components/underpost/DocumentSearchProvider.js +448 -0
- package/src/client/components/underpost/LabGalleryUnderpost.js +79 -0
- package/src/client/components/underpost/LogInUnderpost.js +25 -0
- package/src/client/components/underpost/LogOutUnderpost.js +17 -0
- package/src/client/components/underpost/RouterUnderpost.js +45 -0
- package/src/client/components/underpost/SettingsUnderpost.js +16 -0
- package/src/client/components/underpost/SignUpUnderpost.js +11 -0
- package/src/client/components/underpost/SocketIoUnderpost.js +6 -0
- package/src/client/components/underpost/TranslateUnderpost.js +10 -0
- package/src/client/public/cryptokoyn/assets/banner/koyn-social.png +0 -0
- package/src/client/public/cryptokoyn/assets/logo/base-icon.png +0 -0
- package/src/client/public/cryptokoyn/assets/logo/cryptokoyn.png +0 -0
- package/src/client/public/cryptokoyn/assets/splash/android-chrome-144x144.png +0 -0
- package/src/client/public/cryptokoyn/assets/splash/android-chrome-192x192.png +0 -0
- package/src/client/public/cryptokoyn/assets/splash/android-chrome-256x256.png +0 -0
- package/src/client/public/cryptokoyn/assets/splash/android-chrome-36x36.png +0 -0
- package/src/client/public/cryptokoyn/assets/splash/android-chrome-48x48.png +0 -0
- package/src/client/public/cryptokoyn/assets/splash/android-chrome-72x72.png +0 -0
- package/src/client/public/cryptokoyn/assets/splash/android-chrome-96x96.png +0 -0
- package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-114x114-precomposed.png +0 -0
- package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-114x114.png +0 -0
- package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-120x120-precomposed.png +0 -0
- package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-120x120.png +0 -0
- package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-144x144-precomposed.png +0 -0
- package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-144x144.png +0 -0
- package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-152x152-precomposed.png +0 -0
- package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-152x152.png +0 -0
- package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-180x180-precomposed.png +0 -0
- package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-180x180.png +0 -0
- package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-57x57-precomposed.png +0 -0
- package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-57x57.png +0 -0
- package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-60x60-precomposed.png +0 -0
- package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-60x60.png +0 -0
- package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-72x72-precomposed.png +0 -0
- package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-72x72.png +0 -0
- package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-76x76-precomposed.png +0 -0
- package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-76x76.png +0 -0
- package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon-precomposed.png +0 -0
- package/src/client/public/cryptokoyn/assets/splash/apple-touch-icon.png +0 -0
- package/src/client/public/cryptokoyn/assets/splash/favicon-16x16.png +0 -0
- package/src/client/public/cryptokoyn/assets/splash/favicon-32x32.png +0 -0
- package/src/client/public/cryptokoyn/assets/splash/mstile-144x144.png +0 -0
- package/src/client/public/cryptokoyn/assets/splash/mstile-150x150.png +0 -0
- package/src/client/public/cryptokoyn/assets/splash/mstile-310x150.png +0 -0
- package/src/client/public/cryptokoyn/assets/splash/mstile-310x310.png +0 -0
- package/src/client/public/cryptokoyn/assets/splash/mstile-70x70.png +0 -0
- package/src/client/public/cryptokoyn/assets/splash/safari-pinned-tab.svg +42 -0
- package/src/client/public/cryptokoyn/browserconfig.xml +12 -0
- package/src/client/public/cryptokoyn/favicon.ico +0 -0
- package/src/client/public/cryptokoyn/microdata.json +85 -0
- package/src/client/public/cryptokoyn/site.webmanifest +57 -0
- package/src/client/public/cryptokoyn/sitemap +148 -0
- package/src/client/public/cyberia-docs/ACTION-SYSTEM.md +307 -0
- package/src/client/public/cyberia-docs/ARCHITECTURE.md +309 -0
- package/src/client/public/cyberia-docs/CYBERIA-CLI.md +204 -0
- package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +341 -0
- package/src/client/public/cyberia-docs/CYBERIA-LORE.md +84 -0
- package/src/client/public/cyberia-docs/CYBERIA-SAGA.md +394 -0
- package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +294 -0
- package/src/client/public/cyberia-docs/CYBERIA.md +259 -0
- package/src/client/public/cyberia-docs/ENTITY-PROFILE.md +242 -0
- package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +300 -0
- package/src/client/public/cyberia-docs/OFF-CHAIN-ECONOMY.md +309 -0
- package/src/client/public/cyberia-docs/QUEST-SYSTEM.md +228 -0
- package/src/client/public/cyberia-docs/ROADMAP.md +240 -0
- package/src/client/public/cyberia-docs/UNDERPOST-PLATFORM.md +106 -0
- package/src/client/public/cyberia-docs/WHITE-PAPER.md +740 -0
- package/src/client/public/default/android-chrome-144x144.png +0 -0
- package/src/client/public/default/android-chrome-192x192.png +0 -0
- package/src/client/public/default/android-chrome-256x256.png +0 -0
- package/src/client/public/default/android-chrome-36x36.png +0 -0
- package/src/client/public/default/android-chrome-384x384.png +0 -0
- package/src/client/public/default/android-chrome-48x48.png +0 -0
- package/src/client/public/default/android-chrome-512x512.png +0 -0
- package/src/client/public/default/android-chrome-72x72.png +0 -0
- package/src/client/public/default/android-chrome-96x96.png +0 -0
- package/src/client/public/default/apple-touch-icon-1024x1024.png +0 -0
- package/src/client/public/default/apple-touch-icon-114x114-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-114x114.png +0 -0
- package/src/client/public/default/apple-touch-icon-120x120-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-120x120.png +0 -0
- package/src/client/public/default/apple-touch-icon-144x144-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-144x144.png +0 -0
- package/src/client/public/default/apple-touch-icon-152x152-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-152x152.png +0 -0
- package/src/client/public/default/apple-touch-icon-167x167.png +0 -0
- package/src/client/public/default/apple-touch-icon-180x180-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-180x180.png +0 -0
- package/src/client/public/default/apple-touch-icon-57x57-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-57x57.png +0 -0
- package/src/client/public/default/apple-touch-icon-60x60-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-60x60.png +0 -0
- package/src/client/public/default/apple-touch-icon-72x72-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-72x72.png +0 -0
- package/src/client/public/default/apple-touch-icon-76x76-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-76x76.png +0 -0
- package/src/client/public/default/apple-touch-icon-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1125x2436.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1136x640.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1170x2532.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1179x2556.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1242x2208.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1242x2688.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1284x2778.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1290x2796.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1334x750.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1488x2266.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1536x2048.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1620x2160.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1640x2160.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1668x2224.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1668x2388.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1792x828.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2048x1536.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2048x2732.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2160x1620.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2160x1640.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2208x1242.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2224x1668.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2266x1488.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2388x1668.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2436x1125.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2532x1170.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2556x1179.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2688x1242.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2732x2048.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2778x1284.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2796x1290.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-640x1136.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-750x1334.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-828x1792.png +0 -0
- package/src/client/public/default/assets/background/dark.jpg +0 -0
- package/src/client/public/default/assets/background/dark.svg +557 -0
- package/src/client/public/default/assets/background/white.jpg +0 -0
- package/src/client/public/default/assets/background/white0-min.jpg +0 -0
- package/src/client/public/default/assets/background/white0.jpg +0 -0
- package/src/client/public/default/assets/logo/base-icon.png +0 -0
- package/src/client/public/default/assets/logo/underpost.gif +0 -0
- package/src/client/public/default/assets/mailer/api-user-check.png +0 -0
- package/src/client/public/default/assets/mailer/api-user-default-avatar.png +0 -0
- package/src/client/public/default/assets/mailer/api-user-invalid-token.png +0 -0
- package/src/client/public/default/assets/mailer/api-user-recover.png +0 -0
- package/src/client/public/default/browserconfig.xml +12 -0
- package/src/client/public/default/favicon-16x16.png +0 -0
- package/src/client/public/default/favicon-32x32.png +0 -0
- package/src/client/public/default/favicon-48x48.png +0 -0
- package/src/client/public/default/favicon.ico +0 -0
- package/src/client/public/default/manifest.webmanifest +69 -0
- package/src/client/public/default/mstile-144x144.png +0 -0
- package/src/client/public/default/mstile-150x150.png +0 -0
- package/src/client/public/default/mstile-310x150.png +0 -0
- package/src/client/public/default/mstile-310x310.png +0 -0
- package/src/client/public/default/mstile-70x70.png +0 -0
- package/src/client/public/default/safari-pinned-tab.svg +24 -0
- package/src/client/public/default/site.webmanifest +69 -0
- package/src/client/public/default/sitemap +148 -0
- package/src/client/public/default/yandex-browser-50x50.png +0 -0
- package/src/client/public/default/yandex-browser-manifest.json +9 -0
- package/src/client/public/doc/favicon.ico +0 -0
- package/src/client/public/doc/sitemap +148 -0
- package/src/client/public/itemledger/android-chrome-144x144.png +0 -0
- package/src/client/public/itemledger/android-chrome-192x192.png +0 -0
- package/src/client/public/itemledger/android-chrome-256x256.png +0 -0
- package/src/client/public/itemledger/android-chrome-36x36.png +0 -0
- package/src/client/public/itemledger/android-chrome-384x384.png +0 -0
- package/src/client/public/itemledger/android-chrome-48x48.png +0 -0
- package/src/client/public/itemledger/android-chrome-512x512.png +0 -0
- package/src/client/public/itemledger/android-chrome-72x72.png +0 -0
- package/src/client/public/itemledger/android-chrome-96x96.png +0 -0
- package/src/client/public/itemledger/apple-touch-icon-1024x1024.png +0 -0
- package/src/client/public/itemledger/apple-touch-icon-114x114.png +0 -0
- package/src/client/public/itemledger/apple-touch-icon-120x120.png +0 -0
- package/src/client/public/itemledger/apple-touch-icon-144x144.png +0 -0
- package/src/client/public/itemledger/apple-touch-icon-152x152.png +0 -0
- package/src/client/public/itemledger/apple-touch-icon-167x167.png +0 -0
- package/src/client/public/itemledger/apple-touch-icon-180x180.png +0 -0
- package/src/client/public/itemledger/apple-touch-icon-57x57.png +0 -0
- package/src/client/public/itemledger/apple-touch-icon-60x60.png +0 -0
- package/src/client/public/itemledger/apple-touch-icon-72x72.png +0 -0
- package/src/client/public/itemledger/apple-touch-icon-76x76.png +0 -0
- package/src/client/public/itemledger/apple-touch-icon-precomposed.png +0 -0
- package/src/client/public/itemledger/apple-touch-icon.png +0 -0
- package/src/client/public/itemledger/apple-touch-startup-image-1125x2436.png +0 -0
- package/src/client/public/itemledger/apple-touch-startup-image-1136x640.png +0 -0
- package/src/client/public/itemledger/apple-touch-startup-image-1170x2532.png +0 -0
- package/src/client/public/itemledger/apple-touch-startup-image-1179x2556.png +0 -0
- package/src/client/public/itemledger/apple-touch-startup-image-1242x2208.png +0 -0
- package/src/client/public/itemledger/apple-touch-startup-image-1242x2688.png +0 -0
- package/src/client/public/itemledger/apple-touch-startup-image-1284x2778.png +0 -0
- package/src/client/public/itemledger/apple-touch-startup-image-1290x2796.png +0 -0
- package/src/client/public/itemledger/apple-touch-startup-image-1334x750.png +0 -0
- package/src/client/public/itemledger/apple-touch-startup-image-1488x2266.png +0 -0
- package/src/client/public/itemledger/apple-touch-startup-image-1536x2048.png +0 -0
- package/src/client/public/itemledger/apple-touch-startup-image-1620x2160.png +0 -0
- package/src/client/public/itemledger/apple-touch-startup-image-1640x2160.png +0 -0
- package/src/client/public/itemledger/apple-touch-startup-image-1668x2224.png +0 -0
- package/src/client/public/itemledger/apple-touch-startup-image-1668x2388.png +0 -0
- package/src/client/public/itemledger/apple-touch-startup-image-1792x828.png +0 -0
- package/src/client/public/itemledger/apple-touch-startup-image-2048x1536.png +0 -0
- package/src/client/public/itemledger/apple-touch-startup-image-2048x2732.png +0 -0
- package/src/client/public/itemledger/apple-touch-startup-image-2160x1620.png +0 -0
- package/src/client/public/itemledger/apple-touch-startup-image-2160x1640.png +0 -0
- package/src/client/public/itemledger/apple-touch-startup-image-2208x1242.png +0 -0
- package/src/client/public/itemledger/apple-touch-startup-image-2224x1668.png +0 -0
- package/src/client/public/itemledger/apple-touch-startup-image-2266x1488.png +0 -0
- package/src/client/public/itemledger/apple-touch-startup-image-2388x1668.png +0 -0
- package/src/client/public/itemledger/apple-touch-startup-image-2436x1125.png +0 -0
- package/src/client/public/itemledger/apple-touch-startup-image-2532x1170.png +0 -0
- package/src/client/public/itemledger/apple-touch-startup-image-2556x1179.png +0 -0
- package/src/client/public/itemledger/apple-touch-startup-image-2688x1242.png +0 -0
- package/src/client/public/itemledger/apple-touch-startup-image-2732x2048.png +0 -0
- package/src/client/public/itemledger/apple-touch-startup-image-2778x1284.png +0 -0
- package/src/client/public/itemledger/apple-touch-startup-image-2796x1290.png +0 -0
- package/src/client/public/itemledger/apple-touch-startup-image-640x1136.png +0 -0
- package/src/client/public/itemledger/apple-touch-startup-image-750x1334.png +0 -0
- package/src/client/public/itemledger/apple-touch-startup-image-828x1792.png +0 -0
- package/src/client/public/itemledger/assets/logo/base-icon.png +0 -0
- package/src/client/public/itemledger/browserconfig.xml +12 -0
- package/src/client/public/itemledger/favicon-16x16.png +0 -0
- package/src/client/public/itemledger/favicon-32x32.png +0 -0
- package/src/client/public/itemledger/favicon-48x48.png +0 -0
- package/src/client/public/itemledger/favicon.ico +0 -0
- package/src/client/public/itemledger/manifest.webmanifest +69 -0
- package/src/client/public/itemledger/microdata.json +71 -0
- package/src/client/public/itemledger/mstile-144x144.png +0 -0
- package/src/client/public/itemledger/mstile-150x150.png +0 -0
- package/src/client/public/itemledger/mstile-310x150.png +0 -0
- package/src/client/public/itemledger/mstile-310x310.png +0 -0
- package/src/client/public/itemledger/mstile-70x70.png +0 -0
- package/src/client/public/itemledger/sitemap +148 -0
- package/src/client/public/itemledger/yandex-browser-50x50.png +0 -0
- package/src/client/public/itemledger/yandex-browser-manifest.json +9 -0
- package/src/client/public/test/favicon.ico +0 -0
- package/src/client/public/test/sitemap +148 -0
- package/src/client/services/atlas-sprite-sheet/atlas-sprite-sheet.service.js +137 -0
- package/src/client/services/core/core.service.js +309 -0
- package/src/client/services/crypto/crypto.service.js +68 -0
- package/src/client/services/cyberia-action/cyberia-action.service.js +99 -0
- package/src/client/services/cyberia-client-hints/cyberia-client-hints.service.js +99 -0
- package/src/client/services/cyberia-dialogue/cyberia-dialogue.service.js +99 -0
- package/src/client/services/cyberia-entity/cyberia-entity.management.js +57 -0
- package/src/client/services/cyberia-entity/cyberia-entity.service.js +99 -0
- package/src/client/services/cyberia-entity-type-default/cyberia-entity-type-default.service.js +99 -0
- package/src/client/services/cyberia-instance/cyberia-instance.management.js +194 -0
- package/src/client/services/cyberia-instance/cyberia-instance.service.js +137 -0
- package/src/client/services/cyberia-instance-conf/cyberia-instance-conf.service.js +99 -0
- package/src/client/services/cyberia-map/cyberia-map.management.js +193 -0
- package/src/client/services/cyberia-map/cyberia-map.service.js +120 -0
- package/src/client/services/cyberia-quest/cyberia-quest.service.js +99 -0
- package/src/client/services/cyberia-quest-progress/cyberia-quest-progress.service.js +99 -0
- package/src/client/services/cyberia-saga/cyberia-saga.service.js +99 -0
- package/src/client/services/cyberia-skill/cyberia-skill.service.js +99 -0
- package/src/client/services/default/default.management.js +1015 -0
- package/src/client/services/default/default.service.js +99 -0
- package/src/client/services/document/document.service.js +134 -0
- package/src/client/services/file/file.service.js +94 -0
- package/src/client/services/instance/instance.management.js +78 -0
- package/src/client/services/instance/instance.service.js +107 -0
- package/src/client/services/ipfs/ipfs.service.js +118 -0
- package/src/client/services/object-layer/object-layer.management.js +414 -0
- package/src/client/services/object-layer/object-layer.service.js +208 -0
- package/src/client/services/object-layer-render-frames/object-layer-render-frames.service.js +99 -0
- package/src/client/services/test/test.service.js +68 -0
- package/src/client/services/user/guest.service.js +86 -0
- package/src/client/services/user/user.management.js +51 -0
- package/src/client/services/user/user.service.js +106 -0
- package/src/client/ssr/RootDocument.js +237 -0
- package/src/client/ssr/body/404.js +77 -0
- package/src/client/ssr/body/500.js +76 -0
- package/src/client/ssr/body/CacheControl.js +117 -0
- package/src/client/ssr/body/CyberiaDefaultSplashScreen.js +97 -0
- package/src/client/ssr/body/DefaultSplashScreen.js +97 -0
- package/src/client/ssr/body/SwaggerDarkMode.js +285 -0
- package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +90 -0
- package/src/client/ssr/head/CryptokoynScripts.js +4 -0
- package/src/client/ssr/head/Css.js +241 -0
- package/src/client/ssr/head/CyberiaPortalScripts.js +6 -0
- package/src/client/ssr/head/DefaultScripts.js +6 -0
- package/src/client/ssr/head/ItemledgerScripts.js +4 -0
- package/src/client/ssr/head/Microdata.js +11 -0
- package/src/client/ssr/head/Production.js +1 -0
- package/src/client/ssr/head/Pwa.js +146 -0
- package/src/client/ssr/head/PwaItemledger.js +197 -0
- package/src/client/ssr/head/Seo.js +15 -0
- package/src/client/ssr/head/UnderpostScripts.js +6 -0
- package/src/client/ssr/mailer/DefaultRecoverEmail.js +20 -0
- package/src/client/ssr/mailer/DefaultVerifyEmail.js +16 -0
- package/src/client/ssr/views/Cyberia404.js +328 -0
- package/src/client/ssr/views/CyberiaServerMetrics.js +1070 -0
- package/src/client/ssr/views/Maintenance.js +64 -0
- package/src/client/ssr/views/NoNetworkConnection.js +68 -0
- package/src/client/ssr/views/Test.js +199 -0
- package/src/client/sw/core.sw.js +274 -0
- package/src/client-builder/client-build-docs.js +493 -0
- package/src/client-builder/client-build-live.js +100 -0
- package/src/client-builder/client-build.js +1092 -0
- package/src/client-builder/client-dev-server.js +88 -0
- package/src/client-builder/client-formatted.js +170 -0
- package/src/client-builder/client-icons.js +108 -0
- package/src/client-builder/ssr.js +124 -0
- package/src/client.build.js +17 -0
- package/src/client.dev.js +21 -0
- package/src/db/DataBaseProvider.js +213 -0
- package/src/db/mariadb/MariaDB.js +72 -0
- package/src/db/mongo/MongoBootstrap.js +657 -0
- package/src/db/mongo/MongooseDB.js +199 -0
- package/src/grpc/cyberia/grpc-server.js +162 -0
- package/src/index.js +357 -0
- package/src/mailer/EmailRender.js +116 -0
- package/src/mailer/MailerProvider.js +213 -0
- package/src/projects/cyberia/atlas-sprite-sheet-generator.js +413 -0
- package/src/projects/cyberia/besu-genesis-generator.js +1630 -0
- package/src/projects/cyberia/catalog-cyberia.js +90 -0
- package/src/projects/cyberia/gemini-client.js +175 -0
- package/src/projects/cyberia/generate-saga.js +2137 -0
- package/src/projects/cyberia/hot-reload-trigger.js +163 -0
- package/src/projects/cyberia/instance-data.js +719 -0
- package/src/projects/cyberia/ipfs-client.js +599 -0
- package/src/projects/cyberia/map-preview-generator.js +304 -0
- package/src/projects/cyberia/object-layer.js +978 -0
- package/src/projects/cyberia/semantic-layer-generator-floor.js +319 -0
- package/src/projects/cyberia/semantic-layer-generator-resource.js +259 -0
- package/src/projects/cyberia/semantic-layer-generator-skin.js +1164 -0
- package/src/projects/cyberia/semantic-layer-generator.js +753 -0
- package/src/projects/cyberia/shape-generator.js +1060 -0
- package/src/projects/underpost/catalog-underpost.js +60 -0
- package/src/proxy.js +19 -0
- package/src/runtime/cyberia-client/Dockerfile +49 -0
- package/src/runtime/cyberia-client/Dockerfile.dev +75 -0
- package/src/runtime/cyberia-server/Dockerfile +43 -0
- package/src/runtime/cyberia-server/Dockerfile.dev +56 -0
- package/src/runtime/engine-cyberia/Dockerfile +161 -0
- package/src/runtime/engine-cyberia/Dockerfile.dev +161 -0
- package/src/runtime/engine-cyberia/Dockerfile.test +165 -0
- package/src/runtime/engine-cyberia/compose.env +144 -0
- package/src/runtime/engine-cyberia/docker-compose.yml +434 -0
- package/src/runtime/engine-cyberia/ipfs/configure-ipfs.sh +13 -0
- package/src/runtime/engine-cyberia/mongodb/entrypoint.sh +76 -0
- package/src/runtime/engine-cyberia/nginx.conf +128 -0
- package/src/runtime/express/Dockerfile +45 -0
- package/src/runtime/express/Express.js +285 -0
- package/src/runtime/lampp/Dockerfile +62 -0
- package/src/runtime/lampp/Lampp.js +359 -0
- package/src/runtime/nginx/Nginx.js +250 -0
- package/src/runtime/wp/Dockerfile +62 -0
- package/src/runtime/wp/Wp.js +642 -0
- package/src/server/auth.js +713 -0
- package/src/server/backup.js +102 -0
- package/src/server/catalog.js +72 -0
- package/src/server/conf.js +2316 -0
- package/src/server/cron.js +476 -0
- package/src/server/crypto.js +210 -0
- package/src/server/data-query.js +461 -0
- package/src/server/dns.js +553 -0
- package/src/server/downloader.js +73 -0
- package/src/server/logger.js +229 -0
- package/src/server/middlewares.js +152 -0
- package/src/server/peer.js +75 -0
- package/src/server/process.js +299 -0
- package/src/server/proxy.js +139 -0
- package/src/server/runtime-status.js +252 -0
- package/src/server/runtime.js +183 -0
- package/src/server/start.js +272 -0
- package/src/server/tls.js +254 -0
- package/src/server/valkey.js +201 -0
- package/src/server.js +25 -0
- package/src/ws/IoInterface.js +129 -0
- package/src/ws/IoServer.js +68 -0
- package/src/ws/core/channels/core.ws.chat.js +68 -0
- package/src/ws/core/channels/core.ws.mailer.js +116 -0
- package/src/ws/core/channels/core.ws.stream.js +90 -0
- package/src/ws/core/core.ws.connection.js +41 -0
- package/src/ws/core/core.ws.emit.js +37 -0
- package/src/ws/core/core.ws.server.js +44 -0
- package/src/ws/default/channels/default.ws.main.js +57 -0
- package/src/ws/default/default.ws.connection.js +35 -0
- package/src/ws/default/default.ws.emit.js +14 -0
- package/src/ws/default/default.ws.server.js +39 -0
- package/test/api.test.js +53 -0
- package/test/crypto.test.js +117 -0
- package/test/cyberia-instance-conf-defaults.test.js +140 -0
- package/test/deploy-monitor.test.js +267 -0
- package/test/shape-generator.test.js +463 -0
- package/tsconfig.docs.json +15 -0
- package/typedoc.dd-cyberia.json +31 -0
- package/typedoc.json +31 -0
|
@@ -0,0 +1,633 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Document service module for handling document CRUD operations.
|
|
3
|
+
* Provides REST API handlers for document management with security-aware
|
|
4
|
+
* public/private document access control, search, and file cleanup integration.
|
|
5
|
+
*
|
|
6
|
+
* @module src/api/document/document.service.js
|
|
7
|
+
* @namespace DocumentService
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { loggerFactory } from '../../server/logger.js';
|
|
11
|
+
import { DataBaseProviderService } from '../../db/DataBaseProvider.js';
|
|
12
|
+
import { DocumentDto } from './document.model.js';
|
|
13
|
+
import { uniqueArray } from '../../client/components/core/CommonJs.js';
|
|
14
|
+
import { getBearerToken, verifyJWT } from '../../server/auth.js';
|
|
15
|
+
import { isValidObjectId } from 'mongoose';
|
|
16
|
+
import { FileCleanup } from '../file/file.service.js';
|
|
17
|
+
|
|
18
|
+
const logger = loggerFactory(import.meta);
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Document Service for handling REST API document operations.
|
|
22
|
+
* Implements a security model for public/private document access control
|
|
23
|
+
* with support for high-query typeahead search, tag filtering, and pagination.
|
|
24
|
+
* @namespace DocumentService
|
|
25
|
+
*/
|
|
26
|
+
class DocumentService {
|
|
27
|
+
/**
|
|
28
|
+
* POST - Create a new document.
|
|
29
|
+
* @async
|
|
30
|
+
* @function post
|
|
31
|
+
* @memberof DocumentService
|
|
32
|
+
* @param {Object} req - Express request object.
|
|
33
|
+
* @param {Object} res - Express response object.
|
|
34
|
+
* @param {Object} options - Request options containing host and path.
|
|
35
|
+
* @returns {Promise<Object>} Created document object.
|
|
36
|
+
*/
|
|
37
|
+
static post = async (req, res, options) => {
|
|
38
|
+
/** @type {import('./document.model.js').DocumentModel} */
|
|
39
|
+
const Document = DataBaseProviderService.getModel("Document", options);
|
|
40
|
+
|
|
41
|
+
switch (req.params.id) {
|
|
42
|
+
default:
|
|
43
|
+
req.body.userId = req.auth.user._id;
|
|
44
|
+
|
|
45
|
+
// Extract 'public' from tags and set isPublic field
|
|
46
|
+
// Filter 'public' tag to keep it out of the tags array
|
|
47
|
+
const { isPublic, tags } = DocumentDto.extractPublicFromTags(req.body.tags);
|
|
48
|
+
req.body.isPublic = isPublic;
|
|
49
|
+
req.body.tags = tags;
|
|
50
|
+
|
|
51
|
+
return await new Document(req.body).save();
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* GET - Retrieve documents.
|
|
57
|
+
* Supports public high-query search, public tag-filtered listing,
|
|
58
|
+
* and authenticated user document retrieval with pagination.
|
|
59
|
+
* @async
|
|
60
|
+
* @function get
|
|
61
|
+
* @memberof DocumentService
|
|
62
|
+
* @param {Object} req - Express request object.
|
|
63
|
+
* @param {Object} res - Express response object.
|
|
64
|
+
* @param {Object} options - Request options containing host and path.
|
|
65
|
+
* @returns {Promise<Object>} Document data with optional pagination metadata.
|
|
66
|
+
* @throws {Error} If search query is invalid or document not found.
|
|
67
|
+
*/
|
|
68
|
+
static get = async (req, res, options) => {
|
|
69
|
+
/** @type {import('./document.model.js').DocumentModel} */
|
|
70
|
+
const Document = DataBaseProviderService.getModel("Document", options);
|
|
71
|
+
/** @type {import('../user/user.model.js').UserModel} */
|
|
72
|
+
const User = DataBaseProviderService.getModel("User", options);
|
|
73
|
+
/** @type {import('../file/file.model.js').FileModel} */
|
|
74
|
+
const File = DataBaseProviderService.getModel("File", options);
|
|
75
|
+
|
|
76
|
+
// High-query endpoint for typeahead search
|
|
77
|
+
//
|
|
78
|
+
// Security Model:
|
|
79
|
+
// - Unauthenticated users: CAN see public documents (isPublic=true) from publishers (admin/moderator)
|
|
80
|
+
// - Authenticated users: CAN see public documents from publishers + ALL their own documents (public or private)
|
|
81
|
+
// - No user can see private documents from other users
|
|
82
|
+
// - PANEL FILTER: Only documents with idPanel tag are returned (prevents out-of-panel context results)
|
|
83
|
+
if (req.path.startsWith('/public/high') && req.query['q']) {
|
|
84
|
+
const rawQuery = req.query['q'];
|
|
85
|
+
if (!rawQuery || typeof rawQuery !== 'string') {
|
|
86
|
+
throw new Error('Invalid search query');
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Sanitize and validate search query
|
|
90
|
+
const searchQuery = rawQuery.trim();
|
|
91
|
+
// Minimum match requirement: allow 1 character for maximum results
|
|
92
|
+
if (searchQuery.length < 1) {
|
|
93
|
+
throw new Error('Search query too short');
|
|
94
|
+
}
|
|
95
|
+
if (searchQuery.length > 100) {
|
|
96
|
+
throw new Error('Search query too long (max 100 characters)');
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Get idPanel filter to prevent out-of-panel context results
|
|
100
|
+
const idPanel = req.query['idPanel'];
|
|
101
|
+
if (!idPanel || typeof idPanel !== 'string') {
|
|
102
|
+
logger.warn('Missing idPanel parameter for high-query search');
|
|
103
|
+
return { data: [] };
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const publisherUsers = await User.find({ $or: [{ role: 'admin' }, { role: 'moderator' }] });
|
|
107
|
+
|
|
108
|
+
const token = getBearerToken(req);
|
|
109
|
+
let user;
|
|
110
|
+
if (token) {
|
|
111
|
+
try {
|
|
112
|
+
user = verifyJWT(token, options);
|
|
113
|
+
} catch (error) {
|
|
114
|
+
logger.warn('Invalid token for high-query search', error.message);
|
|
115
|
+
user = null;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Validate and sanitize limit parameter
|
|
120
|
+
let limit = 10;
|
|
121
|
+
if (req.query.limit) {
|
|
122
|
+
const parsedLimit = parseInt(req.query.limit, 10);
|
|
123
|
+
if (isNaN(parsedLimit) || parsedLimit < 1 || parsedLimit > 50) {
|
|
124
|
+
throw new Error('Invalid limit parameter (must be between 1 and 50)');
|
|
125
|
+
}
|
|
126
|
+
limit = parsedLimit;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// SPECIAL CASE: If user searches for exactly "public" (case-insensitive)
|
|
130
|
+
// Return only documents where isPublic === true (exact match behavior)
|
|
131
|
+
if (searchQuery.toLowerCase() === 'public') {
|
|
132
|
+
const queryPayload = {
|
|
133
|
+
isPublic: true,
|
|
134
|
+
userId: { $in: publisherUsers.map((p) => p._id) },
|
|
135
|
+
tags: { $in: [idPanel] }, // Filter by idPanel to prevent out-of-panel context results (tags is array)
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
const data = await Document.find(queryPayload)
|
|
139
|
+
.sort({ createdAt: -1 })
|
|
140
|
+
.limit(limit)
|
|
141
|
+
.select('_id title tags createdAt userId isPublic')
|
|
142
|
+
.populate(DocumentDto.populate.user())
|
|
143
|
+
.lean();
|
|
144
|
+
|
|
145
|
+
const sanitizedData = data.map((doc) => {
|
|
146
|
+
const filteredDoc = {
|
|
147
|
+
...doc,
|
|
148
|
+
tags: DocumentDto.filterPublicTag(doc.tags),
|
|
149
|
+
};
|
|
150
|
+
// For unauthenticated users, only include user data if document is public AND creator is publisher
|
|
151
|
+
if (!user || user.role === 'guest') {
|
|
152
|
+
const isPublisher = doc.userId && (doc.userId.role === 'admin' || doc.userId.role === 'moderator');
|
|
153
|
+
if (!doc.isPublic || !isPublisher) {
|
|
154
|
+
const { userId, ...rest } = filteredDoc;
|
|
155
|
+
return rest;
|
|
156
|
+
}
|
|
157
|
+
// Remove role field from userId before sending to client
|
|
158
|
+
if (filteredDoc.userId && filteredDoc.userId.role) {
|
|
159
|
+
const { role, ...userWithoutRole } = filteredDoc.userId;
|
|
160
|
+
filteredDoc.userId = userWithoutRole;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Remove role field from userId before sending to client (authenticated users)
|
|
164
|
+
if (filteredDoc.userId && filteredDoc.userId.role) {
|
|
165
|
+
const { role, ...userWithoutRole } = filteredDoc.userId;
|
|
166
|
+
filteredDoc.userId = userWithoutRole;
|
|
167
|
+
}
|
|
168
|
+
return filteredDoc;
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
return { data: sanitizedData };
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// OPTIMIZATION: Split search query into individual terms for multi-term matching
|
|
175
|
+
// This maximizes results by matching ANY term in ANY field
|
|
176
|
+
// Example: "react hooks" becomes ["react", "hooks"]
|
|
177
|
+
const searchTerms = searchQuery
|
|
178
|
+
.split(/\s+/)
|
|
179
|
+
.filter((term) => term.length > 0)
|
|
180
|
+
.map((term) => term.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')); // Escape each term for regex safety
|
|
181
|
+
|
|
182
|
+
// Build query based on authentication status
|
|
183
|
+
// and search conditions for maximum permissiveness
|
|
184
|
+
const buildSearchConditions = () => {
|
|
185
|
+
const conditions = [];
|
|
186
|
+
|
|
187
|
+
// For EACH search term, create conditions that match title OR tags
|
|
188
|
+
// This creates an OR chain: (title:term1 OR tags:term1 OR title:term2 OR tags:term2 ...)
|
|
189
|
+
searchTerms.forEach((term) => {
|
|
190
|
+
conditions.push({ title: { $regex: term, $options: 'i' } }); // Case-insensitive title match
|
|
191
|
+
conditions.push({ tags: { $in: [new RegExp(term, 'i')] } }); // Case-insensitive tag match
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
return conditions;
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
let queryPayload;
|
|
198
|
+
|
|
199
|
+
if (user && user.role && user.role !== 'guest') {
|
|
200
|
+
// Authenticated user can see:
|
|
201
|
+
// 1. ALL their own documents (public AND private - no tag restriction)
|
|
202
|
+
// 2. Public-tagged documents from publishers (admin/moderator only)
|
|
203
|
+
|
|
204
|
+
const searchConditions = buildSearchConditions();
|
|
205
|
+
|
|
206
|
+
queryPayload = {
|
|
207
|
+
tags: { $in: [idPanel] }, // Filter by idPanel to prevent out-of-panel context results (tags is array)
|
|
208
|
+
$or: [
|
|
209
|
+
{
|
|
210
|
+
// Public documents from publishers (admin/moderator)
|
|
211
|
+
userId: { $in: publisherUsers.map((p) => p._id) },
|
|
212
|
+
isPublic: true,
|
|
213
|
+
$or: searchConditions, // ANY term in title OR tags
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
// User's OWN documents - NO TAG RESTRICTION
|
|
217
|
+
// User sees ALL their own content matching search
|
|
218
|
+
userId: user._id,
|
|
219
|
+
$or: searchConditions, // ANY term in title OR tags
|
|
220
|
+
},
|
|
221
|
+
],
|
|
222
|
+
};
|
|
223
|
+
} else {
|
|
224
|
+
// Public/unauthenticated user: ONLY public-tagged documents from publishers (admin/moderator)
|
|
225
|
+
|
|
226
|
+
const searchConditions = buildSearchConditions();
|
|
227
|
+
|
|
228
|
+
queryPayload = {
|
|
229
|
+
tags: { $in: [idPanel] }, // Filter by idPanel to prevent out-of-panel context results (tags is array)
|
|
230
|
+
userId: { $in: publisherUsers.map((p) => p._id) },
|
|
231
|
+
isPublic: true,
|
|
232
|
+
$or: searchConditions, // ANY term in title OR tags
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// Edge case: no publishers and no authenticated user = no results
|
|
237
|
+
if (publisherUsers.length === 0 && (!user || user.role === 'guest')) {
|
|
238
|
+
logger.warn('No publishers found and user not authenticated - returning empty results');
|
|
239
|
+
return { data: [] };
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
const data = await Document.find(queryPayload)
|
|
243
|
+
.sort({ createdAt: -1 })
|
|
244
|
+
.limit(limit)
|
|
245
|
+
.select('_id title tags createdAt userId isPublic')
|
|
246
|
+
.populate(DocumentDto.populate.user())
|
|
247
|
+
.lean();
|
|
248
|
+
|
|
249
|
+
// Sanitize response - include userId for public documents from publishers, filter 'public' from tags
|
|
250
|
+
const sanitizedData = data.map((doc) => {
|
|
251
|
+
const filteredDoc = {
|
|
252
|
+
...doc,
|
|
253
|
+
tags: DocumentDto.filterPublicTag(doc.tags),
|
|
254
|
+
};
|
|
255
|
+
// For unauthenticated users, only include user data if document is public AND creator is publisher
|
|
256
|
+
if (!user || user.role === 'guest') {
|
|
257
|
+
const isPublisher = doc.userId && (doc.userId.role === 'admin' || doc.userId.role === 'moderator');
|
|
258
|
+
if (!doc.isPublic || !isPublisher) {
|
|
259
|
+
const { userId, ...rest } = filteredDoc;
|
|
260
|
+
return rest;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
// Remove role field from userId before sending to client (all users)
|
|
264
|
+
delete filteredDoc.userId.role;
|
|
265
|
+
return filteredDoc;
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
return { data: sanitizedData };
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// Standard public endpoint with tag filtering
|
|
272
|
+
// Security Model (consistent with high-query search):
|
|
273
|
+
// - Unauthenticated users: CAN see public documents (isPublic=true) from publishers (admin/moderator)
|
|
274
|
+
// - Authenticated users: CAN see public documents from publishers + ALL their own documents (public AND private)
|
|
275
|
+
if (req.path.startsWith('/public') && req.query['tags']) {
|
|
276
|
+
const publisherUsers = await User.find({ $or: [{ role: 'admin' }, { role: 'moderator' }] });
|
|
277
|
+
|
|
278
|
+
// Security check: Validate publishers exist
|
|
279
|
+
if (publisherUsers.length === 0) {
|
|
280
|
+
logger.warn('No publishers (admin/moderator) found for public tag search');
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
const token = getBearerToken(req);
|
|
284
|
+
let user;
|
|
285
|
+
if (token) {
|
|
286
|
+
try {
|
|
287
|
+
user = verifyJWT(token, options);
|
|
288
|
+
} catch (error) {
|
|
289
|
+
logger.warn('Invalid token for public search', error.message);
|
|
290
|
+
user = null;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
// Parse requested tags
|
|
295
|
+
const requestedTagsRaw = req.query['tags']
|
|
296
|
+
.split(',')
|
|
297
|
+
.map((tag) => tag.trim())
|
|
298
|
+
.filter((tag) => tag);
|
|
299
|
+
|
|
300
|
+
// SPECIAL CASE: If 'public' is in the requested tags (exact match)
|
|
301
|
+
// Filter to ONLY documents where isPublic === true
|
|
302
|
+
const hasPublicTag = requestedTagsRaw.some((tag) => tag.toLowerCase() === 'public');
|
|
303
|
+
|
|
304
|
+
// Remove 'public' from content tags (it's handled by isPublic field)
|
|
305
|
+
const requestedTags = requestedTagsRaw.filter((tag) => tag.toLowerCase() !== 'public');
|
|
306
|
+
|
|
307
|
+
// Parse pagination parameters
|
|
308
|
+
const limit = req.query.limit ? parseInt(req.query.limit, 10) : 6;
|
|
309
|
+
const skip = req.query.skip ? parseInt(req.query.skip, 10) : 0;
|
|
310
|
+
|
|
311
|
+
// Build query based on authentication status
|
|
312
|
+
// Authenticated users see ALL their own documents + public documents from publishers
|
|
313
|
+
// Unauthenticated users see only public documents from publishers
|
|
314
|
+
let queryPayload;
|
|
315
|
+
|
|
316
|
+
if (user && user.role && user.role !== 'guest') {
|
|
317
|
+
// Authenticated user can see:
|
|
318
|
+
// 1. Public documents from publishers (admin/moderator)
|
|
319
|
+
// 2. ALL their own documents (public AND private - matching tag filter)
|
|
320
|
+
const orConditions = [
|
|
321
|
+
{
|
|
322
|
+
// Public documents from publishers
|
|
323
|
+
userId: { $in: publisherUsers.map((p) => p._id) },
|
|
324
|
+
isPublic: true,
|
|
325
|
+
...(requestedTags.length > 0 ? { tags: { $all: requestedTags } } : {}),
|
|
326
|
+
},
|
|
327
|
+
{
|
|
328
|
+
// User's OWN documents - public OR private (matching tag filter)
|
|
329
|
+
// UNLESS 'public' tag was explicitly requested (then only show isPublic: true)
|
|
330
|
+
userId: user._id,
|
|
331
|
+
...(hasPublicTag ? { isPublic: true } : {}),
|
|
332
|
+
...(requestedTags.length > 0 ? { tags: { $all: requestedTags } } : {}),
|
|
333
|
+
},
|
|
334
|
+
];
|
|
335
|
+
|
|
336
|
+
queryPayload = {
|
|
337
|
+
$or: orConditions,
|
|
338
|
+
};
|
|
339
|
+
|
|
340
|
+
// Add cid filter outside $or block if present
|
|
341
|
+
if (req.query.cid) {
|
|
342
|
+
queryPayload._id = {
|
|
343
|
+
$in: req.query.cid.split(',').filter((cid) => isValidObjectId(cid)),
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
} else {
|
|
347
|
+
// Unauthenticated user: only public documents from publishers
|
|
348
|
+
// If 'public' tag requested, it's redundant but handled by isPublic: true
|
|
349
|
+
// When cid is provided, we relax the publisher filter and check in post-processing
|
|
350
|
+
const cidList = req.query.cid ? req.query.cid.split(',').filter((cid) => isValidObjectId(cid)) : null;
|
|
351
|
+
|
|
352
|
+
if (cidList && cidList.length > 0) {
|
|
353
|
+
// For cid queries, just filter by public and tags, check publisher in post-processing
|
|
354
|
+
queryPayload = {
|
|
355
|
+
_id: { $in: cidList },
|
|
356
|
+
isPublic: true,
|
|
357
|
+
...(requestedTags.length > 0 ? { tags: { $all: requestedTags } } : {}),
|
|
358
|
+
};
|
|
359
|
+
} else {
|
|
360
|
+
// For non-cid queries, filter by publisher at query level
|
|
361
|
+
queryPayload = {
|
|
362
|
+
userId: { $in: publisherUsers.map((p) => p._id) },
|
|
363
|
+
isPublic: true,
|
|
364
|
+
...(requestedTags.length > 0 ? { tags: { $all: requestedTags } } : {}),
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
// sort in descending (-1) order by length
|
|
370
|
+
const sort = { createdAt: -1 };
|
|
371
|
+
|
|
372
|
+
// Populate user data for authenticated users OR for public documents from publishers
|
|
373
|
+
// This allows unauthenticated users to see creator profiles on public content
|
|
374
|
+
const shouldPopulateUser = user && user.role !== 'guest';
|
|
375
|
+
// Check if query contains public documents (either in $or array or flat query)
|
|
376
|
+
const hasPublicDocuments =
|
|
377
|
+
queryPayload.isPublic === true ||
|
|
378
|
+
queryPayload.$or?.some(
|
|
379
|
+
(condition) => condition.isPublic === true || (condition.userId && condition.isPublic === true),
|
|
380
|
+
);
|
|
381
|
+
|
|
382
|
+
const data = await Document.find(queryPayload)
|
|
383
|
+
.sort(sort)
|
|
384
|
+
.limit(limit)
|
|
385
|
+
.skip(skip)
|
|
386
|
+
.populate(DocumentDto.populate.file())
|
|
387
|
+
.populate(DocumentDto.populate.mdFile())
|
|
388
|
+
.populate(shouldPopulateUser || hasPublicDocuments ? DocumentDto.populate.user() : null);
|
|
389
|
+
|
|
390
|
+
const lastDoc = await Document.findOne(queryPayload, '_id').sort({ createdAt: 1 });
|
|
391
|
+
const lastId = lastDoc ? lastDoc._id : null;
|
|
392
|
+
|
|
393
|
+
return {
|
|
394
|
+
data: data.map((doc) => {
|
|
395
|
+
const docObj = doc.toObject ? doc.toObject() : doc;
|
|
396
|
+
let userInfo = docObj.userId;
|
|
397
|
+
const isPublisher = userInfo && (userInfo.role === 'admin' || userInfo.role === 'moderator');
|
|
398
|
+
const isOwnDoc = user && user._id.toString() === docObj.userId._id.toString();
|
|
399
|
+
if ((!docObj.isPublic || !isPublisher) && !isOwnDoc) userInfo = undefined;
|
|
400
|
+
return {
|
|
401
|
+
...docObj,
|
|
402
|
+
userId: {
|
|
403
|
+
...userInfo,
|
|
404
|
+
role: undefined,
|
|
405
|
+
email: undefined,
|
|
406
|
+
},
|
|
407
|
+
tags: DocumentDto.filterPublicTag(docObj.tags),
|
|
408
|
+
totalCopyShareLinkCount: DocumentDto.getTotalCopyShareLinkCount(doc),
|
|
409
|
+
};
|
|
410
|
+
}),
|
|
411
|
+
lastId,
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
switch (req.params.id) {
|
|
416
|
+
default: {
|
|
417
|
+
// Simple pagination support for FileExplorer
|
|
418
|
+
const limit = req.query.limit ? parseInt(req.query.limit, 10) : 50;
|
|
419
|
+
const skip = req.query.skip ? parseInt(req.query.skip, 10) : 0;
|
|
420
|
+
|
|
421
|
+
// Search filter parameters
|
|
422
|
+
const searchTitle = req.query.searchTitle ? req.query.searchTitle.trim() : '';
|
|
423
|
+
const searchMdFile = req.query.searchMdFile ? req.query.searchMdFile.trim() : '';
|
|
424
|
+
const searchFile = req.query.searchFile ? req.query.searchFile.trim() : '';
|
|
425
|
+
|
|
426
|
+
const query = {
|
|
427
|
+
userId: req.auth.user._id,
|
|
428
|
+
...(req.params.id ? { _id: req.params.id } : undefined),
|
|
429
|
+
};
|
|
430
|
+
|
|
431
|
+
// Filter by title
|
|
432
|
+
if (searchTitle) {
|
|
433
|
+
const searchRegex = searchTitle.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
434
|
+
query.title = { $regex: searchRegex, $options: 'i' };
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
// Filter by markdown file name
|
|
438
|
+
if (searchMdFile) {
|
|
439
|
+
const searchRegex = searchMdFile.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
440
|
+
const files = await File.find({ name: { $regex: searchRegex, $options: 'i' } }).select('_id');
|
|
441
|
+
query.mdFileId = { $in: files.map((f) => f._id) };
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
// Filter by generic file name
|
|
445
|
+
if (searchFile) {
|
|
446
|
+
const searchRegex = searchFile.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
447
|
+
const files = await File.find({ name: { $regex: searchRegex, $options: 'i' } }).select('_id');
|
|
448
|
+
query.fileId = { $in: files.map((f) => f._id) };
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
// Get total count for pagination
|
|
452
|
+
const totalCount = await Document.countDocuments(query);
|
|
453
|
+
|
|
454
|
+
const data = await Document.find(query)
|
|
455
|
+
.sort({ createdAt: -1 })
|
|
456
|
+
.limit(limit)
|
|
457
|
+
.skip(skip)
|
|
458
|
+
.populate(DocumentDto.populate.file())
|
|
459
|
+
.populate(DocumentDto.populate.mdFile())
|
|
460
|
+
.populate(DocumentDto.populate.user());
|
|
461
|
+
|
|
462
|
+
return {
|
|
463
|
+
data,
|
|
464
|
+
pagination: {
|
|
465
|
+
totalCount,
|
|
466
|
+
limit,
|
|
467
|
+
skip,
|
|
468
|
+
hasMore: skip + data.length < totalCount,
|
|
469
|
+
search: {
|
|
470
|
+
title: searchTitle,
|
|
471
|
+
mdFile: searchMdFile,
|
|
472
|
+
file: searchFile,
|
|
473
|
+
},
|
|
474
|
+
},
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
};
|
|
479
|
+
|
|
480
|
+
/**
|
|
481
|
+
* DELETE - Remove a document and its associated files.
|
|
482
|
+
* @async
|
|
483
|
+
* @function delete
|
|
484
|
+
* @memberof DocumentService
|
|
485
|
+
* @param {Object} req - Express request object.
|
|
486
|
+
* @param {Object} res - Express response object.
|
|
487
|
+
* @param {Object} options - Request options containing host and path.
|
|
488
|
+
* @returns {Promise<Object>} Deleted document object.
|
|
489
|
+
* @throws {Error} If document not found or user not authorized.
|
|
490
|
+
*/
|
|
491
|
+
static delete = async (req, res, options) => {
|
|
492
|
+
/** @type {import('./document.model.js').DocumentModel} */
|
|
493
|
+
const Document = DataBaseProviderService.getModel("Document", options);
|
|
494
|
+
/** @type {import('../file/file.model.js').FileModel} */
|
|
495
|
+
const File = DataBaseProviderService.getModel("File", options);
|
|
496
|
+
|
|
497
|
+
switch (req.params.id) {
|
|
498
|
+
default: {
|
|
499
|
+
const document = await Document.findOne({ _id: req.params.id });
|
|
500
|
+
if (!document) throw new Error('document not found');
|
|
501
|
+
|
|
502
|
+
if (document.userId.toString() !== req.auth.user._id) throw new Error('invalid user');
|
|
503
|
+
|
|
504
|
+
// Clean up all associated files
|
|
505
|
+
await FileCleanup.deleteDocumentFiles({
|
|
506
|
+
doc: document,
|
|
507
|
+
fileFields: ['fileId', 'mdFileId'],
|
|
508
|
+
File,
|
|
509
|
+
});
|
|
510
|
+
|
|
511
|
+
return await Document.findByIdAndDelete(req.params.id);
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
};
|
|
515
|
+
|
|
516
|
+
/**
|
|
517
|
+
* PUT - Update a document.
|
|
518
|
+
* Cleans up replaced files and handles tag-based isPublic extraction.
|
|
519
|
+
* @async
|
|
520
|
+
* @function put
|
|
521
|
+
* @memberof DocumentService
|
|
522
|
+
* @param {Object} req - Express request object.
|
|
523
|
+
* @param {Object} res - Express response object.
|
|
524
|
+
* @param {Object} options - Request options containing host and path.
|
|
525
|
+
* @returns {Promise<Object>} Updated document object.
|
|
526
|
+
* @throws {Error} If document not found.
|
|
527
|
+
*/
|
|
528
|
+
static put = async (req, res, options) => {
|
|
529
|
+
/** @type {import('./document.model.js').DocumentModel} */
|
|
530
|
+
const Document = DataBaseProviderService.getModel("Document", options);
|
|
531
|
+
/** @type {import('../file/file.model.js').FileModel} */
|
|
532
|
+
const File = DataBaseProviderService.getModel("File", options);
|
|
533
|
+
|
|
534
|
+
switch (req.params.id) {
|
|
535
|
+
default: {
|
|
536
|
+
const document = await Document.findOne({ _id: req.params.id });
|
|
537
|
+
if (!document) throw new Error(`Document not found`);
|
|
538
|
+
|
|
539
|
+
// Clean up old files if they are being replaced
|
|
540
|
+
await FileCleanup.cleanupReplacedFiles({
|
|
541
|
+
oldDoc: document,
|
|
542
|
+
newData: req.body,
|
|
543
|
+
fileFields: ['fileId', 'mdFileId'],
|
|
544
|
+
File,
|
|
545
|
+
});
|
|
546
|
+
|
|
547
|
+
// Update file names if provided
|
|
548
|
+
if (req.body.mdFileName && document.mdFileId) {
|
|
549
|
+
await File.findByIdAndUpdate(document.mdFileId, { name: req.body.mdFileName });
|
|
550
|
+
}
|
|
551
|
+
if (req.body.fileName && document.fileId) {
|
|
552
|
+
await File.findByIdAndUpdate(document.fileId, { name: req.body.fileName });
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
// Remove file name fields from body as they are not part of Document schema
|
|
556
|
+
delete req.body.mdFileName;
|
|
557
|
+
delete req.body.fileName;
|
|
558
|
+
|
|
559
|
+
// Extract 'public' from tags and set isPublic field on update
|
|
560
|
+
const { isPublic, tags } = DocumentDto.extractPublicFromTags(req.body.tags);
|
|
561
|
+
req.body.isPublic = isPublic;
|
|
562
|
+
req.body.tags = tags;
|
|
563
|
+
|
|
564
|
+
return await Document.findByIdAndUpdate(req.params.id, req.body, { returnDocument: 'after' });
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
};
|
|
568
|
+
|
|
569
|
+
/**
|
|
570
|
+
* PATCH - Partially update a document.
|
|
571
|
+
* Supports toggle-public and copy-share-link operations.
|
|
572
|
+
* @async
|
|
573
|
+
* @function patch
|
|
574
|
+
* @memberof DocumentService
|
|
575
|
+
* @param {Object} req - Express request object.
|
|
576
|
+
* @param {Object} res - Express response object.
|
|
577
|
+
* @param {Object} options - Request options containing host and path.
|
|
578
|
+
* @returns {Promise<Object>} Updated document or result object.
|
|
579
|
+
* @throws {Error} If document not found or invalid patch endpoint.
|
|
580
|
+
*/
|
|
581
|
+
static patch = async (req, res, options) => {
|
|
582
|
+
/** @type {import('./document.model.js').DocumentModel} */
|
|
583
|
+
const Document = DataBaseProviderService.getModel("Document", options);
|
|
584
|
+
|
|
585
|
+
if (req.path.includes('/toggle-public')) {
|
|
586
|
+
const document = await Document.findById(req.params.id);
|
|
587
|
+
if (!document) throw new Error('Document not found');
|
|
588
|
+
|
|
589
|
+
// Toggle the isPublic field
|
|
590
|
+
document.isPublic = !document.isPublic;
|
|
591
|
+
await document.save();
|
|
592
|
+
|
|
593
|
+
return { _id: document._id, isPublic: document.isPublic };
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
if (req.path.includes('/copy-share-link')) {
|
|
597
|
+
const document = await Document.findById(req.params.id);
|
|
598
|
+
if (!document) throw new Error('Document not found');
|
|
599
|
+
|
|
600
|
+
const now = new Date();
|
|
601
|
+
const year = now.getFullYear();
|
|
602
|
+
const month = now.getMonth() + 1; // 0-indexed
|
|
603
|
+
const day = now.getDate();
|
|
604
|
+
|
|
605
|
+
// Find existing entry for this year/month/day
|
|
606
|
+
const existingEventIndex = document.share?.copyShareLinkEvent?.findIndex(
|
|
607
|
+
(event) => event.year === year && event.month === month && event.day === day,
|
|
608
|
+
);
|
|
609
|
+
|
|
610
|
+
if (existingEventIndex !== undefined && existingEventIndex >= 0) {
|
|
611
|
+
// Increment existing count
|
|
612
|
+
document.share.copyShareLinkEvent[existingEventIndex].count += 1;
|
|
613
|
+
} else {
|
|
614
|
+
// Create new entry
|
|
615
|
+
if (!document.share) document.share = {};
|
|
616
|
+
if (!document.share.copyShareLinkEvent) document.share.copyShareLinkEvent = [];
|
|
617
|
+
document.share.copyShareLinkEvent.push({
|
|
618
|
+
year,
|
|
619
|
+
month,
|
|
620
|
+
day,
|
|
621
|
+
count: 1,
|
|
622
|
+
});
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
await document.save();
|
|
626
|
+
return document;
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
throw new Error('Invalid patch endpoint');
|
|
630
|
+
};
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
export { DocumentService };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { controllerHandler, sendSuccess, serviceHandler, setCrossOriginHeaders } from '../../server/middlewares.js';
|
|
2
|
+
import { FileService } from './file.service.js';
|
|
3
|
+
|
|
4
|
+
class FileController {
|
|
5
|
+
static post = serviceHandler(FileService.post);
|
|
6
|
+
static get = controllerHandler(async (req, res, options) => {
|
|
7
|
+
setCrossOriginHeaders(req, res);
|
|
8
|
+
const result = await FileService.get(req, res, options);
|
|
9
|
+
if (result instanceof Buffer) return res.status(200).end(result);
|
|
10
|
+
return sendSuccess(res, result);
|
|
11
|
+
});
|
|
12
|
+
static delete = serviceHandler(FileService.delete);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export { FileController };
|