minor v1.2.0 #3

Merged
jkeffects merged 8 commits from develop into main 2025-04-16 15:19:17 +00:00
30 changed files with 854 additions and 329 deletions

571
package-lock.json generated
View file

@ -13,7 +13,7 @@
"typeorm": "^0.3.20"
},
"devDependencies": {
"@types/node": "^20.17.16",
"@types/node": "^22.14.1",
"typescript": "^5.7.3"
}
},
@ -51,13 +51,13 @@
"license": "MIT"
},
"node_modules/@types/node": {
"version": "20.17.16",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.16.tgz",
"integrity": "sha512-vOTpLduLkZXePLxHiHsBLp98mHGnl8RptV4YAO3HfKO5UHjDvySGbxKtpYfy8Sx5+WKcgc45qNreJJRVM3L6mw==",
"version": "22.14.1",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.1.tgz",
"integrity": "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==",
"dev": true,
"license": "MIT",
"dependencies": {
"undici-types": "~6.19.2"
"undici-types": "~6.21.0"
}
},
"node_modules/ansi-regex": {
@ -73,25 +73,25 @@
}
},
"node_modules/ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
"integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/any-promise": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
"integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
"license": "MIT"
"node_modules/ansis": {
"version": "3.17.0",
"resolved": "https://registry.npmjs.org/ansis/-/ansis-3.17.0.tgz",
"integrity": "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==",
"license": "ISC",
"engines": {
"node": ">=14"
}
},
"node_modules/app-root-path": {
"version": "3.1.0",
@ -109,9 +109,9 @@
"license": "MIT"
},
"node_modules/axios": {
"version": "1.7.9",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz",
"integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==",
"version": "1.8.4",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz",
"integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==",
"license": "MIT",
"dependencies": {
"follow-redirects": "^1.15.6",
@ -178,137 +178,17 @@
"ieee754": "^1.2.1"
}
},
"node_modules/chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"node_modules/call-bind-apply-helpers": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
"integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
"es-errors": "^1.3.0",
"function-bind": "^1.1.2"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/cli-highlight": {
"version": "2.1.11",
"resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz",
"integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==",
"license": "ISC",
"dependencies": {
"chalk": "^4.0.0",
"highlight.js": "^10.7.1",
"mz": "^2.4.0",
"parse5": "^5.1.1",
"parse5-htmlparser2-tree-adapter": "^6.0.0",
"yargs": "^16.0.0"
},
"bin": {
"highlight": "bin/highlight"
},
"engines": {
"node": ">=8.0.0",
"npm": ">=5.0.0"
}
},
"node_modules/cli-highlight/node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/cli-highlight/node_modules/cliui": {
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
"integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
"license": "ISC",
"dependencies": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.0",
"wrap-ansi": "^7.0.0"
}
},
"node_modules/cli-highlight/node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"license": "MIT"
},
"node_modules/cli-highlight/node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"license": "MIT",
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/cli-highlight/node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/cli-highlight/node_modules/wrap-ansi": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/cli-highlight/node_modules/yargs": {
"version": "16.2.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
"integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
"license": "MIT",
"dependencies": {
"cliui": "^7.0.2",
"escalade": "^3.1.1",
"get-caller-file": "^2.0.5",
"require-directory": "^2.1.1",
"string-width": "^4.2.0",
"y18n": "^5.0.5",
"yargs-parser": "^20.2.2"
},
"engines": {
"node": ">=10"
}
},
"node_modules/cli-highlight/node_modules/yargs-parser": {
"version": "20.2.9",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
"integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
"license": "ISC",
"engines": {
"node": ">=10"
"node": ">= 0.4"
}
},
"node_modules/cliui": {
@ -334,6 +214,21 @@
"node": ">=8"
}
},
"node_modules/cliui/node_modules/ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/cliui/node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@ -460,9 +355,9 @@
}
},
"node_modules/dotenv": {
"version": "16.4.7",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz",
"integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==",
"version": "16.5.0",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz",
"integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==",
"license": "BSD-2-Clause",
"engines": {
"node": ">=12"
@ -471,6 +366,20 @@
"url": "https://dotenvx.com"
}
},
"node_modules/dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
"integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.1",
"es-errors": "^1.3.0",
"gopd": "^1.2.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/eastasianwidth": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
@ -483,6 +392,51 @@
"integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
"license": "MIT"
},
"node_modules/es-define-property": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-errors": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-object-atoms": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
"integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-set-tostringtag": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
"integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.6",
"has-tostringtag": "^1.0.2",
"hasown": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/escalade": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
@ -513,12 +467,12 @@
}
},
"node_modules/foreground-child": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
"integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
"integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
"license": "ISC",
"dependencies": {
"cross-spawn": "^7.0.0",
"cross-spawn": "^7.0.6",
"signal-exit": "^4.0.1"
},
"engines": {
@ -529,19 +483,29 @@
}
},
"node_modules/form-data": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
"integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz",
"integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==",
"license": "MIT",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"es-set-tostringtag": "^2.1.0",
"mime-types": "^2.1.12"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/function-bind": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/get-caller-file": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
@ -551,6 +515,43 @@
"node": "6.* || 8.* || >= 10.*"
}
},
"node_modules/get-intrinsic": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
"integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.2",
"es-define-property": "^1.0.1",
"es-errors": "^1.3.0",
"es-object-atoms": "^1.1.1",
"function-bind": "^1.1.2",
"get-proto": "^1.0.1",
"gopd": "^1.2.0",
"has-symbols": "^1.1.0",
"hasown": "^2.0.2",
"math-intrinsics": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/get-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
"integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
"license": "MIT",
"dependencies": {
"dunder-proto": "^1.0.1",
"es-object-atoms": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/glob": {
"version": "10.4.5",
"resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
@ -571,22 +572,55 @@
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"node_modules/gopd": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
"license": "MIT",
"engines": {
"node": ">=8"
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/highlight.js": {
"version": "10.7.3",
"resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz",
"integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==",
"license": "BSD-3-Clause",
"node_modules/has-symbols": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"license": "MIT",
"engines": {
"node": "*"
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-tostringtag": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"license": "MIT",
"dependencies": {
"has-symbols": "^1.0.3"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/hasown": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"license": "MIT",
"dependencies": {
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/ieee754": {
@ -651,6 +685,15 @@
"integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
"license": "ISC"
},
"node_modules/math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
@ -696,74 +739,18 @@
"node": ">=16 || 14 >=14.17"
}
},
"node_modules/mkdirp": {
"version": "2.1.6",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz",
"integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==",
"license": "MIT",
"bin": {
"mkdirp": "dist/cjs/src/bin.js"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"license": "MIT"
},
"node_modules/mz": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
"integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
"license": "MIT",
"dependencies": {
"any-promise": "^1.0.0",
"object-assign": "^4.0.1",
"thenify-all": "^1.0.0"
}
},
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/package-json-from-dist": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
"integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
"license": "BlueOak-1.0.0"
},
"node_modules/parse5": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz",
"integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==",
"license": "MIT"
},
"node_modules/parse5-htmlparser2-tree-adapter": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz",
"integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==",
"license": "MIT",
"dependencies": {
"parse5": "^6.0.1"
}
},
"node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
"integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
"license": "MIT"
},
"node_modules/path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
@ -799,7 +786,8 @@
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz",
"integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==",
"license": "Apache-2.0"
"license": "Apache-2.0",
"peer": true
},
"node_modules/require-directory": {
"version": "2.1.1",
@ -876,6 +864,22 @@
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/sql-highlight": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/sql-highlight/-/sql-highlight-6.0.0.tgz",
"integrity": "sha512-+fLpbAbWkQ+d0JEchJT/NrRRXbYRNbG15gFpANx73EwxQB1PRjj+k/OI0GTU0J63g8ikGkJECQp9z8XEJZvPRw==",
"funding": [
"https://github.com/scriptcoded/sql-highlight?sponsor=1",
{
"type": "github",
"url": "https://github.com/sponsors/scriptcoded"
}
],
"license": "MIT",
"engines": {
"node": ">=14"
}
},
"node_modules/string-width": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
@ -972,39 +976,6 @@
"node": ">=8"
}
},
"node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/thenify": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
"integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
"license": "MIT",
"dependencies": {
"any-promise": "^1.0.0"
}
},
"node_modules/thenify-all": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
"integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
"license": "MIT",
"dependencies": {
"thenify": ">= 3.1.0 < 4"
},
"engines": {
"node": ">=0.8"
}
},
"node_modules/tslib": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
@ -1012,26 +983,24 @@
"license": "0BSD"
},
"node_modules/typeorm": {
"version": "0.3.20",
"resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.20.tgz",
"integrity": "sha512-sJ0T08dV5eoZroaq9uPKBoNcGslHBR4E4y+EBHs//SiGbblGe7IeduP/IH4ddCcj0qp3PHwDwGnuvqEAnKlq/Q==",
"version": "0.3.22",
"resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.22.tgz",
"integrity": "sha512-P/Tsz3UpJ9+K0oryC0twK5PO27zejLYYwMsE8SISfZc1lVHX+ajigiOyWsKbuXpEFMjD9z7UjLzY3+ElVOMMDA==",
"license": "MIT",
"dependencies": {
"@sqltools/formatter": "^1.2.5",
"ansis": "^3.17.0",
"app-root-path": "^3.1.0",
"buffer": "^6.0.3",
"chalk": "^4.1.2",
"cli-highlight": "^2.1.11",
"dayjs": "^1.11.9",
"debug": "^4.3.4",
"dotenv": "^16.0.3",
"glob": "^10.3.10",
"mkdirp": "^2.1.3",
"reflect-metadata": "^0.2.1",
"dayjs": "^1.11.13",
"debug": "^4.4.0",
"dotenv": "^16.4.7",
"glob": "^10.4.5",
"sha.js": "^2.4.11",
"tslib": "^2.5.0",
"uuid": "^9.0.0",
"yargs": "^17.6.2"
"sql-highlight": "^6.0.0",
"tslib": "^2.8.1",
"uuid": "^11.1.0",
"yargs": "^17.7.2"
},
"bin": {
"typeorm": "cli.js",
@ -1045,23 +1014,24 @@
"url": "https://opencollective.com/typeorm"
},
"peerDependencies": {
"@google-cloud/spanner": "^5.18.0",
"@google-cloud/spanner": "^5.18.0 || ^6.0.0 || ^7.0.0",
"@sap/hana-client": "^2.12.25",
"better-sqlite3": "^7.1.2 || ^8.0.0 || ^9.0.0",
"better-sqlite3": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0",
"hdb-pool": "^0.1.6",
"ioredis": "^5.0.4",
"mongodb": "^5.8.0",
"mssql": "^9.1.1 || ^10.0.1",
"mongodb": "^5.8.0 || ^6.0.0",
"mssql": "^9.1.1 || ^10.0.1 || ^11.0.1",
"mysql2": "^2.2.5 || ^3.0.1",
"oracledb": "^6.3.0",
"pg": "^8.5.1",
"pg-native": "^3.0.0",
"pg-query-stream": "^4.0.0",
"redis": "^3.1.1 || ^4.0.0",
"reflect-metadata": "^0.1.14 || ^0.2.0",
"sql.js": "^1.4.0",
"sqlite3": "^5.0.3",
"ts-node": "^10.7.0",
"typeorm-aurora-data-api-driver": "^2.0.0"
"typeorm-aurora-data-api-driver": "^2.0.0 || ^3.0.0"
},
"peerDependenciesMeta": {
"@google-cloud/spanner": {
@ -1118,9 +1088,9 @@
}
},
"node_modules/typescript": {
"version": "5.7.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz",
"integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==",
"version": "5.8.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
"integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
"dev": true,
"license": "Apache-2.0",
"bin": {
@ -1132,23 +1102,23 @@
}
},
"node_modules/undici-types": {
"version": "6.19.8",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
"integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
"version": "6.21.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
"integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
"dev": true,
"license": "MIT"
},
"node_modules/uuid": {
"version": "9.0.1",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
"integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
"version": "11.1.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz",
"integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==",
"funding": [
"https://github.com/sponsors/broofa",
"https://github.com/sponsors/ctavan"
],
"license": "MIT",
"bin": {
"uuid": "dist/bin/uuid"
"uuid": "dist/esm/bin/uuid"
}
},
"node_modules/which": {
@ -1210,6 +1180,21 @@
"node": ">=8"
}
},
"node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@ -1242,18 +1227,6 @@
"node": ">=8"
}
},
"node_modules/wrap-ansi/node_modules/ansi-styles": {
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
"integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
"license": "MIT",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/y18n": {
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",

View file

@ -19,7 +19,7 @@
"typeorm": "^0.3.20"
},
"devDependencies": {
"@types/node": "^20.17.16",
"@types/node": "^22.14.1",
"typescript": "^5.7.3"
},
"keywords": [

View file

@ -25,8 +25,8 @@ export class WebApiClient extends BaseClient {
resolve();
})
.catch((error) => {
console.error("Error refreshing webapi token:", error);
reject("failed token retrieve");
console.error("Error refreshing webapi token:", error.response.data);
reject(`failed token retrieve: ${error.response.data}`);
});
});
}

