import { planetscaleRequest } from './client.ts'
import { mapAnomaly } from './models.ts'
import type { PlanetscaleAnomalySummary, PlanetscaleAuthInput, PlanetscalePageInfo } from './types.ts'
import { clampInt, compactRecord, optionalString, requireRecord, requireString } from './types.ts'
export type ListAnomaliesInput = PlanetscaleAuthInput & {
organization: string
database: string
branch: string
period?: string
from?: string
to?: string
page?: number
perPage?: number
}
export type ListAnomaliesResult = {
items: Array<PlanetscaleAnomalySummary>
pageInfo: PlanetscalePageInfo
}
/**
* List Insights anomalies on a branch.
* @example
* import listAnomalies from 'kody:@kody/planetscale/list-anomalies'
* const { items } = await listAnomalies({
* organization: 'acme',
* database: 'app',
* branch: 'main',
* period: '1d',
* })
*/
export async function listAnomalies(input: ListAnomaliesInput): Promise<ListAnomaliesResult> {
const organization = requireString(input.organization, 'organization')
const database = requireString(input.database, 'database')
const branch = requireString(input.branch, 'branch')
const result = await planetscaleRequest<Array<unknown>>({
...input,
operation: 'insights.read',
path: `/organizations/${encodeURIComponent(organization)}/databases/${encodeURIComponent(database)}/branches/${encodeURIComponent(branch)}/insights/anomalies`,
query: compactRecord({
period: optionalString(input.period, 'period'),
from: optionalString(input.from, 'from'),
to: optionalString(input.to, 'to'),
page: clampInt(input.page, 1, 100, 1, 'page'),
per_page: clampInt(input.perPage, 1, 100, 25),
}),
})
return {
items: (Array.isArray(result.data) ? result.data : []).map(mapAnomaly),
pageInfo: result.pageInfo,
}
}
export default async function listAnomaliesEntrypoint(
params: Partial<ListAnomaliesInput> & Record<string, unknown> = {},
) {
const input = requireRecord(params, 'list-anomalies')
return listAnomalies({
organization: requireString(input.organization, 'organization'),
database: requireString(input.database, 'database'),
branch: requireString(input.branch, 'branch'),
period: optionalString(input.period, 'period'),
from: optionalString(input.from, 'from'),
to: optionalString(input.to, 'to'),
page: input.page as number | undefined,
perPage: input.perPage as number | undefined,
account: optionalString(input.account, 'account'),
secretName: optionalString(input.secretName, 'secretName'),
})
}