Skip to content

Commit 6bc368b

Browse files
committed
Consume new endpoint to return last 14 days keys after onboarding
1 parent f9c766f commit 6bc368b

File tree

6 files changed

+51
-19
lines changed

6 files changed

+51
-19
lines changed

.env

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@ APP_VERSION_NAME=1.0
66
SUBMIT_URL=https://submission.covidshield.app
77
RETRIEVE_URL=https://retrieval.covidshield.app
88
HMAC_KEY=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
9-
REGION=302
10-
MCC_CODE=302;
9+
REGION=302;
1110
TRANSMISSION_RISK_LEVEL=2
1211
MINIMUM_FETCH_INTERVAL=15
1312

src/env/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export const RETRIEVE_URL = Config.RETRIEVE_URL;
1616

1717
export const HMAC_KEY = Config.HMAC_KEY;
1818

19-
export const REGION = parseInt(Config.REGION, 10);
19+
export const REGION = parseInt(Config.REGION, 10) || 302;
2020

2121
export const TRANSMISSION_RISK_LEVEL = parseInt(Config.TRANSMISSION_RISK_LEVEL, 10);
2222

src/services/BackendService/BackendService.spec.ts

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import {downloadDiagnosisKeysFile} from '../../bridge/CovidShield';
12
import {TemporaryExposureKey} from '../../bridge/ExposureNotification';
23

34
import {BackendService} from './BackendService';
@@ -89,7 +90,7 @@ describe('BackendService', () => {
8990

9091
describe('reportDiagnosisKeys', () => {
9192
it('returns last 14 keys if there is more than 14', async () => {
92-
const backendService = new BackendService('http://localhost', 'https://localhost', 'mock', 0);
93+
const backendService = new BackendService('http://localhost', 'https://localhost', 'mock', undefined);
9394
const keys = generateRandomKeys(20);
9495

9596
await backendService.reportDiagnosisKeys(
@@ -115,4 +116,26 @@ describe('BackendService', () => {
115116
});
116117
});
117118
});
119+
120+
describe('retrieveDiagnosisKeys', () => {
121+
it('returns keys file for set period', async () => {
122+
const backendService = new BackendService('http://localhost', 'https://localhost', 'mock', undefined);
123+
124+
await backendService.retrieveDiagnosisKeys(18457);
125+
126+
expect(downloadDiagnosisKeysFile).toHaveBeenCalledWith(
127+
'http://localhost/retrieve/302/18457/c4d9820c20f7073e47f54cc1bd24475fb98c8ab9ffc0ea81dded3f8ebfb48b67',
128+
);
129+
});
130+
131+
it('returns keys file for 14 days if period is 0', async () => {
132+
const backendService = new BackendService('http://localhost', 'https://localhost', 'mock', undefined);
133+
134+
await backendService.retrieveDiagnosisKeys(0);
135+
136+
expect(downloadDiagnosisKeysFile).toHaveBeenCalledWith(
137+
'http://localhost/retrieve/302/00000/ca365ad512568f4292953403590b398e3f1336efcb4f1acedb20926c35408bd9',
138+
);
139+
});
140+
});
118141
});

src/services/BackendService/BackendService.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ import {BackendInterface, SubmissionKeySet} from './types';
1515
const MAX_UPLOAD_KEYS = 14;
1616
const FETCH_HEADERS = {headers: {'Cache-Control': 'no-store'}};
1717

18+
// See https://github.com/cds-snc/covid-shield-server/pull/176
19+
const LAST_14_DAYS_PERIOD = '00000';
20+
1821
export class BackendService implements BackendInterface {
1922
retrieveUrl: string;
2023
submitUrl: string;
@@ -29,9 +32,10 @@ export class BackendService implements BackendInterface {
2932
}
3033

3134
async retrieveDiagnosisKeys(period: number) {
32-
const message = `${this.region}:${period}:${Math.floor(Date.now() / 1000 / 3600)}`;
35+
const periodStr = `${period > 0 ? period : LAST_14_DAYS_PERIOD}`;
36+
const message = `${REGION}:${periodStr}:${Math.floor(Date.now() / 1000 / 3600)}`;
3337
const hmac = hmac256(message, encHex.parse(this.hmacKey)).toString(encHex);
34-
const url = `${this.retrieveUrl}/retrieve/${this.region}/${period}/${hmac}`;
38+
const url = `${this.retrieveUrl}/retrieve/${REGION}/${periodStr}/${hmac}`;
3539
captureMessage('retrieveDiagnosisKeys', {period, url});
3640
return downloadDiagnosisKeysFile(url);
3741
}

src/services/ExposureNotificationService/ExposureNotificationService.spec.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ describe('ExposureNotificationService', () => {
8282
.mockImplementation((args: any) => new OriginalDate(args));
8383

8484
await service.updateExposureStatus();
85-
expect(server.retrieveDiagnosisKeys).toHaveBeenCalledTimes(14);
85+
expect(server.retrieveDiagnosisKeys).toHaveBeenCalledTimes(1);
8686
});
8787

8888
it('backfills the right amount of keys for current day', async () => {
@@ -98,7 +98,7 @@ describe('ExposureNotificationService', () => {
9898
},
9999
});
100100
await service.updateExposureStatus();
101-
expect(server.retrieveDiagnosisKeys).toHaveBeenCalledTimes(0);
101+
expect(server.retrieveDiagnosisKeys).toHaveBeenCalledTimes(1);
102102

103103
server.retrieveDiagnosisKeys.mockClear();
104104

@@ -109,7 +109,7 @@ describe('ExposureNotificationService', () => {
109109
},
110110
});
111111
await service.updateExposureStatus();
112-
expect(server.retrieveDiagnosisKeys).toHaveBeenCalledTimes(1);
112+
expect(server.retrieveDiagnosisKeys).toHaveBeenCalledTimes(2);
113113

114114
server.retrieveDiagnosisKeys.mockClear();
115115

@@ -120,7 +120,7 @@ describe('ExposureNotificationService', () => {
120120
},
121121
});
122122
await service.updateExposureStatus();
123-
expect(server.retrieveDiagnosisKeys).toHaveBeenCalledTimes(2);
123+
expect(server.retrieveDiagnosisKeys).toHaveBeenCalledTimes(3);
124124
});
125125

