diff --git a/src/query/command/command.controller.ts b/src/query/command/command.controller.ts index 3b46619..b1ae1f2 100644 --- a/src/query/command/command.controller.ts +++ b/src/query/command/command.controller.ts @@ -1,6 +1,15 @@ -import { Body, Controller, Headers, Inject, Param, Post } from "@nestjs/common"; +import { + Body, + Controller, + Headers, + Inject, + Param, + Post, + Res, +} from "@nestjs/common"; import { QueryHandlerService } from "../handler/query.handler.service"; import { QueryExecuterService } from "../executer/query.executer.service"; +import { Response } from "express"; @Controller("command") export class CommandController { @@ -30,8 +39,26 @@ export class CommandController { async runQuery( @Param("token") token: string, @Body() query: Record, - @Headers() headers: Record + @Headers() headers: Record, + @Res() res: Response ) { - return this.queryExecuterService.runQuery(token, query, headers); + const queryResult = await this.queryExecuterService.runQuery( + token, + query, + headers + ); + + res.status(queryResult.statusCode); + + if (queryResult.statusCode === 302 && queryResult.headers["Location"]) { + res.redirect(queryResult.headers["Location"]); + return; + } + + for (const [key, value] of Object.entries(queryResult.headers)) { + res.setHeader(key, value); + } + + res.send(queryResult.response); } } diff --git a/src/query/executer/query.executer.controller.ts b/src/query/executer/query.executer.controller.ts index 3733b07..2cbb3c9 100644 --- a/src/query/executer/query.executer.controller.ts +++ b/src/query/executer/query.executer.controller.ts @@ -1,4 +1,13 @@ -import { Body, Controller, Headers, Inject, Param, Post } from "@nestjs/common"; +import { + Body, + Controller, + Headers, + Inject, + Param, + Post, + Res, +} from "@nestjs/common"; +import { Response } from "express"; import { QueryExecuterService } from "./query.executer.service"; @Controller("query") @@ -12,8 +21,26 @@ export class QueryExecuterController { async runQuery( @Param("token") token: string, @Body() query: Record, - @Headers() headers: Record + @Headers() headers: Record, + @Res() res: Response ) { - return this.queryExecuterService.runQuery(token, query, headers); + const queryResult = await this.queryExecuterService.runQuery( + token, + query, + headers + ); + + res.status(queryResult.statusCode); + + if (queryResult.statusCode === 302 && queryResult.headers["Location"]) { + res.redirect(queryResult.headers["Location"]); + return; + } + + for (const [key, value] of Object.entries(queryResult.headers)) { + res.setHeader(key, value); + } + + res.send(queryResult.response); } } diff --git a/src/query/executer/query.executer.service.ts b/src/query/executer/query.executer.service.ts index a6c47ce..377c1ae 100644 --- a/src/query/executer/query.executer.service.ts +++ b/src/query/executer/query.executer.service.ts @@ -4,7 +4,11 @@ import { Query } from "../entities/query.entity"; import { Repository } from "typeorm"; import { Vm } from "../../vm/vm.class"; import { VModule } from "src/vm/module.class"; -import { registeredModules, registeredPlugins } from "src/vm/vm.constants"; +import { + QueryResponse, + registeredModules, + registeredPlugins, +} from "src/vm/vm.constants"; import { DatabaseManagerService } from "src/databaseManager/database/database.manager.service"; @Injectable() @@ -38,7 +42,7 @@ export class QueryExecuterService { token: string, queryData: any, headers: Record = {} - ) { + ): Promise { const query = await this.queryRepository.findOne({ where: { id: token }, relations: ["project"], @@ -55,7 +59,11 @@ export class QueryExecuterService { headers ); - return { message: "Query executed", result, query: queryData }; + if (this.checkResponse(result)) { + throw new Error(`Error initializing VM: ${JSON.stringify(result)}`); + } + + return result; } private async createVm(query: Query) { @@ -97,4 +105,19 @@ export class QueryExecuterService { return await vm.init(); } + + private checkResponse(obj: any): obj is QueryResponse { + return ( + obj !== null && + typeof obj === "object" && + typeof obj.statusCode === "number" && + typeof obj.response === "object" && + obj.response !== null && + typeof obj.headers === "object" && + obj.headers !== null && + Object.keys(obj.headers).every( + (key) => typeof obj.headers[key] === "string" + ) + ); + } } diff --git a/src/vm/vm.constants.ts b/src/vm/vm.constants.ts index a3ea2ee..a2e2078 100644 --- a/src/vm/vm.constants.ts +++ b/src/vm/vm.constants.ts @@ -29,3 +29,9 @@ export const registeredModules = { squel: "dist/vm/modules/squel.js", asyncCall: "dist/vm/modules/async.js", }; + +export type QueryResponse = { + statusCode: number; + response: Record; + headers: Record; +};