Skip to content

feat(storage): add purgeCache to invalidate CDN cache for a single object#1607

Merged
spydon merged 2 commits into
mainfrom
worktree-sdk-1331
Jul 17, 2026
Merged

feat(storage): add purgeCache to invalidate CDN cache for a single object#1607
spydon merged 2 commits into
mainfrom
worktree-sdk-1331

Conversation

@spydon

@spydon spydon commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Summary

Adds StorageFileApi.purgeCache(path, {transformations}) to invalidate the CDN cache for a single object in a bucket. Issues DELETE /cdn/{bucket}/{path} against the storage base URL and returns the server's success message. When transformations is true, only the resized/formatted variants are purged, leaving the original cached object intact; otherwise the object cache is purged.

Requires the service-role key and the tenant purgeCache feature enabled on the storage server.

Outcome: implemented

Reference: supabase-js PR #2429 (storage.file_buckets.purge_cache)

Compliance matrix

  • storage.file_buckets.purge_cacheimplemented (symbol StorageFileApi.purgeCache)

Tests

Added unit tests in packages/storage_client/test/basic_test.dart covering the DELETE endpoint/URL and the transformations query parameter.

SDK-1331

@spydon
spydon requested a review from a team as a code owner July 16, 2026 16:10
@github-actions github-actions Bot added the storage This issue or pull request is related to storage label Jul 16, 2026
@coderabbitai

coderabbitai Bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 89127fa3-fc98-407e-b54e-7e30635d2605

📥 Commits

Reviewing files that changed from the base of the PR and between 3ad736b and 46eb0ab.

📒 Files selected for processing (3)
  • packages/storage_client/lib/src/storage_bucket_api.dart
  • packages/storage_client/test/basic_test.dart
  • sdk-compliance.yaml
🚧 Files skipped from review as they are similar to previous changes (1)
  • sdk-compliance.yaml

📝 Walkthrough

Summary by CodeRabbit

  • New Features
    • Added the ability to purge the CDN cache for individual storage files and entire buckets.
    • Supports optionally purging cached transformed versions of files.
    • Returns a confirmation message after each cache purge request completes.
  • Tests
    • Added coverage for file and bucket cache purge HTTP requests, including transformation-enabled query parameters.
  • Documentation
    • Updated the SDK capability matrix to include the new cache-purge capabilities.

Walkthrough

Adds StorageBucketApi.purgeBucketCache and StorageFileApi.purgeCache for purging CDN cache at bucket and object scope. Both methods issue HTTP DELETE requests, optionally include transformations=true, and return the response message. Tests cover both query modes and endpoints. The SDK compliance matrix marks both capabilities as implemented.

Sequence Diagram(s)

sequenceDiagram
  participant Caller
  participant StorageBucketApi
  participant StorageFileApi
  participant CDN
  Caller->>StorageBucketApi: purgeBucketCache(id, transformations)
  StorageBucketApi->>CDN: DELETE bucket CDN purge URL
  CDN-->>StorageBucketApi: response message
  StorageBucketApi-->>Caller: return message
  Caller->>StorageFileApi: purgeCache(path, transformations)
  StorageFileApi->>CDN: DELETE object CDN purge URL
  CDN-->>StorageFileApi: response message
  StorageFileApi-->>Caller: return message
Loading

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

