Skip to content

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

Package listing

@kody/supabase

src/list-organizations.ts

65 lines · 1.9 KB · TypeScript
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,
	})
}