From ed23b8690d6a7103953b00e89a8f371011d324d4 Mon Sep 17 00:00:00 2001 From: AdisakKanthawilang Date: Wed, 7 Aug 2024 10:52:53 +0700 Subject: [PATCH] =?UTF-8?q?=E0=B9=80=E0=B8=9E=E0=B8=B4=E0=B9=88=E0=B8=A1?= =?UTF-8?q?=20multiSearch=20=E0=B8=9B=E0=B8=A3=E0=B8=B1=E0=B8=9A=E0=B8=81?= =?UTF-8?q?=E0=B8=B2=E0=B8=A3=E0=B8=AA=E0=B9=88=E0=B8=87=20params=20?= =?UTF-8?q?=E0=B9=80=E0=B8=9B=E0=B9=87=E0=B8=99=20body=20=E0=B8=9A?= =?UTF-8?q?=E0=B8=B2=E0=B8=87=E0=B8=AA=E0=B9=88=E0=B8=A7=E0=B8=99=20?= =?UTF-8?q?=E0=B9=81=E0=B8=A5=E0=B8=B0=20=E0=B9=80=E0=B8=9B=E0=B8=A5?= =?UTF-8?q?=E0=B8=B5=E0=B9=88=E0=B8=A2=E0=B8=99=20method=20=E0=B8=88?= =?UTF-8?q?=E0=B8=B2=E0=B8=81=20get=20=E0=B9=80=E0=B8=9B=E0=B9=87=E0=B8=99?= =?UTF-8?q?=20post?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 87 +++++++++++++++---------------- src/controllers/log-controller.ts | 54 ++++++++++++------- 2 files changed, 78 insertions(+), 63 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4c039c2..5b49397 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,11 +476,11 @@ "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.4.0", + "resolved": "https://registry.npmjs.org/@tsoa/cli/-/cli-6.4.0.tgz", + "integrity": "sha512-cuKqIAJ33enhXejMb04P2JF/SZdM3WLFE9Qg8s2dOVOrLbbZGK3H85YSORif0unxbre02psXuUyl3FwWBt0/pQ==", "dependencies": { - "@tsoa/runtime": "^6.3.0", + "@tsoa/runtime": "^6.4.0", "@types/multer": "^1.4.11", "fs-extra": "^11.2.0", "glob": "^10.3.10", @@ -524,9 +524,9 @@ } }, "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.4.0", + "resolved": "https://registry.npmjs.org/@tsoa/runtime/-/runtime-6.4.0.tgz", + "integrity": "sha512-oiVVK++Svo8KMRVTfOQxtepPQRCpPh8bCmPpmNFePGZYJAtZ8XX1cm8Zs/v87dZZmNEooU6egj1G40ive/9phw==", "dependencies": { "@hapi/boom": "^10.0.1", "@hapi/hapi": "^21.3.3", @@ -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.2", + "resolved": "https://registry.npmjs.org/fast-jwt/-/fast-jwt-4.0.2.tgz", + "integrity": "sha512-uSG3osRm3QNEkoCMwQ25qVs+pxn0f1n4/WLE+BmKaQZSmwhFhkkimHw7MXIPprrEF01CbNI1wL/35LRvLMfn7g==", "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": { @@ -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" }, @@ -2625,9 +2622,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" @@ -3187,9 +3184,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 +3240,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.4.0", + "resolved": "https://registry.npmjs.org/tsoa/-/tsoa-6.4.0.tgz", + "integrity": "sha512-bgNJrpkoTRjbFo/3S3fH+wh9mXTbTAJkzfUXgsAFZJNaDr1+tmiEaP3OO4AbjH0i1acKu9HTTmok3tWau4T83Q==", "dependencies": { - "@tsoa/cli": "^6.3.1", - "@tsoa/runtime": "^6.3.0" + "@tsoa/cli": "^6.4.0", + "@tsoa/runtime": "^6.4.0" }, "bin": { "tsoa": "dist/cli.js" @@ -3352,9 +3349,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.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.1.tgz", + "integrity": "sha512-y/2wiW+ceTYR2TSSptAhfnEtpLaQ4Ups5zrjB2d3kuVxHj16j/QJwPl5PvuGy9uARb39J0+iKxcRPvtpsx4A4A==", "optional": true, "bin": { "uglifyjs": "bin/uglifyjs" @@ -3587,9 +3584,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.5.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", + "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", "bin": { "yaml": "bin.mjs" }, diff --git a/src/controllers/log-controller.ts b/src/controllers/log-controller.ts index 43ce6c3..93f100b 100644 --- a/src/controllers/log-controller.ts +++ b/src/controllers/log-controller.ts @@ -1,5 +1,6 @@ -import { Controller, Get, Query, Route, Security } from "tsoa"; +import { Body, Controller, Get, Post, Query, Route, Security } from "tsoa"; import { Client as ElasticsearchClient } from "@elastic/elasticsearch"; +import { match } from "assert"; function getEnvVar(name: string) { const value = process.env[name]; @@ -19,15 +20,19 @@ const elasticsearch = new ElasticsearchClient({ @Route("/api/v1/log") @Security("keycloak") export class LogController extends Controller { - @Get() - async GET( - @Query() size: number = 30, - @Query() search?: string, - @Query() searchAfter?: number, + @Post() + async Post( + @Body() + body: { + size: number; + search?: string; + multiSearch?: string[]; + searchAfter?: number; + date?: Date; + startDate?: Date; + endDate?: Date; + }, @Query() systemName?: string, - @Query() date?: Date, - @Query() startDate?: Date, - @Query() endDate?: Date, @Query() timezone = "+07:00", @Query() sort: "asc" | "desc" = "desc", ) { @@ -36,12 +41,12 @@ export class LogController extends Controller { let startTimeString = "00:00:00"; let endTimeString = "23:59:59"; - if (date && !startDate && !endDate) { - startDateString = `${date.getFullYear()}-${`${date.getMonth() + 1}`.padStart(2, "0")}-${`${date.getDate()}`.padStart(2, "0")}T${startTimeString}`; - endDateString = `${date.getFullYear()}-${`${date.getMonth() + 1}`.padStart(2, "0")}-${`${date.getDate()}`.padStart(2, "0")}T${endTimeString}`; + if (body.date && !body.startDate && !body.endDate) { + startDateString = `${body.date.getFullYear()}-${`${body.date.getMonth() + 1}`.padStart(2, "0")}-${`${body.date.getDate()}`.padStart(2, "0")}T${startTimeString}`; + endDateString = `${body.date.getFullYear()}-${`${body.date.getMonth() + 1}`.padStart(2, "0")}-${`${body.date.getDate()}`.padStart(2, "0")}T${endTimeString}`; } - if (startDate) startDateString = startDate.toISOString(); - if (endDate) endDateString = endDate.toISOString(); + if (body.startDate) startDateString = body.startDate.toISOString(); + if (body.endDate) endDateString = body.endDate.toISOString(); const queryData = await elasticsearch.search({ index: ELASTICSEARCH_INDEX, @@ -49,7 +54,7 @@ export class LogController extends Controller { bool: { must: [ ...(systemName ? [{ match: { systemName } }] : []), - ...(search + ...(body.search ? [ { bool: { @@ -61,7 +66,7 @@ export class LogController extends Controller { "responseCode", "output", ].map((v) => ({ - wildcard: { [v]: "*" + search + "*" }, + wildcard: { [v]: "*" + body.search + "*" }, })), }, }, @@ -80,12 +85,25 @@ export class LogController extends Controller { }, ] : []), + ...(body.multiSearch + ? [ + { + bool: { + should: body.multiSearch.map((v) => ({ + match_phrase: { + userId: v, + }, + })), + }, + }, + ] + : []), ], }, }, - search_after: searchAfter ? [searchAfter] : undefined, + search_after: body.searchAfter ? [body.searchAfter] : undefined, sort: [{ startTimeStamp: sort }], - size: size, + size: body.size, }); return queryData.hits.hits; }