import { projectAuth } from './setup.ts'
import { asLive, projectRequest } from './client.ts'
import { isRecord, optionalString, type SupabaseAuthInput } from './types.ts'
export type BucketSummary = {
id: string
name: string
public?: boolean
createdAt?: string
updatedAt?: string
}
/**
* List Storage buckets (service role).
* @example
* import listBuckets from 'kody:@kody/supabase/list-buckets'
* const { items } = await listBuckets({ projectRef: 'abcdefghijklmnop' })
*/
export async function listBuckets(
input: SupabaseAuthInput,
): Promise<{ items: Array<BucketSummary>; count: number }> {
const live = asLive<{ data: unknown }>(
await projectRequest({
auth: projectAuth(input),
method: 'GET',
path: '/storage/v1/bucket',
}),
)
const rows = Array.isArray(live.data) ? live.data : []
const items = rows
.map((row) => {
if (!isRecord(row)) return null
const id = optionalString(row.id, 'id') ?? optionalString(row.name, 'name')
const name = optionalString(row.name, 'name') ?? id
if (!id || !name) return null
return {
id,
name,
public: row.public === true,
createdAt: optionalString(row.created_at, 'created_at'),
updatedAt: optionalString(row.updated_at, 'updated_at'),
}
})
.filter((item): item is BucketSummary => item !== null)
return { items, count: items.length }
}
/**
* List Storage buckets (service role).
* @example
* import listBuckets from 'kody:@kody/supabase/list-buckets'
* const result = await listBuckets({ projectRef: 'abcdefghijklmnop' })
*/
export default async function listBucketsEntrypoint(
params: Partial<SupabaseAuthInput> & Record<string, unknown> = {},
) {
return await listBuckets({
account: optionalString(params.account, 'account'),
secretName: optionalString(params.secretName, 'secretName'),
serviceRoleSecretName: optionalString(
params.serviceRoleSecretName,
'serviceRoleSecretName',
),
projectRef: optionalString(params.projectRef, 'projectRef'),
projectUrl: optionalString(params.projectUrl, 'projectUrl'),
})
}