import { MetricSupplierResult, MetricValue, } from '@atlassian/forge-graphql-types'; import isValidDateString from '../helpers/isValidDate'; class MetricSupplierError extends Error {} export enum MetricSupplierValidationErrors { METRIC_VALUES_NOT_PROVIDED = "Can't get metric values", INVALID_DATE = 'Invalid date', } /* Builder class for constructing a response object for compass:metricSupplier Forge modules. */ export class MetricSupplierResponse { metricValues: MetricValue[]; error: string; public build(): MetricSupplierResult { this.validate(); return { metricValues: this.metricValues, error: this.error, }; } public addMetricValues( metricValues: MetricValue[] | null, ): MetricSupplierResponse { if (metricValues === null) { this.error = MetricSupplierValidationErrors.METRIC_VALUES_NOT_PROVIDED; return this; } this.metricValues = metricValues; return this; } private validate(): void { try { if (this.error) { return; } this.validateTimestamps(); } catch (error) { this.error = error.message; this.metricValues = undefined; } } private validateTimestamps(): void | never { if (!this.metricValues.length) { return; } this.metricValues.forEach((value) => { const validDate = isValidDateString(value.timestamp); if (!validDate) { throw new MetricSupplierError( MetricSupplierValidationErrors.INVALID_DATE, ); } }); } }