diff --git a/contrib/plugins/todo-list-backend/src/service/router.ts b/contrib/plugins/todo-list-backend/src/service/router.ts index 2fd9dfea9a..c6d9b503ed 100644 --- a/contrib/plugins/todo-list-backend/src/service/router.ts +++ b/contrib/plugins/todo-list-backend/src/service/router.ts @@ -15,7 +15,6 @@ */ import { errorHandler } from '@backstage/backend-common'; -import { InputError } from '@backstage/errors'; import express from 'express'; import Router from 'express-promise-router'; import { Logger } from 'winston'; @@ -24,6 +23,7 @@ import { getBearerTokenFromAuthorizationHeader, } from '@backstage/plugin-auth-node'; import { add, getAll, update } from './todos'; +import { InputError } from '@backstage/errors'; export interface RouterOptions { logger: Logger; diff --git a/contrib/plugins/todo-list-backend/src/service/todos.ts b/contrib/plugins/todo-list-backend/src/service/todos.ts index 54d07cf059..b87ab7557e 100644 --- a/contrib/plugins/todo-list-backend/src/service/todos.ts +++ b/contrib/plugins/todo-list-backend/src/service/todos.ts @@ -23,10 +23,41 @@ export type Todo = { timestamp: number; }; -export type TodoFilter = Parameters['filter']>[0]; +export type TodoFilter = { + property: Exclude; + values: Array; +}; + +export type TodoFilters = + | { + anyOf: TodoFilters[]; + } + | { allOf: TodoFilters[] } + | { not: TodoFilters } + | TodoFilter; const todos: { [key: string]: Todo } = {}; +const matches = (todo: Todo, filters?: TodoFilters): boolean => { + if (!filters) { + return true; + } + + if ('allOf' in filters) { + return filters.allOf.every(filter => matches(todo, filter)); + } + + if ('anyOf' in filters) { + return filters.anyOf.some(filter => matches(todo, filter)); + } + + if ('not' in filters) { + return !matches(todo, filters.not); + } + + return filters.values.includes(todo[filters.property]); +}; + export function add(todo: Omit) { const id = uuid(); @@ -50,13 +81,10 @@ export function update({ id, title }: { id: string; title: string }) { return todo; } -export function getAll(filter?: TodoFilter) { - let values = Object.values(todos); - if (filter) { - values = values.filter(filter); - } - - return values.sort((a, b) => b.timestamp - a.timestamp); +export function getAll(filter?: TodoFilters) { + return Object.values(todos) + .filter(value => matches(value, filter)) + .sort((a, b) => b.timestamp - a.timestamp); } // prepopulate the db