|
|
@@ -167,6 +167,35 @@ async function retrieveEvents(
|
|
|
};
|
|
|
}
|
|
|
|
|
|
+/* qualifiedEvent is the combination of eventId & modificationNumber */
|
|
|
+function eventResponseMatchesValidEvent(eventResponse, oadrEvents) {
|
|
|
+ return (
|
|
|
+ oadrEvents.filter(oadrEvent => {
|
|
|
+ return (
|
|
|
+ oadrEvent.eventDescriptor.eventId === eventResponse.eventId &&
|
|
|
+ oadrEvent.eventDescriptor.modificationNumber ===
|
|
|
+ eventResponse.modificationNumber &&
|
|
|
+ oadrEvent.eventDescriptor.status !== 'cancelled' &&
|
|
|
+ oadrEvent.eventDescriptor.status !== 'completed'
|
|
|
+ );
|
|
|
+ }).length > 0
|
|
|
+ );
|
|
|
+}
|
|
|
+
|
|
|
+async function validateEventResponses(venId, eventResponses) {
|
|
|
+ const event = await nantum.fetchEvent(venId);
|
|
|
+ const oadrEvents = convertToOadrEvents(event);
|
|
|
+ const staleResponses = eventResponses.filter(
|
|
|
+ eventResponse => !eventResponseMatchesValidEvent(eventResponse, oadrEvents),
|
|
|
+ );
|
|
|
+
|
|
|
+ if (staleResponses.length > 0) {
|
|
|
+ const error = new Error('Event response references invalid event');
|
|
|
+ error.responseCode = '454';
|
|
|
+ throw error;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
async function updateOptType(
|
|
|
oadrCreatedEvent,
|
|
|
clientCertificateCn,
|
|
|
@@ -184,27 +213,35 @@ async function updateOptType(
|
|
|
|
|
|
let opted = await nantum.fetchOpted(requestVenId);
|
|
|
|
|
|
- //TODO: more validation: VEN may opt into an event that doesn't exist. VEN may opt into an old version of an event
|
|
|
- // (modificationNumber doesn't match). May opt into a completed event. Indicate error(s) to client.
|
|
|
-
|
|
|
- for (const eventResponse of oadrCreatedEvent.eventResponses) {
|
|
|
- // remove existing opts for this eventId
|
|
|
- opted = [
|
|
|
- ...opted.filter(optedItem => optedItem.eventId !== eventResponse.eventId),
|
|
|
- ];
|
|
|
- opted.push({
|
|
|
- eventId: eventResponse.eventId,
|
|
|
- modificationNumber: eventResponse.modificationNumber,
|
|
|
- optType: eventResponse.optType,
|
|
|
- });
|
|
|
- }
|
|
|
- await nantum.updateOpted(requestVenId, opted);
|
|
|
+ try {
|
|
|
+ await validateEventResponses(requestVenId, oadrCreatedEvent.eventResponses);
|
|
|
+ for (const eventResponse of oadrCreatedEvent.eventResponses) {
|
|
|
+ // remove existing opts for this eventId
|
|
|
+ opted = [
|
|
|
+ ...opted.filter(
|
|
|
+ optedItem => optedItem.eventId !== eventResponse.eventId,
|
|
|
+ ),
|
|
|
+ ];
|
|
|
+ opted.push({
|
|
|
+ eventId: eventResponse.eventId,
|
|
|
+ modificationNumber: eventResponse.modificationNumber,
|
|
|
+ optType: eventResponse.optType,
|
|
|
+ });
|
|
|
+ }
|
|
|
+ await nantum.updateOpted(requestVenId, opted);
|
|
|
|
|
|
- return {
|
|
|
- responseCode: '200',
|
|
|
- responseDescription: 'OK',
|
|
|
- venId: clientCertificateFingerprint,
|
|
|
- };
|
|
|
+ return {
|
|
|
+ responseCode: '200',
|
|
|
+ responseDescription: 'OK',
|
|
|
+ venId: clientCertificateFingerprint,
|
|
|
+ };
|
|
|
+ } catch (e) {
|
|
|
+ return {
|
|
|
+ responseCode: e.responseCode || '454',
|
|
|
+ responseDescription: e.message || 'Invalid event response received',
|
|
|
+ venId: clientCertificateFingerprint,
|
|
|
+ };
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
async function filterOutAcknowledgedEvents(venId, events) {
|