import { managementAuth } from './setup.ts'
import { asLive, managementRequest } from './client.ts'
import {
clampInt,
isRecord,
optionalString,
type SupabaseAuthInput,
} from './types.ts'
export type OrganizationSummary = {
id: string
name: string
slug?: string
}
/**
* List Supabase organizations visible to the saved personal access token.
* @example
* import listOrganizations from 'kody:@kody/supabase/list-organizations'
* const { items } = await listOrganizations()
*/
export async function listOrganizations(
input: SupabaseAuthInput & { limit?: number } = {},
): Promise<{ items: Array<OrganizationSummary>; count: number }> {
const live = asLive<{ data: unknown }>(
await managementRequest({
auth: managementAuth(input),
method: 'GET',
path: '/v1/organizations',
}),
)
const rows = Array.isArray(live.data) ? live.data : []
const items = rows
.map((row) => {
if (!isRecord(row)) return null
const id = optionalString(row.id, 'id')
const name = optionalString(row.name, 'name')
if (!id || !name) return null
return {
id,
name,
slug: optionalString(row.slug, 'slug'),
}
})
.filter((item): item is OrganizationSummary => item !== null)
.slice(0, clampInt(input.limit, 1, 200, 50))
return { items, count: items.length }
}
/**
* List Supabase organizations visible to the saved personal access token.
* @example
* import listOrganizations from 'kody:@kody/supabase/list-organizations'
* const result = await listOrganizations()
*/
export default async function listOrganizationsEntrypoint(
params: SupabaseAuthInput & Record<string, unknown> = {},
) {
return await listOrganizations({
account: optionalString(params.account, 'account'),
secretName: optionalString(params.secretName, 'secretName'),
patSecretName: optionalString(params.patSecretName, 'patSecretName'),
limit: typeof params.limit === 'number' ? params.limit : undefined,
})
}