// (C) 2007-2019 GoodData Corporation import { has } from "lodash"; import { Application } from "express"; import * as HttpStatusCodes from "http-status-codes"; import { IMockProject, getAttributes, getAttributeDisplayForms, getMetrics, getFacts, getVisualizationObjects, } from "../../model/MockProject"; import { IMetadataObject } from "../../model/MetadataObject"; export interface IIdentifier { identifier: string; uri: string; } export interface IIdentifierToUriRequest { identifierToUri: string[]; } export interface IUriToIdentifierRequest { uriToIdentifier: string[]; } export interface IIdentifiersResponse { identifiers: IIdentifier[]; } export type IdentifiersRequest = IIdentifierToUriRequest | IUriToIdentifierRequest; function isIdentifierToUriRequest(request: IdentifiersRequest): request is IIdentifierToUriRequest { return !!(request as IIdentifierToUriRequest).identifierToUri; } function filterMetadataObjectsByIdentifier( objects: IMetadataObject[], identifiers: string[], ): IMetadataObject[] { const lookup = identifiers.reduce((hash, identifier) => ({ ...hash, [identifier]: true }), {}); return objects.filter(object => has(lookup, object.meta.identifier)); } function filterMetadataObjectsByUri(objects: IMetadataObject[], uris: string[]): IMetadataObject[] { const lookup = uris.reduce((hash, uri) => ({ ...hash, [uri]: true }), {}); return objects.filter(object => has(lookup, object.meta.uri)); } function createPair(object: IMetadataObject): IIdentifier { return { identifier: object.meta.identifier, uri: object.meta.uri, }; } export const identifiers = { register(app: Application, project: IMockProject) { app.post(`/gdc/md/${project.project.meta.identifier}/identifiers`, (req, res) => { const request: IdentifiersRequest = req.body; const objects: IMetadataObject[] = [ ...getVisualizationObjects(project), ...getAttributes(project), ...getAttributeDisplayForms(project), ...getMetrics(project), ...getFacts(project), ]; if (isIdentifierToUriRequest(request)) { const body: IIdentifiersResponse = { identifiers: filterMetadataObjectsByIdentifier(objects, request.identifierToUri).map( createPair, ), }; res.status(HttpStatusCodes.OK).json(body); } else { const body: IIdentifiersResponse = { identifiers: filterMetadataObjectsByUri(objects, request.uriToIdentifier).map(createPair), }; res.status(HttpStatusCodes.OK).json(body); } }); return app; }, };