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, @Query() date?: Date, @Query() startDate?: Date, @Query() endDate?: Date, ) { if (!endDate && !startDate) startDate = endDate = date; let startDateString: string | undefined; let endDateString: string | undefined; if (startDate && endDate) { startDateString = `${startDate.getFullYear()}-${(startDate.getMonth() + 1).toString().padStart(2, "0")}-${startDate.getDate().toString().padStart(2, "0")}T00:00:00`; endDateString = `${endDate.getFullYear()}-${(endDate.getMonth() + 1).toString().padStart(2, "0")}-${endDate.getDate().toString().padStart(2, "0")}T23:59:59`; } 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", "responseCode"], }, }, ], }, }, ] : []), ...(startDateString || endDateString ? [ { range: { startTimeStamp: { time_zone: "+07:00", gte: startDateString, lte: endDateString, }, }, }, ] : []), ], }, }, search_after: searchAfter ? [searchAfter] : undefined, sort: [{ startTimeStamp: "desc" }], size: size, }); return queryData.hits.hits; } }