Skip to content

Commit 6d16185

Browse files
authored
feat: brief notification settings (#2992)
1 parent b0e9e8d commit 6d16185

10 files changed

+44
-104
lines changed

__tests__/users.ts

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4653,9 +4653,7 @@ describe('query personalizedDigest', () => {
46534653
personalizedDigest {
46544654
type
46554655
flags {
4656-
email
46574656
sendType
4658-
slack
46594657
}
46604658
}
46614659
}`;
@@ -4675,8 +4673,6 @@ describe('query personalizedDigest', () => {
46754673
type: UserPersonalizedDigestType.Digest,
46764674
flags: {
46774675
sendType: UserPersonalizedDigestSendType.workdays,
4678-
email: true,
4679-
slack: true,
46804676
},
46814677
});
46824678

@@ -4686,8 +4682,6 @@ describe('query personalizedDigest', () => {
46864682
expect(res.data.personalizedDigest.length).toEqual(1);
46874683
expect(res.data.personalizedDigest[0].flags).toEqual({
46884684
sendType: UserPersonalizedDigestSendType.workdays,
4689-
email: true,
4690-
slack: true,
46914685
});
46924686
});
46934687

@@ -4698,21 +4692,16 @@ describe('query personalizedDigest', () => {
46984692
expect(res.data.personalizedDigest.length).toEqual(1);
46994693
expect(res.data.personalizedDigest[0].flags).toEqual({
47004694
sendType: UserPersonalizedDigestSendType.weekly,
4701-
email: null,
4702-
slack: null,
47034695
});
47044696
});
47054697
});
47064698
});
47074699

47084700
describe('mutation subscribePersonalizedDigest', () => {
4709-
const MUTATION = `mutation SubscribePersonalizedDigest($hour: Int, $day: Int, $type: DigestType, $sendType: UserPersonalizedDigestSendType, $email: Boolean) {
4710-
subscribePersonalizedDigest(hour: $hour, day: $day, type: $type, sendType: $sendType, email: $email) {
4701+
const MUTATION = `mutation SubscribePersonalizedDigest($hour: Int, $day: Int, $type: DigestType, $sendType: UserPersonalizedDigestSendType) {
4702+
subscribePersonalizedDigest(hour: $hour, day: $day, type: $type, sendType: $sendType) {
47114703
preferredDay
47124704
preferredHour
4713-
flags {
4714-
email
4715-
}
47164705
}
47174706
}`;
47184707

@@ -4826,16 +4815,12 @@ describe('mutation subscribePersonalizedDigest', () => {
48264815
variables: {
48274816
day: DayOfWeek.Wednesday,
48284817
hour: 17,
4829-
email: true,
48304818
},
48314819
});
48324820
expect(res.errors).toBeFalsy();
48334821
expect(res.data.subscribePersonalizedDigest).toMatchObject({
48344822
preferredDay: DayOfWeek.Wednesday,
48354823
preferredHour: 17,
4836-
flags: {
4837-
email: true,
4838-
},
48394824
});
48404825
});
48414826

__tests__/workers/newNotificationV2Mail.ts

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import {
88
formatMailDate,
99
notificationsLink,
1010
sendEmail,
11-
updateFlagsStatement,
1211
} from '../../src/common';
1312
import worker, {
1413
notificationToTemplateId,
@@ -1375,22 +1374,44 @@ it('should not invoke squad_blocked email', async () => {
13751374
it('should not send brief email notification if the user prefers not to receive them', async () => {
13761375
const userId = '1';
13771376

1377+
const briefPost = await con.getRepository(BriefPost).save({
1378+
id: 'bnp-1-send',
1379+
shortId: 'bnp-1-send',
1380+
sourceId: BRIEFING_SOURCE,
1381+
visible: true,
1382+
private: true,
1383+
authorId: '1',
1384+
title: 'Presidential briefing',
1385+
content: '',
1386+
readTime: 4,
1387+
contentJSON: [],
1388+
});
1389+
13781390
const ctx: NotificationPostContext = {
13791391
userIds: ['1'],
13801392
source: sourcesFixture.find(
13811393
(item) => item.id === 'unknown',
13821394
) as Reference<Source>,
1383-
post: postsFixture[0] as Reference<Post>,
1395+
post: briefPost as Reference<Post>,
13841396
};
13851397

13861398
await con.getRepository(UserPersonalizedDigest).save({
13871399
userId: '1',
13881400
type: UserPersonalizedDigestType.Brief,
1389-
flags: {
1390-
email: false,
1391-
},
13921401
} as UserPersonalizedDigest);
13931402

1403+
await con.getRepository(User).update(
1404+
{ id: '1' },
1405+
{
1406+
notificationFlags: () =>
1407+
`jsonb_set(
1408+
jsonb_set("notificationFlags", '{briefing_ready}', coalesce("notificationFlags"->'briefing_ready', '{}'::jsonb)),
1409+
'{briefing_ready,email}',
1410+
'"muted"'
1411+
)`,
1412+
},
1413+
);
1414+
13941415
const notificationId = await saveNotificationV2Fixture(
13951416
con,
13961417
NotificationType.BriefingReady,
@@ -2712,18 +2733,11 @@ describe('briefing_ready notification', () => {
27122733
expect(args.transactional_message_id).toEqual('81');
27132734
});
27142735

2715-
it('should not send email if digest flag is not true', async () => {
2716-
await con.getRepository(UserPersonalizedDigest).update(
2717-
{
2718-
userId: 'u-bnp-1',
2719-
type: UserPersonalizedDigestType.Brief,
2720-
},
2721-
{
2722-
flags: updateFlagsStatement<UserPersonalizedDigest>({
2723-
email: false,
2724-
}),
2725-
},
2726-
);
2736+
it('should not send email if digest subscription is missing', async () => {
2737+
await con.getRepository(UserPersonalizedDigest).delete({
2738+
userId: 'u-bnp-1',
2739+
type: UserPersonalizedDigestType.Brief,
2740+
});
27272741

27282742
const postContext = await buildPostContext(con, 'bnp-1');
27292743

__tests__/workers/postAddedSlackChannelSendBrief.ts

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,6 @@ describe('postAddedSlackChannelSendBrief worker', () => {
133133
type: UserPersonalizedDigestType.Brief,
134134
flags: {
135135
sendType: UserPersonalizedDigestSendType.daily,
136-
slack: true,
137136
},
138137
});
139138
});
@@ -347,36 +346,6 @@ describe('postAddedSlackChannelSendBrief worker', () => {
347346
expect(chatPostMessage).toHaveBeenCalledTimes(0);
348347
});
349348

350-
it('should ignore if digest slack flag is not true', async () => {
351-
await con.getRepository(UserPersonalizedDigest).update(
352-
{
353-
userId: '1',
354-
type: UserPersonalizedDigestType.Brief,
355-
},
356-
{
357-
flags: updateFlagsStatement<UserPersonalizedDigest>({
358-
slack: false,
359-
}),
360-
},
361-
);
362-
363-
const post = await con.getRepository(BriefPost).findOneByOrFail({
364-
id: 'bsp-p1',
365-
});
366-
367-
await expectSuccessfulTypedBackground(worker, {
368-
payload: new UserBriefingRequest({
369-
userId: '1',
370-
frequency: 'daily',
371-
modelName: BriefingModel.Default,
372-
}),
373-
postId: post.id,
374-
});
375-
376-
expect(conversationsJoin).toHaveBeenCalledTimes(0);
377-
expect(chatPostMessage).toHaveBeenCalledTimes(0);
378-
});
379-
380349
it('should schedule a message to the slack channel', async () => {
381350
const post = await con.getRepository(BriefPost).findOneByOrFail({
382351
id: 'bsp-p1',

__tests__/workers/userUpdatedPlusSubscriptionBrief.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ describe('userUpdatedPlusSubscriptionBrief worker', () => {
8282
it('should replace digest with brief when user becomes plus', async () => {
8383
const newBase = {
8484
...base,
85-
subscriptionFlags: JSON.stringify({ subscriptionId: '1234' }),
85+
subscriptionFlags: JSON.stringify({ cycle: '1234' }),
8686
};
8787

8888
const digestBefore = await con
@@ -213,7 +213,7 @@ describe('userUpdatedPlusSubscriptionBrief worker', () => {
213213
it('should not replace subscription if flags the same', async () => {
214214
const before: ChangeObject<ObjectType> = {
215215
...base,
216-
subscriptionFlags: JSON.stringify({ subscriptionId: '1234' }),
216+
subscriptionFlags: JSON.stringify({ cycle: '1234' }),
217217
};
218218

219219
const digestBefore = await con
@@ -256,7 +256,7 @@ describe('userUpdatedPlusSubscriptionBrief worker', () => {
256256

257257
const oldBase = {
258258
...base,
259-
subscriptionFlags: JSON.stringify({ subscriptionId: '1234' }),
259+
subscriptionFlags: JSON.stringify({ cycle: '1234' }),
260260
};
261261

262262
const digestBefore = await con
@@ -343,7 +343,7 @@ describe('userUpdatedPlusSubscriptionBrief worker', () => {
343343

344344
const oldBase = {
345345
...base,
346-
subscriptionFlags: JSON.stringify({ subscriptionId: '1234' }),
346+
subscriptionFlags: JSON.stringify({ cycle: '1234' }),
347347
};
348348

349349
const digestBefore = await con
@@ -400,7 +400,7 @@ describe('userUpdatedPlusSubscriptionBrief worker', () => {
400400

401401
const newBase = {
402402
...base,
403-
subscriptionFlags: JSON.stringify({ subscriptionId: '1234' }),
403+
subscriptionFlags: JSON.stringify({ cycle: '1234' }),
404404
};
405405

406406
const digestBefore = await con

src/entity/user/UserPersonalizedDigest.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,11 @@ export enum UserPersonalizedDigestType {
1717

1818
export type UserPersonalizedDigestFlags = Partial<{
1919
sendType: UserPersonalizedDigestSendType;
20-
email: boolean;
21-
inApp: boolean;
22-
slack: boolean;
2320
}>;
2421

2522
export type UserPersonalizedDigestFlagsPublic = Pick<
2623
UserPersonalizedDigestFlags,
27-
'sendType' | 'email' | 'inApp' | 'slack'
24+
'sendType'
2825
>;
2926

3027
@Entity()

src/graphorm/index.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1078,8 +1078,6 @@ const obj = new GraphORM({
10781078
): UserPersonalizedDigestFlagsPublic => {
10791079
return {
10801080
sendType: value?.sendType ?? UserPersonalizedDigestSendType.weekly,
1081-
email: value?.email,
1082-
slack: value?.slack,
10831081
};
10841082
},
10851083
},

src/schema/users.ts

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -773,8 +773,6 @@ export const typeDefs = /* GraphQL */ `
773773
"""
774774
type PersonalizedDigestFlagsPublic {
775775
sendType: UserPersonalizedDigestSendType
776-
email: Boolean
777-
slack: Boolean
778776
}
779777
780778
type UserPersonalizedDigest {
@@ -1128,16 +1126,6 @@ export const typeDefs = /* GraphQL */ `
11281126
Send type of the digest
11291127
"""
11301128
sendType: UserPersonalizedDigestSendType
1131-
1132-
"""
1133-
Send digest over email
1134-
"""
1135-
email: Boolean
1136-
1137-
"""
1138-
Send digest over slack
1139-
"""
1140-
slack: Boolean
11411129
): UserPersonalizedDigest @auth
11421130
11431131
"""
@@ -2334,8 +2322,6 @@ export const resolvers: IResolvers<unknown, BaseContext> = traceResolvers<
23342322
day?: number;
23352323
type?: UserPersonalizedDigestType;
23362324
sendType?: UserPersonalizedDigestSendType;
2337-
email?: boolean;
2338-
slack?: boolean;
23392325
},
23402326
ctx: AuthContext,
23412327
): Promise<GQLUserPersonalizedDigest> => {
@@ -2344,8 +2330,6 @@ export const resolvers: IResolvers<unknown, BaseContext> = traceResolvers<
23442330
day,
23452331
type = UserPersonalizedDigestType.Digest,
23462332
sendType = UserPersonalizedDigestSendType.workdays,
2347-
email,
2348-
slack,
23492333
} = args;
23502334

23512335
if (type === UserPersonalizedDigestType.Brief && !ctx.isPlus) {
@@ -2369,14 +2353,6 @@ export const resolvers: IResolvers<unknown, BaseContext> = traceResolvers<
23692353
flags.sendType = sendType;
23702354
}
23712355

2372-
if (!isNullOrUndefined(email)) {
2373-
flags.email = email;
2374-
}
2375-
2376-
if (!isNullOrUndefined(slack)) {
2377-
flags.slack = slack;
2378-
}
2379-
23802356
const personalizedDigest = await repo.save({
23812357
userId: ctx.userId,
23822358
preferredDay: day,

src/workers/newNotificationV2Mail.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -979,7 +979,7 @@ const notificationToTemplateData: Record<NotificationType, TemplateDataFunc> = {
979979
},
980980
});
981981

982-
if (!personalizedDigest?.flags?.email) {
982+
if (!personalizedDigest) {
983983
return null;
984984
}
985985

src/workers/postAddedSlackChannelSendBrief.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ export const postAddedSlackChannelSendBriefWorker: TypedWorker<'api.v1.brief-rea
6868
}),
6969
]);
7070

71-
if (!personalizedDigest?.flags?.slack) {
71+
if (!personalizedDigest) {
7272
return;
7373
}
7474

src/workers/userUpdatedPlusSubscriptionBrief.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
UserPersonalizedDigest,
66
UserPersonalizedDigestType,
77
} from '../entity';
8+
import { isPlusMember } from '../paddle';
89

910
export const userUpdatedPlusSubscriptionBriefWorker: TypedWorker<'user-updated'> =
1011
{
@@ -25,11 +26,11 @@ export const userUpdatedPlusSubscriptionBriefWorker: TypedWorker<'user-updated'>
2526
return;
2627
}
2728

28-
if (afterFlags?.subscriptionId === beforeFlags?.subscriptionId) {
29+
if (beforeFlags?.cycle === afterFlags?.cycle) {
2930
return;
3031
}
3132

32-
if (afterFlags?.subscriptionId === '' || !afterFlags?.subscriptionId) {
33+
if (!isPlusMember(afterFlags?.cycle)) {
3334
await con.transaction(async (entityManager) => {
3435
await entityManager.delete(UserPersonalizedDigest, {
3536
userId: user.id,

0 commit comments

Comments
 (0)