created-report.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. 'use strict';
  2. const { parseXML, childAttr, required } = require('../parser');
  3. const {
  4. createDoc,
  5. parseEiResponse,
  6. serializeEiResponse,
  7. oadrNs,
  8. energyInteropNs,
  9. } = require('../shared');
  10. const { fragment } = require('xmlbuilder2');
  11. function parsePendingReport(pendingReport) {
  12. return {
  13. reportRequestId: required(
  14. childAttr(pendingReport, 'reportRequestID'),
  15. 'reportRequestID',
  16. ),
  17. };
  18. }
  19. function parsePendingReports(pendingReports) {
  20. return pendingReports.map(x => parsePendingReport(x['$$']));
  21. }
  22. async function parse(input) {
  23. const json = await parseXML(input);
  24. const o =
  25. json['oadrPayload']['$$']['oadrSignedObject'][0]['$$'][
  26. 'oadrCreatedReport'
  27. ][0]['$$'];
  28. const { code, description, requestId } = parseEiResponse(
  29. o['eiResponse'][0]['$$'],
  30. );
  31. const result = {
  32. _type: 'oadrCreatedReport',
  33. responseCode: code,
  34. responseRequestId: requestId,
  35. };
  36. if (description != null) result.responseDescription = description;
  37. if (result.responseCode < 200 || result.responseCode >= 300) {
  38. throw new Error(result.responseDescription || result.responseCode);
  39. }
  40. if (o['oadrPendingReports']) {
  41. result.pendingReports = parsePendingReports(o['oadrPendingReports']);
  42. }
  43. const venId = childAttr(o, 'venID');
  44. if (venId != null) {
  45. result.venId = venId;
  46. }
  47. return result;
  48. }
  49. function serializePendingReport(pendingReport) {
  50. return fragment()
  51. .ele(energyInteropNs, 'ei:reportRequestID')
  52. .txt(pendingReport.reportRequestId)
  53. .up();
  54. }
  55. function serializePendingReports(pendingReports) {
  56. const result = fragment();
  57. const responsesHolder = result.ele(oadrNs, 'oadr2b:oadrPendingReports');
  58. pendingReports.forEach(x =>
  59. responsesHolder.import(serializePendingReport(x)),
  60. );
  61. return result;
  62. }
  63. function serialize(obj) {
  64. const venId =
  65. obj.venId != null
  66. ? fragment()
  67. .ele(energyInteropNs, 'ei:venID')
  68. .txt(obj.venId)
  69. : fragment();
  70. const doc = createDoc()
  71. .ele('@oadr2b', 'oadr2b:oadrPayload')
  72. .ele('oadr2b:oadrSignedObject')
  73. .ele('oadr2b:oadrCreatedReport')
  74. .import(serializeEiResponse(obj))
  75. .import(serializePendingReports(obj.pendingReports))
  76. .import(venId)
  77. .doc();
  78. return doc.end({ headless: true, prettyPrint: false });
  79. }
  80. async function canParse(input) {
  81. const json = await parseXML(input);
  82. const o = json['oadrPayload']['$$']['oadrSignedObject'][0]['$$'];
  83. return o['oadrCreatedReport'] != null;
  84. }
  85. function canSerialize(message) {
  86. return message._type === 'oadrCreatedReport';
  87. }
  88. module.exports = {
  89. parse,
  90. serialize,
  91. canParse,
  92. canSerialize,
  93. };