Skip to content

Built for people who want to own their automations. Join the waitlist for an invite.

Package listing

@kody/planetscale

src/list-queries.ts

77 lines · 2.7 KB · TypeScript
import { planetscaleRequest } from './client.ts'
import { mapQuery } from './models.ts'
import type { PlanetscaleAuthInput, PlanetscalePageInfo, PlanetscaleQuerySummary } from './types.ts'
import { clampInt, compactRecord, optionalString, requireRecord, requireString } from './types.ts'

export type ListQueriesInput = PlanetscaleAuthInput & {
	organization: string
	database: string
	branch: string
	period?: string
	from?: string
	to?: string
	q?: string
	sort?: string
	page?: number
	perPage?: number
}

export type ListQueriesResult = {
	items: Array<PlanetscaleQuerySummary>
	pageInfo: PlanetscalePageInfo
}

/**
 * List Insights query fingerprints on a branch. Default sort is p99 latency.
 * @example
 * import listQueries from 'kody:@kody/planetscale/list-queries'
 * const { items } = await listQueries({
 *   organization: 'acme',
 *   database: 'app',
 *   branch: 'main',
 *   sort: 'p99_latency',
 * })
 */
export async function listQueries(input: ListQueriesInput): Promise<ListQueriesResult> {
	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`,
		query: compactRecord({
			period: optionalString(input.period, 'period'),
			from: optionalString(input.from, 'from'),
			to: optionalString(input.to, 'to'),
			q: optionalString(input.q, 'q'),
			sort: optionalString(input.sort, 'sort') ?? 'p99_latency',
			page: clampInt(input.page, 1, 100, 1, 'page'),
			per_page: clampInt(input.perPage, 1, 100, 10),
		}),
	})
	return {
		items: (Array.isArray(result.data) ? result.data : []).map(mapQuery),
		pageInfo: result.pageInfo,
	}
}

export default async function listQueriesEntrypoint(
	params: Partial<ListQueriesInput> & Record<string, unknown> = {},
) {
	const input = requireRecord(params, 'list-queries')
	return listQueries({
		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'),
		q: optionalString(input.q, 'q'),
		sort: optionalString(input.sort, 'sort'),
		page: input.page as number | undefined,
		perPage: input.perPage as number | undefined,
		account: optionalString(input.account, 'account'),
		secretName: optionalString(input.secretName, 'secretName'),
	})
}