import { listApps } from './apps.ts'
import { listMachines } from './machines.ts'
import type { FlyAppMachinesInput } from './types.ts'
/**
* List machines for one Fly app resolved by `appName` or `appId`.
* @param params.appName - Fly app name when `appId` is omitted.
* @returns Matched app metadata plus machine list for that app.
* @example
* import appMachines from 'kody:@kody/fly/app-machines'
* const result = await appMachines({ appName: 'my-app' })
* // => { app: { id, name }, count: 2, machines: [...] }
*/
export default async function appMachines(params: FlyAppMachinesInput = {}) {
const appName = String(params.appName || params.app || '').trim()
if (!appName && !params.appId) throw new Error('appName or appId is required.')
let resolvedName = appName
let app: any = null
if (!resolvedName && params.appId) {
const apps = await listApps(params)
app = apps.apps.find((candidate: any) => candidate.id === params.appId)
if (!app) throw new Error('Could not find Fly app id: ' + params.appId)
resolvedName = app.name
} else if (resolvedName) {
try {
const apps = await listApps(params)
app = apps.apps.find(
(candidate: any) => candidate.name === resolvedName || candidate.id === resolvedName,
)
if (app) resolvedName = app.name
} catch {
app = { id: params.appId || null, name: resolvedName }
}
}
const machines = await listMachines({ ...params, appName: resolvedName, appId: undefined })
return {
app: app || { id: params.appId || null, name: resolvedName },
...machines,
}
}