diff --git a/package-lock.json b/package-lock.json index 38ed8ca..f5155ef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -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", diff --git a/package.json b/package.json index 205d5b1..728c1d1 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "typeorm": "^0.3.20" }, "devDependencies": { - "@types/node": "^20.17.16", + "@types/node": "^22.14.1", "typescript": "^5.7.3" }, "keywords": [ diff --git a/src/clients/webapi.client.ts b/src/clients/webapi.client.ts index 6bb0190..cca8343 100644 --- a/src/clients/webapi.client.ts +++ b/src/clients/webapi.client.ts @@ -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}`); }); }); } diff --git a/src/clients/webpage.client.ts b/src/clients/webpage.client.ts new file mode 100644 index 0000000..78bb3ba --- /dev/null +++ b/src/clients/webpage.client.ts @@ -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 { + return new Promise(async (resolve, reject) => { + reject("some error occured by Code 401"); + }); + } +} diff --git a/src/index.ts b/src/index.ts index 312ca0d..68dd9e6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -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"; diff --git a/src/requests/admin/memberRequests.ts b/src/requests/admin/memberRequests.ts index 35f4aae..5a10f7a 100644 --- a/src/requests/admin/memberRequests.ts +++ b/src/requests/admin/memberRequests.ts @@ -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; + getAllMembers: RequestDefinition; getMemberById: RequestDefinition<{ id: string }, void, MemberViewModel>; getMemberStatisticsById: RequestDefinition<{ id: string }, void, MemberStatisticsViewModel>; createMember: RequestDefinition; @@ -58,8 +66,9 @@ interface IMemberRequests { @ImplementsRequestInterface() export default abstract class MemberRequests { - static async getAllMembers({ http }: BaseClient): Promise> { - return await http.get("/admin/member"); + static async getAllMembers({ http }: BaseClient, p: RequestData): Promise> { + 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> { return await http.get(`/admin/member/${p.params.id}`); diff --git a/src/requests/admin/queryRequests.ts b/src/requests/admin/queryRequests.ts index aedc357..30c0433 100644 --- a/src/requests/admin/queryRequests.ts +++ b/src/requests/admin/queryRequests.ts @@ -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; - getQueryById: RequestDefinition<{ id: number }, void, QueryViewModel>; - createQuery: RequestDefinition; - updateQuery: RequestDefinition<{ id: number }, UpdateQueryViewModel, void>; - deleteQuery: RequestDefinition<{ id: number }, void, void>; + getQueryById: RequestDefinition<{ id: string }, void, QueryViewModel>; + createQuery: RequestDefinition; + updateQuery: RequestDefinition<{ id: string }, UpdateQueryViewModel, void>; + deleteQuery: RequestDefinition<{ id: string }, void, void>; - executeQuery: RequestDefinition; + executeQuery: RequestDefinition; + executeQueryByQueryStoreId: RequestDefinition; } @ImplementsRequestInterface() export default abstract class QueryDataRequests { static async getQueries({ http }: BaseClient): Promise> { - return await http.get("/admin/award"); + return await http.get("/admin/querystore"); } - static async getQueryById({ http }: BaseClient, p: RequestData<{ id: number }, void>): Promise> { - return await http.get(`/admin/award/${p.params.id}`); + static async getQueryById({ http }: BaseClient, p: RequestData<{ id: string }, void>): Promise> { + return await http.get(`/admin/querystore/${p.params.id}`); } - static async createQuery({ http }: BaseClient, p: RequestData): Promise> { - return await http.post("/admin/award", p.body); + static async createQuery({ http }: BaseClient, p: RequestData): Promise> { + return await http.post("/admin/querystore", p.body); } - static async updateQuery({ http }: BaseClient, p: RequestData<{ id: number }, UpdateQueryViewModel>): Promise> { - return await http.post(`/admin/award/${p.params.id}`, p.body); + static async updateQuery({ http }: BaseClient, p: RequestData<{ id: string }, UpdateQueryViewModel>): Promise> { + return await http.post(`/admin/querystore/${p.params.id}`, p.body); } - static async deleteQuery({ http }: BaseClient, p: RequestData<{ id: number }, void>): Promise> { - return await http.post(`/admin/award/${p.params.id}`); + static async deleteQuery({ http }: BaseClient, p: RequestData<{ id: string }, void>): Promise> { + return await http.post(`/admin/querystore/${p.params.id}`); } static async executeQuery( { http }: BaseClient, - p: RequestData + p: RequestData ): Promise> { - 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 + ): Promise> { + 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}`); } } diff --git a/src/requests/webpage.ts b/src/requests/webpage.ts new file mode 100644 index 0000000..6571ac2 --- /dev/null +++ b/src/requests/webpage.ts @@ -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"; diff --git a/src/requests/webpage/articleRequests.ts b/src/requests/webpage/articleRequests.ts new file mode 100644 index 0000000..a1c5828 --- /dev/null +++ b/src/requests/webpage/articleRequests.ts @@ -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; + getArticleById: RequestDefinition<{ id: string }, void, Article>; + createArticle: RequestDefinition, string>; + updateArticle: RequestDefinition<{ id: string }, Partial
, void>; + deleteArticle: RequestDefinition<{ id: string }, void, void>; +} + +@ImplementsRequestInterface() +export default abstract class ArticleRequests { + static async getArticles({ http }: BaseClient): Promise> { + return await http.get("/articles"); + } + static async getArticleById({ http }: BaseClient, p: RequestData<{ id: string }, void>): Promise> { + return await http.get(`/articles/${p.params.id}`); + } + static async createArticle({ http }: BaseClient, p: RequestData>): Promise> { + return await http.post("/articles", p.body); + } + static async updateArticle({ http }: BaseClient, p: RequestData<{ id: string }, Partial
>): Promise> { + return await http.post(`/articles/${p.params.id}`, p.body); + } + static async deleteArticle({ http }: BaseClient, p: RequestData<{ id: string }, void>): Promise> { + return await http.post(`/articles/${p.params.id}`); + } +} diff --git a/src/requests/webpage/eventRequests.ts b/src/requests/webpage/eventRequests.ts new file mode 100644 index 0000000..779fe0e --- /dev/null +++ b/src/requests/webpage/eventRequests.ts @@ -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; + getEventById: RequestDefinition<{ id: string }, void, Event>; + createEvent: RequestDefinition, string>; + updateEvent: RequestDefinition<{ id: string }, Partial, void>; + deleteEvent: RequestDefinition<{ id: string }, void, void>; +} + +@ImplementsRequestInterface() +export default abstract class EventRequests { + static async getEvents({ http }: BaseClient): Promise> { + return await http.get("/events"); + } + static async getEventById({ http }: BaseClient, p: RequestData<{ id: string }, void>): Promise> { + return await http.get(`/events/${p.params.id}`); + } + static async createEvent({ http }: BaseClient, p: RequestData>): Promise> { + return await http.post("/events", p.body); + } + static async updateEvent({ http }: BaseClient, p: RequestData<{ id: string }, Partial>): Promise> { + return await http.post(`/events/${p.params.id}`, p.body); + } + static async deleteEvent({ http }: BaseClient, p: RequestData<{ id: string }, void>): Promise> { + return await http.post(`/events/${p.params.id}`); + } +} diff --git a/src/requests/webpage/operationRequests.ts b/src/requests/webpage/operationRequests.ts new file mode 100644 index 0000000..b0a3bb6 --- /dev/null +++ b/src/requests/webpage/operationRequests.ts @@ -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; + getOperationById: RequestDefinition<{ id: string }, void, Operation>; + createOperation: RequestDefinition, string>; + updateOperation: RequestDefinition<{ id: string }, Partial, void>; + deleteOperation: RequestDefinition<{ id: string }, void, void>; +} + +@ImplementsRequestInterface() +export default abstract class OperationRequests { + static async getOperations({ http }: BaseClient): Promise> { + return await http.get("/operations"); + } + static async getOperationById({ http }: BaseClient, p: RequestData<{ id: string }, void>): Promise> { + return await http.get(`/operations/${p.params.id}`); + } + static async createOperation({ http }: BaseClient, p: RequestData>): Promise> { + return await http.post("/operations", p.body); + } + static async updateOperation({ http }: BaseClient, p: RequestData<{ id: string }, Partial>): Promise> { + return await http.post(`/operations/${p.params.id}`, p.body); + } + static async deleteOperation({ http }: BaseClient, p: RequestData<{ id: string }, void>): Promise> { + return await http.post(`/operations/${p.params.id}`); + } +} diff --git a/src/requests/webpage/vehicleRequests.ts b/src/requests/webpage/vehicleRequests.ts new file mode 100644 index 0000000..6751744 --- /dev/null +++ b/src/requests/webpage/vehicleRequests.ts @@ -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; + getVehicleById: RequestDefinition<{ id: string }, void, Vehicle>; + createVehicle: RequestDefinition, string>; + updateVehicle: RequestDefinition<{ id: string }, Partial, void>; + deleteVehicle: RequestDefinition<{ id: string }, void, void>; +} + +@ImplementsRequestInterface() +export default abstract class VehicleRequests { + static async getVehicles({ http }: BaseClient): Promise> { + return await http.get("/vehicles"); + } + static async getVehicleById({ http }: BaseClient, p: RequestData<{ id: string }, void>): Promise> { + return await http.get(`/vehicles/${p.params.id}`); + } + static async createVehicle({ http }: BaseClient, p: RequestData>): Promise> { + return await http.post("/vehicles", p.body); + } + static async updateVehicle({ http }: BaseClient, p: RequestData<{ id: string }, Partial>): Promise> { + return await http.post(`/vehicles/${p.params.id}`, p.body); + } + static async deleteVehicle({ http }: BaseClient, p: RequestData<{ id: string }, void>): Promise> { + return await http.post(`/vehicles/${p.params.id}`); + } +} diff --git a/src/types/admin/dynamicQueries.ts b/src/types/admin/dynamicQueries.ts index 7ae4a79..2d870b7 100644 --- a/src/types/admin/dynamicQueries.ts +++ b/src/types/admin/dynamicQueries.ts @@ -1,9 +1,10 @@ export interface DynamicQueryStructure { + id: string; select: string[] | "*"; table: string; where?: Array; - join?: Array; - orderBy?: Array; + join?: Array; + orderBy?: Array; // only at top level } export type ConditionStructure = ( @@ -47,7 +48,12 @@ export type WhereOperation = | "timespanEq"; // Date before x years (YYYY-01-01 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", }, diff --git a/src/types/admin/permissionTypes.ts b/src/types/admin/permissionTypes.ts index 59b8737..1061d49 100644 --- a/src/types/admin/permissionTypes.ts +++ b/src/types/admin/permissionTypes.ts @@ -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 | "*" }; } & { admin?: boolean; + adminByOwner?: boolean; +} & { + additional?: { [key: string]: string }; }; export type SectionsAndModulesObject = { [section in PermissionSection]: Array; +} & { + additional?: Array<{ + key: string; + name: string; + type: "number" | "string"; + emptyIfAdmin: boolean; + }>; }; export const permissionSections: Array = ["club", "configuration", "management"]; @@ -49,6 +62,7 @@ export const permissionModules: Array = [ "newsletter", "newsletter_config", "protocol", + "listprint", "qualification", "award", "executive_position", @@ -63,10 +77,11 @@ export const permissionModules: Array = [ "query_store", "template", "template_usage", + "backup", ]; export const permissionTypes: Array = ["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: [], }; diff --git a/src/types/webpage.ts b/src/types/webpage.ts new file mode 100644 index 0000000..ecebb8f --- /dev/null +++ b/src/types/webpage.ts @@ -0,0 +1,2 @@ +export * as ComponentTypes from "./webpage/componentTypes"; +export * as TextTypes from "./webpage/textTypes"; diff --git a/src/types/webpage/componentTypes.ts b/src/types/webpage/componentTypes.ts new file mode 100644 index 0000000..7ea8f96 --- /dev/null +++ b/src/types/webpage/componentTypes.ts @@ -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; diff --git a/src/types/webpage/textTypes.ts b/src/types/webpage/textTypes.ts new file mode 100644 index 0000000..d35df07 --- /dev/null +++ b/src/types/webpage/textTypes.ts @@ -0,0 +1,10 @@ +export type TypeField = TextField | { type: "link"; url: string; children: Array }; + +export type TextField = { + type: "text"; + text: string; + strikethrough?: boolean; + underline?: boolean; + italic?: boolean; + bold?: boolean; +}; diff --git a/src/viewmodels/admin/newsletter.models.ts b/src/viewmodels/admin/newsletter.models.ts index 85df5fe..56f8a3b 100644 --- a/src/viewmodels/admin/newsletter.models.ts +++ b/src/viewmodels/admin/newsletter.models.ts @@ -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 */ diff --git a/src/viewmodels/admin/protocol.models.ts b/src/viewmodels/admin/protocol.models.ts index aa6e87c..162088d 100644 --- a/src/viewmodels/admin/protocol.models.ts +++ b/src/viewmodels/admin/protocol.models.ts @@ -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 */ diff --git a/src/viewmodels/admin/query.models.ts b/src/viewmodels/admin/query.models.ts index ac1895d..21b75e8 100644 --- a/src/viewmodels/admin/query.models.ts +++ b/src/viewmodels/admin/query.models.ts @@ -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 { diff --git a/src/viewmodels/webpage.ts b/src/viewmodels/webpage.ts new file mode 100644 index 0000000..ac94686 --- /dev/null +++ b/src/viewmodels/webpage.ts @@ -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"; diff --git a/src/viewmodels/webpage/collection.ts b/src/viewmodels/webpage/collection.ts new file mode 100644 index 0000000..f436c27 --- /dev/null +++ b/src/viewmodels/webpage/collection.ts @@ -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; +} + +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; + localizations: any[]; +} diff --git a/src/viewmodels/webpage/component.ts b/src/viewmodels/webpage/component.ts new file mode 100644 index 0000000..5c3b9c9 --- /dev/null +++ b/src/viewmodels/webpage/component.ts @@ -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"; diff --git a/src/viewmodels/webpage/component/base.ts b/src/viewmodels/webpage/component/base.ts new file mode 100644 index 0000000..8de8a0a --- /dev/null +++ b/src/viewmodels/webpage/component/base.ts @@ -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 | 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; +} diff --git a/src/viewmodels/webpage/component/dynamic-zone.ts b/src/viewmodels/webpage/component/dynamic-zone.ts new file mode 100644 index 0000000..e65d550 --- /dev/null +++ b/src/viewmodels/webpage/component/dynamic-zone.ts @@ -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; +} + +export interface Section extends Component { + __component: "dynamic-zone.section"; + title: string; + description: string; +} + +export interface Spacer extends Component { + __component: "dynamic-zone.spacer"; +} diff --git a/src/viewmodels/webpage/component/global.ts b/src/viewmodels/webpage/component/global.ts new file mode 100644 index 0000000..cc45cdc --- /dev/null +++ b/src/viewmodels/webpage/component/global.ts @@ -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[]; +} diff --git a/src/viewmodels/webpage/component/items.ts b/src/viewmodels/webpage/component/items.ts new file mode 100644 index 0000000..c74ceee --- /dev/null +++ b/src/viewmodels/webpage/component/items.ts @@ -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; +} diff --git a/src/viewmodels/webpage/component/shared.ts b/src/viewmodels/webpage/component/shared.ts new file mode 100644 index 0000000..133c242 --- /dev/null +++ b/src/viewmodels/webpage/component/shared.ts @@ -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
; + link_to_articles: string; +} diff --git a/src/viewmodels/webpage/field.ts b/src/viewmodels/webpage/field.ts new file mode 100644 index 0000000..da5bc30 --- /dev/null +++ b/src/viewmodels/webpage/field.ts @@ -0,0 +1,20 @@ +import { TextField, TypeField } from "../../types/webpage/textTypes"; + +export interface ContentField + extends Array< + | { + type: "paragraph" | "heading" | "quote"; + children: Array; + level?: number; + } + | { + type: "list"; + format: "unordered" | "ordered"; + children: Array<{ type: "list-item"; children: Array }>; + } + | { + type: "code"; + children: Array; + language: "plaintext"; + } + > {} diff --git a/src/viewmodels/webpage/single.ts b/src/viewmodels/webpage/single.ts new file mode 100644 index 0000000..85dbd51 --- /dev/null +++ b/src/viewmodels/webpage/single.ts @@ -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; +}