'use strict'; const { Ven } = require('../db'); const { v4 } = require('uuid'); const { vtnId } = require('../config'); const logger = require('../logger'); 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 registrationId, venId; const existingDbRecordByVenId = await Ven.findOne({ where: { ven_id: requestVenId }, }); const existingDbRecordByCommonName = await Ven.findOne({ where: { common_name: clientCertificateCn }, }); if (existingDbRecordByVenId) { if (existingDbRecordByVenId.common_name !== clientCertificateCn) { const error = new Error('Client certificate CN mismatch.'); error.responseCode = 452; throw error; } registrationId = existingDbRecordByVenId.data.registrationId; venId = existingDbRecordByVenId.ven_id; } else if (existingDbRecordByCommonName) { const error = new Error('Ven already exists with that CN.'); error.responseCode = 452; throw error; } else { registrationId = v4().replace(/-/g, ''); venId = requestVenId; const newVen = new Ven(); newVen.common_name = clientCertificateCn; newVen.ven_id = requestVenId; newVen.data = { registrationId: registrationId, }; await newVen.save(); } return { responseRequestId: obj.requestId || '', responseCode: 200, responseDescription: 'OK', registrationId: registrationId, venId: venId, vtnId: vtnId, pollFreqDuration: 'PT10S', }; } module.exports = { registerParty, };