…le bucket (#1608)

## Summary

Adds `StorageBucketApi.purgeBucketCache(id, {transformations})` to
invalidate the CDN cache for every object in a bucket. Issues `DELETE
/cdn/{bucket}` against the storage base URL and returns the server's
success message. When `transformations` is `true`, only the
resized/formatted variants are purged, leaving the original cached
objects intact; otherwise the bucket cache is purged.

Requires the service-role key and the tenant `purgeCache` feature
enabled on the storage server.

> Stacked on top of #1607 (`SDK-1331`, object-level purge). Base this PR
against `main` once #1607 merges.

**Outcome:** implemented

**Reference:** supabase-js PR
[#2429](supabase/supabase-js#2429)
(`storage.file_buckets.purge_bucket_cache`)

## Compliance matrix

- `storage.file_buckets.purge_bucket_cache` → `implemented` (symbol
`StorageBucketApi.purgeBucketCache`)

## Tests

Added unit tests in `packages/storage_client/test/basic_test.dart`
covering the DELETE endpoint/URL and the `transformations` query
parameter.

SDK-1332
@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Capability matrix drift detected

The following capabilities are marked implemented in flutter but have no registered symbols to verify:

  • auth.sign_in.sign_up (no symbols list — cannot confirm implementation exists)
  • auth.sign_in.sign_in_with_password (no symbols list — cannot confirm implementation exists)
  • auth.sign_in.sign_in_with_otp (no symbols list — cannot confirm implementation exists)
  • auth.sign_in.sign_in_with_id_token (no symbols list — cannot confirm implementation exists)
  • auth.sign_in.sign_in_with_sso (no symbols list — cannot confirm implementation exists)
  • auth.sign_in.sign_in_anonymously (no symbols list — cannot confirm implementation exists)
  • auth.sign_in.verify_otp (no symbols list — cannot confirm implementation exists)
  • auth.sign_in.exchange_code_for_session (no symbols list — cannot confirm implementation exists)
  • auth.sign_in.resend_confirmation (no symbols list — cannot confirm implementation exists)
  • auth.sign_in.reauthenticate (no symbols list — cannot confirm implementation exists)
  • auth.sign_in.reset_password (no symbols list — cannot confirm implementation exists)
  • auth.session.refresh_session (no symbols list — cannot confirm implementation exists)
  • auth.session.get_user (no symbols list — cannot confirm implementation exists)
  • auth.session.get_claims (no symbols list — cannot confirm implementation exists)
  • auth.session.sign_out (no symbols list — cannot confirm implementation exists)
  • auth.session.auto_refresh (no symbols list — cannot confirm implementation exists)
  • auth.session.subscribe_auth_events (no symbols list — cannot confirm implementation exists)
  • auth.identities.link_identity (no symbols list — cannot confirm implementation exists)
  • auth.identities.list_identities (no symbols list — cannot confirm implementation exists)
  • auth.identities.unlink_identity (no symbols list — cannot confirm implementation exists)
  • auth.mfa.enroll (no symbols list — cannot confirm implementation exists)
  • auth.mfa.challenge (no symbols list — cannot confirm implementation exists)
  • auth.mfa.verify (no symbols list — cannot confirm implementation exists)
  • auth.mfa.challenge_and_verify (no symbols list — cannot confirm implementation exists)
  • auth.mfa.unenroll (no symbols list — cannot confirm implementation exists)
  • auth.mfa.list_factors (no symbols list — cannot confirm implementation exists)
  • auth.mfa.get_authenticator_assurance_level (no symbols list — cannot confirm implementation exists)
  • auth.passkey.register_passkey (no symbols list — cannot confirm implementation exists)
  • auth.passkey.sign_in_with_passkey (no symbols list — cannot confirm implementation exists)
  • auth.admin.create_user (no symbols list — cannot confirm implementation exists)
  • auth.admin.get_user (no symbols list — cannot confirm implementation exists)
  • auth.admin.update_user (no symbols list — cannot confirm implementation exists)
  • auth.admin.delete_user (no symbols list — cannot confirm implementation exists)
  • auth.admin.invite_user (no symbols list — cannot confirm implementation exists)
  • auth.admin.generate_link (no symbols list — cannot confirm implementation exists)
  • auth.admin.sign_out (no symbols list — cannot confirm implementation exists)
  • auth.admin.list_mfa_factors (no symbols list — cannot confirm implementation exists)
  • auth.admin.delete_mfa_factor (no symbols list — cannot confirm implementation exists)
  • auth.oauth_admin.create_client (no symbols list — cannot confirm implementation exists)
  • auth.oauth_admin.get_client (no symbols list — cannot confirm implementation exists)
  • auth.oauth_admin.update_client (no symbols list — cannot confirm implementation exists)
  • auth.oauth_admin.delete_client (no symbols list — cannot confirm implementation exists)
  • auth.oauth_admin.list_clients (no symbols list — cannot confirm implementation exists)
  • auth.oauth_admin.regenerate_client_secret (no symbols list — cannot confirm implementation exists)
  • auth.passkey_admin.list_passkeys (no symbols list — cannot confirm implementation exists)
  • auth.passkey_admin.delete_passkey (no symbols list — cannot confirm implementation exists)
  • database.query.from_table (no symbols list — cannot confirm implementation exists)
  • database.query.select (no symbols list — cannot confirm implementation exists)
  • database.query.rpc (no symbols list — cannot confirm implementation exists)
  • database.query.schema_selection (no symbols list — cannot confirm implementation exists)
  • database.mutate.insert (no symbols list — cannot confirm implementation exists)
  • database.mutate.update (no symbols list — cannot confirm implementation exists)
  • database.mutate.upsert (no symbols list — cannot confirm implementation exists)
  • database.mutate.delete (no symbols list — cannot confirm implementation exists)
  • database.mutate.select_after_mutation (no symbols list — cannot confirm implementation exists)
  • database.using_filters.eq (no symbols list — cannot confirm implementation exists)
  • database.using_filters.neq (no symbols list — cannot confirm implementation exists)
  • database.using_filters.gt (no symbols list — cannot confirm implementation exists)
  • database.using_filters.gte (no symbols list — cannot confirm implementation exists)
  • database.using_filters.lt (no symbols list — cannot confirm implementation exists)
  • database.using_filters.lte (no symbols list — cannot confirm implementation exists)
  • database.using_filters.like (no symbols list — cannot confirm implementation exists)
  • database.using_filters.like_all (no symbols list — cannot confirm implementation exists)
  • database.using_filters.like_any (no symbols list — cannot confirm implementation exists)
  • database.using_filters.ilike (no symbols list — cannot confirm implementation exists)
  • database.using_filters.ilike_all (no symbols list — cannot confirm implementation exists)
  • database.using_filters.ilike_any (no symbols list — cannot confirm implementation exists)
  • database.using_filters.is (no symbols list — cannot confirm implementation exists)
  • database.using_filters.is_distinct (no symbols list — cannot confirm implementation exists)
  • database.using_filters.in (no symbols list — cannot confirm implementation exists)
  • database.using_filters.not_in (no symbols list — cannot confirm implementation exists)
  • database.using_filters.contains (no symbols list — cannot confirm implementation exists)
  • database.using_filters.contained_by (no symbols list — cannot confirm implementation exists)
  • database.using_filters.overlaps (no symbols list — cannot confirm implementation exists)
  • database.using_filters.match (no symbols list — cannot confirm implementation exists)
  • database.using_filters.not (no symbols list — cannot confirm implementation exists)
  • database.using_filters.or (no symbols list — cannot confirm implementation exists)
  • database.using_filters.range_gt (no symbols list — cannot confirm implementation exists)
  • database.using_filters.range_gte (no symbols list — cannot confirm implementation exists)
  • database.using_filters.range_lt (no symbols list — cannot confirm implementation exists)
  • database.using_filters.range_lte (no symbols list — cannot confirm implementation exists)
  • database.using_filters.range_adjacent (no symbols list — cannot confirm implementation exists)
  • database.using_filters.text_search (no symbols list — cannot confirm implementation exists)
  • database.using_filters.regex (no symbols list — cannot confirm implementation exists)
  • database.using_filters.regex_icase (no symbols list — cannot confirm implementation exists)
  • database.using_filters.raw (no symbols list — cannot confirm implementation exists)
  • database.using_modifiers.order (no symbols list — cannot confirm implementation exists)
  • database.using_modifiers.limit (no symbols list — cannot confirm implementation exists)
  • database.using_modifiers.range (no symbols list — cannot confirm implementation exists)
  • database.using_modifiers.single_row (no symbols list — cannot confirm implementation exists)
  • database.using_modifiers.maybe_single_row (no symbols list — cannot confirm implementation exists)
  • database.using_modifiers.max_affected_rows (no symbols list — cannot confirm implementation exists)
  • database.using_modifiers.format_csv (no symbols list — cannot confirm implementation exists)
  • database.using_modifiers.format_geojson (no symbols list — cannot confirm implementation exists)
  • database.using_modifiers.relationship_embed (no symbols list — cannot confirm implementation exists)
  • storage.file_buckets.access_bucket (no symbols list — cannot confirm implementation exists)
  • storage.file_buckets.upload (no symbols list — cannot confirm implementation exists)
  • storage.file_buckets.upload_with_metadata (no symbols list — cannot confirm implementation exists)
  • storage.file_buckets.upload_with_signed_url (no symbols list — cannot confirm implementation exists)
  • storage.file_buckets.update_file (no symbols list — cannot confirm implementation exists)
  • storage.file_buckets.download (no symbols list — cannot confirm implementation exists)
  • storage.file_buckets.download_with_transform (no symbols list — cannot confirm implementation exists)
  • storage.file_buckets.list_files (no symbols list — cannot confirm implementation exists)
  • storage.file_buckets.move (no symbols list — cannot confirm implementation exists)
  • storage.file_buckets.move_cross_bucket (no symbols list — cannot confirm implementation exists)
  • storage.file_buckets.copy (no symbols list — cannot confirm implementation exists)
  • storage.file_buckets.copy_cross_bucket (no symbols list — cannot confirm implementation exists)
  • storage.file_buckets.remove (no symbols list — cannot confirm implementation exists)
  • storage.file_buckets.create_signed_urls (no symbols list — cannot confirm implementation exists)
  • storage.file_buckets.create_signed_upload_url (no symbols list — cannot confirm implementation exists)
  • storage.file_buckets.get_public_url (no symbols list — cannot confirm implementation exists)
  • storage.file_buckets.url_cache_nonce (no symbols list — cannot confirm implementation exists)
  • storage.file_buckets.file_exists (no symbols list — cannot confirm implementation exists)
  • storage.file_buckets.file_info (no symbols list — cannot confirm implementation exists)
  • storage.file_buckets.create_file_bucket (no symbols list — cannot confirm implementation exists)
  • storage.file_buckets.get_bucket (no symbols list — cannot confirm implementation exists)
  • storage.file_buckets.update_bucket (no symbols list — cannot confirm implementation exists)
  • storage.file_buckets.delete_file_bucket (no symbols list — cannot confirm implementation exists)
  • storage.file_buckets.empty_bucket (no symbols list — cannot confirm implementation exists)
  • storage.vector_buckets.parallel_scan (no symbols list — cannot confirm implementation exists)
  • realtime.channel.subscribe (no symbols list — cannot confirm implementation exists)
  • realtime.channel.unsubscribe (no symbols list — cannot confirm implementation exists)
  • realtime.channel.send (no symbols list — cannot confirm implementation exists)
  • realtime.channel.broadcast_http (no symbols list — cannot confirm implementation exists)
  • realtime.client.channel (no symbols list — cannot confirm implementation exists)
  • realtime.client.connect (no symbols list — cannot confirm implementation exists)
  • realtime.client.connection_state (no symbols list — cannot confirm implementation exists)
  • realtime.client.get_channels (no symbols list — cannot confirm implementation exists)
  • realtime.client.remove_channel (no symbols list — cannot confirm implementation exists)
  • realtime.client.remove_all_channels (no symbols list — cannot confirm implementation exists)
  • realtime.client.set_auth_token (no symbols list — cannot confirm implementation exists)
  • realtime.subscriptions.broadcast (no symbols list — cannot confirm implementation exists)
  • realtime.subscriptions.subscribe_presence (no symbols list — cannot confirm implementation exists)
  • realtime.subscriptions.private_channel (no symbols list — cannot confirm implementation exists)
  • realtime.subscriptions.broadcast_self (no symbols list — cannot confirm implementation exists)
  • realtime.subscriptions.broadcast_ack (no symbols list — cannot confirm implementation exists)
  • realtime.subscriptions.broadcast_replay (no symbols list — cannot confirm implementation exists)
  • realtime.presence.track (no symbols list — cannot confirm implementation exists)
  • realtime.presence.untrack (no symbols list — cannot confirm implementation exists)
  • realtime.presence.presence_state (no symbols list — cannot confirm implementation exists)
  • realtime.presence.presence_key (no symbols list — cannot confirm implementation exists)
  • realtime.configuration.custom_websocket_transport (no symbols list — cannot confirm implementation exists)
  • realtime.configuration.reconnect_backoff (no symbols list — cannot confirm implementation exists)
  • realtime.configuration.heartbeat_interval (no symbols list — cannot confirm implementation exists)
  • realtime.configuration.access_token_callback (no symbols list — cannot confirm implementation exists)
  • realtime.configuration.custom_logger (no symbols list — cannot confirm implementation exists)
  • realtime.configuration.binary_protocol (no symbols list — cannot confirm implementation exists)
  • functions.invocation.set_auth_token (no symbols list — cannot confirm implementation exists)
  • functions.invocation.method_override (no symbols list — cannot confirm implementation exists)
  • functions.invocation.streaming_response (no symbols list — cannot confirm implementation exists)
  • functions.invocation.region_selection (no symbols list — cannot confirm implementation exists)
  • client.authentication_integration.third_party_auth (no symbols list — cannot confirm implementation exists)
  • client.authentication_integration.cross_client_token_sync (no symbols list — cannot confirm implementation exists)
  • client.authentication_integration.oauth_flow_type (no symbols list — cannot confirm implementation exists)
  • client.session_management.custom_storage (no symbols list — cannot confirm implementation exists)
  • client.request_configuration.custom_http_client (no symbols list — cannot confirm implementation exists)
  • client.request_configuration.global_headers (no symbols list — cannot confirm implementation exists)

These may have been renamed, removed, or never registered. Please update the capability matrix.
See: https://github.com/supabase/sdk/blob/main/docs/capability-matrix.md

@spydon
spydon merged commit 4acd0a0 into main Jul 17, 2026
32 checks passed
@spydon
spydon deleted the worktree-sdk-1331 branch July 17, 2026 11:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

storage This issue or pull request is related to storage

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants