Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 15 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -280,14 +280,14 @@ List correspondents
```
USAGE
$ ppls correspondents list [--date-format <value>] [--header <value>...] [--hostname <value>] [--plain | --json |
--table] [--token <value>] [--page <value>] [--page-size <value>] [--id-in <value> | --name-contains <value>]
[--sort <value>]
--table] [--token <value>] [--id-in <value> | --name-contains <value>] [--page <value> --page-size <value>] [--sort
<value>]

FLAGS
--id-in=<value> Filter by id list (comma-separated)
--name-contains=<value> Filter by name substring
--page=<value> Page number to fetch
--page-size=<value> Number of results per page
--page-size=<value> [default: disable pagination, all results] Number of results per page
--sort=<value> Sort results by the provided field

GLOBAL FLAGS
Expand Down Expand Up @@ -457,14 +457,14 @@ List custom fields
```
USAGE
$ ppls custom-fields list [--date-format <value>] [--header <value>...] [--hostname <value>] [--plain | --json |
--table] [--token <value>] [--page <value>] [--page-size <value>] [--id-in <value> | --name-contains <value>]
[--sort <value>]
--table] [--token <value>] [--id-in <value> | --name-contains <value>] [--page <value> --page-size <value>] [--sort
<value>]

FLAGS
--id-in=<value> Filter by id list (comma-separated)
--name-contains=<value> Filter by name substring
--page=<value> Page number to fetch
--page-size=<value> Number of results per page
--page-size=<value> [default: disable pagination, all results] Number of results per page
--sort=<value> Sort results by the provided field

GLOBAL FLAGS
Expand Down Expand Up @@ -632,14 +632,14 @@ List document types
```
USAGE
$ ppls document-types list [--date-format <value>] [--header <value>...] [--hostname <value>] [--plain | --json |
--table] [--token <value>] [--page <value>] [--page-size <value>] [--id-in <value> | --name-contains <value>]
[--sort <value>]
--table] [--token <value>] [--id-in <value> | --name-contains <value>] [--page <value> --page-size <value>] [--sort
<value>]

FLAGS
--id-in=<value> Filter by id list (comma-separated)
--name-contains=<value> Filter by name substring
--page=<value> Page number to fetch
--page-size=<value> Number of results per page
--page-size=<value> [default: disable pagination, all results] Number of results per page
--sort=<value> Sort results by the provided field

GLOBAL FLAGS
Expand Down Expand Up @@ -852,14 +852,14 @@ List documents
```
USAGE
$ ppls documents list [--date-format <value>] [--header <value>...] [--hostname <value>] [--plain | --json |
--table] [--token <value>] [--page <value>] [--page-size <value>] [--id-in <value> | --name-contains <value>]
[--sort <value>]
--table] [--token <value>] [--id-in <value> | --name-contains <value>] [--page <value> --page-size <value>] [--sort
<value>]

FLAGS
--id-in=<value> Filter by id list (comma-separated)
--name-contains=<value> Filter by name substring
--page=<value> Page number to fetch
--page-size=<value> Number of results per page
--page-size=<value> [default: disable pagination, all results] Number of results per page
--sort=<value> Sort results by the provided field

