Skip to content

Commit f756eba

Browse files
authored
Merge pull request #20245 from mozilla/FXA-13287
fix(event-broker): Use generation for event changeTime
2 parents cf94c97 + 6b5a92a commit f756eba

3 files changed

Lines changed: 38 additions & 1 deletion

File tree

packages/fxa-event-broker/src/queueworker/queueworker.service.spec.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,13 @@ const baseDeleteMessage = {
5959
const basePasswordResetMessage = {
6060
...baseMessage,
6161
event: 'reset',
62+
generation: now - 5000,
6263
};
6364

6465
const basePasswordChangeMessage = {
6566
...baseMessage,
6667
event: 'passwordChange',
68+
generation: now - 5000,
6769
};
6870

6971
const basePrimaryEmailMessage = {
@@ -313,6 +315,32 @@ describe('QueueworkerService', () => {
313315
});
314316
}
315317

318+
it('uses generation as changeTime for password change events', async () => {
319+
const msg = updateStubMessage(basePasswordChangeMessage);
320+
await (service as any).handleMessage(msg);
321+
expect(topic.publishMessage).toHaveBeenCalledTimes(1);
322+
const published = topic.publishMessage.mock.calls[0][0].json;
323+
expect(published.changeTime).toBe(basePasswordChangeMessage.generation);
324+
});
325+
326+
it('uses generation as changeTime for password reset events', async () => {
327+
const msg = updateStubMessage(basePasswordResetMessage);
328+
await (service as any).handleMessage(msg);
329+
expect(topic.publishMessage).toHaveBeenCalledTimes(1);
330+
const published = topic.publishMessage.mock.calls[0][0].json;
331+
expect(published.changeTime).toBe(basePasswordResetMessage.generation);
332+
});
333+
334+
it('falls back to timestamp when generation is absent for password events', async () => {
335+
const { generation, ...messageWithoutGeneration } =
336+
basePasswordChangeMessage;
337+
const msg = updateStubMessage(messageWithoutGeneration);
338+
await (service as any).handleMessage(msg);
339+
expect(topic.publishMessage).toHaveBeenCalledTimes(1);
340+
const published = topic.publishMessage.mock.calls[0][0].json;
341+
expect(published.changeTime).toBe(messageWithoutGeneration.timestamp);
342+
});
343+
316344
const invalidMessages = {
317345
login: { ...baseLoginMessage, clientId: 'test1234' },
318346
'password change': { ...basePasswordChangeMessage, ts: false },

packages/fxa-event-broker/src/queueworker/queueworker.service.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,9 +192,16 @@ export class QueueworkerService
192192
const clientIds = await this.clientIdsForUserAndResourceServers(
193193
message.uid
194194
);
195+
196+
const changeTime =
197+
(eventType === 'password' &&
198+
(message as dto.passwordSchema).generation) ||
199+
message.timestamp ||
200+
message.ts * 1000;
201+
195202
for (const clientId of clientIds) {
196203
const messageId = await this.publishMessage(clientId, {
197-
changeTime: message.timestamp ? message.timestamp : message.ts * 1000,
204+
changeTime,
198205
event: message.event,
199206
timestamp: Date.now(),
200207
uid: message.uid,

packages/fxa-event-broker/src/queueworker/sqs.dto.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ export const PASSWORD_CHANGE_SCHEMA = joi
7171
.object()
7272
.keys({
7373
event: joi.string().valid(PASSWORD_CHANGE_EVENT, PASSWORD_RESET_EVENT),
74+
generation: joi.number().optional(),
7475
timestamp: joi.number().optional(),
7576
ts: joi.number().required(),
7677
uid: joi.string().required(),
@@ -118,6 +119,7 @@ export type loginSchema = {
118119

119120
export type passwordSchema = {
120121
event: typeof PASSWORD_CHANGE_EVENT | typeof PASSWORD_RESET_EVENT;
122+
generation?: number;
121123
timestamp?: number;
122124
ts: number;
123125
uid: string;

0 commit comments

Comments
 (0)