import { managementAuth } from './setup.ts'
import { asLive, managementRequest } from './client.ts'
import {
isRecord,
optionalString,
requireString,
type SupabaseAuthInput,
} from './types.ts'
import type { ProjectSummary } from './list-projects.ts'
/**
* Get one Supabase project by ref.
* @example
* import getProject from 'kody:@kody/supabase/get-project'
* const project = await getProject({ ref: 'abcdefghijklmnop' })
*/
export async function getProject(
input: SupabaseAuthInput & { ref: string },
): Promise<ProjectSummary> {
const ref = requireString(input.ref, 'ref')
const live = asLive<{ data: unknown }>(
await managementRequest({
auth: managementAuth(input),
method: 'GET',
path: `/v1/projects/${encodeURIComponent(ref)}`,
}),
)
if (!isRecord(live.data)) {
throw new Error(`Project ${ref} response was not an object.`)
}
return {
id: optionalString(live.data.id, 'id') ?? ref,
ref: optionalString(live.data.ref, 'ref') ?? ref,
name: optionalString(live.data.name, 'name') ?? ref,
region: optionalString(live.data.region, 'region'),
status: optionalString(live.data.status, 'status'),
organizationId: optionalString(live.data.organization_id, 'organization_id'),
organizationSlug: optionalString(live.data.organization_slug, 'organization_slug'),
createdAt: optionalString(live.data.created_at, 'created_at'),
}
}
/**
* Get one Supabase project by ref.
* @example
* import getProject from 'kody:@kody/supabase/get-project'
* const project = await getProject({ ref: 'abcdefghijklmnop' })
*/
export default async function getProjectEntrypoint(
params: Partial<SupabaseAuthInput> & Record<string, unknown> = {},
) {
return await getProject({
account: optionalString(params.account, 'account'),
secretName: optionalString(params.secretName, 'secretName'),
patSecretName: optionalString(params.patSecretName, 'patSecretName'),
ref: requireString(params.ref ?? params.projectRef, 'ref'),
})
}