GLOBAL FLAGS
Expand Down Expand Up @@ -1088,14 +1088,14 @@ List tags
```
USAGE
$ ppls tags list [--date-format <value>] [--header <value>...] [--hostname <value>] [--plain | --json |
--table] [--token <value>] [--page <value>] [--page-size <value>] [--id-in <value> | --name-contains <value>]
[--sort <value>]
--table] [--token <value>] [--id-in <value> | --name-contains <value>] [--page <value> --page-size <value>] [--sort
<value>]

FLAGS
--id-in=<value> Filter by id list (comma-separated)
--name-contains=<value> Filter by name substring
--page=<value> Page number to fetch
--page-size=<value> Number of results per page
--page-size=<value> [default: disable pagination, all results] Number of results per page
--sort=<value> Sort results by the provided field

GLOBAL FLAGS
Expand Down
58 changes: 44 additions & 14 deletions src/list-command.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@ import {Flags} from '@oclif/core'

import type {ApiFlags} from './base-command.js'

import {BaseCommand} from './base-command.js'
import {createValueFormatter, type TableColumn, type TableRow} from './helpers/table.js'
import {PaginatedCommand} from './paginated-command.js'

type ListCommandFlags = ApiFlags & {
'id-in'?: string
'name-contains'?: string
page?: number
'page-size'?: number
'page-size': number
sort?: string
}

Expand All @@ -21,12 +21,16 @@ type ListOutputFlags = ListCommandFlags & {

type TableColumnInput = string | TableColumn

type PaginatedResponse<T> = {
results?: T[]
}

export abstract class ListCommand<
TRaw extends TableRow = TableRow,
TOutput extends TableRow = TRaw,
> extends PaginatedCommand {
> extends BaseCommand {
static baseFlags = {
...PaginatedCommand.baseFlags,
...BaseCommand.baseFlags,
'id-in': Flags.string({
description: 'Filter by id list (comma-separated)',
exclusive: ['name-contains'],
Expand All @@ -35,6 +39,17 @@ export abstract class ListCommand<
description: 'Filter by name substring',
exclusive: ['id-in'],
}),
page: Flags.integer({
dependsOn: ['page-size'],
description: 'Page number to fetch',
min: 1,
}),
'page-size': Flags.integer({
default: async ({flags}) => (flags.page === undefined ? Number.MAX_SAFE_INTEGER : undefined),
defaultHelp: async () => 'disable pagination, all results',
description: 'Number of results per page',
min: 1,
}),
sort: Flags.string({description: 'Sort results by the provided field'}),
}
protected abstract listPath: string
Expand All @@ -46,20 +61,22 @@ export abstract class ListCommand<
path: string
}): Promise<T[]> {
const {flags, params = {}, path} = options
const url = this.buildPaginatedUrlFromFlags({
const url = this.buildListUrl({
flags,
params: {
ordering: flags.sort,
...params,
},
path,
})
const spinner = this.startSpinner(`Fetching ${url.pathname}`)

return this.fetchPaginatedResultsFromFlags<T>({
autoPaginate: this.shouldAutoPaginate(flags),
flags,
url,
})
try {
const payload = await this.fetchJson<PaginatedResponse<T>>(url, flags.token, flags.headers)
return payload.results ?? []
} finally {
spinner?.stop()
}
}

protected listParams(flags: ListCommandFlags): Record<string, number | string | undefined> {
Expand Down Expand Up @@ -102,6 +119,7 @@ export abstract class ListCommand<
public async run(): Promise<TOutput[]> {
const {flags, metadata} = await this.parse()
const {dateFormat, ...apiFlags} = await this.resolveGlobalFlags(flags, metadata)

const listFlags: ListCommandFlags = {
headers: apiFlags.headers,
hostname: apiFlags.hostname,
Expand Down Expand Up @@ -133,15 +151,27 @@ export abstract class ListCommand<
return results
}

protected shouldAutoPaginate(flags: ListCommandFlags): boolean {
return flags.page === undefined && flags['page-size'] === undefined
}

protected transformResult(result: TRaw): TOutput {
return result as unknown as TOutput
}

protected transformResults(results: TRaw[]): TOutput[] {
return results.map((result) => this.transformResult(result))
}

private buildListUrl(options: {
flags: ListCommandFlags
params?: Record<string, number | string | undefined>
path: string
}): URL {
const {flags, params = {}, path} = options
const {page} = flags
const pageSize = flags['page-size']

return this.buildApiUrl(flags.hostname, path, {
...params,
page,
'page_size': pageSize,
})
}
}
166 changes: 0 additions & 166 deletions src/paginated-command.ts

This file was deleted.

Loading