126126
it('serializes status update', async () => {

src/services/ExposureNotificationService/ExposureNotificationService.ts

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -263,10 +263,20 @@ export class ExposureNotificationService {
263263
): AsyncGenerator<{keysFileUrl: string; period: number} | null> {
264264
const runningDate = new Date();
265265

266-
const lastCheckedPeriod =
267-
_lastCheckedPeriod || periodSinceEpoch(addDays(runningDate, -EXPOSURE_NOTIFICATION_CYCLE), HOURS_PER_PERIOD);
268266
let runningPeriod = periodSinceEpoch(runningDate, HOURS_PER_PERIOD);
269267

268+
if (!_lastCheckedPeriod) {
269+
try {
270+
const keysFileUrl = await this.backendInterface.retrieveDiagnosisKeys(0);
271+
yield {keysFileUrl, period: runningPeriod};
272+
} catch (error) {
273+
captureException('Error while downloading batch files', error);
274+
}
275+
return;
276+
}
277+
278+
const lastCheckedPeriod = Math.max(_lastCheckedPeriod - 1, runningPeriod - EXPOSURE_NOTIFICATION_CYCLE);
279+
270280
while (runningPeriod > lastCheckedPeriod) {
271281
try {
272282
const keysFileUrl = await this.backendInterface.retrieveDiagnosisKeys(runningPeriod);
@@ -339,12 +349,7 @@ export class ExposureNotificationService {
339349
if (!value) continue;
340350
const {keysFileUrl, period} = value;
341351
keysFileUrls.push(keysFileUrl);
342-
343-
// Temporarily disable persisting lastCheckPeriod on Android
344-
// Ref https://github.com/cds-snc/covid-shield-mobile/issues/453
345-
if (Platform.OS !== 'android') {
346-
lastCheckedPeriod = Math.max(lastCheckedPeriod || 0, period);
347-
}
352+
lastCheckedPeriod = Math.max(lastCheckedPeriod || 0, period);
348353
}
349354

350355
captureMessage('performExposureStatusUpdate', {
@@ -365,11 +370,12 @@ export class ExposureNotificationService {
365370
lastCheckedPeriod,
366371
);
367372
}
373+
return finalize({}, lastCheckedPeriod);
368374
} catch (error) {
369375
captureException('performExposureStatusUpdate', error);
370376
}
371377

372-
return finalize({}, lastCheckedPeriod);
378+
return finalize();
373379
}
374380

375381
private async processPendingExposureSummary() {

0 commit comments

Comments
 (0)