View file

@ -0,0 +1,15 @@
import { BaseClient } from "./clientBase";
export class WebPageClient extends BaseClient {
constructor({ serverAdress, webapiToken }: { serverAdress: string; webapiToken: string }) {
super({ serverAdress, webapiToken });
this.setAccessToken(webapiToken);
}
public refreshToken(): Promise<void> {
return new Promise<void>(async (resolve, reject) => {
reject("some error occured by Code 401");
});
}
}

View file

@ -1,6 +1,11 @@
export { WebApiClient } from "./clients/webapi.client";
export { WebPageClient } from "./clients/webpage.client";
export * as AdminRequests from "./requests/admin";
export * as AdminModels from "./viewmodels/admin";
export * as AdminTypes from "./types/admin";
export * as AdminEnums from "./enums/admin";
export * as WebpageRequests from "./requests/webpage";
export * as WebpageModels from "./viewmodels/webpage";
export * as WebpageTypes from "./types/webpage";

View file

@ -16,8 +16,16 @@ import {
} from "../../viewmodels/admin/member.models";
import { BaseClient } from "../../clients/clientBase";
interface GetMemberParams {
offset?: number;
count?: number;
search?: string;
noLimit?: boolean;
ids?: string[];
}
interface IMemberRequests {
getAllMembers: RequestDefinition<void, void, MemberViewModel[]>;
getAllMembers: RequestDefinition<GetMemberParams, void, MemberViewModel[]>;
getMemberById: RequestDefinition<{ id: string }, void, MemberViewModel>;
getMemberStatisticsById: RequestDefinition<{ id: string }, void, MemberStatisticsViewModel>;
createMember: RequestDefinition<void, CreateMemberViewModel, string>;
@ -58,8 +66,9 @@ interface IMemberRequests {
@ImplementsRequestInterface<IMemberRequests>()
export default abstract class MemberRequests {
static async getAllMembers({ http }: BaseClient): Promise<AxiosResponse<MemberViewModel[], any>> {
return await http.get("/admin/member");
static async getAllMembers({ http }: BaseClient, p: RequestData<GetMemberParams, void>): Promise<AxiosResponse<MemberViewModel[], any>> {
const queryParams = new URLSearchParams(Object.fromEntries(Object.entries(p.params).filter(([_, v]) => v !== undefined))).toString();
return await http.get(`/admin/member?${queryParams}`);
}
static async getMemberById({ http }: BaseClient, p: RequestData<{ id: string }, void>): Promise<AxiosResponse<MemberViewModel, any>> {
return await http.get(`/admin/member/${p.params.id}`);

View file

@ -4,38 +4,55 @@ import { CreateQueryViewModel, QueryExecuteResult, QueryViewModel, UpdateQueryVi
import { DynamicQueryStructure } from "../../types/admin/dynamicQueries";
import { BaseClient } from "../../clients/clientBase";
interface GetQueryParams {
offset?: number;
count?: number;
noLimit?: boolean;
}
interface IQueryRequests {
getQueries: RequestDefinition<void, void, QueryViewModel[]>;
getQueryById: RequestDefinition<{ id: number }, void, QueryViewModel>;
createQuery: RequestDefinition<void, CreateQueryViewModel, number>;
updateQuery: RequestDefinition<{ id: number }, UpdateQueryViewModel, void>;
deleteQuery: RequestDefinition<{ id: number }, void, void>;
getQueryById: RequestDefinition<{ id: string }, void, QueryViewModel>;
createQuery: RequestDefinition<void, CreateQueryViewModel, string>;
updateQuery: RequestDefinition<{ id: string }, UpdateQueryViewModel, void>;
deleteQuery: RequestDefinition<{ id: string }, void, void>;
executeQuery: RequestDefinition<void, DynamicQueryStructure | string, QueryExecuteResult>;
executeQuery: RequestDefinition<GetQueryParams, DynamicQueryStructure | string, QueryExecuteResult>;
executeQueryByQueryStoreId: RequestDefinition<GetQueryParams & { storeId: string }, void, QueryExecuteResult>;
}
@ImplementsRequestInterface<IQueryRequests>()
export default abstract class QueryDataRequests {
static async getQueries({ http }: BaseClient): Promise<AxiosResponse<QueryViewModel[], any>> {
return await http.get("/admin/award");
return await http.get("/admin/querystore");
}
static async getQueryById({ http }: BaseClient, p: RequestData<{ id: number }, void>): Promise<AxiosResponse<QueryViewModel, any>> {
return await http.get(`/admin/award/${p.params.id}`);
static async getQueryById({ http }: BaseClient, p: RequestData<{ id: string }, void>): Promise<AxiosResponse<QueryViewModel, any>> {
return await http.get(`/admin/querystore/${p.params.id}`);
}
static async createQuery({ http }: BaseClient, p: RequestData<void, CreateQueryViewModel>): Promise<AxiosResponse<number, any>> {
return await http.post("/admin/award", p.body);
static async createQuery({ http }: BaseClient, p: RequestData<void, CreateQueryViewModel>): Promise<AxiosResponse<string, any>> {
return await http.post("/admin/querystore", p.body);
}
static async updateQuery({ http }: BaseClient, p: RequestData<{ id: number }, UpdateQueryViewModel>): Promise<AxiosResponse<void, any>> {
return await http.post(`/admin/award/${p.params.id}`, p.body);
static async updateQuery({ http }: BaseClient, p: RequestData<{ id: string }, UpdateQueryViewModel>): Promise<AxiosResponse<void, any>> {
return await http.post(`/admin/querystore/${p.params.id}`, p.body);
}
static async deleteQuery({ http }: BaseClient, p: RequestData<{ id: number }, void>): Promise<AxiosResponse<void, any>> {
return await http.post(`/admin/award/${p.params.id}`);
static async deleteQuery({ http }: BaseClient, p: RequestData<{ id: string }, void>): Promise<AxiosResponse<void, any>> {
return await http.post(`/admin/querystore/${p.params.id}`);
}
static async executeQuery(
{ http }: BaseClient,
p: RequestData<void, DynamicQueryStructure | string>
p: RequestData<GetQueryParams, DynamicQueryStructure | string | "member" | "memberByRunningMembership">
): Promise<AxiosResponse<QueryExecuteResult, any>> {
return await http.post(`/admin/query`, p.body);
const queryParams = new URLSearchParams(Object.fromEntries(Object.entries(p.params).filter(([_, v]) => v !== undefined))).toString();
return await http.post(`/admin/query?${queryParams}`, p.body);
}
static async executeQueryByQueryStoreId(
{ http }: BaseClient,
p: RequestData<GetQueryParams & { storeId: string }, void>
): Promise<AxiosResponse<QueryExecuteResult, any>> {
const queryParams = new URLSearchParams(
Object.fromEntries(Object.entries(p.params).filter(([k, v]) => v !== undefined && k != "storeId"))
).toString();
return await http.post(`/admin/query/${p.params.storeId}?${queryParams}`);
}
}

4
src/requests/webpage.ts Normal file
View file

@ -0,0 +1,4 @@
export { default as ArticleRequests } from "./webpage/articleRequests";
export { default as EventRequests } from "./webpage/eventRequests";
export { default as OperationRequests } from "./webpage/operationRequests";
export { default as VehicleRequests } from "./webpage/vehicleRequests";

View file

@ -0,0 +1,31 @@
import { AxiosResponse } from "axios";
import { RequestDefinition, RequestData, ImplementsRequestInterface } from "../requestBase";
import { BaseClient } from "../../clients/clientBase";
import { Article } from "../../viewmodels/webpage/collection";
interface IArticleRequests {
getArticles: RequestDefinition<void, void, Article[]>;
getArticleById: RequestDefinition<{ id: string }, void, Article>;
createArticle: RequestDefinition<void, Partial<Article>, string>;
updateArticle: RequestDefinition<{ id: string }, Partial<Article>, void>;
deleteArticle: RequestDefinition<{ id: string }, void, void>;
}
@ImplementsRequestInterface<IArticleRequests>()
export default abstract class ArticleRequests {
static async getArticles({ http }: BaseClient): Promise<AxiosResponse<Article[], any>> {
return await http.get("/articles");
}
static async getArticleById({ http }: BaseClient, p: RequestData<{ id: string }, void>): Promise<AxiosResponse<Article, any>> {
return await http.get(`/articles/${p.params.id}`);
}
static async createArticle({ http }: BaseClient, p: RequestData<void, Partial<Article>>): Promise<AxiosResponse<string, any>> {
return await http.post("/articles", p.body);
}
static async updateArticle({ http }: BaseClient, p: RequestData<{ id: string }, Partial<Article>>): Promise<AxiosResponse<void, any>> {
return await http.post(`/articles/${p.params.id}`, p.body);
}
static async deleteArticle({ http }: BaseClient, p: RequestData<{ id: string }, void>): Promise<AxiosResponse<void, any>> {
return await http.post(`/articles/${p.params.id}`);
}
}

View file

@ -0,0 +1,31 @@
import { AxiosResponse } from "axios";
import { RequestDefinition, RequestData, ImplementsRequestInterface } from "../requestBase";
import { BaseClient } from "../../clients/clientBase";
import { Event } from "../../viewmodels/webpage/collection";
interface IEventRequests {
getEvents: RequestDefinition<void, void, Event[]>;
getEventById: RequestDefinition<{ id: string }, void, Event>;
createEvent: RequestDefinition<void, Partial<Event>, string>;
updateEvent: RequestDefinition<{ id: string }, Partial<Event>, void>;
deleteEvent: RequestDefinition<{ id: string }, void, void>;
}
@ImplementsRequestInterface<IEventRequests>()
export default abstract class EventRequests {
static async getEvents({ http }: BaseClient): Promise<AxiosResponse<Event[], any>> {
return await http.get("/events");
}
static async getEventById({ http }: BaseClient, p: RequestData<{ id: string }, void>): Promise<AxiosResponse<Event, any>> {
return await http.get(`/events/${p.params.id}`);
}
static async createEvent({ http }: BaseClient, p: RequestData<void, Partial<Event>>): Promise<AxiosResponse<string, any>> {
return await http.post("/events", p.body);
}
static async updateEvent({ http }: BaseClient, p: RequestData<{ id: string }, Partial<Event>>): Promise<AxiosResponse<void, any>> {
return await http.post(`/events/${p.params.id}`, p.body);
}
static async deleteEvent({ http }: BaseClient, p: RequestData<{ id: string }, void>): Promise<AxiosResponse<void, any>> {
return await http.post(`/events/${p.params.id}`);
}
}

View file

@ -0,0 +1,31 @@
import { AxiosResponse } from "axios";
import { RequestDefinition, RequestData, ImplementsRequestInterface } from "../requestBase";
import { BaseClient } from "../../clients/clientBase";
import { Operation } from "../../viewmodels/webpage/collection";
interface IOperationRequests {
getOperations: RequestDefinition<void, void, Operation[]>;
getOperationById: RequestDefinition<{ id: string }, void, Operation>;
createOperation: RequestDefinition<void, Partial<Operation>, string>;
updateOperation: RequestDefinition<{ id: string }, Partial<Operation>, void>;
deleteOperation: RequestDefinition<{ id: string }, void, void>;
}
@ImplementsRequestInterface<IOperationRequests>()
export default abstract class OperationRequests {
static async getOperations({ http }: BaseClient): Promise<AxiosResponse<Operation[], any>> {
return await http.get("/operations");
}
static async getOperationById({ http }: BaseClient, p: RequestData<{ id: string }, void>): Promise<AxiosResponse<Operation, any>> {
return await http.get(`/operations/${p.params.id}`);
}
static async createOperation({ http }: BaseClient, p: RequestData<void, Partial<Operation>>): Promise<AxiosResponse<string, any>> {
return await http.post("/operations", p.body);
}
static async updateOperation({ http }: BaseClient, p: RequestData<{ id: string }, Partial<Operation>>): Promise<AxiosResponse<void, any>> {
return await http.post(`/operations/${p.params.id}`, p.body);
}
static async deleteOperation({ http }: BaseClient, p: RequestData<{ id: string }, void>): Promise<AxiosResponse<void, any>> {
return await http.post(`/operations/${p.params.id}`);
}
}

View file

@ -0,0 +1,31 @@
import { AxiosResponse } from "axios";
import { RequestDefinition, RequestData, ImplementsRequestInterface } from "../requestBase";
import { BaseClient } from "../../clients/clientBase";
import { Vehicle } from "../../viewmodels/webpage/collection";
interface IVehicleRequests {
getVehicles: RequestDefinition<void, void, Vehicle[]>;
getVehicleById: RequestDefinition<{ id: string }, void, Vehicle>;
createVehicle: RequestDefinition<void, Partial<Vehicle>, string>;
updateVehicle: RequestDefinition<{ id: string }, Partial<Vehicle>, void>;
deleteVehicle: RequestDefinition<{ id: string }, void, void>;
}
@ImplementsRequestInterface<IVehicleRequests>()
export default abstract class VehicleRequests {
static async getVehicles({ http }: BaseClient): Promise<AxiosResponse<Vehicle[], any>> {
return await http.get("/vehicles");
}
static async getVehicleById({ http }: BaseClient, p: RequestData<{ id: string }, void>): Promise<AxiosResponse<Vehicle, any>> {
return await http.get(`/vehicles/${p.params.id}`);
}
static async createVehicle({ http }: BaseClient, p: RequestData<void, Partial<Vehicle>>): Promise<AxiosResponse<string, any>> {
return await http.post("/vehicles", p.body);
}
static async updateVehicle({ http }: BaseClient, p: RequestData<{ id: string }, Partial<Vehicle>>): Promise<AxiosResponse<void, any>> {
return await http.post(`/vehicles/${p.params.id}`, p.body);
}
static async deleteVehicle({ http }: BaseClient, p: RequestData<{ id: string }, void>): Promise<AxiosResponse<void, any>> {
return await http.post(`/vehicles/${p.params.id}`);
}
}

View file

@ -1,9 +1,10 @@
export interface DynamicQueryStructure {
id: string;
select: string[] | "*";
table: string;
where?: Array<ConditionStructure>;
join?: Array<DynamicQueryStructure & { foreignColumn: string }>;
orderBy?: Array<OrderByStructure>;
join?: Array<DynamicQueryStructure & JoinStructure>;
orderBy?: Array<OrderByStructure>; // only at top level
}
export type ConditionStructure = (
@ -47,7 +48,12 @@ export type WhereOperation =
| "timespanEq"; // Date before x years (YYYY-01-01 <bis> YYYY-12-31)
// TODO: age between | age equals | age greater | age smaller
export type JoinStructure = { foreignColumn: string; type: "defined" } | { condition: string; type: "custom" };
export type OrderByStructure = {
id: string;
depth: number;
table: string;
column: string;
order: OrderByType;
};
@ -59,6 +65,7 @@ export type QueryResult = {
};
export const exampleQuery: DynamicQueryStructure = {
id: "1234",
select: ["firstname", "lastname"],
table: "member",
where: [
@ -92,19 +99,25 @@ export const exampleQuery: DynamicQueryStructure = {
],
join: [
{
id: "5678",
select: "*",
table: "communication",
foreignColumn: "sendNewsletter",
type: "defined",
},
{
id: "91011",
select: "*",
table: "membership",
foreignColumn: "memberships",
type: "defined",
join: [
{
id: "121314",
select: "*",
table: "membership_status",
foreignColumn: "status",
type: "defined",
where: [
{
structureType: "condition",
@ -120,10 +133,16 @@ export const exampleQuery: DynamicQueryStructure = {
],
orderBy: [
{
id: "1234",
depth: 0,
table: "member",
column: "firstname",
order: "ASC",
},
{
id: "1234",
depth: 0,
table: "member",
column: "lastname",
order: "ASC",
},

View file

@ -6,6 +6,7 @@ export type PermissionModule =
| "newsletter"
| "newsletter_config"
| "protocol"
| "listprint"
| "qualification"
| "award"
| "executive_position"
@ -19,7 +20,8 @@ export type PermissionModule =
| "query"
| "query_store"
| "template"
| "template_usage";
| "template_usage"
| "backup";
export type PermissionType = "read" | "create" | "update" | "delete";
@ -28,6 +30,7 @@ export type PermissionString =
| `${PermissionSection}.${PermissionModule}.*` // für alle Berechtigungen in einem Modul
| `${PermissionSection}.${PermissionType}` // für spezifische Berechtigungen in einem Abschnitt
| `${PermissionSection}.*` // für alle Berechtigungen in einem Abschnitt
| `additional.${string}.${string}` // additional
| "*"; // für Admin
export type PermissionObject = {
@ -36,10 +39,20 @@ export type PermissionObject = {
} & { all?: Array<PermissionType> | "*" };
} & {
admin?: boolean;
adminByOwner?: boolean;
} & {
additional?: { [key: string]: string };
};
export type SectionsAndModulesObject = {
[section in PermissionSection]: Array<PermissionModule>;
} & {
additional?: Array<{
key: string;
name: string;
type: "number" | "string";
emptyIfAdmin: boolean;
}>;
};
export const permissionSections: Array<PermissionSection> = ["club", "configuration", "management"];
@ -49,6 +62,7 @@ export const permissionModules: Array<PermissionModule> = [
"newsletter",
"newsletter_config",
"protocol",
"listprint",
"qualification",
"award",
"executive_position",
@ -63,10 +77,11 @@ export const permissionModules: Array<PermissionModule> = [
"query_store",
"template",
"template_usage",
"backup",
];
export const permissionTypes: Array<PermissionType> = ["read", "create", "update", "delete"];
export const sectionsAndModules: SectionsAndModulesObject = {
club: ["member", "calendar", "newsletter", "protocol", "query"],
club: ["member", "calendar", "newsletter", "protocol", "query", "listprint"],
configuration: [
"qualification",
"award",
@ -80,5 +95,6 @@ export const sectionsAndModules: SectionsAndModulesObject = {
"template_usage",
"newsletter_config",
],
management: ["user", "role", "webapi"],
management: ["user", "role", "webapi", "backup"],
additional: [],
};

2
src/types/webpage.ts Normal file
View file

@ -0,0 +1,2 @@
export * as ComponentTypes from "./webpage/componentTypes";
export * as TextTypes from "./webpage/textTypes";

View file

@ -0,0 +1,42 @@
import { List } from "postcss/lib/list";
import {
Spacer,
Gallery,
FullText,
FullImage,
DualColumnText,
ColumnImageText,
FileViewer,
FileDownload,
Embedding,
Section,
} from "../../viewmodels/webpage/component/dynamic-zone";
import { EmphasiseArticle } from "../../viewmodels/webpage/component/shared";
export type ComponentNames =
| "shared.list"
| "shared.emphasise-article"
| "dynamic-zone.section"
| "dynamic-zone.spacer"
| "dynamic-zone.gallery"
| "dynamic-zone.full-text"
| "dynamic-zone.full-image"
| "dynamic-zone.dual-column-text"
| "dynamic-zone.column-image-text"
| "dynamic-zone.file-viewer"
| "dynamic-zone.file-download"
| "dynamic-zone.embedding";
export type ComponentTypes =
| List
| EmphasiseArticle
| Section
| Spacer
| Gallery
| FullText
| FullImage
| DualColumnText
| ColumnImageText
| FileViewer
| FileDownload
| Embedding;

View file

@ -0,0 +1,10 @@
export type TypeField = TextField | { type: "link"; url: string; children: Array<TextField> };
export type TextField = {
type: "text";
text: string;
strikethrough?: boolean;
underline?: boolean;
italic?: boolean;
bold?: boolean;
};

View file

@ -13,7 +13,7 @@ export interface NewsletterViewModel {
newsletterText: string;
newsletterSignatur: string;
isSent: boolean;
recipientsByQueryId?: number | null;
recipientsByQueryId?: string | null;
recipientsByQuery?: QueryViewModel | null;
}
export interface CreateNewsletterViewModel {
@ -25,7 +25,7 @@ export interface SyncNewsletterViewModel {
newsletterTitle: string;
newsletterText: string;
newsletterSignatur: string;
recipientsByQueryId?: number;
recipientsByQueryId?: string;
}
/** Newsletter Recipient Models */

View file

@ -24,12 +24,14 @@ export interface ProtocolAgendaViewModel {
id: number;
topic: string;
context: string;
sort: number;
protocolId: number;
}
export interface SyncProtocolAgendaViewModel {
id: number;
topic: string;
context: string;
sort: number;
}
/** Protocol Decision Models */
@ -37,12 +39,14 @@ export interface ProtocolDecisionViewModel {
id: number;
topic: string;
context: string;
sort: number;
protocolId: number;
}
export interface SyncProtocolDecisionViewModel {
id: number;
topic: string;
context: string;
sort: number;
}
/** Protocol Presence Models */
@ -50,6 +54,7 @@ export interface ProtocolPresenceViewModel {
memberId: string;
absent: boolean;
excused: boolean;
sort: number;
protocolId: number;
}
export interface SyncProtocolPresenceViewModel {
@ -57,6 +62,7 @@ export interface SyncProtocolPresenceViewModel {
memberId: string;
absent: boolean;
excused: boolean;
sort: number;
}>;
}
@ -68,6 +74,7 @@ export interface ProtocolVotingViewModel {
favour: number;
abstain: number;
against: number;
sort: number;
protocolId: number;
}
export interface SyncProtocolVotingViewModel {
@ -77,6 +84,7 @@ export interface SyncProtocolVotingViewModel {
favour: number;
abstain: number;
against: number;
sort: number;
}
/** Protocol Printout Models */

View file

@ -2,9 +2,10 @@ import { DynamicQueryStructure, FieldType } from "../../types/admin/dynamicQueri
/** Query Store Models */
export interface QueryViewModel {
id: number;
id: string;
title: string;
query: string | DynamicQueryStructure;
updatedAt: Date;
}
export interface CreateQueryViewModel {

View file

@ -0,0 +1,4 @@
export * as CollectionModels from "./webpage/collection";
export * as ComponentModels from "./webpage/component";
export * as FieldModels from "./webpage/field";
export * as SingleModels from "./webpage/single";

View file

@ -0,0 +1,59 @@
import { ComponentTypes } from "../../types/webpage/componentTypes";
import { File } from "./component/base";
import { Hero } from "./component/items";
import { ContentField } from "./field";
export interface BaseCollection {
id: number;
documentId: string;
slug: string;
createdAt: string;
updatedAt: string;
publishedAt: string;
locale: string;
title: string;
description: string;
date: string;
content: ContentField | undefined;
image: File | undefined;
attachment: Array<File>;
}
export interface Article extends BaseCollection {}
export interface Event extends BaseCollection {}
export interface Operation extends BaseCollection {}
export interface Vehicle extends BaseCollection {}
export interface Lookup {
id: number;
documentId: string;
createdAt: string;
updatedAt: string;
publishedAt: string;
reference: string;
collection: "events" | "vehicles" | "articles" | "operations";
show_image: boolean;
show_date: boolean;
list_with_date: "none" | "by-year" | "by-month";
items_with_number: "none" | "numbered" | "inverted";
enable_detail: boolean;
}
export interface Page {
id: number;
documentId: string;
identifier: string;
createdAt: string;
updatedAt: string;
publishedAt: string;
locale: string;
slug: string;
hero: Hero;
content: Array<ComponentTypes>;
localizations: any[];
}

View file

@ -0,0 +1,5 @@
export * as BaseModels from "./component/base";
export * as DaynamicZoneModels from "./component/dynamic-zone";
export * as GlobalModels from "./component/global";
export * as ItemsModels from "./component/items";
export * as SharedModels from "./component/shared";

View file

@ -0,0 +1,41 @@
import { ComponentNames } from "../../../types/webpage/componentTypes";
export interface Component {
__component: ComponentNames;
id: number;
}
export interface File {
id: number;
documentId: string;
name: string;
alternativeText: string | null;
caption: string | null;
width: number;
height: number;
formats: Record<string, ImageFormat> | null;
hash: string;
ext: string;
mime: string;
size: number;
url: string;
previewUrl: string | null;
provider: string;
provider_metadata: any;
createdAt: string;
updatedAt: string;
publishedAt: string;
}
export interface ImageFormat {
name: string;
hash: string;
ext: string;
mime: string;
path: string | null;
width: number;
height: number;
size: number;
sizeInBytes: number;
url: string;
}

View file

@ -0,0 +1,55 @@
import { ContentField } from "../field";
import { File, Component } from "./base";
export interface ColumnImageText extends Component {
__component: "dynamic-zone.column-image-text";
text: ContentField;
image_left: boolean;
image: File;
}
export interface DualColumnText extends Component {
__component: "dynamic-zone.dual-column-text";
left_side: ContentField;
right_side: ContentField;
}
export interface Embedding extends Component {
__component: "dynamic-zone.embedding";
link: string;
}
export interface FileDownload extends Component {
__component: "dynamic-zone.file-download";
file: File;
}
export interface FileViewer extends Component {
__component: "dynamic-zone.file-viewer";
file: File;
}
export interface FullImage extends Component {
__component: "dynamic-zone.full-image";
image: File;
}
export interface FullText extends Component {
__component: "dynamic-zone.full-text";
text: ContentField;
}
export interface Gallery extends Component {
__component: "dynamic-zone.gallery";
images: Array<File>;
}
export interface Section extends Component {
__component: "dynamic-zone.section";
title: string;
description: string;
}
export interface Spacer extends Component {
__component: "dynamic-zone.spacer";
}

View file

@ -0,0 +1,19 @@
import { NavbarItem, FooterLink } from "./items";
export interface SEO {
metaTitle: string;
metaDescription: string;
keywords: string;
}
export interface Navbar {
id: number;
navbar_items: NavbarItem[];
}
export interface Footer {
id: number;
copyright: undefined | string;
maintained_by: undefined | string;
links: FooterLink[];
}

View file

@ -0,0 +1,37 @@
import { Page } from "../collection";
import { File } from "./base";
export interface FooterLink {
id: number;
text: string;
URL: string;
target: string;
}
export interface Hero {
id: number;
title: string | undefined;
banner: File | undefined;
}
export interface Link {
text: string;
URL: string;
target: "_blank" | "_self" | "_parent" | "_top";
}
export interface NavbarItem {
id: number;
name: string;
URL: string;
default_active_child: string;
page: any;
navbar_sub_items: NavbarSubItem[];
}
export interface NavbarSubItem {
id: number;
name: string;
URL: string;
page: Page | null;
}

View file

@ -0,0 +1,13 @@
import { Article, Lookup } from "../collection";
import { Component } from "./base";
export interface List extends Component {
__component: "shared.list";
lookup: Lookup;
}
export interface EmphasiseArticle extends Component {
__component: "shared.emphasise-article";
articles: Array<Article>;
link_to_articles: string;
}

View file

@ -0,0 +1,20 @@
import { TextField, TypeField } from "../../types/webpage/textTypes";
export interface ContentField
extends Array<
| {
type: "paragraph" | "heading" | "quote";
children: Array<TypeField>;
level?: number;
}
| {
type: "list";
format: "unordered" | "ordered";
children: Array<{ type: "list-item"; children: Array<TypeField> }>;
}
| {
type: "code";
children: Array<TextField>;
language: "plaintext";
}
> {}

View file

@ -0,0 +1,27 @@
import { ComponentTypes } from "../../types/webpage/componentTypes";
import { File } from "./component/base";
import { Navbar, Footer, SEO } from "./component/global";
export interface Global {
id: number;
documentId: string;
createdAt: string;
updatedAt: string;
publishedAt: string;
locale: string;
logo: File;
navbar: Navbar | undefined;
footer: Footer | undefined;
SEO: SEO | undefined;
}
export interface Homepage {
id: number;
documentId: string;
createdAt: string;
updatedAt: string;
publishedAt: string;
locale: string;
backdrop: undefined | File;
content: Array<ComponentTypes>;
}