refactor(bucket-provisioner): own the physical bucket naming policy - #1779
Merged
Conversation
Contributor
🤖 Devin AI EngineerI'll be helping with this pull request! Here's what you should know: ✅ I will automatically:
Note: I can only respond to comments from users who have write access to this repository. ⚙️ Control Options:
|
|
Review complete. No issues found — approved ✅. This PR extracts the
Reviewed commit: 817c42c |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The physical-bucket naming policy —
{prefix}-{bucketKey}-{sha256(prefix/databaseId/bucketKey)}— lived privately insidegraphile-settings/src/presigned-url-resolver.ts. That made it unreachable for any bucket creator outside a customer's GraphQL request: notably thestorage:provision_bucketreconciler inconstructive-db, which currently has no way to name a tenant bucket and would otherwise invent one (a baredefaultshared by every tenant, stamped permanently ontophysical_name).This moves the policy, byte-for-byte unchanged, into
@constructive-io/bucket-provisioner— the package every creator already depends on — and exports it:graphile-settingskeeps the env reading (getBucketNamePrefix()→CDN_BUCKET_NAME, still throwing rather than defaulting) and both resolver factories; the shared package stays env-free and dependency-free (nodecryptoonly). No produced name changes — deliberately: the whole point is that existingphysical_namevalues remain valid and that the lazy first-upload path, the eagerprovisionBucketmutation, and the reconciler cannot disagree.Tests cover the properties the callers rely on: determinism, distinct names for the same key in different databases, distinct names for keys that agree only past the truncation budget, S3 legality (
/^[a-z0-9-]{3,63}$/, no edge hyphens), and the digest-only fallback when both readable components sanitize away. The existing caller-level assertion that the presigned resolver and the provisioner resolver agree still holds.Follow-up in
constructive-db: bump this package and have the reconciler mint through it instead of using the bucket key.Link to Devin session: https://app.devin.ai/sessions/967dd6f667004819ae392597f090a3cd
Requested by: @pyramation