Skip to content

[pull] main from TryGhost:main#1083

Merged
pull[bot] merged 6 commits into
code:mainfrom
TryGhost:main
Apr 21, 2026
Merged

[pull] main from TryGhost:main#1083
pull[bot] merged 6 commits into
code:mainfrom
TryGhost:main

Conversation

@pull
Copy link
Copy Markdown

@pull pull Bot commented Apr 21, 2026

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

allouis and others added 6 commits April 21, 2026 08:58
ref https://linear.app/ghost/issue/HKG-1708

The redis cache adapter only has unit tests today, and they stub the
underlying cache layer completely - so they verify the implementation
but not the behavioural contract against a real Redis. We're planning
some changes to the redis cache and want full coverage of the current
behaviour locked in before we touch the implementation, so any
behavioural regression is caught immediately.

Wires redis as a CI service alongside mysql and adds a default
adapters.Redis block to the testing config so the suite reads the host
through the standard config layer.
no-issue

The cache adapter interface (@tryghost/adapter-base-cache) still requires
a keys() method, but enumerating every key in redis is an O(n) SCAN that
no production code path should rely on - the previous consumer was
settings-cache.getAll(), which calls keys() synchronously and treats the
result as an array. The redis impl was async, so any deployment that
wired Redis to the settings cache would already crash on
keys.forEach is not a function. The path is unreachable in practice but
worth tightening up.

The stub is sync (not async) so the throw surfaces directly to the same
sync caller pattern that exposed the original bug, instead of becoming
an unhandled rejection.

A future bump to @tryghost/adapter-base-cache that drops keys from
requiredFns will let us remove the stub entirely.
…gift subs

ref https://linear.app/ghost/issue/BER-3482

- previously, the synthetic subscription constructed for non-Stripe subscriptions (comped, gift)
  always used the "Complimentary" nickname
- now, it returns the nickname "Gift subscription" for gifts
  so Admin can render them distinctly
- also uses the product's currency instead of hardcoding USD on the synthetic
  plan/price payload
ref https://linear.app/ghost/issue/BER-3482

- surfaces gift subscriptions on the member detail view using the new
  "Gift subscription" nickname returned by the API
- renders "Gift subscription - Expires {date}" for gift subscriptions
- hides the action menu for gift subs since they can't be edited or
  cancelled from Admin
no ref

Updated the gift purchase confirmation page to show gift short URL
(`/gift/<token>`) instead of the longer redemption URL
(`/#/portal/gift/redeem/<token>`)
…7460)

closes https://linear.app/ghost/issue/BER-3476

- when a new member redeemed a gift subscription, they were briefly
created with status 'free' and only flipped to 'gift' by the subsequent
redeem call, which triggered the "new free signup" staff notification -
now fixed
- they would also receive the free member welcome email - now fixed
- wrapped member creation and gift redemption in a transaction to ensure
atomicity
@pull pull Bot locked and limited conversation to collaborators Apr 21, 2026
@pull pull Bot added the ⤵️ pull label Apr 21, 2026
@pull pull Bot merged commit b2f88c2 into code:main Apr 21, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants