hrms-api-log/src/controllers/log-controller.ts

111 lines
3.5 KiB
TypeScript
Raw Normal View History

import { Body, Controller, Get, Post, Query, Route, Security } from "tsoa";
2024-07-10 17:53:27 +07:00
import { Client as ElasticsearchClient } from "@elastic/elasticsearch";
import { match } from "assert";
2024-07-10 17:53:27 +07:00
function getEnvVar(name: string) {
const value = process.env[name];
if (!value) throw new Error(`${name} is required.`);
return value;
}
const ELASTICSEARCH_PROTOCOL = getEnvVar("ELASTICSEARCH_PROTOCOL");
const ELASTICSEARCH_HOST = getEnvVar("ELASTICSEARCH_HOST");
const ELASTICSEARCH_PORT = getEnvVar("ELASTICSEARCH_PORT");
const ELASTICSEARCH_INDEX = getEnvVar("ELASTICSEARCH_INDEX");
const elasticsearch = new ElasticsearchClient({
node: `${ELASTICSEARCH_PROTOCOL}://${ELASTICSEARCH_HOST}:${ELASTICSEARCH_PORT}`,
});
@Route("/api/v1/log")
@Security("keycloak")
export class LogController extends Controller {
@Post()
async Post(
@Body()
body: {
size: number;
search?: string;
multiSearch?: string[];
searchAfter?: number;
date?: Date;
startDate?: Date;
endDate?: Date;
},
2024-07-10 17:53:27 +07:00
@Query() systemName?: string,
2024-07-31 11:21:43 +07:00
@Query() timezone = "+07:00",
@Query() sort: "asc" | "desc" = "desc",
2024-07-10 17:53:27 +07:00
) {
2024-07-30 09:15:26 +07:00
let startDateString: string | undefined;
let endDateString: string | undefined;
2024-07-31 11:21:43 +07:00
let startTimeString = "00:00:00";
let endTimeString = "23:59:59";
2024-07-30 09:15:26 +07:00
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}`;
2024-07-30 09:15:26 +07:00
}
if (body.startDate) startDateString = body.startDate.toISOString();
if (body.endDate) endDateString = body.endDate.toISOString();
2024-07-30 09:15:12 +07:00
2024-07-10 17:53:27 +07:00
const queryData = await elasticsearch.search({
index: ELASTICSEARCH_INDEX,
query: {
bool: {
must: [
...(systemName ? [{ match: { systemName } }] : []),
...(body.search
2024-07-10 17:53:27 +07:00
? [
{
bool: {
2024-07-31 15:59:15 +07:00
should: [
"method",
"logType",
"endpoint",
"host",
"responseCode",
"output",
].map((v) => ({
wildcard: { [v]: "*" + body.search + "*" },
2024-07-31 15:59:15 +07:00
})),
2024-07-10 17:53:27 +07:00
},
},
]
: []),
2024-07-30 09:15:26 +07:00
...(startDateString || endDateString
2024-07-11 16:12:11 +07:00
? [
{
range: {
startTimeStamp: {
2024-07-31 11:21:43 +07:00
time_zone: timezone,
2024-07-30 09:15:12 +07:00
gte: startDateString,
lte: endDateString,
2024-07-11 16:12:11 +07:00
},
},
},
]
: []),
...(body.multiSearch
? [
{
bool: {
should: body.multiSearch.map((v) => ({
match_phrase: {
userId: v,
},
})),
},
},
]
: []),
2024-07-10 17:53:27 +07:00
],
},
},
search_after: body.searchAfter ? [body.searchAfter] : undefined,
2024-07-31 11:21:43 +07:00
sort: [{ startTimeStamp: sort }],
size: body.size,
2024-07-10 17:53:27 +07:00
});
return queryData.hits.hits;
}
}