import { collectConnection, nodes, requestGraphql } from './core.ts'
import type { FlyOrganizationInput } from './types.ts'
/**
* List Fly organizations or resolve one by slug/id (defaults to `personal`).
*
* @param params.organizationSlug - Org slug to resolve (or `slug`).
* @param params.organizationId - Org id to resolve (or `id`).
* @param params.first - Page size when listing (1–100).
* @returns `{ organizations }` or `{ organization }` when a slug/id filter is passed.
*
* @example
* import organizations from 'kody:@kentcdodds/fly/organizations'
* const result = await organizations({ organizationSlug: 'personal' })
* // => { organization: { id, name, slug } }
*/
export default async function organizations(params: FlyOrganizationInput = {}) {
if (params.organizationId || params.organizationSlug || params.slug) {
return { organization: await getOrganization(params) }
}
return await listOrganizations(params)
}
export async function listOrganizations(params = {}) {
const first = Math.min(Math.max(Math.floor(Number(params.first) || 100), 1), 100)
const organizations = await collectConnection(async (after) => {
const data = await requestGraphql({
query: 'query($first: Int, $after: String) { organizations(first: $first, after: $after) { nodes { id name slug } pageInfo { hasNextPage endCursor } } }',
variables: { first, after },
})
return data.organizations
}, { maxPages: params.maxPages })
return { organizations }
}
export async function getOrganization(params = {}) {
const slug = String(params.organizationSlug || params.slug || 'personal').trim()
const id = String(params.organizationId || params.id || '').trim()
if (id) {
const data = await requestGraphql({
query: 'query($id: ID!) { organization(id: $id) { id name slug } }',
variables: { id },
})
return data.organization
}
const result = await listOrganizations({ first: 100 })
return result.organizations.find((organization) => organization.slug === slug || organization.name === slug) || null
}