60 lines
1.7 KiB
TypeScript
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;
|
|
}
|
|
}
|