diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts index 9b7269f6..ba00fbd1 100644 --- a/packages/cli/src/cli.ts +++ b/packages/cli/src/cli.ts @@ -112,6 +112,7 @@ export function createCli({ appConsole }: Deps): commander.Command { "Filter on the given statuses, comma-separated" ) // TODO: list available statuses .option("-r, --raw", "Use a raw format instead of a table", false) + .option("-t, --tags ", "Filter on the given tags, comma-separated") .description("List ADRs") .action( (opts: ListCommandOpts): Promise => { diff --git a/packages/cli/src/commands/ListCommand.ts b/packages/cli/src/commands/ListCommand.ts index 7c7a62cf..66483254 100644 --- a/packages/cli/src/commands/ListCommand.ts +++ b/packages/cli/src/commands/ListCommand.ts @@ -8,6 +8,7 @@ type Deps = { export type ListCommandOpts = { statuses: string; + tags: string; raw: boolean; }; @@ -26,6 +27,9 @@ export class ListCommand { if (opts.statuses) { filters.statuses = opts.statuses.split(",") as AdrDtoStatus[]; } + if (opts.tags) { + filters.tags = opts.tags.split(","); + } const adrs = await this.l4bInstance.searchAdrs(filters); const table = this.console.createTable({ head: ["Slug", "Status", "Package", "Title"] diff --git a/packages/core/src/adr/application/queries/SearchAdrsQuery.ts b/packages/core/src/adr/application/queries/SearchAdrsQuery.ts index 272a2ae0..2f5f79c1 100644 --- a/packages/core/src/adr/application/queries/SearchAdrsQuery.ts +++ b/packages/core/src/adr/application/queries/SearchAdrsQuery.ts @@ -3,6 +3,7 @@ import { Query } from "@src/application"; export type SearchAdrsFilters = { statuses?: AdrStatus[]; + tags?: string[]; }; export class SearchAdrsQuery extends Query { diff --git a/packages/core/src/adr/application/query-handlers/SearchAdrsQueryHandler.ts b/packages/core/src/adr/application/query-handlers/SearchAdrsQueryHandler.ts index 41ab60c0..7e89bea3 100644 --- a/packages/core/src/adr/application/query-handlers/SearchAdrsQueryHandler.ts +++ b/packages/core/src/adr/application/query-handlers/SearchAdrsQueryHandler.ts @@ -25,6 +25,11 @@ export class SearchAdrsQueryHandler implements QueryHandler { ) { return false; } + if (query.filters.tags) { + return query.filters.tags.some((tag) => { + return adr.tags.includes(tag); + }); + } return true; }); } diff --git a/packages/core/src/infrastructure/api/Log4brains.ts b/packages/core/src/infrastructure/api/Log4brains.ts index 295c96d7..5d86b8f1 100644 --- a/packages/core/src/infrastructure/api/Log4brains.ts +++ b/packages/core/src/infrastructure/api/Log4brains.ts @@ -23,6 +23,7 @@ import { FileWatcher } from "../file-watcher"; export type SearchAdrsFilters = { statuses?: AdrDtoStatus[]; + tags?: string[]; }; /** @@ -71,6 +72,9 @@ export class Log4brains { AdrStatus.createFromName(status) ); } + if (filters?.tags) { + appFilters.tags = filters.tags; + } const adrs = await this.queryBus.dispatch( new SearchAdrsQuery(appFilters) );