// (C) 2019 GoodData Corporation import { ExecuteAFM as AFM } from "@gooddata/typings"; import * as e from "express"; import * as HttpStatusCodes from "http-status-codes"; import { IConfig } from "../../model/Config"; import { getVisualizationObject, IMockProject } from "../../model/MockProject"; import { doExecuteAfm, isErrorResponse } from "./executeAfm"; import { mergeFiltersToAfm } from "./executeVisualization/mergeFilters"; import { toAfm } from "./executeVisualization/toAfm"; export interface IVisualizationExecution { visualizationExecution: { reference: string; resultSpec?: AFM.IResultSpec; filters?: AFM.CompatibilityFilter[]; }; } export function getAfmExecutionForVisualization( project: IMockProject, visExecution: IVisualizationExecution, ): AFM.IExecution { const { reference, resultSpec, filters } = visExecution.visualizationExecution; const visObject = getVisualizationObject(project, reference); const resultSpecProp = resultSpec ? { resultSpec } : undefined; return visObject ? { execution: { afm: mergeFiltersToAfm(toAfm(visObject.content), filters), ...resultSpecProp, }, } : undefined; } export const executeVisualization = { register(app: e.Application, project: IMockProject, config: IConfig) { app.post(`/gdc/app/projects/${project.project.meta.identifier}/executeVisualization`, (req, res) => { const executeAfmRequest = getAfmExecutionForVisualization(project, req.body); if (executeAfmRequest === undefined) { return res.status(HttpStatusCodes.BAD_REQUEST).send("Visualization does not exist"); } const result = doExecuteAfm(project, executeAfmRequest, config); if (isErrorResponse(result)) { const { error } = result; return res.status(error.statusCode).send(error.message); } return res.status(HttpStatusCodes.CREATED).send(result); }); return app; }, };