Skip to content

Commit 61f67d9

Browse files
committed
feat(scripts): remove subscriptions check from inactive deletions
Because: - we want SubPlat to exclude account in the same fashion as other RPs, by providing a list - checking for a record in the `accountCustomers` table was not the correct way of checking for an active Stripe subscription This commit: - remove the subscription part of the active status check in the scripts
1 parent 05e05f4 commit 61f67d9

4 files changed

Lines changed: 4 additions & 130 deletions

File tree

packages/fxa-auth-server/scripts/delete-inactive-accounts/enqueue-inactive-account-deletions.ts

Lines changed: 1 addition & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -46,22 +46,15 @@ import {
4646
} from '@fxa/shared/cloud-tasks';
4747

4848
import { collect, parseBooleanArg } from '../lib/args';
49-
import { AppConfig, AuthFirestore, AuthLogger } from '../../lib/types';
49+
import { AppConfig, AuthLogger } from '../../lib/types';
5050
import appConfig from '../../config';
5151
import initLog from '../../lib/log';
5252
import initRedis from '../../lib/redis';
5353
import { gleanMetrics } from '../../lib/metrics/glean';
5454
import Token from '../../lib/tokens';
5555
import * as random from '../../lib/crypto/random';
5656
import { createDB } from '../../lib/db';
57-
import { setupFirestore } from '../../lib/firestore-db';
58-
import { CurrencyHelper } from '../../lib/payments/currencies';
59-
import { createStripeHelper, StripeHelper } from '../../lib/payments/stripe';
6057
import oauthDb from '../../lib/oauth/db';
61-
import { PlayBilling } from '../../lib/payments/iap/google-play';
62-
import { PlaySubscriptions } from '../../lib/payments/iap/google-play/subscriptions';
63-
import { AppleIAP } from '../../lib/payments/iap/apple-app-store/apple-iap';
64-
import { AppStoreSubscriptions } from '../../lib/payments/iap/apple-app-store/subscriptions';
6558

