feat: add isAdmin column to token entity; implement migration for isAdmin; enhance logging and error handling in query execution; update query plugin to support new logging structure
This commit is contained in:
@ -15,6 +15,7 @@ import { QueryExecuterService } from "../executer/query.executer.service";
|
||||
import { QueryGuard } from "src/query/guards/query.guard";
|
||||
import { LoggerService } from "../logger/logger.service";
|
||||
import { TLogType } from "../logger/logger.types";
|
||||
import { QueryResponse } from "src/vm/vm.constants";
|
||||
|
||||
@UseGuards(ApiTokenGuard)
|
||||
export abstract class BaseQueryController {
|
||||
@ -53,6 +54,7 @@ export abstract class BaseQueryController {
|
||||
@Headers() headers: Record<string, any>,
|
||||
@Res() res: Response
|
||||
) {
|
||||
let queryResult: QueryResponse;
|
||||
const loggerTraceId =
|
||||
headers["x-trace-id"] || LoggerService.generateTraceId();
|
||||
const log = LoggerService.log(
|
||||
@ -69,20 +71,35 @@ export abstract class BaseQueryController {
|
||||
{ content: "", type: TLogType.info, timeStamp: new Date().getTime() }
|
||||
);
|
||||
|
||||
const queryResult = await this.queryExecuterService.runQueryQueued(
|
||||
id,
|
||||
query,
|
||||
log,
|
||||
headers,
|
||||
headers.cookie.split("; ").reduce((acc, cookie) => {
|
||||
const [key, value] = cookie.split("=");
|
||||
acc[key] = value;
|
||||
return acc;
|
||||
}, {})
|
||||
);
|
||||
try {
|
||||
queryResult = await this.queryExecuterService.runQueryQueued(
|
||||
id,
|
||||
query,
|
||||
log,
|
||||
headers,
|
||||
headers.cookie.split("; ").reduce((acc, cookie) => {
|
||||
const [key, value] = cookie.split("=");
|
||||
acc[key] = value;
|
||||
return acc;
|
||||
}, {})
|
||||
);
|
||||
} catch (error) {
|
||||
log.content.push({
|
||||
content: `Query execution failed: ${error.message}`,
|
||||
type: TLogType.error,
|
||||
timeStamp: new Date().getTime(),
|
||||
});
|
||||
log.endTime = new Date().getTime();
|
||||
await this.loggerService.create(log.traceId, log);
|
||||
res.status(500).send({ error: "Internal Server Error" });
|
||||
return;
|
||||
}
|
||||
|
||||
if (queryResult?.log) {
|
||||
queryResult.log.endTime = new Date().getTime();
|
||||
const res = JSON.parse(JSON.stringify(queryResult));
|
||||
delete res.log;
|
||||
queryResult.log.response = res;
|
||||
await this.loggerService.create(queryResult.log.traceId, queryResult.log);
|
||||
}
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
import { RedisNodeService } from "./../../redisManager/redisNode/redis.node.service";
|
||||
import { Inject, Injectable } from "@nestjs/common";
|
||||
import { Inject, Injectable, Logger } from "@nestjs/common";
|
||||
import { InjectRepository } from "@nestjs/typeorm";
|
||||
import { Query } from "../entities/query.entity";
|
||||
import { Repository } from "typeorm";
|
||||
@ -16,7 +16,8 @@ import { QUEUE_NAMES } from "src/queue/constants";
|
||||
import { Queue, QueueEvents } from "bullmq";
|
||||
import { FunctionService } from "src/query/function/function.service";
|
||||
import { SessionService } from "../session/session.service";
|
||||
import { TLog } from "../logger/logger.types";
|
||||
import { TLog, TLogType } from "../logger/logger.types";
|
||||
import { LoggerService } from "../logger/logger.service";
|
||||
|
||||
@Injectable()
|
||||
export class QueryExecuterService {
|
||||
@ -104,12 +105,11 @@ export class QueryExecuterService {
|
||||
cookies["x-session-id"] = session.sessionId;
|
||||
}
|
||||
|
||||
const vm = await this.createVm(query, cookies["x-session-id"]);
|
||||
const vm = await this.createVm(query, log, cookies["x-session-id"]);
|
||||
const result = await vm.runScript(
|
||||
this.clearImports(query.source),
|
||||
queryData,
|
||||
headers,
|
||||
log
|
||||
headers
|
||||
);
|
||||
|
||||
if (!this.checkResponse(result)) {
|
||||
@ -129,7 +129,7 @@ export class QueryExecuterService {
|
||||
return result;
|
||||
}
|
||||
|
||||
private async createVm(query: Query, sessionId: string = null) {
|
||||
private async createVm(query: Query, log: TLog, sessionId: string = null) {
|
||||
const imports = this.parseImports(query.source);
|
||||
const importsParsed = imports.map((imp) => {
|
||||
const item = imp.split("/");
|
||||
@ -179,6 +179,7 @@ export class QueryExecuterService {
|
||||
modules: modules,
|
||||
plugins: plugins,
|
||||
functions: functions,
|
||||
log,
|
||||
});
|
||||
|
||||
return await vm.init();
|
||||
|
||||
@ -9,7 +9,13 @@ export class Log {
|
||||
@Column({ type: "varchar", length: 255 })
|
||||
traceId: string;
|
||||
|
||||
@Column({ type: "longtext" })
|
||||
@Column({
|
||||
type: "longtext",
|
||||
transformer: {
|
||||
to: (value: TLog) => JSON.stringify(value),
|
||||
from: (value: string) => JSON.parse(value) as TLog,
|
||||
},
|
||||
})
|
||||
content: TLog;
|
||||
|
||||
@Column({ type: "timestamp", default: () => "CURRENT_TIMESTAMP" })
|
||||
|
||||
Reference in New Issue
Block a user