Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New Supporter Revenue cookie lifecycle #13277

Merged
merged 10 commits into from
Feb 12, 2025
Merged

New Supporter Revenue cookie lifecycle #13277

merged 10 commits into from
Feb 12, 2025

Conversation

rupertbates
Copy link
Member

@rupertbates rupertbates commented Feb 4, 2025

What does this change?

This PR changes the way that DCR handles supporter-revenue cookies to be consistent with this document

Why?

As described in the document, this gives us greater control over the benefits received by users on DCR, particularly in the way they can be set from support.theguardian.com.

@rupertbates rupertbates force-pushed the user-benefits-cookies branch from 513b12d to effeacc Compare February 4, 2025 16:54
Copy link

github-actions bot commented Feb 4, 2025

Size Change: -1.47 kB (-0.16%)

Total Size: 899 kB

Filename Size Change
dotcom-rendering/dist/4793.client.web.********************.js 5.33 kB -155 B (-2.83%)
dotcom-rendering/dist/7546.client.web.********************.js 7.59 kB +177 B (+2.39%)
dotcom-rendering/dist/AdBlockAsk-importable.client.web.********************.js 3.02 kB +169 B (+5.93%) 🔍
dotcom-rendering/dist/SignInGateSelector-importable.client.web.********************.js 6.48 kB -2.04 kB (-23.96%) 🎉
dotcom-rendering/dist/StickyBottomBanner-importable.client.web.********************.js 4.03 kB -1.98 kB (-32.96%) 🎉
dotcom-rendering/dist/1845.client.web.********************.js 2.67 kB +2.67 kB (new file) 🆕
ℹ️ View Unchanged
Filename Size Change
dotcom-rendering/dist/1076.client.web.********************.js 3.41 kB 0 B
dotcom-rendering/dist/1101.client.web.********************.js 4.82 kB 0 B
dotcom-rendering/dist/1262.client.web.********************.js 4.49 kB 0 B
dotcom-rendering/dist/1401.client.web.********************.js 441 B 0 B
dotcom-rendering/dist/1427.client.web.********************.js 4.94 kB 0 B
dotcom-rendering/dist/1477.client.web.********************.js 3.4 kB 0 B
dotcom-rendering/dist/1714.client.web.********************.js 2.87 kB 0 B
dotcom-rendering/dist/2188.client.web.********************.js 6.52 kB 0 B
dotcom-rendering/dist/2444.client.web.********************.js 2.67 kB 0 B
dotcom-rendering/dist/2482.client.web.********************.js 44.8 kB 0 B
dotcom-rendering/dist/280.client.web.********************.js 531 B 0 B
dotcom-rendering/dist/2930.client.web.********************.js 14.3 kB 0 B
dotcom-rendering/dist/342.client.web.********************.js 4.18 kB 0 B
dotcom-rendering/dist/3524.client.web.********************.js 3.52 kB 0 B
dotcom-rendering/dist/3769.client.web.********************.js 22.7 kB 0 B
dotcom-rendering/dist/3789.client.web.********************.js 3.58 kB 0 B
dotcom-rendering/dist/39.client.web.********************.js 3.07 kB 0 B
dotcom-rendering/dist/3937.client.web.********************.js 3.88 kB 0 B
dotcom-rendering/dist/4170.client.web.********************.js 16.3 kB 0 B
dotcom-rendering/dist/4285.client.web.********************.js 5.86 kB 0 B
dotcom-rendering/dist/4501.client.web.********************.js 4.29 kB 0 B
dotcom-rendering/dist/4684.client.web.********************.js 3.17 kB 0 B
dotcom-rendering/dist/4878.client.web.********************.js 8.08 kB 0 B
dotcom-rendering/dist/4943.client.web.********************.js 3.69 kB 0 B
dotcom-rendering/dist/5095.client.web.********************.js 4.17 kB 0 B
dotcom-rendering/dist/5223.client.web.********************.js 3.27 kB 0 B
dotcom-rendering/dist/5598.client.web.********************.js 4.49 kB 0 B
dotcom-rendering/dist/5738.client.web.********************.js 13.6 kB 0 B
dotcom-rendering/dist/5748.client.web.********************.js 2.49 kB 0 B
dotcom-rendering/dist/6021.client.web.********************.js 11.3 kB 0 B
dotcom-rendering/dist/6061.client.web.********************.js 3.63 kB 0 B
dotcom-rendering/dist/6073.client.web.********************.js 3.53 kB 0 B
dotcom-rendering/dist/6110.client.web.********************.js 3.54 kB 0 B
dotcom-rendering/dist/6163.client.web.********************.js 3.83 kB 0 B
dotcom-rendering/dist/6577.client.web.********************.js 5.41 kB 0 B
dotcom-rendering/dist/6627.client.web.********************.js 10.3 kB 0 B
dotcom-rendering/dist/6876.client.web.********************.js 2.67 kB 0 B
dotcom-rendering/dist/6882.client.web.********************.js 13.1 kB 0 B
dotcom-rendering/dist/6903.client.web.********************.js 3.21 kB 0 B
dotcom-rendering/dist/6931.client.web.********************.js 2.65 kB 0 B
dotcom-rendering/dist/6940.client.web.********************.js 526 B 0 B
dotcom-rendering/dist/7116.client.web.********************.js 23 kB 0 B
dotcom-rendering/dist/7350.client.web.********************.js 3.32 kB 0 B
dotcom-rendering/dist/7364.client.web.********************.js 3.22 kB 0 B
dotcom-rendering/dist/7540.client.web.********************.js 2.72 kB 0 B
dotcom-rendering/dist/7544.client.web.********************.js 4.77 kB 0 B
dotcom-rendering/dist/7861.client.web.********************.js 619 B 0 B
dotcom-rendering/dist/8030.client.web.********************.js 4.21 kB 0 B
dotcom-rendering/dist/8067.client.web.********************.js 3.39 kB 0 B
dotcom-rendering/dist/8123.client.web.********************.js 20.4 kB 0 B
dotcom-rendering/dist/8209.client.web.********************.js 3.64 kB 0 B
dotcom-rendering/dist/839.client.web.********************.js 3.42 kB 0 B
dotcom-rendering/dist/8592.client.web.********************.js 157 B 0 B
dotcom-rendering/dist/9072.client.web.********************.js 2.61 kB 0 B
dotcom-rendering/dist/9242.client.web.********************.js 3.76 kB 0 B
dotcom-rendering/dist/9288.client.web.********************.js 2.51 kB 0 B
dotcom-rendering/dist/9558.client.web.********************.js 3.53 kB 0 B
dotcom-rendering/dist/9665.client.web.********************.js 4.05 kB 0 B
dotcom-rendering/dist/9735.client.web.********************.js 4.46 kB 0 B
dotcom-rendering/dist/9766.client.web.********************.js 3.4 kB 0 B
dotcom-rendering/dist/9790.client.web.********************.js 3.58 kB 0 B
dotcom-rendering/dist/9870.client.web.********************.js 2.86 kB 0 B
dotcom-rendering/dist/Accessibility-importable.client.web.********************.js 7 kB 0 B
dotcom-rendering/dist/AdPortals-importable.client.web.********************.js 4.85 kB 0 B
dotcom-rendering/dist/AlreadyVisited-importable.client.web.********************.js 424 B 0 B
dotcom-rendering/dist/AppsEpic-importable.client.web.********************.js 3.63 kB 0 B
dotcom-rendering/dist/AppsFooter-importable.client.web.********************.js 2.7 kB 0 B
dotcom-rendering/dist/AppsLightboxImage-importable.client.web.********************.js 2.66 kB 0 B
dotcom-rendering/dist/AppsLightboxImageStore-importable.client.web.********************.js 2.55 kB 0 B
dotcom-rendering/dist/AudioAtomWrapper-importable.client.web.********************.js 2.76 kB 0 B
dotcom-rendering/dist/AudioPlayerWrapper-importable.client.web.********************.js 6.5 kB 0 B
dotcom-rendering/dist/AustralianTerritorySwitcher-importable.client.web.********************.js 2 kB 0 B
dotcom-rendering/dist/Branding-importable.client.web.********************.js 2.88 kB 0 B
dotcom-rendering/dist/braze-web-sdk-core.client.web.********************.js 37.2 kB 0 B
dotcom-rendering/dist/BrazeMessaging-importable.client.web.********************.js 1.97 kB 0 B
dotcom-rendering/dist/CalloutBlockComponent-importable.client.web.********************.js 6.74 kB 0 B
dotcom-rendering/dist/CalloutEmbedBlockComponent-importable.client.web.********************.js 5.77 kB 0 B
dotcom-rendering/dist/CardCommentCount-importable.client.web.********************.js 2.66 kB 0 B
dotcom-rendering/dist/Carousel-importable.client.web.********************.js 7.82 kB 0 B
dotcom-rendering/dist/CarouselForNewsletters-importable.client.web.********************.js 5.17 kB 0 B
dotcom-rendering/dist/ChartAtom-importable.client.web.********************.js 538 B 0 B
dotcom-rendering/dist/CommentCount-importable.client.web.********************.js 2.29 kB 0 B
dotcom-rendering/dist/CrosswordComponent-importable.client.web.********************.js 1.03 kB 0 B
dotcom-rendering/dist/DiscussionApps-importable.client.web.********************.js 1.93 kB 0 B
dotcom-rendering/dist/DiscussionMeta-importable.client.web.********************.js 2.44 kB 0 B
dotcom-rendering/dist/DiscussionWeb-importable.client.web.********************.js 1.74 kB 0 B
dotcom-rendering/dist/DocumentBlockComponent-importable.client.web.********************.js 2.82 kB 0 B
dotcom-rendering/dist/Dropdown-importable.client.web.********************.js 1.72 kB 0 B
dotcom-rendering/dist/EditionSwitcherBanner-importable.client.web.********************.js 3.54 kB 0 B
dotcom-rendering/dist/EmbedBlockComponent-importable.client.web.********************.js 3.94 kB 0 B
dotcom-rendering/dist/EnhancePinnedPost-importable.client.web.********************.js 2.02 kB 0 B
dotcom-rendering/dist/FetchOnwardsData-importable.client.web.********************.js 1.94 kB 0 B
dotcom-rendering/dist/FilterKeyEventsToggle-importable.client.web.********************.js 3.8 kB 0 B
dotcom-rendering/dist/FocusStyles-importable.client.web.********************.js 617 B 0 B
dotcom-rendering/dist/FollowWrapper-importable.client.web.********************.js 2.52 kB 0 B
dotcom-rendering/dist/FootballMatchesPage-importable.client.web.********************.js 3.88 kB 0 B
dotcom-rendering/dist/FooterLabel-importable.client.web.********************.js 343 B 0 B
dotcom-rendering/dist/FooterReaderRevenueLinks-importable.client.web.********************.js 3.46 kB -38 B (-1.09%)
dotcom-rendering/dist/frameworks.client.web.********************.js 20.9 kB 0 B
dotcom-rendering/dist/FrontSubNav-importable.client.web.********************.js 7.43 kB 0 B
dotcom-rendering/dist/GetCricketScoreboard-importable.client.web.********************.js 6.28 kB 0 B
dotcom-rendering/dist/GetMatchNav-importable.client.web.********************.js 11.5 kB 0 B
dotcom-rendering/dist/GetMatchStats-importable.client.web.********************.js 7.99 kB 0 B
dotcom-rendering/dist/GetMatchTabs-importable.client.web.********************.js 2.58 kB 0 B
dotcom-rendering/dist/guardian-braze-components-banner.client.web.********************.js 15.8 kB 0 B
dotcom-rendering/dist/guardian-braze-components-end-of-article.client.web.********************.js 10.2 kB 0 B
dotcom-rendering/dist/GuideAtomWrapper-importable.client.web.********************.js 783 B 0 B
dotcom-rendering/dist/index.client.web.********************.js 45 kB -68 B (-0.15%)
dotcom-rendering/dist/InstagramBlockComponent-importable.client.web.********************.js 2.9 kB 0 B
dotcom-rendering/dist/InteractiveAtomMessenger-importable.client.web.********************.js 853 B 0 B
dotcom-rendering/dist/InteractiveBlockComponent-importable.client.web.********************.js 8.55 kB 0 B
dotcom-rendering/dist/InteractiveContentsBlockComponent-importable.client.web.********************.js 3.77 kB 0 B
dotcom-rendering/dist/KeyEventsCarousel-importable.client.web.********************.js 5.71 kB 0 B
dotcom-rendering/dist/KnowledgeQuizAtom-importable.client.web.********************.js 3.55 kB 0 B
dotcom-rendering/dist/LatestLinks-importable.client.web.********************.js 6.4 kB 0 B
dotcom-rendering/dist/LightboxHash-importable.client.web.********************.js 436 B 0 B
dotcom-rendering/dist/LightboxLayout-importable.client.web.********************.js 6.55 kB 0 B
dotcom-rendering/dist/LiveBlogEpic-importable.client.web.********************.js 3.62 kB -34 B (-0.93%)
dotcom-rendering/dist/LiveblogNotifications-importable.client.web.********************.js 4.82 kB 0 B
dotcom-rendering/dist/Liveness-importable.client.web.********************.js 4.72 kB 0 B
dotcom-rendering/dist/ManyNewsletterSignUp-importable.client.web.********************.js 7.64 kB 0 B
dotcom-rendering/dist/MapEmbedBlockComponent-importable.client.web.********************.js 5.96 kB 0 B
dotcom-rendering/dist/Metrics-importable.client.web.********************.js 2.69 kB 0 B
dotcom-rendering/dist/MostViewedFooter-importable.client.web.********************.js 3.85 kB 0 B
dotcom-rendering/dist/MostViewedFooterData-importable.client.web.********************.js 5.95 kB 0 B
dotcom-rendering/dist/MostViewedRightWithAd-importable.client.web.********************.js 5.12 kB 0 B
dotcom-rendering/dist/OnwardsUpper-importable.client.web.********************.js 5.34 kB 0 B
dotcom-rendering/dist/PersonalityQuizAtom-importable.client.web.********************.js 3.72 kB 0 B
dotcom-rendering/dist/ProfileAtom-importable.client.web.********************.js 543 B 0 B
dotcom-rendering/dist/ProfileAtomWrapper-importable.client.web.********************.js 802 B 0 B
dotcom-rendering/dist/PulsingDot-importable.client.web.********************.js 749 B 0 B
dotcom-rendering/dist/QandaAtom-importable.client.web.********************.js 543 B 0 B
dotcom-rendering/dist/ReaderRevenueDev-importable.client.web.********************.js 468 B 0 B
dotcom-rendering/dist/readerRevenueDevUtils.client.web.********************.js 1.69 kB -56 B (-3.2%)
dotcom-rendering/dist/RelativeTime-importable.client.web.********************.js 2.56 kB 0 B
dotcom-rendering/dist/RichLinkComponent-importable.client.web.********************.js 6.11 kB 0 B
dotcom-rendering/dist/ScrollableFeature-importable.client.web.********************.js 6.8 kB 0 B
dotcom-rendering/dist/ScrollableHighlights-importable.client.web.********************.js 6.48 kB 0 B
dotcom-rendering/dist/ScrollableMedium-importable.client.web.********************.js 4.18 kB 0 B
dotcom-rendering/dist/ScrollableSmall-importable.client.web.********************.js 4.16 kB 0 B
dotcom-rendering/dist/SecureSignup-importable.client.web.********************.js 4.1 kB 0 B
dotcom-rendering/dist/SendTargetingParams-importable.client.web.********************.js 2.22 kB 0 B
dotcom-rendering/dist/sentry.client.web.********************.js 794 B 0 B
dotcom-rendering/dist/SetABTests-importable.client.web.********************.js 3.92 kB 0 B
dotcom-rendering/dist/SetAdTargeting-importable.client.web.********************.js 485 B 0 B
dotcom-rendering/dist/ShareButton-importable.client.web.********************.js 919 B 0 B
dotcom-rendering/dist/shimport.client.web.********************.js 2.8 kB 0 B
dotcom-rendering/dist/ShowHideContainers-importable.client.web.********************.js 920 B 0 B
dotcom-rendering/dist/ShowMore-importable.client.web.********************.js 2.1 kB 0 B
dotcom-rendering/dist/SignInGateMain.client.web.********************.js 4.46 kB 0 B
dotcom-rendering/dist/SignInGateMainCheckoutComplete.client.web.********************.js 5.56 kB 0 B
dotcom-rendering/dist/SlideshowCarousel-importable.client.web.********************.js 4.38 kB 0 B
dotcom-rendering/dist/SlotBodyEnd-importable.client.web.********************.js 4.84 kB 0 B
dotcom-rendering/dist/SpotifyBlockComponent-importable.client.web.********************.js 5.78 kB 0 B
dotcom-rendering/dist/StickyLiveblogAskWrapper-importable.client.web.********************.js 4.92 kB -33 B (-0.67%)
dotcom-rendering/dist/SubNav-importable.client.web.********************.js 2.44 kB 0 B
dotcom-rendering/dist/TableOfContents-importable.client.web.********************.js 3.51 kB 0 B
dotcom-rendering/dist/TimelineAtom-importable.client.web.********************.js 1.23 kB 0 B
dotcom-rendering/dist/Titlepiece-importable.client.web.********************.js 13.6 kB 0 B
dotcom-rendering/dist/TopBar-importable.client.web.********************.js 9.31 kB -41 B (-0.44%)
dotcom-rendering/dist/TopBarSupport-importable.client.web.********************.js 2.55 kB -37 B (-1.43%)
dotcom-rendering/dist/TweetBlockComponent-importable.client.web.********************.js 1.13 kB 0 B
dotcom-rendering/dist/UnsafeEmbedBlockComponent-importable.client.web.********************.js 2.91 kB 0 B
dotcom-rendering/dist/VideoFacebookBlockComponent-importable.client.web.********************.js 5.97 kB 0 B
dotcom-rendering/dist/VineBlockComponent-importable.client.web.********************.js 2.78 kB 0 B
dotcom-rendering/dist/YoutubeBlockComponent-importable.client.web.********************.js 4.28 kB 0 B

