import { projectAuth } from './setup.ts'
import { assertMutationAllowed, readMutationFlags } from './safety.ts'
import { asLive, projectRequest } from './client.ts'
import { optionalBoolean, optionalString, requireString, type DryRunResult, type SupabaseAuthInput } from './types.ts'
/**
* Delete an Auth user. Requires `confirm: true`, or use `dryRun: true`.
* @example
* import deleteUser from 'kody:@kody/supabase/delete-user'
* const preview = await deleteUser({
* projectRef: 'abcdefghijklmnop',
* userId: '00000000-0000-0000-0000-000000000000',
* dryRun: true,
* })
*/
export async function deleteUser(
input: SupabaseAuthInput & { userId: string; dryRun?: boolean; confirm?: boolean },
) {
const userId = requireString(input.userId, 'userId')
const allowed = assertMutationAllowed(readMutationFlags(input), 'delete-user')
const path = `/auth/v1/admin/users/${encodeURIComponent(userId)}`
if (allowed.dryRun) {
const preview: DryRunResult = { dryRun: true, method: 'DELETE', path }
return preview
}
await projectRequest({
auth: projectAuth(input),
method: 'DELETE',
path,
})
return { deleted: true, userId }
}
/**
* Delete an Auth user. Requires `confirm: true`, or use `dryRun: true`.
* @example
* import deleteUser from 'kody:@kody/supabase/delete-user'
* const preview = await deleteUser({ projectRef: 'abcdefghijklmnop', userId: '00000000-0000-0000-0000-000000000000', dryRun: true })
*/
export default async function deleteUserEntrypoint(
params: Partial<SupabaseAuthInput> & Record<string, unknown> = {},
) {
return await deleteUser({
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'),
userId: requireString(params.userId ?? params.id, 'userId'),
dryRun: optionalBoolean(params.dryRun, 'dryRun'),
confirm: optionalBoolean(params.confirm, 'confirm'),
})
}