chore: move role impersonation state into a context (#19510)

* chore: move role impersonation state into a context

* clean up ProjectContext.tsx imports

* move isRoleImpersonationEnabled to only relevant queries
This commit is contained in:
Alaister Young
2023-12-11 15:32:11 +10:00
committed by GitHub
parent aae63fb694
commit 9d8e8b068f
18 changed files with 176 additions and 46 deletions

View File

@@ -13,7 +13,6 @@ import {
ROLE_IMPERSONATION_NO_RESULTS,
ROLE_IMPERSONATION_SQL_LINE_COUNT,
} from 'lib/role-impersonation'
import { getRoleImpersonationStateSnapshot } from 'state/role-impersonation-state'
import { sqlKeys } from './keys'
export type Error = { code: number; message: string; requestId: string }
@@ -24,6 +23,7 @@ export type ExecuteSqlVariables = {
sql: string
queryKey?: QueryKey
handleError?: (error: { code: number; message: string; requestId: string }) => any
isRoleImpersonationEnabled?: boolean
}
export async function executeSql(
@@ -33,9 +33,15 @@ export async function executeSql(
sql,
queryKey,
handleError,
isRoleImpersonationEnabled = false,
}: Pick<
ExecuteSqlVariables,
'projectRef' | 'connectionString' | 'sql' | 'queryKey' | 'handleError'
| 'projectRef'
| 'connectionString'
| 'sql'
| 'queryKey'
| 'handleError'
| 'isRoleImpersonationEnabled'
>,
signal?: AbortSignal
) {
@@ -44,8 +50,6 @@ export async function executeSql(
let headers = new Headers()
if (connectionString) headers.set('x-connection-encrypted', connectionString)
const isRoleImpersonationEnabled = getRoleImpersonationStateSnapshot().role?.type === 'postgrest'
let { data, error } = await post('/platform/pg-meta/{ref}/query', {
signal,
params: {
@@ -107,13 +111,23 @@ export type ExecuteSqlData = Awaited<ReturnType<typeof executeSql>>
export type ExecuteSqlError = unknown
export const useExecuteSqlQuery = <TData = ExecuteSqlData>(
{ projectRef, connectionString, sql, queryKey, handleError }: ExecuteSqlVariables,
{
projectRef,
connectionString,
sql,
queryKey,
handleError,
isRoleImpersonationEnabled,
}: ExecuteSqlVariables,
{ enabled = true, ...options }: UseQueryOptions<ExecuteSqlData, ExecuteSqlError, TData> = {}
) =>
useQuery<ExecuteSqlData, ExecuteSqlError, TData>(
sqlKeys.query(projectRef, queryKey ?? [md5(sql)]),
({ signal }) =>
executeSql({ projectRef, connectionString, sql, queryKey, handleError }, signal),
executeSql(
{ projectRef, connectionString, sql, queryKey, handleError, isRoleImpersonationEnabled },
signal
),
{ enabled: enabled && typeof projectRef !== 'undefined', ...options }
)