From 25323e8b6728d0ed4b01943cf2a0faaef94a731b Mon Sep 17 00:00:00 2001 From: AdisakKanthawilang Date: Wed, 20 Nov 2024 11:40:36 +0700 Subject: [PATCH 01/10] checkpoint --- package-lock.json | 248 ++++++++++++++------------- src/controllers/report-controller.ts | 52 +++++- 2 files changed, 171 insertions(+), 129 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4c039c2..367530d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,25 +10,25 @@ "license": "ISC", "dependencies": { "@elastic/elasticsearch": "^8.14.0", - "@tsoa/runtime": "^6.0.0", + "@tsoa/runtime": "^6.4.0", "cors": "^2.8.5", - "dotenv": "^16.3.1", - "express": "^4.18.2", - "fast-jwt": "^3.3.2", + "dotenv": "^16.4.5", + "express": "^4.19.2", + "fast-jwt": "^4.0.1", "promise.any": "^2.0.6", - "reflect-metadata": "^0.2.1", - "swagger-ui-express": "^5.0.0", - "tsoa": "^6.0.1" + "reflect-metadata": "^0.2.2", + "swagger-ui-express": "^5.0.1", + "tsoa": "^6.4.0" }, "devDependencies": { "@types/cors": "^2.8.17", "@types/express": "^4.17.21", - "@types/node": "^20.11.5", + "@types/node": "^20.14.10", "@types/swagger-ui-express": "^4.1.6", - "nodemon": "^3.0.3", - "prettier": "^3.2.2", + "nodemon": "^3.1.4", + "prettier": "^3.3.3", "ts-node": "^10.9.2", - "typescript": "^5.3.3" + "typescript": "^5.5.3" } }, "node_modules/@cspotcode/source-map-support": { @@ -476,21 +476,21 @@ "dev": true }, "node_modules/@tsoa/cli": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@tsoa/cli/-/cli-6.3.1.tgz", - "integrity": "sha512-KOlsShmAZ8Ju8KCkBFFzdURlGa9YNgf6gAvU6GwnOQl7mcvqvKMk8IDy2bcotpqNcabHo6fbkeExztF/n0Z0kg==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@tsoa/cli/-/cli-6.5.1.tgz", + "integrity": "sha512-nvYI/kU0kI+uxvCUIEAYHDUpiekvZIt5AUUyJGObHQXyh62c7nK4U20bbowsjOx7A5uQE8SgodU227lcyk76YQ==", "dependencies": { - "@tsoa/runtime": "^6.3.0", - "@types/multer": "^1.4.11", + "@tsoa/runtime": "^6.5.1", + "@types/multer": "^1.4.12", "fs-extra": "^11.2.0", "glob": "^10.3.10", "handlebars": "^4.7.8", "merge-anything": "^5.1.4", "minimatch": "^9.0.1", - "ts-deepmerge": "^7.0.0", - "typescript": "^5.3.3", - "validator": "^13.11.0", - "yaml": "^2.4.1", + "ts-deepmerge": "^7.0.1", + "typescript": "^5.6.2", + "validator": "^13.12.0", + "yaml": "^2.5.1", "yargs": "^17.7.1" }, "bin": { @@ -524,17 +524,17 @@ } }, "node_modules/@tsoa/runtime": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@tsoa/runtime/-/runtime-6.3.0.tgz", - "integrity": "sha512-9z/0ePKpSoYpUq1IJvihk4FcgpAkyMTEEl9oFLiL9p5SE86ndsGJdH3kt/IyqtD3wajPSykMRHlAidrGUyLuNQ==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@tsoa/runtime/-/runtime-6.5.1.tgz", + "integrity": "sha512-fllTz/LrHw+BJvKTREGyrnnfkusHdPivsHNNfwy5v1ZaKfxTFjSSADwm8mu64zw/SFrNeyx8N7Mr9z1ujeV1Rw==", "dependencies": { "@hapi/boom": "^10.0.1", - "@hapi/hapi": "^21.3.3", + "@hapi/hapi": "^21.3.10", "@types/koa": "^2.15.0", - "@types/multer": "^1.4.11", - "express": "^4.18.3", - "reflect-metadata": "^0.2.1", - "validator": "^13.11.0" + "@types/multer": "^1.4.12", + "express": "^4.21.0", + "reflect-metadata": "^0.2.2", + "validator": "^13.12.0" }, "engines": { "node": ">=18.0.0", @@ -657,9 +657,9 @@ "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" }, "node_modules/@types/multer": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.11.tgz", - "integrity": "sha512-svK240gr6LVWvv3YGyhLlA+6LRRWA4mnGIU7RcNmgjBYFl6665wcXrRfxGp5tEPVHUNm5FMcmq7too9bxCwX/w==", + "version": "1.4.12", + "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.12.tgz", + "integrity": "sha512-pQ2hoqvXiJt2FP9WQVLPRO+AmiIm/ZYkavPlIQnx282u4ZrVdztx0pkh3jjpQt0Kz+YI0YhSG264y08UJKoUQg==", "dependencies": { "@types/express": "*" } @@ -748,9 +748,9 @@ } }, "node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "engines": { "node": ">=12" }, @@ -896,9 +896,9 @@ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -908,7 +908,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -1112,9 +1112,9 @@ } }, "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "engines": { "node": ">= 0.6" } @@ -1143,9 +1143,9 @@ "dev": true }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -1304,9 +1304,9 @@ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "engines": { "node": ">= 0.8" } @@ -1475,9 +1475,9 @@ } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "engines": { "node": ">=6" } @@ -1496,36 +1496,36 @@ } }, "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.10", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -1537,9 +1537,9 @@ } }, "node_modules/fast-jwt": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-jwt/-/fast-jwt-3.3.3.tgz", - "integrity": "sha512-oS3P8bRI24oPLJUePt2OgF64FBQib5TlgHLFQxYNoHYEEZe0gU3cKjJAVqpB5XKV/zjxmq4Hzbk3fgfW/wRz8Q==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/fast-jwt/-/fast-jwt-4.0.5.tgz", + "integrity": "sha512-QnpNdn0955GT7SlT8iMgYfhTsityUWysrQjM+Q7bGFijLp6+TNWzlbSMPvgalbrQGRg4ZaHZgMcns5fYOm5avg==", "dependencies": { "@lukeed/ms": "^2.0.1", "asn1.js": "^5.4.1", @@ -1547,7 +1547,7 @@ "mnemonist": "^0.39.5" }, "engines": { - "node": ">=16 <22" + "node": ">=16" } }, "node_modules/fill-range": { @@ -1563,12 +1563,12 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -1588,9 +1588,9 @@ } }, "node_modules/foreground-child": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", - "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -2281,15 +2281,12 @@ } }, "node_modules/jackspeak": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.2.tgz", - "integrity": "sha512-qH3nOSj8q/8+Eg8LUPOq3C+6HWkpUioIjDsq1+D4zY91oZvpPttw8GwtF1nReRYKXl+1AORyFqtm2f5Q1SB6/Q==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dependencies": { "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": "14 >=14.21 || 16 >=16.20 || >=18" - }, "funding": { "url": "https://github.com/sponsors/isaacs" }, @@ -2342,9 +2339,12 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/methods": { "version": "1.1.2", @@ -2564,9 +2564,9 @@ } }, "node_modules/package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" + "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==" }, "node_modules/parseurl": { "version": "1.3.3", @@ -2600,9 +2600,9 @@ } }, "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -2625,9 +2625,9 @@ } }, "node_modules/prettier": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz", - "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -2678,11 +2678,11 @@ "dev": true }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -2830,9 +2830,9 @@ } }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -2852,20 +2852,28 @@ "node": ">= 0.8.0" } }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/send/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==" }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" @@ -3187,9 +3195,9 @@ } }, "node_modules/ts-deepmerge": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ts-deepmerge/-/ts-deepmerge-7.0.0.tgz", - "integrity": "sha512-WZ/iAJrKDhdINv1WG6KZIGHrZDar6VfhftG1QJFpVbOYZMYJLJOvZOo1amictRXVdBXZIgBHKswMTXzElngprA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ts-deepmerge/-/ts-deepmerge-7.0.1.tgz", + "integrity": "sha512-JBFCmNenZdUCc+TRNCtXVM6N8y/nDQHAcpj5BlwXG/gnogjam1NunulB9ia68mnqYI446giMfpqeBFFkOleh+g==", "engines": { "node": ">=14.13.1" } @@ -3243,12 +3251,12 @@ "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, "node_modules/tsoa": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/tsoa/-/tsoa-6.3.1.tgz", - "integrity": "sha512-w2INTVkjqQDlWo5aLv/ZIVAgWSfOOUstOW1WWVYOa+9mY2Er/W9E9BcBpIdaoJ5BtUZimhhhs5BQ2Nn76OfQpw==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/tsoa/-/tsoa-6.5.1.tgz", + "integrity": "sha512-NnsrtNj2iWoQkQ4sX9sNtX60uOsBxZVOZX4WzUTJC24lrxeh0amywYVTKfdspfCyQsy6YjK53pK4A9+My1cEjw==", "dependencies": { - "@tsoa/cli": "^6.3.1", - "@tsoa/runtime": "^6.3.0" + "@tsoa/cli": "^6.5.1", + "@tsoa/runtime": "^6.5.1" }, "bin": { "tsoa": "dist/cli.js" @@ -3340,9 +3348,9 @@ } }, "node_modules/typescript": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", - "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -3352,9 +3360,9 @@ } }, "node_modules/uglify-js": { - "version": "3.18.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.18.0.tgz", - "integrity": "sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A==", + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", "optional": true, "bin": { "uglifyjs": "bin/uglifyjs" @@ -3587,9 +3595,9 @@ } }, "node_modules/yaml": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz", - "integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", + "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", "bin": { "yaml": "bin.mjs" }, diff --git a/src/controllers/report-controller.ts b/src/controllers/report-controller.ts index 14b3f75..ef734e2 100644 --- a/src/controllers/report-controller.ts +++ b/src/controllers/report-controller.ts @@ -1,5 +1,9 @@ -import { Body, Controller, Get, Post, Query, Route, Security, Tags } from "tsoa"; +import { Body, Controller, Get, Post, Query, Route, Security, Tags, Response } from "tsoa"; import { Client as ElasticsearchClient } from "@elastic/elasticsearch"; +import * as fs from 'fs'; +import * as os from 'os'; +import * as path from 'path'; + function getEnvVar(name: string) { const value = process.env[name]; @@ -174,7 +178,9 @@ export class ReportController extends Controller { output: string; sequence: string[]; } - const lists = queryData.hits.hits.map((x) => { + + const fs = require('node:fs'); + const content = queryData.hits.hits.map((x) => { const source = x._source as DocumentSource; return { id: x._id, @@ -200,13 +206,41 @@ export class ReportController extends Controller { }], }; }); + const contentString = JSON.stringify(content, null, 2); + let downloadsPath = path.join(os.homedir(), 'Downloads'); + if (!fs.existsSync(downloadsPath)) { + downloadsPath = path.join(os.homedir(), 'ดาวน์โหลด'); + + if (!fs.existsSync(downloadsPath)) { + throw new Error("ไม่พบโฟลเดอร์ Downloads หรือ ดาวน์โหลด ในระบบนี้"); + } + } + const filePath = path.join(downloadsPath, `log_${id}.txt`); - const data = lists.length === 1 ? lists[0] : lists; - - return { - template: "logs_detail", - reportName: "docx-report", - data: data, - }; + try { + const writeStream = fs.createWriteStream(filePath); + + writeStream.on('error', (error:any) => { + console.error("Error writing file:", error); + throw error; + }); + + writeStream.write(contentString); + writeStream.end(); + + return { + status: 200, + message: "Created successfully", + result: "success" + }; + } catch (error:any) { + console.error("An error occurred:", error); + return { + status: 500, + message: "Failed to create file", + result: "error", + error: error.message + }; + } } } From 9d1b43561a7a5510b1c5e93a36585db70d437d1d Mon Sep 17 00:00:00 2001 From: Bright Date: Thu, 21 Nov 2024 18:31:02 +0700 Subject: [PATCH 02/10] api report logsDetail --- src/controllers/report-controller.ts | 70 +++++++++++++++++++++++++++- 1 file changed, 69 insertions(+), 1 deletion(-) diff --git a/src/controllers/report-controller.ts b/src/controllers/report-controller.ts index ef734e2..b161c29 100644 --- a/src/controllers/report-controller.ts +++ b/src/controllers/report-controller.ts @@ -1,4 +1,4 @@ -import { Body, Controller, Get, Post, Query, Route, Security, Tags, Response } from "tsoa"; +import { Body, Controller, Get, Post, Query, Route, Security, Tags, Res, TsoaResponse } from "tsoa"; import { Client as ElasticsearchClient } from "@elastic/elasticsearch"; import * as fs from 'fs'; import * as os from 'os'; @@ -243,4 +243,72 @@ export class ReportController extends Controller { }; } } + + @Post("logsDetail") + async reportLogsDetail( + @Res() downloadFile: TsoaResponse<200, object | string | any>, + @Query() id: string, + ) { + try { + const queryData = await elasticsearch.search({ + index: ELASTICSEARCH_INDEX, + query: { + bool: { + must: [ ...(id ? [{term: {_id: id}} ] : []) ], + }, + }, + }); + interface DocumentSource { + startTimeStamp: Date; + userName: string; + host: string; + endpoint: string; + method: string; + responseCode: string; + logType: string; + responseDescription: string; + input: string; + output: string; + sequence: string[]; + } + + const content = queryData.hits.hits.map((x) => { + const source = x._source as DocumentSource; + return { + id: x._id, + startTimeStamp: source.startTimeStamp, + userName: source.userName, + host: source.host, + endpoint: source.endpoint, + method: source.method, + responseCode: source.responseCode, + logType: source.logType, + responseDescription: source.responseDescription, + input: source.input, + output: source.output, + sequence: source.sequence ? source.sequence : [{ + action:"-", + status:"-", + description:"-", + request:{ + method:"-", + url:"-", + response:"-", + }, + }], + }; + }); + + const contentString = JSON.parse(JSON.stringify(content, null, 2)); + downloadFile(200, contentString, { + "Content-Type": "application/octet-stream", + "Content-Disposition": `attachment; filename="log_${id}.txt"`, + "Content-Length": contentString.length.toString(), + }); + } + catch (error:any) { + console.error("An error occurred:", error); + throw new Error("Failed to process logs: " + error.message); + } + } } From 736030da3925d397d5cf5a96b408da496baa2954 Mon Sep 17 00:00:00 2001 From: Bright Date: Fri, 22 Nov 2024 10:48:35 +0700 Subject: [PATCH 03/10] fix output --- src/controllers/report-controller.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/controllers/report-controller.ts b/src/controllers/report-controller.ts index b161c29..35c4a9c 100644 --- a/src/controllers/report-controller.ts +++ b/src/controllers/report-controller.ts @@ -271,7 +271,6 @@ export class ReportController extends Controller { output: string; sequence: string[]; } - const content = queryData.hits.hits.map((x) => { const source = x._source as DocumentSource; return { @@ -285,7 +284,7 @@ export class ReportController extends Controller { logType: source.logType, responseDescription: source.responseDescription, input: source.input, - output: source.output, + output: JSON.parse(/*JSON.stringify(*/source.output/*, null, 2)*/), sequence: source.sequence ? source.sequence : [{ action:"-", status:"-", From e669971e8a1bfe338cd82eee3d66a168abf96412 Mon Sep 17 00:00:00 2001 From: Bright Date: Fri, 22 Nov 2024 11:03:46 +0700 Subject: [PATCH 04/10] fix array to object --- src/controllers/report-controller.ts | 54 ++++++++++++++-------------- 1 file changed, 26 insertions(+), 28 deletions(-) diff --git a/src/controllers/report-controller.ts b/src/controllers/report-controller.ts index 35c4a9c..33dd915 100644 --- a/src/controllers/report-controller.ts +++ b/src/controllers/report-controller.ts @@ -271,42 +271,40 @@ export class ReportController extends Controller { output: string; sequence: string[]; } - const content = queryData.hits.hits.map((x) => { - const source = x._source as DocumentSource; - return { - id: x._id, - startTimeStamp: source.startTimeStamp, - userName: source.userName, - host: source.host, - endpoint: source.endpoint, - method: source.method, - responseCode: source.responseCode, - logType: source.logType, - responseDescription: source.responseDescription, - input: source.input, - output: JSON.parse(/*JSON.stringify(*/source.output/*, null, 2)*/), - sequence: source.sequence ? source.sequence : [{ - action:"-", - status:"-", - description:"-", - request:{ - method:"-", - url:"-", - response:"-", - }, - }], - }; - }); + const x = queryData.hits.hits[0] + const source = x._source as DocumentSource; + const content = { + id: x._id, + startTimeStamp: source.startTimeStamp, + userName: source.userName, + host: source.host, + endpoint: source.endpoint, + method: source.method, + responseCode: source.responseCode, + logType: source.logType, + responseDescription: source.responseDescription, + input: JSON.parse(source.input), + output: JSON.parse(source.output), + sequence: source.sequence ? source.sequence : [{ + action:"-", + status:"-", + description:"-", + request:{ + method:"-", + url:"-", + response:"-", + }, + }], + }; + const contentString = JSON.parse(JSON.stringify(content, null, 2)); downloadFile(200, contentString, { "Content-Type": "application/octet-stream", "Content-Disposition": `attachment; filename="log_${id}.txt"`, - "Content-Length": contentString.length.toString(), }); } catch (error:any) { - console.error("An error occurred:", error); throw new Error("Failed to process logs: " + error.message); } } From e295c13ba3c5f80b233fa60d2c4ae0a98930d2af Mon Sep 17 00:00:00 2001 From: "DESKTOP-2S5P7D1\\Windows 10" Date: Fri, 6 Dec 2024 09:09:43 +0700 Subject: [PATCH 05/10] edit build --- .github/workflows/release.yml | 53 ++++++++++++++++++++++++----------- docker/Dockerfile | 15 ++++------ 2 files changed, 42 insertions(+), 26 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a80e6de..55a6038 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,6 +10,8 @@ env: IMAGE_NAME: ehr/bma-ehr-log-backup DEPLOY_HOST: 49.0.91.80 COMPOSE_PATH: /home/frappet/docker/bma/bma-ehr-log-backup + DISCORD_WEBHOOK: https://discord.com/api/webhooks/1313895135121248377/ph4LEfzvrNKyPKouCfHkKx73E323sAc--f3aIM2N0pvS-lQaGdBOg-yHxSNNFxfvjob7 + jobs: release: runs-on: ubuntu-latest @@ -64,21 +66,40 @@ jobs: docker compose pull docker compose up -d echo "${{ steps.gen_ver.outputs.image_ver }}"> success - - uses: snow-actions/line-notify@v1.1.0 + - name: Notify Discord Success if: success() - with: - access_token: ${{ secrets.TOKEN_LINE }} - message: | - ✅ - Image: ${{ env.IMAGE_NAME }} - Version: ${{ steps.gen_ver.outputs.IMAGE_VER }} - By: ${{github.actor}} - - uses: snow-actions/line-notify@v1.1.0 + run: | + curl -H "Content-Type: application/json" \ + -X POST \ + -d '{ + "embeds": [{ + "title": "✅ Deployment Success!", + "description": "**Details:**\n- Image: `${{env.IMAGE_NAME}}`\n- Version: `${{ steps.gen_ver.outputs.image_ver }}`\n- Deployed by: `${{github.actor}}`", + "color": 3066993, + "footer": { + "text": "Release Notification", + "icon_url": "https://example.com/success-icon.png" + }, + "timestamp": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'" + }] + }' \ + ${{ env.DISCORD_WEBHOOK }} + + - name: Notify Discord Failure if: failure() - with: - access_token: ${{ secrets.TOKEN_LINE }} - message: | - ❌ - Image: ${{ env.IMAGE_NAME }} - Version: ${{ steps.gen_ver.outputs.IMAGE_VER }} - By: ${{github.actor}} + run: | + curl -H "Content-Type: application/json" \ + -X POST \ + -d '{ + "embeds": [{ + "title": "❌ Deployment Failed!", + "description": "**Details:**\n- Image: `${{env.IMAGE_NAME}}`\n- Version: `${{ steps.gen_ver.outputs.image_ver }}`\n- Attempted by: `${{github.actor}}`", + "color": 15158332, + "footer": { + "text": "Release Notification", + "icon_url": "https://example.com/failure-icon.png" + }, + "timestamp": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'" + }] + }' \ + ${{ env.DISCORD_WEBHOOK }} diff --git a/docker/Dockerfile b/docker/Dockerfile index 6faa727..6767e59 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,30 +1,25 @@ -# Base stage -FROM node:lts-alpine AS base +FROM node:20-slim AS base + ENV PNPM_HOME="/pnpm" ENV PATH="$PNPM_HOME:$PATH" RUN corepack enable + WORKDIR /app + COPY . . -# Dependencies stage FROM base AS deps RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --prod --frozen-lockfile -# Build stage FROM base AS build RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile RUN pnpm run build -# Production stage -FROM node:lts-alpine AS prod +FROM base as prod ENV NODE_ENV="production" -WORKDIR /app - -# Copy necessary files from previous stages COPY --from=deps /app/node_modules /app/node_modules COPY --from=build /app/dist /app/dist COPY --from=base /app/static /app/static -# Start the application CMD ["pnpm", "run", "start"] From e4343b61acddc48d0ac1e0ccd0315d464cc22698 Mon Sep 17 00:00:00 2001 From: "DESKTOP-2S5P7D1\\Windows 10" Date: Sat, 7 Dec 2024 09:31:03 +0700 Subject: [PATCH 06/10] test build discord --- .github/workflows/release.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 55a6038..b52a7ee 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,5 +1,5 @@ name: release -run-name: Release by ${{ github.actor }} +run-name: release ${{ github.actor }} on: push: tags: @@ -8,16 +8,16 @@ on: env: REGISTRY: docker.frappet.com IMAGE_NAME: ehr/bma-ehr-log-backup - DEPLOY_HOST: 49.0.91.80 + DEPLOY_HOST: frappet.com COMPOSE_PATH: /home/frappet/docker/bma/bma-ehr-log-backup - DISCORD_WEBHOOK: https://discord.com/api/webhooks/1313895135121248377/ph4LEfzvrNKyPKouCfHkKx73E323sAc--f3aIM2N0pvS-lQaGdBOg-yHxSNNFxfvjob7 jobs: release: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - + # skip Set up QEMU because it fail on act and container + # Gen Version try to get version from tag or inut - name: Set output tags id: vars run: echo "tag=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT @@ -83,7 +83,7 @@ jobs: "timestamp": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'" }] }' \ - ${{ env.DISCORD_WEBHOOK }} + ${{ secrets.DISCORD_WEBHOOK }} - name: Notify Discord Failure if: failure() @@ -102,4 +102,4 @@ jobs: "timestamp": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'" }] }' \ - ${{ env.DISCORD_WEBHOOK }} + ${{ secrets.DISCORD_WEBHOOK }} From 8c69be5bb957e527f23d58a53b0f0a11dfe31026 Mon Sep 17 00:00:00 2001 From: "DESKTOP-2S5P7D1\\Windows 10" Date: Sat, 7 Dec 2024 09:34:25 +0700 Subject: [PATCH 07/10] test build discord --- .github/workflows/{release.yml => release.yaml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{release.yml => release.yaml} (100%) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yaml similarity index 100% rename from .github/workflows/release.yml rename to .github/workflows/release.yaml From b4f54b10b31e80870f4c5990595106064033dc8d Mon Sep 17 00:00:00 2001 From: "DESKTOP-2S5P7D1\\Windows 10" Date: Tue, 10 Dec 2024 15:17:36 +0700 Subject: [PATCH 08/10] edit env --- .env.example | 12 ++-- src/controllers/backup-controller.ts | 70 +++++++++++------------ src/middlewares/auth-provider/keycloak.ts | 12 ++-- 3 files changed, 47 insertions(+), 47 deletions(-) diff --git a/.env.example b/.env.example index dc718a4..1fb634d 100644 --- a/.env.example +++ b/.env.example @@ -1,4 +1,4 @@ -KC_REALM_URL= +AUTH_REALM_URL= ELASTICSEARCH_PROTOCOL= ELASTICSEARCH_HOST= @@ -29,9 +29,9 @@ MAIN_MINIO_ACCESS_KEY= MAIN_MINIO_SECRET_KEY= MAIN_MINIO_BUCKET= -BACKUP_MINIO_USE_SSL= -BACKUP_MINIO_HOST= -BACKUP_MINIO_PORT= -BACKUP_MINIO_ACCESS_KEY= -BACKUP_MINIO_SECRET_KEY= +MAIN_MINIO_USE_SSL= +MAIN_MINIO_HOST= +MAIN_MINIO_PORT= +MAIN_MINIO_ACCESS_KEY= +MAIN_MINIO_SECRET_KEY= BACKUP_MINIO_BUCKET= diff --git a/src/controllers/backup-controller.ts b/src/controllers/backup-controller.ts index 3b47bf1..a685a05 100644 --- a/src/controllers/backup-controller.ts +++ b/src/controllers/backup-controller.ts @@ -27,11 +27,11 @@ const MAIN_MINIO_PORT = process.env.MAIN_MINIO_PORT; const MAIN_MINIO_ACCESS_KEY = getEnvVar("MAIN_MINIO_ACCESS_KEY"); const MAIN_MINIO_SECRET_KEY = getEnvVar("MAIN_MINIO_SECRET_KEY"); const MAIN_MINIO_BUCKET = getEnvVar("MAIN_MINIO_BUCKET"); -const BACKUP_MINIO_USE_SSL = getEnvVar("BACKUP_MINIO_USE_SSL"); -const BACKUP_MINIO_HOST = getEnvVar("BACKUP_MINIO_HOST"); -const BACKUP_MINIO_PORT = process.env.BACKUP_MINIO_PORT; -const BACKUP_MINIO_ACCESS_KEY = getEnvVar("BACKUP_MINIO_ACCESS_KEY"); -const BACKUP_MINIO_SECRET_KEY = getEnvVar("BACKUP_MINIO_SECRET_KEY"); +const MAIN_MINIO_USE_SSL = getEnvVar("MAIN_MINIO_USE_SSL"); +const MAIN_MINIO_HOST = getEnvVar("MAIN_MINIO_HOST"); +const MAIN_MINIO_PORT = process.env.MAIN_MINIO_PORT; +const MAIN_MINIO_ACCESS_KEY = getEnvVar("MAIN_MINIO_ACCESS_KEY"); +const MAIN_MINIO_SECRET_KEY = getEnvVar("MAIN_MINIO_SECRET_KEY"); const BACKUP_MINIO_BUCKET = getEnvVar("BACKUP_MINIO_BUCKET"); function jsonParseOrPlainText(str: string) { @@ -56,9 +56,9 @@ export class BackupController extends Controller { "Content-Type": "application/json", }, body: JSON.stringify({ - s3_backup_endpoint: `${BACKUP_MINIO_USE_SSL === "true" ? "https://" : "http://"}${BACKUP_MINIO_HOST}${(BACKUP_MINIO_PORT && ":" + BACKUP_MINIO_PORT) || ""}`, - s3_backup_access: BACKUP_MINIO_ACCESS_KEY, - s3_backup_secret: BACKUP_MINIO_SECRET_KEY, + s3_backup_endpoint: `${MAIN_MINIO_USE_SSL === "true" ? "https://" : "http://"}${MAIN_MINIO_HOST}${(MAIN_MINIO_PORT && ":" + MAIN_MINIO_PORT) || ""}`, + s3_backup_access: MAIN_MINIO_ACCESS_KEY, + s3_backup_secret: MAIN_MINIO_SECRET_KEY, s3_backup_bucket: BACKUP_MINIO_BUCKET, }), }, @@ -142,14 +142,14 @@ export class BackupController extends Controller { s3_source_access: MAIN_MINIO_ACCESS_KEY, s3_source_secret: MAIN_MINIO_SECRET_KEY, s3_source_bucket: MAIN_MINIO_BUCKET, - s3_dest_endpoint: `${BACKUP_MINIO_USE_SSL === "true" ? "https://" : "http://"}${BACKUP_MINIO_HOST}${(BACKUP_MINIO_PORT && ":" + BACKUP_MINIO_PORT) || ""}`, - s3_dest_access: BACKUP_MINIO_ACCESS_KEY, - s3_dest_secret: BACKUP_MINIO_SECRET_KEY, + s3_dest_endpoint: `${MAIN_MINIO_USE_SSL === "true" ? "https://" : "http://"}${MAIN_MINIO_HOST}${(MAIN_MINIO_PORT && ":" + MAIN_MINIO_PORT) || ""}`, + s3_dest_access: MAIN_MINIO_ACCESS_KEY, + s3_dest_secret: MAIN_MINIO_SECRET_KEY, }, database: { - s3_endpoint: `${BACKUP_MINIO_USE_SSL === "true" ? "https://" : "http://"}${BACKUP_MINIO_HOST}${(BACKUP_MINIO_PORT && ":" + BACKUP_MINIO_PORT) || ""}`, - s3_access: BACKUP_MINIO_ACCESS_KEY, - s3_secret: BACKUP_MINIO_SECRET_KEY, + s3_endpoint: `${MAIN_MINIO_USE_SSL === "true" ? "https://" : "http://"}${MAIN_MINIO_HOST}${(MAIN_MINIO_PORT && ":" + MAIN_MINIO_PORT) || ""}`, + s3_access: MAIN_MINIO_ACCESS_KEY, + s3_secret: MAIN_MINIO_SECRET_KEY, s3_bucket: BACKUP_MINIO_BUCKET, db_host: DB_HOST, db_port: DB_PORT, @@ -185,14 +185,14 @@ export class BackupController extends Controller { s3_restore_access: MAIN_MINIO_ACCESS_KEY, s3_restore_secret: MAIN_MINIO_SECRET_KEY, s3_restore_bucket: MAIN_MINIO_BUCKET, - s3_backup_endpoint: `${BACKUP_MINIO_USE_SSL === "true" ? "https://" : "http://"}${BACKUP_MINIO_HOST}${(BACKUP_MINIO_PORT && ":" + BACKUP_MINIO_PORT) || ""}`, - s3_backup_access: BACKUP_MINIO_ACCESS_KEY, - s3_backup_secret: BACKUP_MINIO_SECRET_KEY, + s3_backup_endpoint: `${MAIN_MINIO_USE_SSL === "true" ? "https://" : "http://"}${MAIN_MINIO_HOST}${(MAIN_MINIO_PORT && ":" + MAIN_MINIO_PORT) || ""}`, + s3_backup_access: MAIN_MINIO_ACCESS_KEY, + s3_backup_secret: MAIN_MINIO_SECRET_KEY, }, database: { - s3_endpoint: `${BACKUP_MINIO_USE_SSL === "true" ? "https://" : "http://"}${BACKUP_MINIO_HOST}${(BACKUP_MINIO_PORT && ":" + BACKUP_MINIO_PORT) || ""}`, - s3_access: BACKUP_MINIO_ACCESS_KEY, - s3_secret: BACKUP_MINIO_SECRET_KEY, + s3_endpoint: `${MAIN_MINIO_USE_SSL === "true" ? "https://" : "http://"}${MAIN_MINIO_HOST}${(MAIN_MINIO_PORT && ":" + MAIN_MINIO_PORT) || ""}`, + s3_access: MAIN_MINIO_ACCESS_KEY, + s3_secret: MAIN_MINIO_SECRET_KEY, s3_bucket: BACKUP_MINIO_BUCKET, db_host: DB_HOST, db_port: DB_PORT, @@ -216,9 +216,9 @@ export class BackupController extends Controller { }, body: JSON.stringify({ backup_name: body.name, - s3_backup_endpoint: `${BACKUP_MINIO_USE_SSL === "true" ? "https://" : "http://"}${BACKUP_MINIO_HOST}${(BACKUP_MINIO_PORT && ":" + BACKUP_MINIO_PORT) || ""}`, - s3_backup_access: BACKUP_MINIO_ACCESS_KEY, - s3_backup_secret: BACKUP_MINIO_SECRET_KEY, + s3_backup_endpoint: `${MAIN_MINIO_USE_SSL === "true" ? "https://" : "http://"}${MAIN_MINIO_HOST}${(MAIN_MINIO_PORT && ":" + MAIN_MINIO_PORT) || ""}`, + s3_backup_access: MAIN_MINIO_ACCESS_KEY, + s3_backup_secret: MAIN_MINIO_SECRET_KEY, s3_backup_bucket: BACKUP_MINIO_BUCKET, }), }, @@ -285,14 +285,14 @@ export class BackupController extends Controller { s3_source_access: MAIN_MINIO_ACCESS_KEY, s3_source_secret: MAIN_MINIO_SECRET_KEY, s3_source_bucket: MAIN_MINIO_BUCKET, - s3_dest_endpoint: `${BACKUP_MINIO_USE_SSL === "true" ? "https://" : "http://"}${BACKUP_MINIO_HOST}${(BACKUP_MINIO_PORT && ":" + BACKUP_MINIO_PORT) || ""}`, - s3_dest_access: BACKUP_MINIO_ACCESS_KEY, - s3_dest_secret: BACKUP_MINIO_SECRET_KEY, + s3_dest_endpoint: `${MAIN_MINIO_USE_SSL === "true" ? "https://" : "http://"}${MAIN_MINIO_HOST}${(MAIN_MINIO_PORT && ":" + MAIN_MINIO_PORT) || ""}`, + s3_dest_access: MAIN_MINIO_ACCESS_KEY, + s3_dest_secret: MAIN_MINIO_SECRET_KEY, }, database: { - s3_endpoint: `${BACKUP_MINIO_USE_SSL === "true" ? "https://" : "http://"}${BACKUP_MINIO_HOST}${(BACKUP_MINIO_PORT && ":" + BACKUP_MINIO_PORT) || ""}`, - s3_access: BACKUP_MINIO_ACCESS_KEY, - s3_secret: BACKUP_MINIO_SECRET_KEY, + s3_endpoint: `${MAIN_MINIO_USE_SSL === "true" ? "https://" : "http://"}${MAIN_MINIO_HOST}${(MAIN_MINIO_PORT && ":" + MAIN_MINIO_PORT) || ""}`, + s3_access: MAIN_MINIO_ACCESS_KEY, + s3_secret: MAIN_MINIO_SECRET_KEY, s3_bucket: BACKUP_MINIO_BUCKET, db_host: DB_HOST, db_port: DB_PORT, @@ -336,14 +336,14 @@ export class BackupController extends Controller { s3_source_access: MAIN_MINIO_ACCESS_KEY, s3_source_secret: MAIN_MINIO_SECRET_KEY, s3_source_bucket: MAIN_MINIO_BUCKET, - s3_dest_endpoint: `${BACKUP_MINIO_USE_SSL === "true" ? "https://" : "http://"}${BACKUP_MINIO_HOST}${(BACKUP_MINIO_PORT && ":" + BACKUP_MINIO_PORT) || ""}`, - s3_dest_access: BACKUP_MINIO_ACCESS_KEY, - s3_dest_secret: BACKUP_MINIO_SECRET_KEY, + s3_dest_endpoint: `${MAIN_MINIO_USE_SSL === "true" ? "https://" : "http://"}${MAIN_MINIO_HOST}${(MAIN_MINIO_PORT && ":" + MAIN_MINIO_PORT) || ""}`, + s3_dest_access: MAIN_MINIO_ACCESS_KEY, + s3_dest_secret: MAIN_MINIO_SECRET_KEY, }, database: { - s3_endpoint: `${BACKUP_MINIO_USE_SSL === "true" ? "https://" : "http://"}${BACKUP_MINIO_HOST}${(BACKUP_MINIO_PORT && ":" + BACKUP_MINIO_PORT) || ""}`, - s3_access: BACKUP_MINIO_ACCESS_KEY, - s3_secret: BACKUP_MINIO_SECRET_KEY, + s3_endpoint: `${MAIN_MINIO_USE_SSL === "true" ? "https://" : "http://"}${MAIN_MINIO_HOST}${(MAIN_MINIO_PORT && ":" + MAIN_MINIO_PORT) || ""}`, + s3_access: MAIN_MINIO_ACCESS_KEY, + s3_secret: MAIN_MINIO_SECRET_KEY, s3_bucket: BACKUP_MINIO_BUCKET, db_host: DB_HOST, db_port: DB_PORT, diff --git a/src/middlewares/auth-provider/keycloak.ts b/src/middlewares/auth-provider/keycloak.ts index cd4ddef..6bf7597 100644 --- a/src/middlewares/auth-provider/keycloak.ts +++ b/src/middlewares/auth-provider/keycloak.ts @@ -4,12 +4,12 @@ import { createDecoder, createVerifier } from "fast-jwt"; import HttpError from "../../interfaces/http-error"; import HttpStatus from "../../interfaces/http-status"; -if (!process.env.KC_PUBLIC_KEY && !process.env.KC_REALM_URL) { - throw new Error("Require keycloak KC_PUBLIC_KEY or KC_REALM_URL."); +if (!process.env.KC_PUBLIC_KEY && !process.env.AUTH_REALM_URL) { + throw new Error("Require keycloak KC_PUBLIC_KEY or AUTH_REALM_URL."); } -if (process.env.KC_PUBLIC_KEY && process.env.KC_REALM_URL && !process.env.KC_PREFERRED_MODE) { +if (process.env.KC_PUBLIC_KEY && process.env.AUTH_REALM_URL && !process.env.KC_PREFERRED_MODE) { throw new Error( - "AUTH_PREFERRED must be specified if KC_PUBLIC_KEY and KC_REALM_URL is provided.", + "AUTH_PREFERRED must be specified if KC_PUBLIC_KEY and AUTH_REALM_URL is provided.", ); } @@ -44,7 +44,7 @@ export async function keycloakAuth(request: Express.Request) { payload = await verifyOffline(token); break; default: - if (process.env.KC_REALM_URL) payload = await verifyOnline(token); + if (process.env.AUTH_REALM_URL) payload = await verifyOnline(token); if (process.env.KC_PUBLIC_KEY) payload = await verifyOffline(token); break; } @@ -61,7 +61,7 @@ async function verifyOffline(token: string) { } async function verifyOnline(token: string) { - const res = await fetch(`${process.env.KC_REALM_URL}/protocol/openid-connect/userinfo`, { + const res = await fetch(`${process.env.AUTH_REALM_URL}/protocol/openid-connect/userinfo`, { headers: { authorization: `Bearer ${token}` }, }).catch((e) => console.error(e)); From c6c1ebd7c34798107c7778e20d368a9de50b0b7c Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Tue, 24 Dec 2024 10:32:26 +0700 Subject: [PATCH 09/10] fix: error redeclare var --- src/controllers/backup-controller.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/controllers/backup-controller.ts b/src/controllers/backup-controller.ts index a685a05..552aaf7 100644 --- a/src/controllers/backup-controller.ts +++ b/src/controllers/backup-controller.ts @@ -27,11 +27,6 @@ const MAIN_MINIO_PORT = process.env.MAIN_MINIO_PORT; const MAIN_MINIO_ACCESS_KEY = getEnvVar("MAIN_MINIO_ACCESS_KEY"); const MAIN_MINIO_SECRET_KEY = getEnvVar("MAIN_MINIO_SECRET_KEY"); const MAIN_MINIO_BUCKET = getEnvVar("MAIN_MINIO_BUCKET"); -const MAIN_MINIO_USE_SSL = getEnvVar("MAIN_MINIO_USE_SSL"); -const MAIN_MINIO_HOST = getEnvVar("MAIN_MINIO_HOST"); -const MAIN_MINIO_PORT = process.env.MAIN_MINIO_PORT; -const MAIN_MINIO_ACCESS_KEY = getEnvVar("MAIN_MINIO_ACCESS_KEY"); -const MAIN_MINIO_SECRET_KEY = getEnvVar("MAIN_MINIO_SECRET_KEY"); const BACKUP_MINIO_BUCKET = getEnvVar("BACKUP_MINIO_BUCKET"); function jsonParseOrPlainText(str: string) { From f080854899294aef6a55838e0970ad4bfe827d97 Mon Sep 17 00:00:00 2001 From: "DESKTOP-2S5P7D1\\Windows 10" Date: Tue, 24 Dec 2024 10:50:43 +0700 Subject: [PATCH 10/10] no message --- .github/workflows/release.yaml | 24 ++++++++++++------------ docker/Dockerfile | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index b52a7ee..ddfd391 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -54,18 +54,18 @@ jobs: file: docker/Dockerfile push: true tags: ${{env.REGISTRY}}/${{env.IMAGE_NAME}}:${{ steps.gen_ver.outputs.image_ver }},${{env.REGISTRY}}/${{env.IMAGE_NAME}}:latest - - name: Remote Deployment - uses: appleboy/ssh-action@v0.1.8 - with: - host: ${{env.DEPLOY_HOST}} - username: frappet - password: ${{ secrets.SSH_PASSWORD }} - port: 10102 - script: | - cd "${{env.COMPOSE_PATH}}" - docker compose pull - docker compose up -d - echo "${{ steps.gen_ver.outputs.image_ver }}"> success + # - name: Remote Deployment + # uses: appleboy/ssh-action@v0.1.8 + # with: + # host: ${{env.DEPLOY_HOST}} + # username: frappet + # password: ${{ secrets.SSH_PASSWORD }} + # port: 10102 + # script: | + # cd "${{env.COMPOSE_PATH}}" + # docker compose pull + # docker compose up -d + # echo "${{ steps.gen_ver.outputs.image_ver }}"> success - name: Notify Discord Success if: success() run: | diff --git a/docker/Dockerfile b/docker/Dockerfile index 6767e59..e75f5a0 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -22,4 +22,4 @@ COPY --from=deps /app/node_modules /app/node_modules COPY --from=build /app/dist /app/dist COPY --from=base /app/static /app/static -CMD ["pnpm", "run", "start"] +CMD ["npm", "run", "start"]