underpost 3.2.8 → 3.2.10

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 (92) hide show
  1. package/.github/workflows/npmpkg.ci.yml +1 -0
  2. package/.github/workflows/pwa-microservices-template-test.ci.yml +1 -1
  3. package/.github/workflows/release.cd.yml +1 -0
  4. package/.vscode/settings.json +10 -5
  5. package/CHANGELOG.md +223 -2
  6. package/CLI-HELP.md +36 -7
  7. package/README.md +38 -9
  8. package/bin/build.js +27 -11
  9. package/bin/deploy.js +20 -21
  10. package/bin/file.js +32 -13
  11. package/bin/index.js +2 -1
  12. package/bin/vs.js +1 -1
  13. package/bump.config.js +26 -0
  14. package/conf.js +20 -4
  15. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +2 -2
  16. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +2 -2
  17. package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
  18. package/manifests/deployment/dd-test-development/deployment.yaml +4 -2
  19. package/manifests/kind-config-dev.yaml +8 -0
  20. package/manifests/mongodb/pv-pvc.yaml +44 -8
  21. package/manifests/mongodb/statefulset.yaml +55 -68
  22. package/package.json +40 -25
  23. package/scripts/k3s-node-setup.sh +30 -11
  24. package/scripts/nat-iptables.sh +103 -18
  25. package/src/api/core/core.router.js +19 -14
  26. package/src/api/core/core.service.js +5 -5
  27. package/src/api/default/default.router.js +22 -18
  28. package/src/api/default/default.service.js +5 -5
  29. package/src/api/document/document.router.js +28 -23
  30. package/src/api/document/document.service.js +100 -23
  31. package/src/api/file/file.router.js +19 -13
  32. package/src/api/file/file.service.js +9 -7
  33. package/src/api/test/test.router.js +17 -12
  34. package/src/api/types.js +24 -0
  35. package/src/api/user/guest.service.js +5 -4
  36. package/src/api/user/user.router.js +297 -288
  37. package/src/api/user/user.service.js +100 -35
  38. package/src/cli/baremetal.js +20 -11
  39. package/src/cli/cluster.js +243 -55
  40. package/src/cli/db.js +106 -62
  41. package/src/cli/deploy.js +297 -154
  42. package/src/cli/fs.js +19 -3
  43. package/src/cli/index.js +37 -9
  44. package/src/cli/ipfs.js +4 -6
  45. package/src/cli/kubectl.js +4 -1
  46. package/src/cli/lxd.js +217 -135
  47. package/src/cli/release.js +289 -131
  48. package/src/cli/repository.js +91 -34
  49. package/src/cli/run.js +297 -56
  50. package/src/cli/test.js +9 -3
  51. package/src/client/Default.index.js +9 -3
  52. package/src/client/components/core/Auth.js +19 -5
  53. package/src/client/components/core/Docs.js +6 -34
  54. package/src/client/components/core/FileExplorer.js +6 -6
  55. package/src/client/components/core/Modal.js +65 -2
  56. package/src/client/components/core/PanelForm.js +56 -52
  57. package/src/client/components/core/Recover.js +4 -4
  58. package/src/client/components/core/Worker.js +170 -350
  59. package/src/client/services/default/default.management.js +20 -25
  60. package/src/client/services/user/guest.service.js +10 -3
  61. package/src/client/sw/core.sw.js +174 -112
  62. package/src/db/DataBaseProvider.js +120 -20
  63. package/src/db/mongo/MongoBootstrap.js +587 -0
  64. package/src/db/mongo/MongooseDB.js +126 -22
  65. package/src/index.js +1 -1
  66. package/src/runtime/express/Express.js +2 -2
  67. package/src/runtime/wp/Wp.js +8 -5
  68. package/src/server/auth.js +2 -2
  69. package/src/server/client-build-docs.js +1 -1
  70. package/src/server/client-build.js +94 -129
  71. package/src/server/conf.js +20 -65
  72. package/src/server/data-query.js +32 -20
  73. package/src/server/dns.js +22 -0
  74. package/src/server/process.js +180 -19
  75. package/src/server/runtime.js +1 -1
  76. package/src/server/start.js +26 -7
  77. package/src/server/valkey.js +9 -2
  78. package/src/ws/IoInterface.js +16 -16
  79. package/src/ws/core/channels/core.ws.chat.js +11 -11
  80. package/src/ws/core/channels/core.ws.mailer.js +29 -29
  81. package/src/ws/core/channels/core.ws.stream.js +19 -19
  82. package/src/ws/core/core.ws.connection.js +8 -8
  83. package/src/ws/core/core.ws.server.js +6 -5
  84. package/src/ws/default/channels/default.ws.main.js +10 -10
  85. package/src/ws/default/default.ws.connection.js +4 -4
  86. package/src/ws/default/default.ws.server.js +4 -3
  87. package/typedoc.json +10 -1
  88. package/src/client/ssr/email/DefaultRecoverEmail.js +0 -21
  89. package/src/client/ssr/email/DefaultVerifyEmail.js +0 -17
  90. /package/src/client/ssr/{offline → views}/Maintenance.js +0 -0
  91. /package/src/client/ssr/{offline → views}/NoNetworkConnection.js +0 -0
  92. /package/src/client/ssr/{pages → views}/Test.js +0 -0