compressed-size-action

@@ -0,0 +1,17 @@
import { getCookie } from '@guardian/libs';

export const USER_BENEFITS_EXPIRY_COOKIE = 'gu_user_features_expiry';
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm going to change the name of this cookie to gu_user_benefits_expiry at some point but I'm waiting for the go ahead from Transparency and Consent before doing that.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've got the go ahead from Emily for this change now.

if ((await isUserLoggedInOktaRefactor()) && featuresDataIsOld()) {
return requestNewData();
} else if ((await userHasDataAfterSignOut()) && !forcedAdFreeMode) {
deleteAllCookies();
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't explicitly delete any user benefits cookies now, we just let the expiry time remove them which will take a maximum of 24 hrs.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And to check my understanding -
if the user is signed in and the cookie has expired, then the client will refresh the cookie? And so there cannot be a period between expiry and the next refresh where the benefits are missing

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think there could be a gap, but if there is (if the benefits expiry cookie is not up to date) then we err on the side of giving benefits.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes correct, if the user is signed in and the cookies are missing or expired in the case of the expiry cookie then we grant the benefit. For example with the hide support messaging benefit :
Screenshot 2025-02-12 at 11 18 48

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And for ad-free:
Screenshot 2025-02-12 at 11 20 28

@rupertbates rupertbates force-pushed the user-benefits-cookies branch from 1a42fd9 to e542c62 Compare February 11, 2025 11:21
@rupertbates rupertbates marked this pull request as ready for review February 11, 2025 11:23
@rupertbates rupertbates requested review from a team as code owners February 11, 2025 11:23
Copy link

Hello 👋! When you're ready to run Chromatic, please apply the run_chromatic label to this PR.

You will need to reapply the label each time you want to run Chromatic.

Click here to see the Chromatic project.

@rupertbates rupertbates changed the title New cookie lifecycle New Supporter Revenue cookie lifecycle Feb 11, 2025
const expiresValue = timeInDaysFromNow(daysTillExpiry);
setCookie({
name: cookieName,
value: expiresValue.toString(),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Am I right in thinking the value is never used by DCR?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes that's right, we have to give it some value so I thought I'd put the expiry value in there even though we don't really use it. If you have a better suggestion though I'm open to changing it.

return tmpDate.getTime();
};

export const extendCookieExpiry = (
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This function works like an upsert right? I.e. it'll create if it doesn't already exist or update if it does. I wonder if there's a name which reflects that, just to make it really clear.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've changed this to createOrRenewCookie

@rupertbates rupertbates added the run_chromatic Runs chromatic when label is applied label Feb 12, 2025
@github-actions github-actions bot removed the run_chromatic Runs chromatic when label is applied label Feb 12, 2025
Copy link
Member

@tjmw tjmw left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good (with one minor question) 👍

describe('Refreshing the features data', () => {
const expectUserBenefitExpiryCookieHasBeenSetCorrectly = () => {
const expectedNextRefreshDate = new Date(
timeInDaysFromNow(1),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a danger here that the system clock could tick over to the next second between the cookie being set and running this assertion, resulting in flaky tests? Should we be freezing time in the tests?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This check just looks at the date though not the time, so I think it's ok?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah sorry yep you're right, how did I miss that?!

@rupertbates rupertbates added the run_chromatic Runs chromatic when label is applied label Feb 12, 2025
@github-actions github-actions bot removed the run_chromatic Runs chromatic when label is applied label Feb 12, 2025
@rupertbates rupertbates merged commit fff81bc into main Feb 12, 2025
31 checks passed
@rupertbates rupertbates deleted the user-benefits-cookies branch February 12, 2025 16:00
@prout-bot
Copy link

Seen on PROD (merged by @rupertbates 9 minutes and 46 seconds ago) Please check your changes!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants