Skip to content
← Public packages

@kentcdodds/fly

Manage Fly.io apps, Machines, logs, and metrics.

src/organizations.ts

48 lines · 2.0 KB · TypeScript
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
}