// (C) 2007-2019 GoodData Corporation import { flatMap, has } from "lodash"; import { ISchemaKpi } from "../model/SchemaKpi"; import { getProjectId, IProject } from "../../model/Project"; import { IKpi, IKpiContentWithComparison, IKpiContentWithoutComparison, IKpiContentBase, } from "../../model/Kpi"; import { objectUri, profileUri } from "../../route/routes"; import { webalize } from "../../utils/string"; import { ISchema } from "../model/Schema"; import { createProject } from "./ProjectBuilder"; import { createUsers } from "./UserBuilder"; import { ISchemaAnalyticalDashboard } from "../model/SchemaAnalyticalDashboard"; import { SchemaWidget } from "../model/SchemaWidget"; function getContentBase(project: IProject, kpi: ISchemaKpi): IKpiContentBase { return { metric: objectUri(getProjectId(project), kpi.metricIdentifier), ignoreDashboardFilters: [], ...(kpi.dateDataSetUri && { dateDataSet: kpi.dateDataSetUri }), }; } function getContentWithComparison(project: IProject, kpi: ISchemaKpi): IKpiContentWithComparison { return { ...getContentBase(project, kpi), comparisonType: kpi.comparisonType, comparisonDirection: kpi.comparisonDirection, }; } function getContentWithoutComparison(project: IProject, kpi: ISchemaKpi): IKpiContentWithoutComparison { return { ...getContentBase(project, kpi), comparisonType: "none", }; } function getDashboardKpis(analyticalDashboard: ISchemaAnalyticalDashboard): ISchemaKpi[] { const widgets: SchemaWidget[] = analyticalDashboard.widgets ? analyticalDashboard.widgets.filter((widget: ISchemaKpi) => has(widget, "metricIdentifier")) : []; return widgets as ISchemaKpi[]; } export function createKpi(project: IProject, userId: string, kpi: ISchemaKpi): IKpi { const identifier = kpi.identifier || webalize(kpi.title); return { content: kpi.comparisonDirection ? getContentWithComparison(project, kpi) : getContentWithoutComparison(project, kpi), meta: { author: profileUri(userId), category: "kpi", deprecated: false, identifier, locked: false, title: kpi.title, unlisted: false, uri: objectUri(getProjectId(project), identifier), }, }; } export function createKpis(schema: ISchema): IKpi[] { const project = createProject(schema); const users = createUsers(schema); const kpis = flatMap( schema.analyticalDashboards || [], analyticalDashboard => getDashboardKpis(analyticalDashboard) || [], ); return kpis.map(kpi => createKpi(project, users[0].identifier, kpi)); }