import pgMeta from '@supabase/pg-meta' import { QueryClient, useQuery } from '@tanstack/react-query' import { z } from 'zod' import { databaseRoleKeys } from './keys' import { executeSql } from '@/data/sql/execute-sql-mutation' import { ResponseError, UseCustomQueryOptions } from '@/types' export type DatabaseRolesVariables = { projectRef?: string connectionString?: string | null } export type PgRole = z.infer const pgMetaRolesList = pgMeta.roles.list() export async function getDatabaseRoles( { projectRef, connectionString }: DatabaseRolesVariables, signal?: AbortSignal ) { const { result } = await executeSql( { projectRef, connectionString, sql: pgMetaRolesList.sql, queryKey: ['database-roles'] }, signal ) return result as PgRole[] } export type DatabaseRolesData = z.infer export type DatabaseRolesError = ResponseError export const useDatabaseRolesQuery = ( { projectRef, connectionString }: DatabaseRolesVariables, { enabled = true, ...options }: UseCustomQueryOptions = {} ) => useQuery({ queryKey: databaseRoleKeys.databaseRoles(projectRef), queryFn: ({ signal }) => getDatabaseRoles({ projectRef, connectionString }, signal), enabled: enabled && typeof projectRef !== 'undefined', ...options, }) export function invalidateRolesQuery(client: QueryClient, projectRef: string | undefined) { return client.invalidateQueries({ queryKey: databaseRoleKeys.databaseRoles(projectRef) }) }