Skip to content

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

Package listing

@kody/supabase

src/delete-user.ts

56 lines · 2.1 KB · TypeScript
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'),
	})
}