package/package.json CHANGED
@@ -2,8 +2,8 @@
2
2
  "type": "module",
3
3
  "main": "src/index.js",
4
4
  "name": "underpost",
5
- "version": "3.2.8",
6
- "description": "pwa api rest template",
5
+ "version": "3.2.10",
6
+ "description": "Underpost Platform end-to-end CI/CD and application-delivery toolchain CLI. Covers bare metal, Kubernetes, K3s, kubeadm, LXD, container/image orchestration, secrets, databases, cron jobs, monitoring, SSH, runners, PWA + Workbox delivery, and release orchestration. Extensible via downstream CLIs.",
7
7
  "scripts": {
8
8
  "start": "node --max-old-space-size=8192 src/server",
9
9
  "build": "node bin client",
@@ -35,7 +35,21 @@
35
35
  "url": "git+https://github.com/underpostnet/pwa-microservices-template.git"
36
36
  },
37
37
  "keywords": [
38
+ "underpost",
39
+ "underpost-platform",
40
+ "cli",
41
+ "toolchain",
42
+ "ci-cd",
43
+ "devops",
44
+ "kubernetes",
45
+ "k3s",
46
+ "kubeadm",
47
+ "lxd",
48
+ "bare-metal",
49
+ "container-orchestration",
50
+ "image-management",
38
51
  "pwa",
52
+ "workbox",
39
53
  "microservices",
40
54
  "template",
41
55
  "builder",
@@ -53,12 +67,13 @@
53
67
  "dependencies": {
54
68
  "@fortawesome/fontawesome-free": "^7.2.0",
55
69
  "@fullcalendar/rrule": "^6.1.20",
56
- "@grpc/grpc-js": "^1.12.5",
57
- "@grpc/proto-loader": "^0.8.0",
70
+ "@grpc/grpc-js": "^1.14.4",
71
+ "@grpc/proto-loader": "^0.8.1",
58
72
  "@neodrag/vanilla": "^2.3.1",
59
73
  "adm-zip": "^0.5.17",
60
- "ag-grid-community": "^35.2.1",
61
- "axios": "^1.15.2",
74
+ "ag-grid-community": "^35.3.0",
75
+ "axios": "^1.16.1",
76
+ "bumpp": "^10.1.0",
62
77
  "chai": "^6.2.2",
63
78
  "clipboardy": "^5.3.1",
64
79
  "cloudinary": "^2.10.0",
@@ -70,35 +85,35 @@
70
85
  "d3": "^7.9.0",
71
86
  "dexie": "^4.2.1",
72
87
  "dotenv": "^17.4.2",
73
- "easymde": "^2.18.0",
88
+ "easymde": "^2.21.0",
74
89
  "esbuild": "^0.28.0",
75
90
  "escape-string-regexp": "^5.0.0",
76
91
  "express": "^5.2.1",
77
92
  "express-fileupload": "^1.4.3",
78
- "express-rate-limit": "^8.4.1",
93
+ "express-rate-limit": "^8.5.2",
79
94
  "express-slow-down": "^3.1.0",
80
95
  "fast-json-stable-stringify": "^2.1.0",
81
96
  "favicons": "^7.2.0",
82
- "fs-extra": "^11.3.4",
97
+ "fs-extra": "^11.3.5",
83
98
  "fullcalendar": "^6.1.15",
84
- "helmet": "^8.1.0",
99
+ "helmet": "^8.2.0",
85
100
  "html-minifier-terser": "^7.2.0",
86
- "http-proxy-middleware": "^3.0.5",
87
- "ignore-walk": "^8.0.0",
101
+ "http-proxy-middleware": "^4.0.0",
102
+ "ignore-walk": "^9.0.0",
88
103
  "iovalkey": "^0.3.3",
89
104
  "json-colorizer": "^3.0.1",
90
105
  "jsonwebtoken": "^9.0.3",
91
106
  "mariadb": "^3.2.2",
92
- "marked": "^18.0.2",
93
- "mocha": "^11.3.0",
94
- "mongoose": "^9.5.0",
107
+ "mocha": "^11.7.6",
108
+ "marked": "^18.0.4",
109
+ "mongoose": "^9.6.2",
95
110
  "morgan": "^1.10.0",
96
- "nodemailer": "^8.0.6",
111
+ "nodemailer": "^8.0.8",
97
112
  "nodemon": "^3.0.1",
98
113
  "peer": "^1.0.2",
99
114
  "peerjs": "^1.5.5",
100
115
  "prom-client": "^15.1.2",
101
- "read": "^5.0.1",
116
+ "read": "^6.0.0",
102
117
  "rrule": "^2.8.1",
103
118
  "shelljs": "^0.10.0",
104
119
  "sitemap": "^9.0.1",
@@ -108,17 +123,17 @@
108
123
  "swagger-autogen": "^2.23.7",
109
124
  "swagger-ui-express": "^5.0.0",
110
125
  "typedoc": "^0.28.19",
111
- "typescript": "^5.8.0",
126
+ "typescript": "^6.0.3",
112
127
  "validator": "^13.15.35",
113
128
  "vanilla-jsoneditor": "^3.12.0",
114
129
  "winston": "^3.19.0",
115
- "workbox-background-sync": "^7.4.0",
116
- "workbox-cacheable-response": "^7.4.0",
117
- "workbox-core": "^7.4.0",
118
- "workbox-expiration": "^7.4.0",
119
- "workbox-precaching": "^7.4.0",
120
- "workbox-routing": "^7.4.0",
121
- "workbox-strategies": "^7.4.0"
130
+ "workbox-background-sync": "^7.4.1",
131
+ "workbox-cacheable-response": "^7.4.1",
132
+ "workbox-core": "^7.4.1",
133
+ "workbox-expiration": "^7.4.1",
134
+ "workbox-precaching": "^7.4.1",
135
+ "workbox-routing": "^7.4.1",
136
+ "workbox-strategies": "^7.4.1"
122
137
  },
123
138
  "publishConfig": {
124
139
  "provenance": true,
@@ -8,6 +8,13 @@ set -e
8
8
  # --worker Initialize as K3s worker node
9
9
  # --control-ip=<ip> Control plane IP (required for --worker)
10
10
  # --token=<token> K3s node token (required for --worker)
11
+ #
12
+ # DESIGN NOTES:
13
+ # - This script installs the underpost CLI globally via npm.
14
+ # - It then uses the global CLI binary for configuration and K3s setup.
15
+ # - Engine source replication (e.g. via --bootstrap-engine from the host)
16
+ # is a SEPARATE step. This script does NOT depend on /home/dd/engine
17
+ # being pre-pushed. Use --bootstrap-engine after --init-vm completes.
11
18
  # ---------------------------------------------------------------------------
12
19
 
13
20
  ROLE="control"
@@ -32,8 +39,8 @@ curl -o- https://cdn.jsdelivr.net/gh/nvm-sh/nvm@v0.40.1/install.sh | bash
32
39
  export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
33
40
  [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
34
41
 
35
- nvm install 24.10.0
36
- nvm use 24.10.0
42
+ nvm install 24.15.0
43
+ nvm use 24.15.0
37
44
 
38
45
  echo "
39
46
  ██╗░░░██╗███╗░░██╗██████╗░███████╗██████╗░██████╗░░█████╗░░██████╗████████╗
@@ -48,19 +55,31 @@ Installing underpost VM node...
48
55
 
49
56
  npm install -g underpost
50
57
 
51
- cd /home/dd/engine
52
-
53
58
  echo "Applying host configuration..."
54
59
 
55
- npm install
56
-
57
- node bin run secret
58
-
59
- node bin cluster --dev --config
60
+ # Use the globally installed underpost CLI
61
+ # NOTE: --dev is used to match the host dev context
62
+ underpost cluster --dev --config
63
+
64
+ # Check if /home/dd/engine exists locally for engine-specific operations.
65
+ # This directory is populated by the host running --bootstrap-engine.
66
+ # If absent, the global underpost CLI handles all operations.
67
+ if [ -d /home/dd/engine ]; then
68
+ echo "Local engine source found at /home/dd/engine. Using local underpost."
69
+ cd /home/dd/engine
70
+ npm install
71
+ node bin run secret
72
+ else
73
+ echo "No local engine source at /home/dd/engine. Using global underpost CLI."
74
+ echo "Engine source can be replicated later with --bootstrap-engine from the host."
75
+ # The globally installed underpost handles secret generation via its own config
76
+ underpost secret underpost --init
77
+ fi
60
78
 
61
79
  if [ "$ROLE" = "control" ]; then
62
80
  echo "Initializing K3s control plane..."
63
- node bin cluster --dev --k3s
81
+ # Use global underpost CLI for K3s setup
82
+ underpost cluster --dev --k3s
64
83
 
65
84
  echo ""
66
85
  echo "K3s control plane is ready."
@@ -86,4 +105,4 @@ elif [ "$ROLE" = "worker" ]; then
86
105
  echo ""
87
106
  echo "K3s worker node joined the cluster at https://${CONTROL_IP}:6443 successfully."
88
107
  sudo systemctl status k3s-agent --no-pager
89
- fi
108
+ fi
@@ -1,26 +1,111 @@
1
1
  #!/bin/bash
2
2
  set -euo pipefail
3
3
 
4
- # Disable firewalld
5
- sudo systemctl disable --now iptables
6
- sudo systemctl disable --now ufw
7
- sudo systemctl disable --now firewalld
4
+ echo "[INFO] Enabling firewalld..."
5
+ sudo systemctl enable --now firewalld
8
6
 
7
+ echo "[INFO] Configuring kernel networking..."
9
8
 
10
- # Remove any existing entries, then append exactly one
11
- sudo sed -i '/^net.ipv4.ip_forward/d' /etc/sysctl.conf
12
- sudo sed -i '/^net.ipv6.conf.all.forwarding/d' /etc/sysctl.conf
13
- echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
14
- echo "net.ipv6.conf.all.forwarding = 1" | sudo tee -a /etc/sysctl.conf
15
- # ---
9
+ sudo tee /etc/sysctl.d/99-kubernetes.conf >/dev/null <<'EOF'
10
+ # Kubernetes networking
11
+ net.ipv4.ip_forward = 1
12
+ net.ipv6.conf.all.forwarding = 1
16
13
 
17
- sudo sysctl -p
14
+ # Required for Kubernetes iptables
15
+ net.bridge.bridge-nf-call-iptables = 1
16
+ net.bridge.bridge-nf-call-ip6tables = 1
18
17
 
19
- # Accept all traffic
20
- sudo iptables -P INPUT ACCEPT
21
- sudo iptables -P FORWARD ACCEPT
22
- sudo iptables -P OUTPUT ACCEPT
18
+ # Better conntrack handling
19
+ net.netfilter.nf_conntrack_max = 131072
20
+ EOF
23
21
 
24
- # List iptables rules and forwarding flag
25
- sudo iptables -L -n
26
- sysctl net.ipv4.ip_forward net.ipv6.conf.all.forwarding
22
+ # Load br_netfilter immediately
23
+ sudo modprobe br_netfilter
24
+
25
+ # Apply sysctl
26
+ sudo sysctl --system
27
+
28
+ echo "[INFO] Opening common WAN/public services..."
29
+
30
+ # Public services
31
+ sudo firewall-cmd --permanent --zone=public --add-service=ssh
32
+ sudo firewall-cmd --permanent --zone=public --add-service=http
33
+ sudo firewall-cmd --permanent --zone=public --add-service=https
34
+
35
+ echo "[INFO] Opening Kubernetes control plane ports..."
36
+
37
+ # Kubernetes API Server
38
+ sudo firewall-cmd --permanent --zone=public --add-port=6443/tcp
39
+
40
+ # etcd
41
+ sudo firewall-cmd --permanent --zone=public --add-port=2379-2380/tcp
42
+
43
+ # kubelet API
44
+ sudo firewall-cmd --permanent --zone=public --add-port=10250/tcp
45
+
46
+ # kube-scheduler
47
+ sudo firewall-cmd --permanent --zone=public --add-port=10259/tcp
48
+
49
+ # kube-controller-manager
50
+ sudo firewall-cmd --permanent --zone=public --add-port=10257/tcp
51
+
52
+ echo "[INFO] Opening Kubernetes networking ports..."
53
+
54
+ # CoreDNS
55
+ sudo firewall-cmd --permanent --zone=public --add-port=53/tcp
56
+ sudo firewall-cmd --permanent --zone=public --add-port=53/udp
57
+
58
+ # NodePort Services
59
+ sudo firewall-cmd --permanent --zone=public --add-port=30000-32767/tcp
60
+ sudo firewall-cmd --permanent --zone=public --add-port=30000-32767/udp
61
+
62
+ # Calico VXLAN
63
+ sudo firewall-cmd --permanent --zone=public --add-port=4789/udp
64
+
65
+ # Calico BGP
66
+ sudo firewall-cmd --permanent --zone=public --add-port=179/tcp
67
+
68
+ # Calico Typha (required for multi-node Calico deployments)
69
+ sudo firewall-cmd --permanent --zone=public --add-port=5473/tcp
70
+
71
+ # Calico WireGuard (optional encrypted overlay)
72
+ sudo firewall-cmd --permanent --zone=public --add-port=51820/udp
73
+ sudo firewall-cmd --permanent --zone=public --add-port=51821/udp
74
+
75
+ # Flannel VXLAN (UDP, required if using Flannel CNI)
76
+ sudo firewall-cmd --permanent --zone=public --add-port=8472/udp
77
+
78
+ # kube-proxy healthz
79
+ sudo firewall-cmd --permanent --zone=public --add-port=10256/tcp
80
+
81
+ # metrics-server
82
+ sudo firewall-cmd --permanent --zone=public --add-port=4443/tcp
83
+
84
+ echo "[INFO] Configuring trusted zone for inter-node pod/service CIDRs..."
85
+ # Allow all traffic from the default pod CIDR and service CIDR so that
86
+ # cross-node pod-to-pod and service routing works without explicit per-port rules.
87
+ sudo firewall-cmd --permanent --zone=trusted --add-source=192.168.0.0/16
88
+ sudo firewall-cmd --permanent --zone=trusted --add-source=10.96.0.0/12
89
+
90
+ echo "[INFO] Enabling masquerade and forwarding..."
91
+
92
+ sudo firewall-cmd --permanent --zone=public --add-masquerade
93
+
94
+ echo "[INFO] Reloading firewall..."
95
+
96
+ sudo firewall-cmd --reload
97
+
98
+ echo
99
+ echo "[INFO] Sysctl status:"
100
+ sudo sysctl \
101
+ net.ipv4.ip_forward \
102
+ net.ipv6.conf.all.forwarding \
103
+ net.bridge.bridge-nf-call-iptables \
104
+ net.bridge.bridge-nf-call-ip6tables
105
+
106
+ echo
107
+ echo "[INFO] Firewall status:"
108
+ sudo firewall-cmd --zone=public --list-all
109
+
110
+ echo
111
+ echo "[INFO] Kubernetes firewall configuration completed."
@@ -5,20 +5,25 @@ import express from 'express';
5
5
 
6
6
  const logger = loggerFactory(import.meta);
7
7
 
8
- const CoreRouter = (options) => {
9
- const router = express.Router();
10
- const authMiddleware = options.authMiddleware;
11
- router.post(`/:id`, authMiddleware, adminGuard, async (req, res) => await CoreController.post(req, res, options));
12
- router.post(`/`, authMiddleware, adminGuard, async (req, res) => await CoreController.post(req, res, options));
13
- router.get(`/:id`, authMiddleware, adminGuard, async (req, res) => await CoreController.get(req, res, options));
14
- router.get(`/`, authMiddleware, adminGuard, async (req, res) => await CoreController.get(req, res, options));
15
- router.put(`/:id`, authMiddleware, adminGuard, async (req, res) => await CoreController.put(req, res, options));
16
- router.put(`/`, authMiddleware, adminGuard, async (req, res) => await CoreController.put(req, res, options));
17
- router.delete(`/:id`, authMiddleware, adminGuard, async (req, res) => await CoreController.delete(req, res, options));
18
- router.delete(`/`, authMiddleware, adminGuard, async (req, res) => await CoreController.delete(req, res, options));
19
- return router;
20
- };
8
+ class CoreRouter {
9
+ /**
10
+ * @param {import('../types.js').RouterOptions} options
11
+ * @returns {import('express').Router}
12
+ */
13
+ static router(options) {
14
+ const router = express.Router();
15
+ router.post(`/:id`, options.authMiddleware, adminGuard, async (req, res) => await CoreController.post(req, res, options));
16
+ router.post(`/`, options.authMiddleware, adminGuard, async (req, res) => await CoreController.post(req, res, options));
17
+ router.get(`/:id`, options.authMiddleware, adminGuard, async (req, res) => await CoreController.get(req, res, options));
18
+ router.get(`/`, options.authMiddleware, adminGuard, async (req, res) => await CoreController.get(req, res, options));
19
+ router.put(`/:id`, options.authMiddleware, adminGuard, async (req, res) => await CoreController.put(req, res, options));
20
+ router.put(`/`, options.authMiddleware, adminGuard, async (req, res) => await CoreController.put(req, res, options));
21
+ router.delete(`/:id`, options.authMiddleware, adminGuard, async (req, res) => await CoreController.delete(req, res, options));
22
+ router.delete(`/`, options.authMiddleware, adminGuard, async (req, res) => await CoreController.delete(req, res, options));
23
+ return router;
24
+ }
25
+ }
21
26
 
22
- const ApiRouter = CoreRouter;
27
+ const ApiRouter = (options) => CoreRouter.router(options);
23
28
 
24
29
  export { ApiRouter, CoreRouter };
@@ -1,4 +1,4 @@
1
- import { DataBaseProvider } from '../../db/DataBaseProvider.js';
1
+ import { DataBaseProviderService } from '../../db/DataBaseProvider.js';
2
2
  import { loggerFactory } from '../../server/logger.js';
3
3
  import { shellExec } from '../../server/process.js';
4
4
 
@@ -7,22 +7,22 @@ const logger = loggerFactory(import.meta);
7
7
  class CoreService {
8
8
  static post = async (req, res, options) => {
9
9
  /** @type {import('./core.model.js').CoreModel} */
10
- const Core = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.Core;
10
+ const Core = DataBaseProviderService.getModel("Core", options);
11
11
  return await new Core(req.body).save();
12
12
  };
13
13
  static get = async (req, res, options) => {
14
14
  /** @type {import('./core.model.js').CoreModel} */
15
- const Core = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.Core;
15
+ const Core = DataBaseProviderService.getModel("Core", options);
16
16
  return await Core.findById(req.params.id);
17
17
  };
18
18
  static put = async (req, res, options) => {
19
19
  /** @type {import('./core.model.js').CoreModel} */
20
- const Core = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.Core;
20
+ const Core = DataBaseProviderService.getModel("Core", options);
21
21
  return await Core.findByIdAndUpdate(req.params.id, req.body);
22
22
  };
23
23
  static delete = async (req, res, options) => {
24
24
  /** @type {import('./core.model.js').CoreModel} */
25
- const Core = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.Core;
25
+ const Core = DataBaseProviderService.getModel("Core", options);
26
26
  return await Core.findByIdAndDelete(req.params.id);
27
27
  };
28
28
  }
@@ -4,24 +4,28 @@ import express from 'express';
4
4
 
5
5
  const logger = loggerFactory(import.meta);
6
6
 
7
- const DefaultRouter = (options) => {
8
- const router = express.Router();
9
- const authMiddleware = options.authMiddleware;
10
- router.post(`/:id`, async (req, res) => await DefaultController.post(req, res, options));
11
- router.post(`/`, async (req, res) => await DefaultController.post(req, res, options));
12
- router.get(
13
- `/:id`,
14
- // authMiddleware,
15
- async (req, res) => await DefaultController.get(req, res, options),
16
- );
17
- router.get(`/`, async (req, res) => await DefaultController.get(req, res, options));
18
- router.put(`/:id`, async (req, res) => await DefaultController.put(req, res, options));
19
- router.put(`/`, async (req, res) => await DefaultController.put(req, res, options));
20
- router.delete(`/:id`, async (req, res) => await DefaultController.delete(req, res, options));
21
- router.delete(`/`, async (req, res) => await DefaultController.delete(req, res, options));
22
- return router;
23
- };
7
+ class DefaultRouter {
8
+ /**
9
+ * @param {import('../types.js').RouterOptions} options
10
+ * @returns {import('express').Router}
11
+ */
12
+ static router(options) {
13
+ const router = express.Router();
14
+ router.post(`/:id`, async (req, res) => await DefaultController.post(req, res, options));
15
+ router.post(`/`, async (req, res) => await DefaultController.post(req, res, options));
16
+ router.get(`/:id`,
17
+ // options.authMiddleware,
18
+ async (req, res) => await DefaultController.get(req, res, options),
19
+ );
20
+ router.get(`/`, async (req, res) => await DefaultController.get(req, res, options));
21
+ router.put(`/:id`, async (req, res) => await DefaultController.put(req, res, options));
22
+ router.put(`/`, async (req, res) => await DefaultController.put(req, res, options));
23
+ router.delete(`/:id`, async (req, res) => await DefaultController.delete(req, res, options));
24
+ router.delete(`/`, async (req, res) => await DefaultController.delete(req, res, options));
25
+ return router;
26
+ }
27
+ }
24
28
 
25
- const ApiRouter = DefaultRouter;
29
+ const ApiRouter = (options) => DefaultRouter.router(options);
26
30
 
27
31
  export { ApiRouter, DefaultRouter };
@@ -1,4 +1,4 @@
1
- import { DataBaseProvider } from '../../db/DataBaseProvider.js';
1
+ import { DataBaseProviderService } from '../../db/DataBaseProvider.js';
2
2
  import { loggerFactory } from '../../server/logger.js';
3
3
  import { DataQuery } from '../../server/data-query.js';
4
4
 
@@ -7,12 +7,12 @@ const logger = loggerFactory(import.meta);
7
7
  class DefaultService {
8
8
  static post = async (req, res, options) => {
9
9
  /** @type {import('./default.model.js').DefaultModel} */
10
- const Default = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.Default;
10
+ const Default = DataBaseProviderService.getModel("Default", options);
11
11
  return await new Default(req.body).save();
12
12
  };
13
13
  static get = async (req, res, options) => {
14
14
  /** @type {import('./default.model.js').DefaultModel} */
15
- const Default = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.Default;
15
+ const Default = DataBaseProviderService.getModel("Default", options);
16
16
  if (req.params.id) return await Default.findById(req.params.id);
17
17
 
18
18
  // Parse query parameters using DataQuery helper
@@ -28,12 +28,12 @@ class DefaultService {
28
28
  };
29
29
  static put = async (req, res, options) => {
30
30
  /** @type {import('./default.model.js').DefaultModel} */
31
- const Default = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.Default;
31
+ const Default = DataBaseProviderService.getModel("Default", options);
32
32
  return await Default.findByIdAndUpdate(req.params.id, req.body);
33
33
  };
34
34
  static delete = async (req, res, options) => {
35
35
  /** @type {import('./default.model.js').DefaultModel} */
36
- const Default = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.Default;
36
+ const Default = DataBaseProviderService.getModel("Default", options);
37
37
  if (req.params.id) return await Default.findByIdAndDelete(req.params.id);
38
38
  else return await Default.deleteMany();
39
39
  };
@@ -1,31 +1,36 @@
1
1
  import { loggerFactory } from '../../server/logger.js';
2
2
  import { DocumentController } from './document.controller.js';
3
3
  import express from 'express';
4
- import fs from 'fs-extra';
4
+
5
5
  const logger = loggerFactory(import.meta);
6
6
 
7
- const DocumentRouter = (options) => {
8
- const router = express.Router();
9
- const authMiddleware = options.authMiddleware;
10
- router.post(`/:id`, authMiddleware, async (req, res) => await DocumentController.post(req, res, options));
11
- router.post(`/`, authMiddleware, async (req, res) => await DocumentController.post(req, res, options));
12
- router.get(`/public/high`, async (req, res) => await DocumentController.get(req, res, options));
13
- router.get(`/public`, async (req, res) => await DocumentController.get(req, res, options));
14
- router.get(`/:id`, authMiddleware, async (req, res) => await DocumentController.get(req, res, options));
15
- router.get(`/`, authMiddleware, async (req, res) => await DocumentController.get(req, res, options));
16
- router.put(`/:id`, authMiddleware, async (req, res) => await DocumentController.put(req, res, options));
17
- router.put(`/`, authMiddleware, async (req, res) => await DocumentController.put(req, res, options));
18
- router.patch(`/:id/copy-share-link`, async (req, res) => await DocumentController.patch(req, res, options));
19
- router.patch(
20
- `/:id/toggle-public`,
21
- authMiddleware,
22
- async (req, res) => await DocumentController.patch(req, res, options),
23
- );
24
- router.delete(`/:id`, authMiddleware, async (req, res) => await DocumentController.delete(req, res, options));
25
- router.delete(`/`, authMiddleware, async (req, res) => await DocumentController.delete(req, res, options));
26
- return router;
27
- };
7
+ class DocumentRouter {
8
+ /**
9
+ * @param {import('../types.js').RouterOptions} options
10
+ * @returns {import('express').Router}
11
+ */
12
+ static router(options) {
13
+ const router = express.Router();
14
+ router.post(`/:id`, options.authMiddleware, async (req, res) => await DocumentController.post(req, res, options));
15
+ router.post(`/`, options.authMiddleware, async (req, res) => await DocumentController.post(req, res, options));
16
+ router.get(`/public/high`, async (req, res) => await DocumentController.get(req, res, options));
17
+ router.get(`/public`, async (req, res) => await DocumentController.get(req, res, options));
18
+ router.get(`/:id`, options.authMiddleware, async (req, res) => await DocumentController.get(req, res, options));
19
+ router.get(`/`, options.authMiddleware, async (req, res) => await DocumentController.get(req, res, options));
20
+ router.put(`/:id`, options.authMiddleware, async (req, res) => await DocumentController.put(req, res, options));
21
+ router.put(`/`, options.authMiddleware, async (req, res) => await DocumentController.put(req, res, options));
22
+ router.patch(`/:id/copy-share-link`, async (req, res) => await DocumentController.patch(req, res, options));
23
+ router.patch(
24
+ `/:id/toggle-public`,
25
+ options.authMiddleware,
26
+ async (req, res) => await DocumentController.patch(req, res, options),
27
+ );
28
+ router.delete(`/:id`, options.authMiddleware, async (req, res) => await DocumentController.delete(req, res, options));
29
+ router.delete(`/`, options.authMiddleware, async (req, res) => await DocumentController.delete(req, res, options));
30
+ return router;
31
+ }
32
+ }
28
33
 
29
- const ApiRouter = DocumentRouter;
34
+ const ApiRouter = (options) => DocumentRouter.router(options);
30
35
 
31
36
  export { ApiRouter, DocumentRouter };