เพิ่ม multiSearch ปรับการส่ง params เป็น body บางส่วน และ เปลี่ยน method จาก get เป็น post

This commit is contained in:
AdisakKanthawilang 2024-08-07 10:52:53 +07:00
parent 8189813b4f
commit ed23b8690d
2 changed files with 78 additions and 63 deletions

87
package-lock.json generated
View file

@ -10,25 +10,25 @@
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"@elastic/elasticsearch": "^8.14.0", "@elastic/elasticsearch": "^8.14.0",
"@tsoa/runtime": "^6.0.0", "@tsoa/runtime": "^6.4.0",
"cors": "^2.8.5", "cors": "^2.8.5",
"dotenv": "^16.3.1", "dotenv": "^16.4.5",
"express": "^4.18.2", "express": "^4.19.2",
"fast-jwt": "^3.3.2", "fast-jwt": "^4.0.1",
"promise.any": "^2.0.6", "promise.any": "^2.0.6",
"reflect-metadata": "^0.2.1", "reflect-metadata": "^0.2.2",
"swagger-ui-express": "^5.0.0", "swagger-ui-express": "^5.0.1",
"tsoa": "^6.0.1" "tsoa": "^6.4.0"
}, },
"devDependencies": { "devDependencies": {
"@types/cors": "^2.8.17", "@types/cors": "^2.8.17",
"@types/express": "^4.17.21", "@types/express": "^4.17.21",
"@types/node": "^20.11.5", "@types/node": "^20.14.10",
"@types/swagger-ui-express": "^4.1.6", "@types/swagger-ui-express": "^4.1.6",
"nodemon": "^3.0.3", "nodemon": "^3.1.4",
"prettier": "^3.2.2", "prettier": "^3.3.3",
"ts-node": "^10.9.2", "ts-node": "^10.9.2",
"typescript": "^5.3.3" "typescript": "^5.5.3"
} }
}, },
"node_modules/@cspotcode/source-map-support": { "node_modules/@cspotcode/source-map-support": {
@ -476,11 +476,11 @@
"dev": true "dev": true
}, },
"node_modules/@tsoa/cli": { "node_modules/@tsoa/cli": {
"version": "6.3.1", "version": "6.4.0",
"resolved": "https://registry.npmjs.org/@tsoa/cli/-/cli-6.3.1.tgz", "resolved": "https://registry.npmjs.org/@tsoa/cli/-/cli-6.4.0.tgz",
"integrity": "sha512-KOlsShmAZ8Ju8KCkBFFzdURlGa9YNgf6gAvU6GwnOQl7mcvqvKMk8IDy2bcotpqNcabHo6fbkeExztF/n0Z0kg==", "integrity": "sha512-cuKqIAJ33enhXejMb04P2JF/SZdM3WLFE9Qg8s2dOVOrLbbZGK3H85YSORif0unxbre02psXuUyl3FwWBt0/pQ==",
"dependencies": { "dependencies": {
"@tsoa/runtime": "^6.3.0", "@tsoa/runtime": "^6.4.0",
"@types/multer": "^1.4.11", "@types/multer": "^1.4.11",
"fs-extra": "^11.2.0", "fs-extra": "^11.2.0",
"glob": "^10.3.10", "glob": "^10.3.10",
@ -524,9 +524,9 @@
} }
}, },
"node_modules/@tsoa/runtime": { "node_modules/@tsoa/runtime": {
"version": "6.3.0", "version": "6.4.0",
"resolved": "https://registry.npmjs.org/@tsoa/runtime/-/runtime-6.3.0.tgz", "resolved": "https://registry.npmjs.org/@tsoa/runtime/-/runtime-6.4.0.tgz",
"integrity": "sha512-9z/0ePKpSoYpUq1IJvihk4FcgpAkyMTEEl9oFLiL9p5SE86ndsGJdH3kt/IyqtD3wajPSykMRHlAidrGUyLuNQ==", "integrity": "sha512-oiVVK++Svo8KMRVTfOQxtepPQRCpPh8bCmPpmNFePGZYJAtZ8XX1cm8Zs/v87dZZmNEooU6egj1G40ive/9phw==",
"dependencies": { "dependencies": {
"@hapi/boom": "^10.0.1", "@hapi/boom": "^10.0.1",
"@hapi/hapi": "^21.3.3", "@hapi/hapi": "^21.3.3",
@ -1537,9 +1537,9 @@
} }
}, },
"node_modules/fast-jwt": { "node_modules/fast-jwt": {
"version": "3.3.3", "version": "4.0.2",
"resolved": "https://registry.npmjs.org/fast-jwt/-/fast-jwt-3.3.3.tgz", "resolved": "https://registry.npmjs.org/fast-jwt/-/fast-jwt-4.0.2.tgz",
"integrity": "sha512-oS3P8bRI24oPLJUePt2OgF64FBQib5TlgHLFQxYNoHYEEZe0gU3cKjJAVqpB5XKV/zjxmq4Hzbk3fgfW/wRz8Q==", "integrity": "sha512-uSG3osRm3QNEkoCMwQ25qVs+pxn0f1n4/WLE+BmKaQZSmwhFhkkimHw7MXIPprrEF01CbNI1wL/35LRvLMfn7g==",
"dependencies": { "dependencies": {
"@lukeed/ms": "^2.0.1", "@lukeed/ms": "^2.0.1",
"asn1.js": "^5.4.1", "asn1.js": "^5.4.1",
@ -1547,7 +1547,7 @@
"mnemonist": "^0.39.5" "mnemonist": "^0.39.5"
}, },
"engines": { "engines": {
"node": ">=16 <22" "node": ">=16"
} }
}, },
"node_modules/fill-range": { "node_modules/fill-range": {
@ -2281,15 +2281,12 @@
} }
}, },
"node_modules/jackspeak": { "node_modules/jackspeak": {
"version": "3.4.2", "version": "3.4.3",
"resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.2.tgz", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
"integrity": "sha512-qH3nOSj8q/8+Eg8LUPOq3C+6HWkpUioIjDsq1+D4zY91oZvpPttw8GwtF1nReRYKXl+1AORyFqtm2f5Q1SB6/Q==", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
"dependencies": { "dependencies": {
"@isaacs/cliui": "^8.0.2" "@isaacs/cliui": "^8.0.2"
}, },
"engines": {
"node": "14 >=14.21 || 16 >=16.20 || >=18"
},
"funding": { "funding": {
"url": "https://github.com/sponsors/isaacs" "url": "https://github.com/sponsors/isaacs"
}, },
@ -2625,9 +2622,9 @@
} }
}, },
"node_modules/prettier": { "node_modules/prettier": {
"version": "3.3.2", "version": "3.3.3",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz",
"integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==", "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==",
"dev": true, "dev": true,
"bin": { "bin": {
"prettier": "bin/prettier.cjs" "prettier": "bin/prettier.cjs"
@ -3187,9 +3184,9 @@
} }
}, },
"node_modules/ts-deepmerge": { "node_modules/ts-deepmerge": {
"version": "7.0.0", "version": "7.0.1",
"resolved": "https://registry.npmjs.org/ts-deepmerge/-/ts-deepmerge-7.0.0.tgz", "resolved": "https://registry.npmjs.org/ts-deepmerge/-/ts-deepmerge-7.0.1.tgz",
"integrity": "sha512-WZ/iAJrKDhdINv1WG6KZIGHrZDar6VfhftG1QJFpVbOYZMYJLJOvZOo1amictRXVdBXZIgBHKswMTXzElngprA==", "integrity": "sha512-JBFCmNenZdUCc+TRNCtXVM6N8y/nDQHAcpj5BlwXG/gnogjam1NunulB9ia68mnqYI446giMfpqeBFFkOleh+g==",
"engines": { "engines": {
"node": ">=14.13.1" "node": ">=14.13.1"
} }
@ -3243,12 +3240,12 @@
"integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ=="
}, },
"node_modules/tsoa": { "node_modules/tsoa": {
"version": "6.3.1", "version": "6.4.0",
"resolved": "https://registry.npmjs.org/tsoa/-/tsoa-6.3.1.tgz", "resolved": "https://registry.npmjs.org/tsoa/-/tsoa-6.4.0.tgz",
"integrity": "sha512-w2INTVkjqQDlWo5aLv/ZIVAgWSfOOUstOW1WWVYOa+9mY2Er/W9E9BcBpIdaoJ5BtUZimhhhs5BQ2Nn76OfQpw==", "integrity": "sha512-bgNJrpkoTRjbFo/3S3fH+wh9mXTbTAJkzfUXgsAFZJNaDr1+tmiEaP3OO4AbjH0i1acKu9HTTmok3tWau4T83Q==",
"dependencies": { "dependencies": {
"@tsoa/cli": "^6.3.1", "@tsoa/cli": "^6.4.0",
"@tsoa/runtime": "^6.3.0" "@tsoa/runtime": "^6.4.0"
}, },
"bin": { "bin": {
"tsoa": "dist/cli.js" "tsoa": "dist/cli.js"
@ -3352,9 +3349,9 @@
} }
}, },
"node_modules/uglify-js": { "node_modules/uglify-js": {
"version": "3.18.0", "version": "3.19.1",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.18.0.tgz", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.1.tgz",
"integrity": "sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A==", "integrity": "sha512-y/2wiW+ceTYR2TSSptAhfnEtpLaQ4Ups5zrjB2d3kuVxHj16j/QJwPl5PvuGy9uARb39J0+iKxcRPvtpsx4A4A==",
"optional": true, "optional": true,
"bin": { "bin": {
"uglifyjs": "bin/uglifyjs" "uglifyjs": "bin/uglifyjs"
@ -3587,9 +3584,9 @@
} }
}, },
"node_modules/yaml": { "node_modules/yaml": {
"version": "2.4.5", "version": "2.5.0",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz",
"integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==", "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==",
"bin": { "bin": {
"yaml": "bin.mjs" "yaml": "bin.mjs"
}, },

View file

@ -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 { Client as ElasticsearchClient } from "@elastic/elasticsearch";
import { match } from "assert";
function getEnvVar(name: string) { function getEnvVar(name: string) {
const value = process.env[name]; const value = process.env[name];
@ -19,15 +20,19 @@ const elasticsearch = new ElasticsearchClient({
@Route("/api/v1/log") @Route("/api/v1/log")
@Security("keycloak") @Security("keycloak")
export class LogController extends Controller { export class LogController extends Controller {
@Get() @Post()
async GET( async Post(
@Query() size: number = 30, @Body()
@Query() search?: string, body: {
@Query() searchAfter?: number, size: number;
search?: string;
multiSearch?: string[];
searchAfter?: number;
date?: Date;
startDate?: Date;
endDate?: Date;
},
@Query() systemName?: string, @Query() systemName?: string,
@Query() date?: Date,
@Query() startDate?: Date,
@Query() endDate?: Date,
@Query() timezone = "+07:00", @Query() timezone = "+07:00",
@Query() sort: "asc" | "desc" = "desc", @Query() sort: "asc" | "desc" = "desc",
) { ) {
@ -36,12 +41,12 @@ export class LogController extends Controller {
let startTimeString = "00:00:00"; let startTimeString = "00:00:00";
let endTimeString = "23:59:59"; let endTimeString = "23:59:59";
if (date && !startDate && !endDate) { if (body.date && !body.startDate && !body.endDate) {
startDateString = `${date.getFullYear()}-${`${date.getMonth() + 1}`.padStart(2, "0")}-${`${date.getDate()}`.padStart(2, "0")}T${startTimeString}`; startDateString = `${body.date.getFullYear()}-${`${body.date.getMonth() + 1}`.padStart(2, "0")}-${`${body.date.getDate()}`.padStart(2, "0")}T${startTimeString}`;
endDateString = `${date.getFullYear()}-${`${date.getMonth() + 1}`.padStart(2, "0")}-${`${date.getDate()}`.padStart(2, "0")}T${endTimeString}`; 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 (body.startDate) startDateString = body.startDate.toISOString();
if (endDate) endDateString = endDate.toISOString(); if (body.endDate) endDateString = body.endDate.toISOString();
const queryData = await elasticsearch.search({ const queryData = await elasticsearch.search({
index: ELASTICSEARCH_INDEX, index: ELASTICSEARCH_INDEX,
@ -49,7 +54,7 @@ export class LogController extends Controller {
bool: { bool: {
must: [ must: [
...(systemName ? [{ match: { systemName } }] : []), ...(systemName ? [{ match: { systemName } }] : []),
...(search ...(body.search
? [ ? [
{ {
bool: { bool: {
@ -61,7 +66,7 @@ export class LogController extends Controller {
"responseCode", "responseCode",
"output", "output",
].map((v) => ({ ].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 }], sort: [{ startTimeStamp: sort }],
size: size, size: body.size,
}); });
return queryData.hits.hits; return queryData.hits.hits;
} }