created-report.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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. pendingReports: parsePendingReports(o['oadrPendingReports']),
  36. };
  37. if (description != null) result.responseDescription = description;
  38. const venId = childAttr(o, 'venID');
  39. if (venId != null) {
  40. result.venId = venId;
  41. }
  42. return result;
  43. }
  44. function serializePendingReport(pendingReport) {
  45. return fragment()
  46. .ele(energyInteropNs, 'ei:reportRequestID')
  47. .txt(pendingReport.reportRequestId)
  48. .up();
  49. }
  50. function serializePendingReports(pendingReports) {
  51. const result = fragment();
  52. const responsesHolder = result.ele(oadrNs, 'oadr2b:oadrPendingReports');
  53. pendingReports.forEach(x =>
  54. responsesHolder.import(serializePendingReport(x)),
  55. );
  56. return result;
  57. }
  58. function serialize(obj) {
  59. const venId =
  60. obj.venId != null
  61. ? fragment()
  62. .ele(energyInteropNs, 'ei:venID')
  63. .txt(obj.venId)
  64. : fragment();
  65. const doc = createDoc()
  66. .ele('@oadr2b', 'oadr2b:oadrPayload')
  67. .ele('oadr2b:oadrSignedObject')
  68. .ele('oadr2b:oadrCreatedReport')
  69. .import(serializeEiResponse(obj))
  70. .import(serializePendingReports(obj.pendingReports))
  71. .import(venId)
  72. .doc();
  73. return doc.end({ headless: true, prettyPrint: false });
  74. }
  75. async function canParse(input) {
  76. const json = await parseXML(input);
  77. const o = json['oadrPayload']['$$']['oadrSignedObject'][0]['$$'];
  78. return o['oadrCreatedReport'] != null;
  79. }
  80. function canSerialize(message) {
  81. return message._type === 'oadrCreatedReport';
  82. }
  83. module.exports = {
  84. parse,
  85. serialize,
  86. canParse,
  87. canSerialize,
  88. };