'use strict'; const { v4 } = require('uuid'); const { vtnId } = require('../config'); const logger = require('../logger'); const nantum = require('../modules/nantum'); async function registerParty( obj, clientCertificateCn, clientCertificateFingerprint, ) { logger.info( 'registerParty', obj, clientCertificateCn, clientCertificateFingerprint, ); const requestVenId = obj.venId; if (!requestVenId) { const error = new Error('No VenID in request'); error.responseCode = 452; throw error; } if (requestVenId !== clientCertificateFingerprint) { // as per certification item #512, venId MUST be case-sensitive const error = new Error('VenID does not match certificate'); error.responseCode = 452; throw error; } if (!clientCertificateCn) { const error = new Error('Could not determine CN from client certificate'); error.responseCode = 452; throw error; } let nantumRegistration = await nantum.fetchRegistration(requestVenId); if (nantumRegistration) { if (nantumRegistration.common_name !== clientCertificateCn) { const error = new Error('Client certificate CN mismatch'); error.responseCode = 452; throw error; } if (nantumRegistration.registration_id == null) { const registrationId = v4().replace(/-/g, ''); nantumRegistration.registration_id = registrationId; await nantum.updateRegistration(nantumRegistration); } } else { const registrationId = v4().replace(/-/g, ''); nantumRegistration = { common_name: clientCertificateCn, ven_id: requestVenId, registration_id: registrationId, }; await nantum.updateRegistration(nantumRegistration); } return nantumRegistrationToOadrRegistrationCreated( obj.requestId, nantumRegistration, ); } async function query(obj, clientCertificateCn, clientCertificateFingerprint) { logger.info('query', obj, clientCertificateCn, clientCertificateFingerprint); const requestVenId = clientCertificateFingerprint; let nantumRegistration = await nantum.fetchRegistration(requestVenId); if (nantumRegistration) { if (nantumRegistration.common_name !== clientCertificateCn) { const error = new Error('Client certificate CN mismatch'); error.responseCode = 452; throw error; } } else { // response payload should not contain ven_id or registration_id nantumRegistration = {}; } return nantumRegistrationToOadrRegistrationCreated( obj.requestId, nantumRegistration, ); } async function cancelParty( obj, clientCertificateCn, clientCertificateFingerprint, ) { logger.info( 'cancelParty', obj, clientCertificateCn, clientCertificateFingerprint, ); const registrationId = obj.registrationId; if (!registrationId) { const error = new Error('No registrationID in request'); error.responseCode = 452; throw error; } const requestVenId = obj.venId; if (requestVenId && requestVenId !== clientCertificateFingerprint) { // as per certification item #512, venId MUST be case-sensitive const error = new Error('VenID does not match certificate'); error.responseCode = 452; throw error; } const venId = clientCertificateFingerprint; if (!clientCertificateCn) { const error = new Error('Could not determine CN from client certificate'); error.responseCode = 452; throw error; } let nantumRegistration = await nantum.fetchRegistration(requestVenId); let cancelledRegistrationId; if (nantumRegistration) { if (nantumRegistration.common_name !== clientCertificateCn) { const error = new Error('Client certificate CN mismatch'); error.responseCode = 452; throw error; } cancelledRegistrationId = nantumRegistration.registration_id; // clear all registration data nantumRegistration = { ven_id: requestVenId, common_name: clientCertificateCn, }; await nantum.updateRegistration(nantumRegistration); } if (cancelledRegistrationId == null) { const error = new Error('No current registration for VenID'); error.responseCode = 452; throw error; } return { responseRequestId: obj.requestId || '', responseCode: '200', responseDescription: 'OK', venId: venId, registrationId: cancelledRegistrationId, }; } function nantumRegistrationToOadrRegistrationCreated( requestId, nantumRegistration, ) { return { responseRequestId: requestId || '', responseCode: '200', responseDescription: 'OK', registrationId: nantumRegistration.registration_id, venId: nantumRegistration.ven_id, vtnId: vtnId, pollFreqDuration: 'PT10S', }; } module.exports = { cancelParty, query, registerParty, };