hrms-api-log/src/controllers/log-controller.ts
2024-07-10 17:53:27 +07:00

60 lines
1.7 KiB
TypeScript

import { Controller, Get, Query, Route, Security } from "tsoa";
import { Client as ElasticsearchClient } from "@elastic/elasticsearch";
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 {
@Get()
async GET(
@Query() size: number = 30,
@Query() search?: string,
@Query() searchAfter?: number,
@Query() systemName?: string,
) {
const queryData = await elasticsearch.search({
index: ELASTICSEARCH_INDEX,
query: {
bool: {
must: [
...(systemName ? [{ match: { systemName } }] : []),
...(search
? [
{
bool: {
should: [
{
multi_match: {
query: search,
fields: ["method", "logType", "endpoint", "host"],
},
},
],
},
},
]
: []),
],
},
},
search_after: searchAfter ? [searchAfter] : undefined,
sort: [{ startTimeStamp: "desc" }],
size: size,
});
return queryData.hits.hits;
}
}