Files
supabase/apps/studio/lib/api/self-hosted/query.ts
Zach Gorton 9bf15f9675 fix(mcp): postgres-meta parameters binding for list_tables (#40499)
* add params to executeQuery

* revert env change

* chore: upgrade "supabase" to v2.58.5

---------

Co-authored-by: Matt Rossman <22670878+mattrossman@users.noreply.github.com>
Co-authored-by: Ali Waseem <waseema393@gmail.com>
2025-11-18 16:01:03 +00:00

61 lines
1.7 KiB
TypeScript

import { PG_META_URL } from 'lib/constants/index'
import { constructHeaders } from '../apiHelpers'
import { PgMetaDatabaseError, databaseErrorSchema, WrappedResult } from './types'
import { assertSelfHosted, encryptString, getConnectionString } from './util'
export type QueryOptions = {
query: string
parameters?: unknown[]
readOnly?: boolean
headers?: HeadersInit
}
/**
* Executes a SQL query against the self-hosted Postgres instance via pg-meta service.
*
* _Only call this from server-side self-hosted code._
*/
export async function executeQuery<T = unknown>({
query,
parameters,
readOnly = false,
headers,
}: QueryOptions): Promise<WrappedResult<T[]>> {
assertSelfHosted()
const connectionString = getConnectionString({ readOnly })
const connectionStringEncrypted = encryptString(connectionString)
const requestBody: { query: string; parameters?: unknown[] } = { query }
if (parameters !== undefined) {
requestBody.parameters = parameters
}
const response = await fetch(`${PG_META_URL}/query`, {
method: 'POST',
headers: constructHeaders({
...headers,
'Content-Type': 'application/json',
'x-connection-encrypted': connectionStringEncrypted,
}),
body: JSON.stringify(requestBody),
})
try {
const result = await response.json()
if (!response.ok) {
const { message, code, formattedError } = databaseErrorSchema.parse(result)
const error = new PgMetaDatabaseError(message, code, response.status, formattedError)
return { data: undefined, error }
}
return { data: result, error: undefined }
} catch (error) {
if (error instanceof Error) {
return { data: undefined, error }
}
throw error
}
}