6659
import {
6760
accountWhereAndOrderByQueryBuilder,
@@ -261,17 +254,6 @@ const init = async () => {
261254
Container.set(AppConfig, config);
262255
Container.set(AuthLogger, log);
263256

264-
const authFirestore = setupFirestore(config);
265-
Container.set(AuthFirestore, authFirestore);
266-
const currencyHelper = new CurrencyHelper(config);
267-
Container.set(CurrencyHelper, currencyHelper);
268-
const stripeHelper = createStripeHelper(log, config, statsd);
269-
Container.set(StripeHelper, stripeHelper);
270-
const playBilling = Container.get(PlayBilling);
271-
const playSubscriptions = Container.get(PlaySubscriptions);
272-
const appleIap = Container.get(AppleIAP);
273-
const appStoreSubscriptions = Container.get(AppStoreSubscriptions);
274-
275257
// /dependencies }}}
276258

277259
const emitStatsdMetrics =
@@ -422,34 +404,10 @@ const init = async () => {
422404
'accounts.inactive.access-token-check'
423405
);
424406

425-
const iapSubUids = new Set<string>();
426-
const playSubscriptionsCollection = await playBilling.purchaseDbRef().get();
427-
const appleSubscriptionsCollection = await appleIap.purchasesDbRef().get();
428-
((collections) => {
429-
for (const c of collections) {
430-
for (const purchaseRecordSnapshot of c.docs) {
431-
const x = purchaseRecordSnapshot.data();
432-
if (x.userId) {
433-
iapSubUids.add(x.userId);
434-
}
435-
}
436-
}
437-
})([playSubscriptionsCollection, appleSubscriptionsCollection]);
438-
439-
const _hasIapSubscription = async (uid: string) =>
440-
iapSubUids.has(uid) &&
441-
((await playSubscriptions.getSubscriptions(uid)).length > 0 ||
442-
(await appStoreSubscriptions.getSubscriptions(uid)).length > 0);
443-
const hasIapSubscription = emitStatsdMetrics(
444-
_hasIapSubscription,
445-
'accounts.inactive.iap-subscription-check'
446-
);
447-
448407
const _isActive = new IsActiveFnBuilder()
449408
.setActiveSessionTokenFn(checkActiveSessionToken)
450409
.setRefreshTokenFn(checkRefreshToken)
451410
.setAccessTokenFn(checkAccessToken)
452-
.setIapSubscriptionFn(hasIapSubscription)
453411
.build();
454412

455413
const isActive = emitStatsdMetrics(

packages/fxa-auth-server/scripts/delete-inactive-accounts/get-inactive-account-uids.ts

Lines changed: 1 addition & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -16,26 +16,18 @@ import os from 'os';
1616
import { performance } from 'perf_hooks';
1717

1818
import { Command } from 'commander';
19-
import { StatsD } from 'hot-shots';
2019
import { Container } from 'typedi';
2120
import PQueue from 'p-queue-compat';
2221

2322
import { parseBooleanArg } from '../lib/args';
24-
import { AppConfig, AuthFirestore, AuthLogger } from '../../lib/types';
23+
import { AppConfig, AuthLogger } from '../../lib/types';
2524
import appConfig from '../../config';
2625
import initLog from '../../lib/log';
2726
import initRedis from '../../lib/redis';
2827
import Token from '../../lib/tokens';
2928
import * as random from '../../lib/crypto/random';
3029
import { createDB } from '../../lib/db';
31-
import { setupFirestore } from '../../lib/firestore-db';
32-
import { CurrencyHelper } from '../../lib/payments/currencies';
33-
import { createStripeHelper, StripeHelper } from '../../lib/payments/stripe';
3430
import oauthDb from '../../lib/oauth/db';
35-
import { PlayBilling } from '../../lib/payments/iap/google-play';
36-
import { PlaySubscriptions } from '../../lib/payments/iap/google-play/subscriptions';
37-
import { AppleIAP } from '../../lib/payments/iap/apple-app-store/apple-iap';
38-
import { AppStoreSubscriptions } from '../../lib/payments/iap/apple-app-store/subscriptions';
3931

4032
import {
4133
accountWhereAndOrderByQueryBuilder,
@@ -135,7 +127,6 @@ const init = async () => {
135127
const log = initLog({
136128
...config.log,
137129
});
138-
const statsd = new StatsD({ ...config.statsd });
139130
const redis = initRedis(
140131
{ ...config.redis, ...config.redis.sessionTokens },
141132
log
@@ -151,17 +142,6 @@ const init = async () => {
151142
Container.set(AppConfig, config);
152143
Container.set(AuthLogger, log);
153144

154-
const authFirestore = setupFirestore(config);
155-
Container.set(AuthFirestore, authFirestore);
156-
const currencyHelper = new CurrencyHelper(config);
157-
Container.set(CurrencyHelper, currencyHelper);
158-
const stripeHelper = createStripeHelper(log, config, statsd);
159-
Container.set(StripeHelper, stripeHelper);
160-
const playBilling = Container.get(PlayBilling);
161-
const playSubscriptions = Container.get(PlaySubscriptions);
162-
const appleIap = Container.get(AppleIAP);
163-
const appStoreSubscriptions = Container.get(AppStoreSubscriptions);
164-
165145
const accountWhereAndOrderBy = () =>
166146
accountWhereAndOrderByQueryBuilder(
167147
startDateTimestamp,
@@ -193,51 +173,10 @@ const init = async () => {
193173
async (uid: string) => await hasAccessToken(accessTokensFn, uid)
194174
);
195175

196-
const getPlaySubscriptionsCollection = collectPerfStatsOn(
197-
'Get Play Collection',
198-
async () => await playBilling.purchaseDbRef().get()
199-
);
200-
const getAppleSubscriptionsCollection = collectPerfStatsOn(
201-
'Get Apple Collection',
202-
async () => await appleIap.purchasesDbRef().get()
203-
);
204-
205-
const iapSubUids = new Set<string>();
206-
const playSubscriptionsCollection = await getPlaySubscriptionsCollection();
207-
const appleSubscriptionsCollection = await getAppleSubscriptionsCollection();
208-
((collections) => {
209-
for (const c of collections) {
210-
for (const purchaseRecordSnapshot of c.docs) {
211-
const x = purchaseRecordSnapshot.data();
212-
if (x.userId) {
213-
iapSubUids.add(x.userId);
214-
}
215-
}
216-
}
217-
})([playSubscriptionsCollection, appleSubscriptionsCollection]);
218-
219-
const getPlaySubscriptions = collectPerfStatsOn(
220-
'Get Play Subscriptions',
221-
async (uid: string) => await playSubscriptions.getSubscriptions(uid)
222-
);
223-
const getAppleSubscriptions = collectPerfStatsOn(
224-
'Get Apple Subscriptions',
225-
async (uid: string) => await appStoreSubscriptions.getSubscriptions(uid)
226-
);
227-
228-
const hasIapSubscription = collectPerfStatsOn(
229-
'Has IAP Check',
230-
async (uid: string) =>
231-
iapSubUids.has(uid) &&
232-
((await getPlaySubscriptions(uid)).length > 0 ||
233-
(await getAppleSubscriptions(uid)).length > 0)
234-
);
235-
236176
const _isActive = new IsActiveFnBuilder()
237177
.setActiveSessionTokenFn(checkActiveSessionToken)
238178
.setRefreshTokenFn(checkRefreshToken)
239179
.setAccessTokenFn(checkAccessToken)
240-
.setIapSubscriptionFn(hasIapSubscription)
241180
.build();
242181
const isActive = collectPerfStatsOn('Active Status Check', _isActive);
243182

packages/fxa-auth-server/scripts/delete-inactive-accounts/lib.ts

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
import {
66
Account,
7-
AccountCustomers,
87
Email,
98
SecurityEvent,
109
SessionToken as SessionTokenOrm,
@@ -42,9 +41,6 @@ export const securityEventUidsQuery = (activeByDateTimestamp) =>
4241
])
4342
.as('securityEventUids');
4443

45-
export const accountCustomerUidsQuery = () =>
46-
AccountCustomers.query().select('uid').as('accountCustomerUids');
47-
4844
export const accountWhereAndOrderByQueryBuilder = (
4945
startDateTimestamp,
5046
endDateTimestamp,
@@ -53,22 +49,19 @@ export const accountWhereAndOrderByQueryBuilder = (
5349
const emailUids = emailUidsQuery(activeByDateTimestamp);
5450
const sessionTokenUids = sessionTokenUidsQuery(activeByDateTimestamp);
5551
const securityEventUids = securityEventUidsQuery(activeByDateTimestamp);
56-
const accountCustomerUids = accountCustomerUidsQuery();
5752

5853
return Account.query()
5954
.leftJoin(emailUids, 'emailUids.uid', 'accounts.uid')
6055
.leftJoin(sessionTokenUids, 'sessionTokenUids.uid', 'accounts.uid')
6156
.leftJoin(securityEventUids, 'securityEventUids.uid', 'accounts.uid')
62-
.leftJoin(accountCustomerUids, 'accountCustomerUids.uid', 'accounts.uid')
6357
.where('accounts.emailVerified', 1)
6458
.where('accounts.createdAt', '>=', startDateTimestamp)
6559
.where('accounts.createdAt', '<', endDateTimestamp)
6660
.where((builder) => {
6761
builder
6862
.whereNull('emailUids.uid')
6963
.whereNull('sessionTokenUids.uid')
70-
.whereNull('securityEventUids.uid')
71-
.whereNull('accountCustomerUids.uid');
64+
.whereNull('securityEventUids.uid');
7265
})
7366
.orderBy('accounts.createdAt', 'asc')
7467
.orderBy('accounts.uid', 'asc');
@@ -122,7 +115,6 @@ export class IsActiveFnBuilder {
122115
activeSessionTokenFn: ActiveConditionFn;
123116
refreshTokenFn: ActiveConditionFn;
124117
accessTokenFn: ActiveConditionFn;
125-
iapSubscriptionFn: ActiveConditionFn;
126118

127119
constructor() {
128120
this.activeSessionTokenFn = this.requiredFn(
@@ -134,9 +126,6 @@ export class IsActiveFnBuilder {
134126
this.accessTokenFn = this.requiredFn(
135127
'A function to check for an access token is required.'
136128
);
137-
this.iapSubscriptionFn = this.requiredFn(
138-
'A function to check for an IAP subscription is required.'
139-
);
140129
}
141130

142131
setActiveSessionTokenFn(fn: ActiveConditionFn) {
@@ -154,17 +143,11 @@ export class IsActiveFnBuilder {
154143
return this;
155144
}
156145

157-
setIapSubscriptionFn(fn: ActiveConditionFn) {
158-
this.iapSubscriptionFn = fn;
159-
return this;
160-
}
161-
162146
build() {
163147
return (async (uid: string) =>
164148
(await this.activeSessionTokenFn(uid)) ||
165149
(await this.refreshTokenFn(uid)) ||
166-
(await this.accessTokenFn(uid)) ||
167-
(await this.iapSubscriptionFn(uid))).bind(this);
150+
(await this.accessTokenFn(uid))).bind(this);
168151
}
169152
}
170153

packages/fxa-auth-server/test/scripts/delete-inactive-accounts/lib.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,6 @@ describe('delete inactive accounts script lib', () => {
188188
await builder
189189
.setRefreshTokenFn(refreshTokensFn)
190190
.setAccessTokenFn(accessTokensFn)
191-
.setIapSubscriptionFn(iapSubscriptionFn)
192191
.build()();
193192
assert.fail('should have thrown an error');
194193
} catch (actual) {
@@ -201,7 +200,6 @@ describe('delete inactive accounts script lib', () => {
201200
await builder
202201
.setActiveSessionTokenFn(sessionTokensFn)
203202
.setAccessTokenFn(accessTokensFn)
204-
.setIapSubscriptionFn(iapSubscriptionFn)
205203
.build()();
206204
assert.fail('should have thrown an error');
207205
} catch (actual) {
@@ -214,7 +212,6 @@ describe('delete inactive accounts script lib', () => {
214212
await builder
215213
.setActiveSessionTokenFn(sessionTokensFn)
216214
.setRefreshTokenFn(refreshTokensFn)
217-
.setIapSubscriptionFn(iapSubscriptionFn)
218215
.build()();
219216
assert.fail('should have thrown an error');
220217
} catch (actual) {
@@ -244,7 +241,6 @@ describe('delete inactive accounts script lib', () => {
244241
.setActiveSessionTokenFn(sessionTokensFn)
245242
.setRefreshTokenFn(refreshTokensFn)
246243
.setAccessTokenFn(accessTokensFn)
247-
.setIapSubscriptionFn(iapSubscriptionFn)
248244
.build();
249245
});
250246

@@ -288,7 +284,6 @@ describe('delete inactive accounts script lib', () => {
288284
.setActiveSessionTokenFn(sessionTokensFn)
289285
.setRefreshTokenFn(refreshTokensFn)
290286
.setAccessTokenFn(accessTokensFn)
291-
.setIapSubscriptionFn(iapSubscriptionFn)
292287
.build();
293288
sessionTokensFn.resolves(false);
294289
refreshTokensFn.resolves(false);
@@ -300,7 +295,6 @@ describe('delete inactive accounts script lib', () => {
300295
sinon.assert.calledOnceWithExactly(sessionTokensFn, '9001');
301296
sinon.assert.calledOnceWithExactly(refreshTokensFn, '9001');
302297
sinon.assert.calledOnceWithExactly(accessTokensFn, '9001');
303-
sinon.assert.calledOnceWithExactly(iapSubscriptionFn, '9001');
304298
});
305299
});
306300
});

0 commit comments

Comments
 (0)