- Ya
- 11 Agosti 2026, 00:29 UTC
- Mwandishi
- Kamo
- Ahadi ya
- 9775c73
Storage was measured across nineteen domains, nightly, with a build-failing coverage test — and nothing anywhere computed an allowance or refused a byte. The plan's storage figure was data nobody read, and the Additional Storage add-on had no product effect at all: paying changed nothing and not paying cost nothing. StorageQuotaService resolves what an organization may hold — the plan's per-user allowance pooled across its seats, plus the blocks it has bought — and ImageService refuses content that would exceed it. The check sits after the dedup lookup, so re-attaching a file the platform already holds is never refused for space; only genuinely new bytes count. It lives here rather than in BillingService because the services that write bytes cannot each call a billing API on their upload path, and it is injected by field rather than through the constructor because ImageService is assembled by hand in several places — a constructor argument is the one edit that compiles everywhere except the tests and then fails the image build. Two deliberate ways of being wrong. "GB" is read as a gibibyte, which is what a file manager means when it prints GB and the more generous reading. And an organization with no live subscription, or a service with no quota bean wired, stores exactly as before: this gate exists to hold a paying customer to what they bought, not to turn a billing gap into data loss. Reads are never gated — filling your storage stops you adding more, never takes away what you have.