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; } }