Skip to content

Commit d08f4c6

Browse files
authored
refactor(studio): remove unnecessary buckets query (supabase#41211)
Remove unnecessary unpaginated buckets query from bucket delete modal.
1 parent f23f8d8 commit d08f4c6

2 files changed

Lines changed: 14 additions & 23 deletions

File tree

apps/studio/components/interfaces/Storage/DeleteBucketModal.tsx

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { get as _get, find } from 'lodash'
21
import { useRouter } from 'next/router'
32
import { toast } from 'sonner'
43

@@ -7,9 +6,9 @@ import { TextConfirmModal } from 'components/ui/TextConfirmModalWrapper'
76
import { useDatabasePoliciesQuery } from 'data/database-policies/database-policies-query'
87
import { useDatabasePolicyDeleteMutation } from 'data/database-policies/database-policy-delete-mutation'
98
import { useBucketDeleteMutation } from 'data/storage/bucket-delete-mutation'
10-
import { Bucket, useBucketsQuery } from 'data/storage/buckets-query'
9+
import { Bucket } from 'data/storage/buckets-query'
1110
import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject'
12-
import { formatPoliciesForStorage } from './Storage.utils'
11+
import { extractBucketNameFromDefinition } from './Storage.utils'
1312

1413
export interface DeleteBucketModalProps {
1514
visible: boolean
@@ -22,9 +21,6 @@ export const DeleteBucketModal = ({ visible, bucket, onClose }: DeleteBucketModa
2221
const { ref: projectRef, bucketId } = useParams()
2322
const { data: project } = useSelectedProjectQuery()
2423

25-
const { data } = useBucketsQuery({ projectRef })
26-
const buckets = data ?? []
27-
2824
const { data: policies } = useDatabasePoliciesQuery({
2925
projectRef: project?.ref,
3026
connectionString: project?.connectionString,
@@ -39,20 +35,16 @@ export const DeleteBucketModal = ({ visible, bucket, onClose }: DeleteBucketModa
3935
if (!project) return console.error('Project is required')
4036

4137
// Clean up policies from the corresponding bucket that was deleted
42-
const storageObjectsPolicies = (policies ?? []).filter((policy) => policy.table === 'objects')
43-
const formattedStorageObjectPolicies = formatPoliciesForStorage(
44-
buckets,
45-
storageObjectsPolicies
46-
)
47-
const bucketPolicies = _get(
48-
find(formattedStorageObjectPolicies, { name: bucket.id }),
49-
['policies'],
50-
[]
51-
)
38+
const bucketPolicies = (policies ?? []).filter((policy) => {
39+
if (policy.table !== 'objects') return false
40+
41+
const policyBucket = extractBucketNameFromDefinition(policy.definition ?? policy.check)
42+
return policyBucket === bucket.name
43+
})
5244

5345
try {
5446
await Promise.all(
55-
bucketPolicies.map((policy: any) =>
47+
bucketPolicies.map((policy) =>
5648
deletePolicy({
5749
projectRef: project?.ref,
5850
connectionString: project?.connectionString,

apps/studio/components/interfaces/Storage/Storage.utils.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,7 @@ export const formatPoliciesForStorage = (buckets: Bucket[], policies: PostgresPo
4343
return policiesByBucket
4444
}
4545

46-
/* Start: Internal methods to support formatPoliciesForStorage but exported for tests to cover */
47-
const formatStoragePolicies = (buckets: any[], policies: any[]) => {
46+
const formatStoragePolicies = (buckets: Bucket[], policies: PostgresPolicy[]) => {
4847
const availableBuckets = buckets.map((bucket) => bucket.name)
4948
const formattedPolicies = policies.map((policy) => {
5049
const { definition: policyDefinition, check: policyCheck } = policy
@@ -69,23 +68,23 @@ const formatStoragePolicies = (buckets: any[], policies: any[]) => {
6968
return formattedPolicies
7069
}
7170

72-
const extractBucketNameFromDefinition = (definition: string) => {
71+
export const extractBucketNameFromDefinition = (definition: string | null) => {
72+
if (!definition) return null
73+
7374
const definitionSegments = definition?.split(' AND ') ?? []
7475
const [bucketDefinition] = definitionSegments.filter((segment: string) =>
7576
segment.includes('bucket_id')
7677
)
7778
return bucketDefinition ? bucketDefinition.split("'")[1] : null
7879
}
7980

80-
const groupPoliciesByBucket = (policies: any[]) => {
81+
const groupPoliciesByBucket = (policies: (PostgresPolicy & { bucket: string })[]) => {
8182
const policiesByBucket = groupBy(policies, 'bucket')
8283
return Object.keys(policiesByBucket).map((bucketName) => {
8384
return { name: bucketName, policies: policiesByBucket[bucketName] }
8485
})
8586
}
8687

87-
/* End: Internal methods to support formatPoliciesForStorage but exported for tests to cover */
88-
8988
export const createPayloadsForAddPolicy = (
9089
bucketName = '',
9190
policyFormFields: StoragePolicyFormField,

0 commit comments

Comments
 (0)