import pgMeta, { type SafeSqlFragment } from '@supabase/pg-meta' import { useQuery } from '@tanstack/react-query' import { z } from 'zod' import { databaseKeys } from '@/data/database/keys' import { executeSql } from '@/data/sql/execute-sql-query' import type { ResponseError, UseCustomQueryOptions } from '@/types' export type DatabaseFunctionsVariables = { projectRef?: string connectionString?: string | null } export type DatabaseFunction = z.infer export type SavedDatabaseFunction = Omit & { complete_statement: SafeSqlFragment } const pgMetaFunctionsList = pgMeta.functions.list() export async function getDatabaseFunctions( { projectRef, connectionString }: DatabaseFunctionsVariables, signal?: AbortSignal, headersInit?: HeadersInit ) { let headers = new Headers(headersInit) const { result } = await executeSql( { projectRef, connectionString, sql: pgMetaFunctionsList.sql, queryKey: ['database-functions'], }, signal, headers ) return result as SavedDatabaseFunction[] } export type DatabaseFunctionsData = Awaited> export type DatabaseFunctionsError = ResponseError export const useDatabaseFunctionsQuery = ( { projectRef, connectionString }: DatabaseFunctionsVariables, { enabled = true, ...options }: UseCustomQueryOptions = {} ) => useQuery({ queryKey: databaseKeys.databaseFunctions(projectRef), queryFn: ({ signal }) => getDatabaseFunctions({ projectRef, connectionString }, signal), enabled: enabled && typeof projectRef !== 'undefined', ...options, })