diff --git a/src/entities/InterchangeSystem.ts b/src/entities/InterchangeSystem.ts index 2cb9072..37aed58 100644 --- a/src/entities/InterchangeSystem.ts +++ b/src/entities/InterchangeSystem.ts @@ -71,6 +71,7 @@ export class InterchangeSystem { shuttleRepository, notificationRepository, new AppleNotificationSender(), + args.id, ); notificationScheduler.startListeningForUpdates(); @@ -115,6 +116,7 @@ export class InterchangeSystem { shuttleRepository, notificationRepository, new AppleNotificationSender(false), + args.id, ); notificationScheduler.startListeningForUpdates(); diff --git a/src/notifications/schedulers/ETANotificationScheduler.ts b/src/notifications/schedulers/ETANotificationScheduler.ts index 97a2d4d..b269982 100644 --- a/src/notifications/schedulers/ETANotificationScheduler.ts +++ b/src/notifications/schedulers/ETANotificationScheduler.ts @@ -13,7 +13,8 @@ export class ETANotificationScheduler { constructor( private shuttleRepository: ShuttleGetterRepository, private notificationRepository: NotificationRepository = new InMemoryNotificationRepository(), - private appleNotificationSender = new AppleNotificationSender() + private appleNotificationSender = new AppleNotificationSender(), + private interchangeSystemId: string, ) { this.etaSubscriberCallback = this.etaSubscriberCallback.bind(this); this.sendEtaNotificationImmediately = this.sendEtaNotificationImmediately.bind(this); @@ -45,6 +46,11 @@ export class ETANotificationScheduler { const notificationAlertArguments: NotificationAlertArguments = { title: "Shuttle is arriving", body: `Shuttle is approaching ${stop.name} in ${Math.ceil(eta.secondsRemaining / 60)} minutes.`, + customKeys: { + shuttleId, + stopId, + systemId: this.interchangeSystemId, + }, } return this.appleNotificationSender.sendNotificationImmediately(deviceId, notificationAlertArguments); } diff --git a/src/notifications/senders/AppleNotificationSender.ts b/src/notifications/senders/AppleNotificationSender.ts index 8e5904a..2f458af 100644 --- a/src/notifications/senders/AppleNotificationSender.ts +++ b/src/notifications/senders/AppleNotificationSender.ts @@ -10,6 +10,7 @@ interface APNsUrl { export interface NotificationAlertArguments { title: string; body: string; + customKeys?: any, } export class AppleNotificationSender { @@ -106,12 +107,21 @@ export class AppleNotificationSender { resolve(); }); - req.write(JSON.stringify({ + const customKeys = { + ...notificationAlertArguments.customKeys, + } + delete notificationAlertArguments.customKeys; + + // See https://developer.apple.com/documentation/usernotifications/generating-a-remote-notification + // for notification payload examples + const payload = JSON.stringify({ aps: { alert: notificationAlertArguments, sound: "default" - } - })); + }, + customKeys, + }); + req.write(payload); req.end(); }); return true; diff --git a/test/notifications/schedulers/ETANotificationSchedulerTests.test.ts b/test/notifications/schedulers/ETANotificationSchedulerTests.test.ts index b9f1790..db6a94b 100644 --- a/test/notifications/schedulers/ETANotificationSchedulerTests.test.ts +++ b/test/notifications/schedulers/ETANotificationSchedulerTests.test.ts @@ -40,7 +40,8 @@ describe("ETANotificationScheduler", () => { notificationService = new ETANotificationScheduler( shuttleRepository, notificationRepository, - appleNotificationSender + appleNotificationSender, + "1", ); notificationService.startListeningForUpdates(); }); @@ -127,7 +128,8 @@ describe("ETANotificationScheduler", () => { notificationService = new ETANotificationScheduler( shuttleRepository, notificationRepository, - updatedNotificationSender + updatedNotificationSender, + "1", ); notificationService.startListeningForUpdates(); diff --git a/test/notifications/senders/AppleNotificationSenderTests.test.ts b/test/notifications/senders/AppleNotificationSenderTests.test.ts index 9cbc0cb..948be7d 100644 --- a/test/notifications/senders/AppleNotificationSenderTests.test.ts +++ b/test/notifications/senders/AppleNotificationSenderTests.test.ts @@ -5,7 +5,6 @@ import { AppleNotificationSender, NotificationAlertArguments } from "../../../src/notifications/senders/AppleNotificationSender"; -import { ETANotificationScheduler } from "../../../src/notifications/schedulers/ETANotificationScheduler"; jest.mock("http2"); @@ -13,7 +12,7 @@ const sampleKeyBase64 = "LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR1RBZ0VBTUJNR0J function mockHttp2Connect(status: number) { class MockClient extends EventEmitter { - request = jest.fn((headers: any) => { + request = jest.fn((_) => { const mockRequest: any = new EventEmitter(); mockRequest.setEncoding = jest.fn(); mockRequest.write = jest.fn();