feat: implement command functionality with new CommandController, update Query entity, and enhance query execution with headers support

This commit is contained in:
lborv
2025-10-02 10:02:44 +03:00
parent e53e3cf92c
commit efbb9f5c21
11 changed files with 122 additions and 11 deletions

View File

@ -0,0 +1,37 @@
import { Body, Controller, Headers, Inject, Param, Post } from "@nestjs/common";
import { QueryHandlerService } from "../handler/query.handler.service";
import { QueryExecuterService } from "../executer/query.executer.service";
@Controller("command")
export class CommandController {
constructor(
@Inject(QueryHandlerService)
private readonly queryHandlerService: QueryHandlerService,
@Inject(QueryExecuterService)
private readonly queryExecuterService: QueryExecuterService
) {}
@Post("create")
async createQuery(
@Body() queryData: { projectToken: string; source: string }
) {
return this.queryHandlerService.createQuery(queryData, true);
}
@Post("update/:id")
async updateQuery(
@Body() updateData: Partial<{ source: string }>,
@Inject("id") id: string
) {
return this.queryHandlerService.updateQuery(id, updateData);
}
@Post("/run/:token")
async runQuery(
@Param("token") token: string,
@Body() query: Record<string, any>,
@Headers() headers: Record<string, any>
) {
return this.queryExecuterService.runQuery(token, query, headers);
}
}

View File

@ -14,4 +14,7 @@ export class Query {
@Column({ type: "tinyint", default: 1 })
isActive: number;
@Column({ type: "tinyint", default: 0 })
isCommand: number;
}

View File

@ -1,4 +1,4 @@
import { Body, Controller, Inject, Param, Post } from "@nestjs/common";
import { Body, Controller, Headers, Inject, Param, Post } from "@nestjs/common";
import { QueryExecuterService } from "./query.executer.service";
@Controller("query")
@ -11,8 +11,9 @@ export class QueryExecuterController {
@Post("/run/:token")
async runQuery(
@Param("token") token: string,
@Body() query: Record<string, any>
@Body() query: Record<string, any>,
@Headers() headers: Record<string, any>
) {
return this.queryExecuterService.runQuery(token, query);
return this.queryExecuterService.runQuery(token, query, headers);
}
}

View File

@ -34,7 +34,11 @@ export class QueryExecuterService {
.trim();
}
async runQuery(token: string, queryData: any) {
async runQuery(
token: string,
queryData: any,
headers: Record<string, any> = {}
) {
const query = await this.queryRepository.findOne({
where: { id: token },
relations: ["project"],
@ -47,7 +51,8 @@ export class QueryExecuterService {
const vm = await this.createVm(query);
const result = await vm.runScript(
this.clearImports(query.source),
queryData
queryData,
headers
);
return { message: "Query executed", result, query: queryData };

View File

@ -13,7 +13,10 @@ export class QueryHandlerService {
private readonly projectService: ProjectService
) {}
async createQuery(queryData: { projectToken: string; source: string }) {
async createQuery(
queryData: { projectToken: string; source: string },
isCommand = false
) {
const project = await this.projectService.findById(queryData.projectToken);
if (!project) {
@ -21,6 +24,7 @@ export class QueryHandlerService {
}
queryData["project"] = project;
queryData["isCommand"] = isCommand ? 1 : 0;
delete queryData.projectToken;
const query = this.queryRepository.create(queryData);

View File

@ -7,6 +7,7 @@ import { QueryExecuterService } from "./executer/query.executer.service";
import { QueryHandlerService } from "./handler/query.handler.service";
import { ProjectModule } from "src/project/project.module";
import { DatabaseManagerModule } from "src/databaseManager/database.manager.module";
import { CommandController } from "./command/command.controller";
@Module({
imports: [
@ -14,7 +15,11 @@ import { DatabaseManagerModule } from "src/databaseManager/database.manager.modu
forwardRef(() => DatabaseManagerModule),
TypeOrmModule.forFeature([Query]),
],
controllers: [QueryExecuterController, QueryHandlerController],
controllers: [
QueryExecuterController,
QueryHandlerController,
CommandController,
],
providers: [QueryExecuterService, QueryHandlerService],
})
export class QueryModule {}