diff --git a/plugins/home/src/api/VisitsApi.ts b/plugins/home/src/api/VisitsApi.ts index ad750d81f2..610f4be483 100644 --- a/plugins/home/src/api/VisitsApi.ts +++ b/plugins/home/src/api/VisitsApi.ts @@ -16,6 +16,20 @@ import { createApiRef } from '@backstage/core-plugin-api'; +/** + * @public + * The operators that can be used in filter. + */ +export type Operators = '<' | '<=' | '==' | '!=' | '>' | '>=' | 'contains'; + +/** + * @public + * Type guard for operators. + */ +export const isOperator = (s: string): s is Operators => { + return ['<', '<=', '==', '!=', '>', '>=', 'contains'].includes(s); +}; + /** * @public * Model for a visit entity. @@ -84,7 +98,7 @@ export type VisitsApiQueryParams = { */ filterBy?: Array<{ field: keyof Visit; - operator: '<' | '<=' | '==' | '!=' | '>' | '>=' | 'contains'; + operator: Operators; value: string | number; }>; }; diff --git a/plugins/home/src/api/config.ts b/plugins/home/src/api/config.ts index 3cc6d93f24..359026958f 100644 --- a/plugins/home/src/api/config.ts +++ b/plugins/home/src/api/config.ts @@ -14,7 +14,12 @@ * limitations under the License. */ -import { Visit, VisitsApiQueryParams } from './VisitsApi'; +import { + Visit, + VisitsApiQueryParams, + Operators, + isOperator, +} from './VisitsApi'; import { Config } from '@backstage/config'; /** @@ -24,25 +29,23 @@ import { Config } from '@backstage/config'; * * @public */ + export function readFilterConfig(config: Config): | { field: keyof Visit; - operator: '<' | '<=' | '==' | '!=' | '>' | '>=' | 'contains'; + operator: Operators; value: string | number; } | undefined { try { const field = config.getString('field') as keyof Visit; - const operator = config.getString('operator') as - | '<' - | '<=' - | '==' - | '!=' - | '>' - | '>=' - | 'contains'; - const value = config.getString('value'); - return { field, operator, value }; + const operator = config.getString('operator'); + const value = + config.getOptionalNumber('value') ?? config.getString('value'); + if (isOperator(operator)) { + return { field, operator, value }; + } + return undefined; } catch (error) { // invalid filter config - ignore filter return undefined;