Skip to content

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

Package listing

@kody/fly

src/scheduled-status.ts

58 lines · 1.7 KB · TypeScript
import machineCount from './machine-count.ts'
import { listOrganizations } from './organizations.ts'
import type { FlyAuthOptions } from './fly-core.ts'

export type ScheduledStatusInput = FlyAuthOptions & {
	organizationSlug?: string
	orgSlug?: string
}

/**
 * Read-only machine counts. With no params, uses the only org visible to the
 * token (the same contract the scheduled job uses). Never mutates Machines.
 *
 * @example
 * import status from 'kody:@kody/fly/scheduled-status'
 * const result = await status()
 */
export async function runMachineStatus(input: ScheduledStatusInput = {}) {
	const explicit = String(input.organizationSlug || input.orgSlug || '').trim()
	if (explicit) {
		const counted = await machineCount({ ...input, organizationSlug: explicit })
		return {
			ok: true,
			organizationSlug: explicit,
			count: counted.count,
			byState: counted.byState,
			byApp: counted.byApp,
		}
	}

	const listed = await listOrganizations({ ...input, first: 100 })
	const organizations = listed.organizations
	if (organizations.length === 0) {
		return { ok: true, organizationSlug: null, count: 0, byState: {}, byApp: {}, organizations: [] }
	}
	if (organizations.length > 1) {
		return {
			ok: true,
			skipped: true,
			reason: 'Multiple organizations visible; pass organizationSlug to count machines.',
			organizations: organizations.map((org: any) => ({ slug: org.slug, name: org.name })),
		}
	}

	const organizationSlug = organizations[0].slug
	const counted = await machineCount({ ...input, organizationSlug })
	return {
		ok: true,
		organizationSlug,
		count: counted.count,
		byState: counted.byState,
		byApp: counted.byApp,
	}
}

export default async function scheduledStatus(input: ScheduledStatusInput = {}) {
	return await runMachineStatus(input)
}