'use strict'; const { parseXML, childAttr, required } = require('../parser'); const { createDoc, parseEiResponse, serializeEiResponse, oadrNs, energyInteropNs, } = require('../shared'); const { fragment } = require('xmlbuilder2'); function parsePendingReport(pendingReport) { return { reportRequestId: required( childAttr(pendingReport, 'reportRequestID'), 'reportRequestID', ), }; } function parsePendingReports(pendingReports) { return pendingReports.map(x => parsePendingReport(x['$$'])); } async function parse(input) { const json = await parseXML(input); const o = json['oadrPayload']['$$']['oadrSignedObject'][0]['$$'][ 'oadrCreatedReport' ][0]['$$']; const { code, description, requestId } = parseEiResponse( o['eiResponse'][0]['$$'], ); const result = { _type: 'oadrCreatedReport', responseCode: code, responseRequestId: requestId, }; if (description != null) result.responseDescription = description; if (result.responseCode < 200 || result.responseCode >= 300) { throw new Error(result.responseDescription || result.responseCode); } if (o['oadrPendingReports']) { result.pendingReports = parsePendingReports(o['oadrPendingReports']); } const venId = childAttr(o, 'venID'); if (venId != null) { result.venId = venId; } return result; } function serializePendingReport(pendingReport) { return fragment() .ele(energyInteropNs, 'ei:reportRequestID') .txt(pendingReport.reportRequestId) .up(); } function serializePendingReports(pendingReports) { const result = fragment(); const responsesHolder = result.ele(oadrNs, 'oadr2b:oadrPendingReports'); pendingReports.forEach(x => responsesHolder.import(serializePendingReport(x)), ); return result; } function serialize(obj) { const venId = obj.venId != null ? fragment() .ele(energyInteropNs, 'ei:venID') .txt(obj.venId) : fragment(); const doc = createDoc() .ele('@oadr2b', 'oadr2b:oadrPayload') .ele('oadr2b:oadrSignedObject') .ele('oadr2b:oadrCreatedReport') .import(serializeEiResponse(obj)) .import(serializePendingReports(obj.pendingReports)) .import(venId) .doc(); return doc.end({ headless: true, prettyPrint: false }); } async function canParse(input) { const json = await parseXML(input); const o = json['oadrPayload']['$$']['oadrSignedObject'][0]['$$']; return o['oadrCreatedReport'] != null; } function canSerialize(message) { return message._type === 'oadrCreatedReport'; } module.exports = { parse, serialize, canParse, canSerialize, };