Files
supabase/apps/studio/data/storage/iceberg-wrapper-create-mutation.ts
47e1134a1d feat: Vector buckets - initial work (#39597)
* Initial work on vector buckets.

* Add more queries and UI.

* chore(studio): vector buckets contents (#39705)

* language

* match analytics buckets

* shared empty state

* proper loading state

* create dialog cleanup

* simplify copywriting

* proper details

* filtering

* use real data

* chore(studio): vector buckets polish A (#39759)

* empty state

* better checks

* bucket name in sheet

* fix typo

* sheet improvements

* rename vector index to vector table

* cleanup

* More work on the vector indexes.

* Add delete for bucket and indexes. Create index should now work.

* chore(studio): vector buckets polish B (#39794)

* loading

* delete modal

* fix modal behaviour

* Add modal for deleting vector buckets.

* Bring back the shimmering loader.

* chore(studio): vector buckets polish C (#39887)

* fix bucketname on deletion dialog

* empty states

* remove extraneous padding

* proper loading and not-found cases

* Minor fixes.

* Minor updates to the vector components.

* Add more instructions to the cursor rules.

* Some refactors and shifting files around

* Refactor analytics buckets detial to improve time to fcp

* Fix

* Refactors + simplify

* Last few nits, just leaving comments

* If the bucket is not empty, delete all indexes first.

---------

Co-authored-by: Danny White <3104761+dnywh@users.noreply.github.com>
Co-authored-by: Joshen Lim <joshenlimek@gmail.com>
2025-11-04 15:25:46 +01:00

80 lines
3.0 KiB
TypeScript

import { PermissionAction } from '@supabase/shared-types/out/constants'
import { WRAPPERS } from 'components/interfaces/Integrations/Wrappers/Wrappers.constants'
import {
getAnalyticsBucketFDWName,
getAnalyticsBucketS3KeyName,
} from 'components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/AnalyticsBucketDetails.utils'
import {
getCatalogURI,
getConnectionURL,
} from 'components/interfaces/Storage/StorageSettings/StorageSettings.utils'
import { getKeys, useAPIKeysQuery } from 'data/api-keys/api-keys-query'
import { useProjectSettingsV2Query } from 'data/config/project-settings-v2-query'
import { FDWCreateVariables, useFDWCreateMutation } from 'data/fdw/fdw-create-mutation'
import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions'
import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject'
import { useS3AccessKeyCreateMutation } from './s3-access-key-create-mutation'
export const useIcebergWrapperCreateMutation = () => {
const { data: project } = useSelectedProjectQuery()
const { data: apiKeys } = useAPIKeysQuery({ projectRef: project?.ref, reveal: true })
const { secretKey, serviceKey } = getKeys(apiKeys)
const { data: settings } = useProjectSettingsV2Query({ projectRef: project?.ref })
const protocol = settings?.app_config?.protocol ?? 'https'
const endpoint = settings?.app_config?.storage_endpoint || settings?.app_config?.endpoint
const apiKey = secretKey?.api_key ?? serviceKey?.api_key ?? 'SUPABASE_CLIENT_API_KEY'
const wrapperMeta = WRAPPERS.find((wrapper) => wrapper.name === 'iceberg_wrapper')
const { can: canCreateCredentials } = useAsyncCheckPermissions(
PermissionAction.STORAGE_ADMIN_WRITE,
'*'
)
const { mutateAsync: createS3AccessKey, isLoading: isCreatingS3AccessKey } =
useS3AccessKeyCreateMutation()
const { mutateAsync: createFDW, isLoading: isCreatingFDW } = useFDWCreateMutation()
const mutateAsync = async ({ bucketName }: { bucketName: string }) => {
const createS3KeyData = await createS3AccessKey({
projectRef: project?.ref,
description: getAnalyticsBucketS3KeyName(bucketName),
})
const wrapperName = getAnalyticsBucketFDWName(bucketName)
const params: FDWCreateVariables = {
projectRef: project?.ref,
connectionString: project?.connectionString,
wrapperMeta: wrapperMeta!,
formState: {
wrapper_name: wrapperName,
server_name: `${wrapperName}_server`,
vault_aws_access_key_id: createS3KeyData?.access_key,
vault_aws_secret_access_key: createS3KeyData?.secret_key,
vault_token: apiKey,
warehouse: bucketName,
's3.endpoint': getConnectionURL(project?.ref ?? '', protocol, endpoint),
catalog_uri: getCatalogURI(project?.ref ?? '', protocol, endpoint),
},
mode: 'skip',
tables: [],
sourceSchema: '',
targetSchema: '',
}
await createFDW(params)
}
return {
mutateAsync,
isLoading: isCreatingFDW || isCreatingS3AccessKey,
hasPermission: canCreateCredentials,
}
}