// (C) 2007-2019 GoodData Corporation import { Application } from "express"; import { filterByUri } from "../helpers/filtering"; import * as HttpStatusCodes from "http-status-codes"; import { IMockProject, getAttributeDisplayForms, getAttributes, getDateAttributes, getDateAttributeDisplayForms, getMetrics, } from "../../model/MockProject"; import { IMetadataObject } from "../../model/MetadataObject"; import { ValidationError } from "../ValidationError"; import { getUri, getWrappedMetadataObject } from "../helpers/metadataObjects"; import { WrappedMetadataObject } from "../../model/index"; interface IMetadataObjectsRequest { get: { items: string[]; }; } interface IMetadataObjectsResponse { objects: { items: WrappedMetadataObject[]; }; } function getResponseBody(uris: string[], project: IMockProject): IMetadataObjectsResponse { const metadataObjects: IMetadataObject[] = [ ...project.visualizationObjects, ...project.visualizationWidgets, ...project.visualizationClasses, ...project.kpis, ...project.filterContexts, ...getAttributeDisplayForms(project), ...getAttributes(project), ...getMetrics(project), ...getDateAttributes(project), ...getDateAttributeDisplayForms(project), ]; if (uris.indexOf(null) !== -1) { throw new Error("Structure is not supposed to be NULL and has no value defined."); } const items = filterByUri(uris, getUri, metadataObjects); const wrappedItems: WrappedMetadataObject[] = items.map(getWrappedMetadataObject); return { objects: { items: wrappedItems } }; } export const metadataObjects = { register(app: Application, project: IMockProject) { app.post(`/gdc/md/${project.project.meta.identifier}/objects/get`, (req, res) => { const request: IMetadataObjectsRequest = req.body; try { const body: IMetadataObjectsResponse = getResponseBody(request.get.items, project); res.status(HttpStatusCodes.OK).json(body); } catch (error) { if (error instanceof ValidationError) { res.status(HttpStatusCodes.BAD_REQUEST).json(error.getValidationError()); } else { res.status(HttpStatusCodes.INTERNAL_SERVER_ERROR).json(error); } } }); return app; }, };