Files
supabase/apps/studio/data/storage/versioning/archived-object-version-delete-mutation.ts
T
Francesco SansalvadoreandClaude Sonnet 5 876bb8cf9e feat(storage): archived objects data layer (#49677)
## This PR

On a versioned bucket a file or a version can be "soft deleted/archived"
or "permanently deleted".

- `archived-objects-query.ts` — `ArchivedObject` /
`ArchivedObjectVersion` types + `archivedObjectsQueryOptions`
- `archived-object-restore-mutation.ts` — bring an archived object back
into the live tree
- `archived-object-purge-mutation.ts` — delete it and every version,
permanently
- `archived-object-version-delete-mutation.ts` — remove one retained
version
- `archivedOverlay.utils.ts` — synthesizes the explorer rows for one
folder from the archived list
- `archivedVersions.utils.ts` — an archived object's history as one
flat, newest-first list

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-12 09:57:39 +02:00

64 lines
2.0 KiB
TypeScript

import { useMutation, useQueryClient, type UseMutationOptions } from '@tanstack/react-query'
import { toast } from 'sonner'
import { storageKeys } from '../keys'
import { del, handleError } from '@/data/fetchers'
import type { ResponseError } from '@/types'
export type ArchivedObjectVersionDeleteVariables = {
projectRef: string
bucketId: string
archivedObjectId: string
path: string
versionId: string
/** Deleting the version live at archive time promotes the next one, or removes the object. */
wasCurrentAtArchive: boolean
}
async function deleteArchivedObjectVersion({
projectRef,
bucketId,
archivedObjectId,
path,
versionId,
}: ArchivedObjectVersionDeleteVariables) {
if (!projectRef) throw new Error('projectRef is required')
if (!bucketId) throw new Error('bucketId is required')
if (!archivedObjectId) throw new Error('archivedObjectId is required')
if (!path) throw new Error('path is required')
if (!versionId) throw new Error('versionId is required')
const { error } = await del('/platform/storage/{ref}/buckets/{id}/objects', {
params: { path: { ref: projectRef, id: bucketId } },
body: { paths: [{ path, versionId }] },
})
if (error) handleError(error)
}
export const useArchivedObjectVersionDeleteMutation = ({
onSuccess,
onError,
...options
}: Omit<
UseMutationOptions<void, ResponseError, ArchivedObjectVersionDeleteVariables>,
'mutationFn'
> = {}) => {
const queryClient = useQueryClient()
return useMutation<void, ResponseError, ArchivedObjectVersionDeleteVariables>({
mutationFn: deleteArchivedObjectVersion,
async onSuccess(data, variables, context) {
await queryClient.invalidateQueries({
queryKey: storageKeys.archivedObjects(variables.projectRef, variables.bucketId),
})
await onSuccess?.(data, variables, context)
},
async onError(error, variables, context) {
if (onError === undefined) toast.error(`Failed to delete version: ${error.message}`)
else onError(error, variables, context)
},
...options,
})
}