iotagent-node-lib 2.17.0 → 2.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (347) hide show
  1. package/.github/workflows/ci.yml +17 -2
  2. package/.nyc_output/76bc24ff-5fac-4b5a-997d-de2799342eb0.json +1 -0
  3. package/.nyc_output/processinfo/76bc24ff-5fac-4b5a-997d-de2799342eb0.json +1 -0
  4. package/.nyc_output/processinfo/index.json +1 -1
  5. package/CHANGES_NEXT_RELEASE +1 -0
  6. package/README.md +3 -54
  7. package/doc/advanced-topics.md +121 -85
  8. package/doc/api.md +52 -52
  9. package/doc/development.md +13 -6
  10. package/doc/expressionLanguage.md +514 -312
  11. package/doc/installationguide.md +66 -64
  12. package/doc/usermanual.md +48 -16
  13. package/docker/Mosquitto/Dockerfile +1 -0
  14. package/docker/Mosquitto/README.md +1 -0
  15. package/docker/Mosquitto/startMosquitto.sh +9 -4
  16. package/lib/commonConfig.js +1 -14
  17. package/lib/errors.js +0 -16
  18. package/lib/fiware-iotagent-lib.js +4 -2
  19. package/lib/jexlTranformsMap.js +13 -2
  20. package/lib/model/Device.js +4 -1
  21. package/lib/model/Group.js +19 -1
  22. package/lib/plugins/attributeAlias.js +6 -13
  23. package/lib/plugins/bidirectionalData.js +1 -21
  24. package/lib/plugins/expressionParser.js +7 -6
  25. package/lib/plugins/expressionPlugin.js +11 -25
  26. package/lib/plugins/jexlParser.js +8 -4
  27. package/lib/plugins/multiEntity.js +54 -145
  28. package/lib/plugins/pluginUtils.js +12 -48
  29. package/lib/plugins/timestampProcessPlugin.js +1 -46
  30. package/lib/request-shim.js +111 -0
  31. package/lib/services/common/domain.js +6 -2
  32. package/lib/services/common/genericMiddleware.js +6 -2
  33. package/lib/services/common/iotManagerService.js +1 -1
  34. package/lib/services/common/securityServiceKeystone.js +1 -1
  35. package/lib/services/common/securityServiceOAuth2.js +3 -2
  36. package/lib/services/devices/deviceRegistryMongoDB.js +2 -0
  37. package/lib/services/devices/deviceService.js +2 -5
  38. package/lib/services/devices/devices-NGSI-LD.js +1 -1
  39. package/lib/services/devices/devices-NGSI-v2.js +4 -8
  40. package/lib/services/devices/registrationUtils.js +1 -134
  41. package/lib/services/ngsi/entities-NGSI-LD.js +205 -124
  42. package/lib/services/ngsi/entities-NGSI-v2.js +109 -15
  43. package/lib/services/ngsi/ngsiService.js +4 -6
  44. package/lib/services/ngsi/ngsiUtils.js +0 -36
  45. package/lib/services/ngsi/subscriptionService.js +1 -4
  46. package/lib/services/northBound/contextServer-NGSI-LD.js +7 -2
  47. package/lib/services/northBound/contextServer-NGSI-v2.js +24 -12
  48. package/lib/services/northBound/contextServer.js +1 -4
  49. package/lib/services/northBound/contextServerUtils.js +0 -81
  50. package/lib/services/northBound/deviceProvisioningServer.js +31 -7
  51. package/lib/services/northBound/northboundServer.js +2 -0
  52. package/lib/services/northBound/restUtils.js +1 -38
  53. package/lib/templates/updateDevice.json +4 -0
  54. package/lib/templates/updateDeviceLax.json +4 -0
  55. package/package.json +10 -16
  56. package/test/tools/utils.js +2 -0
  57. package/test/unit/examples/groupProvisioningRequests/multipleGroupsCreation.json +1 -1
  58. package/test/unit/expressions/jexlExpression-test.js +44 -5
  59. package/test/unit/general/contextBrokerKeystoneSecurityAccess-test.js +19 -66
  60. package/test/unit/general/deviceService-test.js +11 -27
  61. package/test/unit/general/loglevel-api_test.js +6 -11
  62. package/test/unit/general/startup-test.js +2 -1
  63. package/test/unit/memoryRegistry/deviceRegistryMemory_test.js +8 -16
  64. package/test/unit/mongodb/mongodb-group-registry-test.js +1 -1
  65. package/test/unit/mongodb/mongodb-registry-test.js +38 -114
  66. package/test/unit/ngsi-ld/examples/contextRequests/createMinimumProvisionedDevice.json +0 -7
  67. package/test/unit/ngsi-ld/examples/contextRequests/createProvisionedDevice.json +0 -7
  68. package/test/unit/ngsi-ld/examples/contextRequests/createProvisionedDeviceMultientity.json +0 -7
  69. package/test/unit/ngsi-ld/examples/contextRequests/createProvisionedDeviceWithGroupAndStatic.json +0 -14
  70. package/test/unit/ngsi-ld/examples/contextRequests/createProvisionedDeviceWithGroupAndStatic2.json +0 -14
  71. package/test/unit/ngsi-ld/examples/contextRequests/createProvisionedDeviceWithGroupAndStatic3.json +1 -15
  72. package/test/unit/ngsi-ld/examples/contextRequests/createTimeInstantMinimumDevice.json +0 -7
  73. package/test/unit/ngsi-ld/examples/contextRequests/updateContextAliasPlugin6.json +0 -7
  74. package/test/unit/ngsi-ld/examples/contextRequests/updateContextAutocast5.json +0 -7
  75. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin12a.json +7 -0
  76. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin13.json +13 -13
  77. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin16.json +0 -7
  78. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin17.json +0 -7
  79. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin1a.json +18 -0
  80. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin29.json +18 -0
  81. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin31.json +15 -0
  82. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin32.json +17 -0
  83. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin33.json +18 -0
  84. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin34.json +17 -0
  85. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin4a.json +36 -0
  86. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin5.json +0 -7
  87. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin7.json +16 -16
  88. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin8a.json +18 -0
  89. package/test/unit/ngsi-ld/examples/contextRequests/updateContextGeoproperties3.json +0 -7
  90. package/test/unit/ngsi-ld/examples/contextRequests/updateContextMultientityPlugin15.json +25 -0
  91. package/test/unit/ngsi-ld/examples/contextRequests/updateContextMultientityTimestampPlugin1.json +6 -6
  92. package/test/unit/ngsi-ld/examples/contextRequests/updateContextMultientityTimestampPlugin2.json +3 -3
  93. package/test/unit/ngsi-ld/examples/contextRequests/updateProvisionActiveAttributes1.json +0 -7
  94. package/test/unit/ngsi-ld/examples/contextRequests/updateProvisionCommands1.json +0 -7
  95. package/test/unit/ngsi-ld/examples/contextRequests/updateProvisionDeviceStatic.json +0 -7
  96. package/test/unit/ngsi-ld/examples/contextRequests/updateProvisionMinimumDevice.json +0 -7
  97. package/test/unit/ngsi-ld/expressions/jexlBasedTransformations-test.js +1018 -0
  98. package/test/unit/ngsi-ld/general/contextBrokerOAuthSecurityAccess-test.js +2 -2
  99. package/test/unit/ngsi-ld/general/deviceService-test.js +1 -1
  100. package/test/unit/ngsi-ld/general/https-support-test.js +2 -1
  101. package/test/unit/ngsi-ld/general/iotam-autoregistration-test.js +2 -1
  102. package/test/unit/ngsi-ld/general/startup-test.js +1 -0
  103. package/test/unit/ngsi-ld/lazyAndCommands/active-devices-attribute-update-test.js +3 -1
  104. package/test/unit/ngsi-ld/lazyAndCommands/command-test.js +2 -1
  105. package/test/unit/ngsi-ld/lazyAndCommands/lazy-devices-test.js +2 -6
  106. package/test/unit/ngsi-ld/lazyAndCommands/polling-commands-test.js +2 -1
  107. package/test/unit/ngsi-ld/ngsiService/active-devices-test.js +1 -0
  108. package/test/unit/ngsi-ld/ngsiService/autocast-test.js +1 -0
  109. package/test/unit/ngsi-ld/ngsiService/geoproperties-test.js +1 -0
  110. package/test/unit/ngsi-ld/ngsiService/subscriptions-test.js +4 -3
  111. package/test/unit/ngsi-ld/plugins/alias-plugin_test.js +1 -0
  112. package/test/unit/ngsi-ld/plugins/bidirectional-plugin_test.js +3 -2
  113. package/test/unit/ngsi-ld/plugins/multientity-plugin_test.js +61 -0
  114. package/test/unit/ngsi-ld/provisioning/device-provisioning-api_test.js +2 -1
  115. package/test/unit/ngsi-ld/provisioning/device-registration_test.js +3 -2
  116. package/test/unit/ngsi-ld/provisioning/device-update-registration_test.js +1 -0
  117. package/test/unit/ngsi-ld/provisioning/listProvisionedDevices-test.js +42 -54
  118. package/test/unit/ngsi-ld/provisioning/provisionDeviceMultientity-test.js +2 -1
  119. package/test/unit/ngsi-ld/provisioning/removeProvisionedDevice-test.js +4 -4
  120. package/test/unit/ngsi-ld/provisioning/singleConfigurationMode-test.js +3 -5
  121. package/test/unit/ngsi-ld/provisioning/updateProvisionedDevices-test.js +12 -18
  122. package/test/unit/ngsi-mixed/provisioning/ngsi-versioning-test.js +3 -1
  123. package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerIoTAgent3.json +19 -0
  124. package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerIoTAgent5.json +19 -0
  125. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin17.json +1 -1
  126. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin29.json +22 -0
  127. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin30.json +6 -0
  128. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin31.json +18 -0
  129. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin32.json +16 -0
  130. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin33.json +22 -0
  131. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin34.json +12 -0
  132. package/test/unit/ngsiv2/examples/contextRequests/updateContextMiddleware1.json +10 -0
  133. package/test/unit/ngsiv2/examples/contextRequests/updateContextMiddleware2.json +10 -0
  134. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin11.json +13 -0
  135. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin12.json +33 -0
  136. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin13.json +33 -0
  137. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin14.json +33 -0
  138. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin15.json +25 -0
  139. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin16.json +25 -0
  140. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityTimestampPlugin1.json +6 -6
  141. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityTimestampPlugin2.json +3 -3
  142. package/test/unit/{examples → ngsiv2/examples}/contextRequests/updateProvisionDevice.json +0 -0
  143. package/test/unit/ngsiv2/expressions/expressionBasedTransformations-test.js +37 -4
  144. package/test/unit/ngsiv2/expressions/jexlBasedTransformations-test.js +598 -0
  145. package/test/unit/ngsiv2/general/contextBrokerOAuthSecurityAccess-test.js +3 -2
  146. package/test/unit/ngsiv2/general/deviceService-test.js +9 -8
  147. package/test/unit/ngsiv2/general/https-support-test.js +2 -1
  148. package/test/unit/ngsiv2/general/iotam-autoregistration-test.js +2 -1
  149. package/test/unit/ngsiv2/general/startup-test.js +1 -0
  150. package/test/unit/ngsiv2/lazyAndCommands/active-devices-attribute-update-test.js +3 -1
  151. package/test/unit/ngsiv2/lazyAndCommands/command-test.js +2 -1
  152. package/test/unit/ngsiv2/lazyAndCommands/lazy-devices-test.js +287 -15
  153. package/test/unit/ngsiv2/lazyAndCommands/polling-commands-test.js +3 -1
  154. package/test/unit/ngsiv2/ngsiService/active-devices-test.js +88 -0
  155. package/test/unit/{ngsiService → ngsiv2/ngsiService}/queryDeviceInformationInCb-test.js +20 -49
  156. package/test/unit/ngsiv2/ngsiService/subscriptions-test.js +4 -3
  157. package/test/unit/ngsiv2/plugins/bidirectional-plugin_test.js +3 -2
  158. package/test/unit/ngsiv2/plugins/multientity-plugin_test.js +526 -0
  159. package/test/unit/{plugins → ngsiv2/plugins}/translation-inPlugins_test.js +21 -21
  160. package/test/unit/{provisioning → ngsiv2/provisioning}/device-group-api-test.js +19 -50
  161. package/test/unit/{provisioning/device-group-utils_test.js → ngsiv2/provisioning/device-group-utils-test.js} +5 -4
  162. package/test/unit/ngsiv2/provisioning/device-provisioning-api_test.js +2 -1
  163. package/test/unit/ngsiv2/provisioning/device-registration_test.js +3 -2
  164. package/test/unit/ngsiv2/provisioning/device-update-registration_test.js +4 -3
  165. package/test/unit/ngsiv2/provisioning/listProvisionedDevices-test.js +42 -53
  166. package/test/unit/ngsiv2/provisioning/provisionDeviceMultientity-test.js +2 -1
  167. package/test/unit/ngsiv2/provisioning/removeProvisionedDevice-test.js +4 -4
  168. package/test/unit/ngsiv2/provisioning/singleConfigurationMode-test.js +3 -4
  169. package/test/unit/ngsiv2/provisioning/updateProvisionedDevices-test.js +14 -20
  170. package/test/unit/plugins/capture-configuration-inPlugins_test.js +3 -1
  171. package/test/unit/plugins/capture-provision-inPlugins_test.js +8 -18
  172. package/.eslintcache +0 -1
  173. package/.nyc_output/dca24ca1-851e-490c-9d34-8d13b3330297.json +0 -1
  174. package/.nyc_output/processinfo/dca24ca1-851e-490c-9d34-8d13b3330297.json +0 -1
  175. package/bin/agentConsole.js +0 -257
  176. package/bin/iotAgentTester.js +0 -44
  177. package/lib/command/commandLine.js +0 -918
  178. package/lib/command/migration.js +0 -176
  179. package/lib/services/devices/devices-NGSI-v1.js +0 -310
  180. package/lib/services/ngsi/entities-NGSI-v1.js +0 -299
  181. package/lib/services/ngsi/subscription-NGSI-v1.js +0 -234
  182. package/lib/services/northBound/contextServer-NGSI-v1.js +0 -526
  183. package/lib/templates/notificationTemplateNgsi1.json +0 -75
  184. package/lib/templates/updateContextNgsi1.json +0 -50
  185. package/test/unit/examples/contextAvailabilityRequests/registerIoTAgent1.json +0 -21
  186. package/test/unit/examples/contextAvailabilityRequests/registerIoTAgent2.json +0 -21
  187. package/test/unit/examples/contextAvailabilityRequests/registerIoTAgent3.json +0 -25
  188. package/test/unit/examples/contextAvailabilityRequests/registerIoTAgent4.json +0 -22
  189. package/test/unit/examples/contextAvailabilityRequests/registerIoTAgentAttributeUpdates.json +0 -16
  190. package/test/unit/examples/contextAvailabilityRequests/registerIoTAgentCommands.json +0 -21
  191. package/test/unit/examples/contextAvailabilityRequests/registerNewDevice1.json +0 -21
  192. package/test/unit/examples/contextAvailabilityRequests/registerNewDevice2.json +0 -21
  193. package/test/unit/examples/contextAvailabilityRequests/registerProvisionedDevice.json +0 -25
  194. package/test/unit/examples/contextAvailabilityRequests/registerProvisionedDevice2.json +0 -21
  195. package/test/unit/examples/contextAvailabilityRequests/registerProvisionedDeviceWithGroup.json +0 -33
  196. package/test/unit/examples/contextAvailabilityRequests/registerProvisionedDeviceWithGroup2.json +0 -33
  197. package/test/unit/examples/contextAvailabilityRequests/unregisterDevice1.json +0 -22
  198. package/test/unit/examples/contextAvailabilityRequests/unregisterDevice3.json +0 -26
  199. package/test/unit/examples/contextAvailabilityRequests/unregisterProvisionedDevice.json +0 -26
  200. package/test/unit/examples/contextAvailabilityRequests/updateCommands1.json +0 -22
  201. package/test/unit/examples/contextAvailabilityRequests/updateIoTAgent1.json +0 -22
  202. package/test/unit/examples/contextAvailabilityRequests/updateIoTAgent2.json +0 -26
  203. package/test/unit/examples/contextAvailabilityRequests/updateIoTAgent3.json +0 -26
  204. package/test/unit/examples/contextAvailabilityResponses/registerIoTAgent1Failed.json +0 -8
  205. package/test/unit/examples/contextAvailabilityResponses/registerIoTAgent1Success.json +0 -4
  206. package/test/unit/examples/contextAvailabilityResponses/registerNewDevice1Success.json +0 -4
  207. package/test/unit/examples/contextAvailabilityResponses/registerNewDevice2Success.json +0 -4
  208. package/test/unit/examples/contextAvailabilityResponses/registerProvisionedDeviceSuccess.json +0 -4
  209. package/test/unit/examples/contextAvailabilityResponses/unregisterDevice1Failed.json +0 -8
  210. package/test/unit/examples/contextAvailabilityResponses/unregisterDevice1Success.json +0 -4
  211. package/test/unit/examples/contextAvailabilityResponses/updateCommands1Success.json +0 -4
  212. package/test/unit/examples/contextAvailabilityResponses/updateIoTAgent1Success.json +0 -6
  213. package/test/unit/examples/contextProviderResponses/queryInformationResponse.json +0 -22
  214. package/test/unit/examples/contextProviderResponses/queryInformationResponseEmptyAttributes.json +0 -22
  215. package/test/unit/examples/contextProviderResponses/queryInformationStaticAttributesResponse.json +0 -27
  216. package/test/unit/examples/contextProviderResponses/updateInformationResponse.json +0 -22
  217. package/test/unit/examples/contextProviderResponses/updateInformationResponse2.json +0 -22
  218. package/test/unit/examples/contextRequests/contextSubscriptionRequest.json +0 -20
  219. package/test/unit/examples/contextRequests/contextSubscriptionRequest2.json +0 -20
  220. package/test/unit/examples/contextRequests/createBidirectionalDevice.json +0 -17
  221. package/test/unit/examples/contextRequests/createDatetimeProvisionedDevice.json +0 -17
  222. package/test/unit/examples/contextRequests/createGeopointProvisionedDevice.json +0 -17
  223. package/test/unit/examples/contextRequests/createMinimumProvisionedDevice.json +0 -17
  224. package/test/unit/examples/contextRequests/createProvisionedDevice.json +0 -32
  225. package/test/unit/examples/contextRequests/createProvisionedDeviceMultientity.json +0 -32
  226. package/test/unit/examples/contextRequests/createProvisionedDeviceWithGroup.json +0 -47
  227. package/test/unit/examples/contextRequests/createProvisionedDeviceWithGroupAndStatic.json +0 -52
  228. package/test/unit/examples/contextRequests/createProvisionedDeviceWithGroupAndStatic2.json +0 -52
  229. package/test/unit/examples/contextRequests/createTimeinstantDevice.json +0 -17
  230. package/test/unit/examples/contextRequests/queryContext1.json +0 -13
  231. package/test/unit/examples/contextRequests/queryContext2.json +0 -13
  232. package/test/unit/examples/contextRequests/queryContextAliasPlugin1.json +0 -10
  233. package/test/unit/examples/contextRequests/queryContextCompressTimestamp1.json +0 -13
  234. package/test/unit/examples/contextRequests/updateActiveAttributes.json +0 -32
  235. package/test/unit/examples/contextRequests/updateContext1.json +0 -22
  236. package/test/unit/examples/contextRequests/updateContext2.json +0 -22
  237. package/test/unit/examples/contextRequests/updateContext3.json +0 -17
  238. package/test/unit/examples/contextRequests/updateContext3WithStatic.json +0 -22
  239. package/test/unit/examples/contextRequests/updateContext4.json +0 -22
  240. package/test/unit/examples/contextRequests/updateContext5.json +0 -19
  241. package/test/unit/examples/contextRequests/updateContextAliasPlugin.json +0 -22
  242. package/test/unit/examples/contextRequests/updateContextAliasPlugin2.json +0 -17
  243. package/test/unit/examples/contextRequests/updateContextAppendMode.json +0 -22
  244. package/test/unit/examples/contextRequests/updateContextCommandError.json +0 -22
  245. package/test/unit/examples/contextRequests/updateContextCommandExpired.json +0 -22
  246. package/test/unit/examples/contextRequests/updateContextCommandFinish.json +0 -22
  247. package/test/unit/examples/contextRequests/updateContextCommandStatus.json +0 -17
  248. package/test/unit/examples/contextRequests/updateContextCompressTimestamp1.json +0 -22
  249. package/test/unit/examples/contextRequests/updateContextCompressTimestamp2.json +0 -29
  250. package/test/unit/examples/contextRequests/updateContextExpressionPlugin1.json +0 -17
  251. package/test/unit/examples/contextRequests/updateContextExpressionPlugin10.json +0 -17
  252. package/test/unit/examples/contextRequests/updateContextExpressionPlugin2.json +0 -27
  253. package/test/unit/examples/contextRequests/updateContextExpressionPlugin3.json +0 -17
  254. package/test/unit/examples/contextRequests/updateContextExpressionPlugin4.json +0 -17
  255. package/test/unit/examples/contextRequests/updateContextExpressionPlugin5.json +0 -27
  256. package/test/unit/examples/contextRequests/updateContextExpressionPlugin6.json +0 -17
  257. package/test/unit/examples/contextRequests/updateContextExpressionPlugin7.json +0 -27
  258. package/test/unit/examples/contextRequests/updateContextExpressionPlugin8.json +0 -22
  259. package/test/unit/examples/contextRequests/updateContextExpressionPlugin9.json +0 -27
  260. package/test/unit/examples/contextRequests/updateContextMiddleware1.json +0 -22
  261. package/test/unit/examples/contextRequests/updateContextMultiEntityPlugin3.json +0 -35
  262. package/test/unit/examples/contextRequests/updateContextMultientityPlugin1.json +0 -30
  263. package/test/unit/examples/contextRequests/updateContextMultientityPlugin2.json +0 -30
  264. package/test/unit/examples/contextRequests/updateContextProcessTimestamp1.json +0 -29
  265. package/test/unit/examples/contextRequests/updateContextStaticAttributes.json +0 -22
  266. package/test/unit/examples/contextRequests/updateContextTimestamp.json +0 -41
  267. package/test/unit/examples/contextRequests/updateContextTimestampOverride.json +0 -22
  268. package/test/unit/examples/contextRequests/updateContextTimestampOverrideWithoutMilis.json +0 -22
  269. package/test/unit/examples/contextRequests/updateContextTimestampTimezone.json +0 -41
  270. package/test/unit/examples/contextRequests/updateProvisionActiveAttributes1.json +0 -17
  271. package/test/unit/examples/contextRequests/updateProvisionCommands1.json +0 -27
  272. package/test/unit/examples/contextRequests/updateProvisionDeviceStatic.json +0 -38
  273. package/test/unit/examples/contextRequests/updateProvisionMinimumDevice.json +0 -17
  274. package/test/unit/examples/contextResponses/contextSubscriptionRequest2Success.json +0 -7
  275. package/test/unit/examples/contextResponses/contextSubscriptionRequestSuccess.json +0 -7
  276. package/test/unit/examples/contextResponses/createBidirectionalDeviceSuccess.json +0 -22
  277. package/test/unit/examples/contextResponses/createDatetimeProvisionedDeviceSuccess.json +0 -22
  278. package/test/unit/examples/contextResponses/createGeopointProvisionedDeviceSuccess.json +0 -22
  279. package/test/unit/examples/contextResponses/createProvisionedDeviceSuccess.json +0 -22
  280. package/test/unit/examples/contextResponses/createTimeinstantSuccess.json +0 -22
  281. package/test/unit/examples/contextResponses/queryContext1Success.json +0 -27
  282. package/test/unit/examples/contextResponses/queryContext2Error.json +0 -7
  283. package/test/unit/examples/contextResponses/queryContext2UnknownError.json +0 -6
  284. package/test/unit/examples/contextResponses/queryContext3Error.json +0 -34
  285. package/test/unit/examples/contextResponses/queryContextAliasPlugin1Success.json +0 -27
  286. package/test/unit/examples/contextResponses/queryContextCompressTimestamp1Success.json +0 -27
  287. package/test/unit/examples/contextResponses/updateActiveAttributesSuccess.json +0 -42
  288. package/test/unit/examples/contextResponses/updateContext1Failed.json +0 -7
  289. package/test/unit/examples/contextResponses/updateContext1Success.json +0 -27
  290. package/test/unit/examples/contextResponses/updateContext2Failed.json +0 -35
  291. package/test/unit/examples/contextResponses/updateContextAliasPlugin2Success.json +0 -27
  292. package/test/unit/examples/contextResponses/updateContextAliasPluginSuccess.json +0 -27
  293. package/test/unit/examples/contextResponses/updateContextCommandFinishSuccess.json +0 -27
  294. package/test/unit/examples/contextResponses/updateContextCommandStatusSuccess.json +0 -22
  295. package/test/unit/examples/contextResponses/updateContextCompressTimestamp1Success.json +0 -27
  296. package/test/unit/examples/contextResponses/updateContextCompressTimestamp2Success.json +0 -34
  297. package/test/unit/examples/contextResponses/updateContextEvents1Success.json +0 -27
  298. package/test/unit/examples/contextResponses/updateContextExpressionPlugin1Success.json +0 -22
  299. package/test/unit/examples/contextResponses/updateContextExpressionPlugin2Success.json +0 -22
  300. package/test/unit/examples/contextResponses/updateContextExpressionPlugin3Success.json +0 -22
  301. package/test/unit/examples/contextResponses/updateContextExpressionPlugin5Success.json +0 -32
  302. package/test/unit/examples/contextResponses/updateContextMultientityPlugin1Success.json +0 -40
  303. package/test/unit/examples/contextResponses/updateContextMultientityPlugin2Success.json +0 -40
  304. package/test/unit/examples/contextResponses/updateContextMultientityPlugin3Success.json +0 -40
  305. package/test/unit/examples/contextResponses/updateContextProcessTimestamp1Success.json +0 -27
  306. package/test/unit/examples/contextResponses/updateProvisionActiveAttributes1Success.json +0 -22
  307. package/test/unit/examples/contextResponses/updateProvisionCommands1Success.json +0 -32
  308. package/test/unit/examples/contextResponses/updateProvisionMinimumDeviceSuccess.json +0 -22
  309. package/test/unit/examples/subscriptionRequests/bidirectionalNotification.json +0 -24
  310. package/test/unit/examples/subscriptionRequests/bidirectionalSubscriptionRemove.json +0 -3
  311. package/test/unit/examples/subscriptionRequests/bidirectionalSubscriptionRequest.json +0 -22
  312. package/test/unit/examples/subscriptionRequests/errorNotification.json +0 -24
  313. package/test/unit/examples/subscriptionRequests/simpleNotification.json +0 -24
  314. package/test/unit/examples/subscriptionRequests/simpleSubscriptionRemove.json +0 -3
  315. package/test/unit/examples/subscriptionRequests/simpleSubscriptionRequest.json +0 -19
  316. package/test/unit/examples/subscriptionRequests/simpleSubscriptionRequest1.json +0 -19
  317. package/test/unit/examples/subscriptionResponses/bidirectionalSubscriptionSuccess.json +0 -6
  318. package/test/unit/examples/subscriptionResponses/simpleSubscriptionSuccess.json +0 -6
  319. package/test/unit/expressions/expressionBasedTransformations-test.js +0 -328
  320. package/test/unit/expressions/expressionCombinedTransformations-test.js +0 -306
  321. package/test/unit/expressions/jexlBasedTransformations-test.js +0 -334
  322. package/test/unit/general/contextBrokerOAuthSecurityAccess-test.js +0 -902
  323. package/test/unit/general/https-support-test.js +0 -286
  324. package/test/unit/general/iotam-autoregistration-test.js +0 -368
  325. package/test/unit/general/migration-test.js +0 -256
  326. package/test/unit/lazyAndCommands/active-devices-attribute-update-test.js +0 -168
  327. package/test/unit/lazyAndCommands/command-test.js +0 -341
  328. package/test/unit/lazyAndCommands/lazy-devices-test.js +0 -878
  329. package/test/unit/lazyAndCommands/polling-commands-test.js +0 -421
  330. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin20.json +0 -25
  331. package/test/unit/ngsiService/active-devices-test.js +0 -692
  332. package/test/unit/ngsiService/staticAttributes-test.js +0 -148
  333. package/test/unit/ngsiService/subscriptions-test.js +0 -345
  334. package/test/unit/plugins/alias-plugin_test.js +0 -158
  335. package/test/unit/plugins/bidirectional-plugin_test.js +0 -564
  336. package/test/unit/plugins/compress-timestamp-plugin_test.js +0 -257
  337. package/test/unit/plugins/event-plugin_test.js +0 -119
  338. package/test/unit/plugins/multientity-plugin_test.js +0 -248
  339. package/test/unit/plugins/timestamp-processing-plugin_test.js +0 -119
  340. package/test/unit/provisioning/device-provisioning-api_test.js +0 -748
  341. package/test/unit/provisioning/device-registration_test.js +0 -432
  342. package/test/unit/provisioning/device-update-registration_test.js +0 -326
  343. package/test/unit/provisioning/listProvisionedDevices-test.js +0 -488
  344. package/test/unit/provisioning/provisionDeviceMultientity-test.js +0 -123
  345. package/test/unit/provisioning/removeProvisionedDevice-test.js +0 -244
  346. package/test/unit/provisioning/singleConfigurationMode-test.js +0 -346
  347. package/test/unit/provisioning/updateProvisionedDevices-test.js +0 -436
@@ -25,7 +25,7 @@
25
25
 
26
26
  /* eslint-disable consistent-return */
27
27
 
28
- const request = require('request');
28
+ const request = require('../../request-shim');
29
29
  const statsService = require('./../stats/statsRegistry');
30
30
  const async = require('async');
31
31
  const apply = async.apply;
@@ -34,6 +34,7 @@ const errors = require('../../errors');
34
34
  const utils = require('../northBound/restUtils');
35
35
  const config = require('../../commonConfig');
36
36
  const constants = require('../../constants');
37
+ const jexlParser = require('../../plugins/jexlParser');
37
38
  const moment = require('moment-timezone');
38
39
  const logger = require('logops');
39
40
  const _ = require('underscore');
@@ -43,19 +44,8 @@ const context = {
43
44
  const NGSIv2 = require('./entities-NGSI-v2');
44
45
  const NGSIUtils = require('./ngsiUtils');
45
46
 
46
- const NGSI_LD_NULL = { '@type': 'Intangible', '@value': null };
47
47
  const NGSI_LD_URN = 'urn:ngsi-ld:';
48
48
 
49
- /**
50
- * Determines if a value is a number - Not a Number replaced by Null
51
- *
52
- * @param {String} value Value to be analyzed
53
- * @return {Number}
54
- */
55
- function valueOfOrNull(value) {
56
- return isNaN(value) ? NGSI_LD_NULL : value;
57
- }
58
-
59
49
  /**
60
50
  * Amends an NGSIv2 attribute to NGSI-LD format
61
51
  * All native JSON types are respected and cast as Property values
@@ -66,100 +56,112 @@ function valueOfOrNull(value) {
66
56
  * format
67
57
  */
68
58
 
69
- function convertNGSIv2ToLD(attr) {
70
- const obj = { type: 'Property', value: attr.value };
71
-
72
- if (attr.value === null){
73
- obj.value = NGSI_LD_NULL;
74
- } else {
75
- switch (attr.type.toLowerCase()) {
76
- // Properties
77
- case 'property':
78
- case 'string':
79
- break;
80
-
81
- // Other Native JSON Types
82
- case 'boolean':
83
- obj.value = !!attr.value;
84
- break;
85
- case 'float':
86
- obj.value = valueOfOrNull(Number.parseFloat(attr.value));
87
- break;
88
- case 'integer':
89
- obj.value = valueOfOrNull(Number.parseInt(attr.value));
90
- break;
91
- case 'number':
92
- if (NGSIUtils.isFloat(attr.value)) {
93
- obj.value = valueOfOrNull(Number.parseFloat(attr.value));
94
- } else {
95
- obj.value = valueOfOrNull(Number.parseInt(attr.value));
96
- }
97
- break;
98
-
99
- // Temporal Properties
100
- case 'datetime':
101
- obj.value = {
102
- '@type': 'DateTime',
103
- '@value': moment.tz(attr.value, 'Etc/UTC').toISOString()
104
- };
105
- break;
106
- case 'date':
107
- obj.value = {
108
- '@type': 'Date',
109
- '@value': moment.tz(attr.value, 'Etc/UTC').format(moment.HTML5_FMT.DATE)
110
- };
111
- break;
112
- case 'time':
113
- obj.value = {
114
- '@type': 'Time',
115
- '@value': moment.tz(attr.value, 'Etc/UTC').format(moment.HTML5_FMT.TIME_SECONDS)
116
- };
117
- break;
118
-
119
- // GeoProperties
120
- case 'geoproperty':
121
- case 'point':
122
- case 'geo:point':
123
- case 'geo:json':
124
- obj.type = 'GeoProperty';
125
- obj.value = NGSIUtils.getLngLats('Point', attr.value);
126
- break;
127
- case 'linestring':
128
- case 'geo:linestring':
129
- obj.type = 'GeoProperty';
130
- obj.value = NGSIUtils.getLngLats('LineString', attr.value);
131
- break;
132
- case 'polygon':
133
- case 'geo:polygon':
134
- obj.type = 'GeoProperty';
135
- obj.value = NGSIUtils.getLngLats('Polygon', attr.value);
136
- break;
137
- case 'multipoint':
138
- case 'geo:multipoint':
139
- obj.type = 'GeoProperty';
140
- obj.value = NGSIUtils.getLngLats('MultiPoint', attr.value);;
141
- break;
142
- case 'multilinestring':
143
- case 'geo:multilinestring':
144
- obj.type = 'GeoProperty';
145
- obj.value = NGSIUtils.getLngLats( 'MultiLineString', attr.value);
146
- break;
147
- case 'multipolygon':
148
- case 'geo:multipolygon':
149
- obj.type = 'GeoProperty';
150
- obj.value = NGSIUtils.getLngLats( 'MultiPolygon', attr.value);
151
- break;
152
-
153
- // Relationships
154
- case 'relationship':
155
- obj.type = 'Relationship';
156
- obj.object = attr.value;
157
- delete obj.value;
158
- break;
59
+ function convertAttrNGSILD(attr) {
60
+ // eslint eqeqeq - deliberate double equals to include undefined.
61
+ if (attr.value == null || Number.isNaN(attr.value)) {
62
+ return undefined;
63
+ }
64
+ let obj = { type: 'Property', value: attr.value };
65
+
66
+ switch (attr.type.toLowerCase()) {
67
+ // Properties
68
+ case 'property':
69
+ case 'string':
70
+ case 'text':
71
+ case 'textunrestricted':
72
+ break;
73
+
74
+ // Other Native JSON Types
75
+ case 'boolean':
76
+ obj.value = !!attr.value;
77
+ break;
78
+ case 'float':
79
+ if (isNaN(attr.value)) {
80
+ obj = undefined;
81
+ } else {
82
+ obj.value = Number.parseFloat(attr.value);
83
+ }
84
+ break;
85
+ case 'integer':
86
+ if (isNaN(attr.value)) {
87
+ obj = undefined;
88
+ } else {
89
+ obj.value = Number.parseInt(attr.value);
90
+ }
91
+ break;
92
+ case 'number':
93
+ if (isNaN(attr.value)) {
94
+ obj = undefined;
95
+ } else if (NGSIUtils.isFloat(attr.value)) {
96
+ obj.value = Number.parseFloat(attr.value);
97
+ } else {
98
+ obj.value = Number.parseInt(attr.value);
99
+ }
100
+ break;
159
101
 
160
- default:
161
- obj.value = { '@type': attr.type, '@value': attr.value };
162
- }
102
+ // Temporal Properties
103
+ case 'datetime':
104
+ obj.value = {
105
+ '@type': 'DateTime',
106
+ '@value': moment.tz(attr.value, 'Etc/UTC').toISOString()
107
+ };
108
+ break;
109
+ case 'date':
110
+ obj.value = {
111
+ '@type': 'Date',
112
+ '@value': moment.tz(attr.value, 'Etc/UTC').format(moment.HTML5_FMT.DATE)
113
+ };
114
+ break;
115
+ case 'time':
116
+ obj.value = {
117
+ '@type': 'Time',
118
+ '@value': moment.tz(attr.value, 'Etc/UTC').format(moment.HTML5_FMT.TIME_SECONDS)
119
+ };
120
+ break;
121
+
122
+ // GeoProperties
123
+ case 'geoproperty':
124
+ case 'point':
125
+ case 'geo:point':
126
+ case 'geo:json':
127
+ obj.type = 'GeoProperty';
128
+ obj.value = NGSIUtils.getLngLats('Point', attr.value);
129
+ break;
130
+ case 'linestring':
131
+ case 'geo:linestring':
132
+ obj.type = 'GeoProperty';
133
+ obj.value = NGSIUtils.getLngLats('LineString', attr.value);
134
+ break;
135
+ case 'polygon':
136
+ case 'geo:polygon':
137
+ obj.type = 'GeoProperty';
138
+ obj.value = NGSIUtils.getLngLats('Polygon', attr.value);
139
+ break;
140
+ case 'multipoint':
141
+ case 'geo:multipoint':
142
+ obj.type = 'GeoProperty';
143
+ obj.value = NGSIUtils.getLngLats('MultiPoint', attr.value);
144
+ break;
145
+ case 'multilinestring':
146
+ case 'geo:multilinestring':
147
+ obj.type = 'GeoProperty';
148
+ obj.value = NGSIUtils.getLngLats('MultiLineString', attr.value);
149
+ break;
150
+ case 'multipolygon':
151
+ case 'geo:multipolygon':
152
+ obj.type = 'GeoProperty';
153
+ obj.value = NGSIUtils.getLngLats('MultiPolygon', attr.value);
154
+ break;
155
+
156
+ // Relationships
157
+ case 'relationship':
158
+ obj.type = 'Relationship';
159
+ obj.object = attr.value;
160
+ delete obj.value;
161
+ break;
162
+
163
+ default:
164
+ obj.value = { '@type': attr.type, '@value': attr.value };
163
165
  }
164
166
 
165
167
  if (attr.metadata) {
@@ -178,7 +180,7 @@ function convertNGSIv2ToLD(attr) {
178
180
  obj.unitCode = attr.metadata[key].value;
179
181
  break;
180
182
  default:
181
- obj[key] = convertNGSIv2ToLD(attr.metadata[key]);
183
+ obj[key] = convertAttrNGSILD(attr.metadata[key]);
182
184
  }
183
185
  });
184
186
  delete obj.TimeInstant;
@@ -201,7 +203,7 @@ function formatAsNGSILD(json) {
201
203
  case 'id':
202
204
  id = json[key];
203
205
  obj[key] = id;
204
- if (!id.startsWith(NGSI_LD_URN)){
206
+ if (!id.startsWith(NGSI_LD_URN)) {
205
207
  obj[key] = NGSI_LD_URN + json.type + ':' + id;
206
208
  logger.debug(context, 'Amending id to a valid URN: %s', obj[key]);
207
209
  }
@@ -214,7 +216,7 @@ function formatAsNGSILD(json) {
214
216
  // element for NSGI-LD.
215
217
  break;
216
218
  default:
217
- obj[key] = convertNGSIv2ToLD(json[key]);
219
+ obj[key] = convertAttrNGSILD(json[key]);
218
220
  }
219
221
  });
220
222
 
@@ -288,18 +290,15 @@ function generateNGSILDOperationHandler(operationName, entityName, typeInformati
288
290
  );
289
291
  } else if (response && body && response.statusCode === 404) {
290
292
  logger.info(context, 'Received the following response from the CB:\n\n%s\n\n', bodyAsString);
291
-
292
293
  logger.error(context, 'Operation ' + operationName + ' error connecting to the Context Broker: %j', body);
293
294
 
294
- const errorField = NGSIUtils.getErrorField(body);
295
- if (
296
- response.statusCode &&
297
- response.statusCode === 404 &&
298
- errorField.details.includes(typeInformation.type)
299
- ) {
295
+ let errorField = body.error;
296
+ if (body.description) {
297
+ errorField += ':' + body.description;
298
+ }
299
+
300
+ if (errorField !== undefined) {
300
301
  callback(new errors.DeviceNotFound(entityName));
301
- } else if (errorField.code && errorField.code === '404') {
302
- callback(new errors.AttributeNotFound());
303
302
  } else {
304
303
  callback(new errors.EntityGenericError(entityName, typeInformation.type, body));
305
304
  }
@@ -332,7 +331,6 @@ function sendQueryValueNgsiLD(entityName, attributes, typeInformation, token, ca
332
331
 
333
332
  const options = NGSIUtils.createRequestObject(url, typeInformation, token);
334
333
  options.method = 'GET';
335
- options.json = true;
336
334
 
337
335
  if (!typeInformation || !typeInformation.type) {
338
336
  callback(new errors.TypeNotFound(null, entityName));
@@ -376,7 +374,7 @@ function addLinkedEntities(typeInformation, json) {
376
374
  return calculatedType;
377
375
  }
378
376
  const linkedTypeInfo = {};
379
- if(typeInformation.staticAttributes){
377
+ if (typeInformation.staticAttributes) {
380
378
  typeInformation.staticAttributes.forEach((item) => {
381
379
  if (item.link) {
382
380
  linkedTypeInfo[item.name] = item.link;
@@ -405,6 +403,90 @@ function addLinkedEntities(typeInformation, json) {
405
403
  });
406
404
  }
407
405
 
406
+ /**
407
+ * Remove id, type and any hidden attrs after processing
408
+ *
409
+ * @param {Object} enities Unprocessed entities
410
+ * @param {Object} typeInformation Configuration information for the device.
411
+ */
412
+ function removeHiddenAttrsFromMultiEntity(entities, typeInformation) {
413
+ var explicitAttrsList = [];
414
+ if (typeInformation.explicitAttrs) {
415
+ explicitAttrsList.push('type');
416
+ explicitAttrsList.push('id');
417
+ if (typeof typeInformation.explicitAttrs === 'boolean') {
418
+ if (typeInformation.timestamp) {
419
+ explicitAttrsList.push(constants.TIMESTAMP_ATTRIBUTE);
420
+ }
421
+ if (typeInformation.active) {
422
+ typeInformation.active.forEach((attr) => {
423
+ explicitAttrsList.push(attr.name);
424
+ });
425
+ }
426
+ if (typeInformation.staticAttributes) {
427
+ typeInformation.staticAttributes.forEach((attr) => {
428
+ explicitAttrsList.push(attr.name);
429
+ });
430
+ }
431
+ } else if (typeof typeInformation.explicitAttrs === 'string') {
432
+ entities.forEach((entity) => {
433
+ const attsArray = utils.extractAttributesArrayFromNgsi2Entity(entity);
434
+ const ctx = jexlParser.extractContext(attsArray);
435
+ const res = jexlParser.parse(typeInformation.explicitAttrs, ctx);
436
+ explicitAttrsList = explicitAttrsList.concat(res);
437
+ });
438
+ }
439
+ }
440
+ if (explicitAttrsList.length > 0) {
441
+ entities.forEach((entity) => {
442
+ const hidden = _.difference(_.keys(entity), explicitAttrsList);
443
+ hidden.forEach((attr) => {
444
+ delete entity[attr];
445
+ });
446
+ });
447
+ }
448
+ return entities;
449
+ }
450
+
451
+ /**
452
+ * Remove id, type and any hidden attrs after processing
453
+ *
454
+ * @param {Object} result Unprocessed entity
455
+ * @param {Object} typeInformation Configuration information for the device.
456
+ */
457
+ function removeHiddenAttrs(result, typeInformation) {
458
+ delete result.id;
459
+ delete result.type;
460
+ var explicitAttrsList = [];
461
+ if (typeInformation.explicitAttrs && typeof typeInformation.explicitAttrs === 'boolean') {
462
+ if (typeInformation.timestamp) {
463
+ explicitAttrsList.push(constants.TIMESTAMP_ATTRIBUTE);
464
+ }
465
+ if (typeInformation.active) {
466
+ typeInformation.active.forEach((attr) => {
467
+ explicitAttrsList.push(attr.name);
468
+ });
469
+ }
470
+ if (typeInformation.staticAttributes) {
471
+ typeInformation.staticAttributes.forEach((attr) => {
472
+ explicitAttrsList.push(attr.name);
473
+ });
474
+ }
475
+ } else if (typeInformation.explicitAttrs && typeof typeInformation.explicitAttrs === 'string') {
476
+ const attsArray = utils.extractAttributesArrayFromNgsi2Entity(result);
477
+ const ctx = jexlParser.extractContext(attsArray);
478
+ const res = jexlParser.parse(typeInformation.explicitAttrs, ctx);
479
+ explicitAttrsList = res;
480
+ }
481
+ if (explicitAttrsList.length > 0) {
482
+ const hidden = _.difference(_.keys(result), explicitAttrsList);
483
+ hidden.forEach((attr) => {
484
+ delete result[attr];
485
+ });
486
+ }
487
+ return result;
488
+ }
489
+
408
490
  /**
409
491
  * Makes an update in the Device's entity in the context broker, with the values given in the 'attributes' array.
410
492
  * This array should comply to the NGSI-LD's attribute format.
@@ -416,7 +498,6 @@ function addLinkedEntities(typeInformation, json) {
416
498
  */
417
499
  function sendUpdateValueNgsiLD(entityName, attributes, typeInformation, token, callback) {
418
500
  let payload = {};
419
-
420
501
  const url = '/ngsi-ld/v1/entityOperations/upsert/?options=update';
421
502
 
422
503
  const options = NGSIUtils.createRequestObject(url, typeInformation, token);
@@ -477,11 +558,10 @@ function sendUpdateValueNgsiLD(entityName, attributes, typeInformation, token, c
477
558
  }
478
559
  }
479
560
 
480
- options.json = result;
561
+ options.json = removeHiddenAttrsFromMultiEntity(result, typeInformation);
481
562
  } else {
482
- delete result.id;
483
- delete result.type;
484
- options.json = result;
563
+ // Remove id, type and any hidden attrs after processing
564
+ options.json = removeHiddenAttrs(result, typeInformation);
485
565
  logger.debug(context, 'typeInformation: %j', typeInformation);
486
566
  if (
487
567
  'timestamp' in typeInformation && typeInformation.timestamp !== undefined
@@ -570,6 +650,7 @@ function sendUpdateValueNgsiLD(entityName, attributes, typeInformation, token, c
570
650
  );
571
651
  }
572
652
 
653
+ exports.convertAttrNGSILD = convertAttrNGSILD;
573
654
  exports.formatAsNGSILD = formatAsNGSILD;
574
655
  exports.sendUpdateValue = sendUpdateValueNgsiLD;
575
656
  exports.sendQueryValue = sendQueryValueNgsiLD;
@@ -27,21 +27,24 @@
27
27
 
28
28
  /* eslint-disable consistent-return */
29
29
 
30
- const request = require('request');
30
+ const request = require('../../request-shim');
31
31
  const statsService = require('./../stats/statsRegistry');
32
32
  const async = require('async');
33
33
  const apply = async.apply;
34
34
  const alarms = require('../common/alarmManagement');
35
35
  const errors = require('../../errors');
36
36
  const utils = require('../northBound/restUtils');
37
+ const pluginUtils = require('../../plugins/pluginUtils');
37
38
  const config = require('../../commonConfig');
38
39
  const constants = require('../../constants');
40
+ const jexlParser = require('../../plugins/jexlParser');
39
41
  const moment = require('moment-timezone');
40
42
  const NGSIUtils = require('./ngsiUtils');
41
43
  const logger = require('logops');
42
44
  const context = {
43
45
  op: 'IoTAgentNGSI.Entities-v2'
44
46
  };
47
+ const _ = require('underscore');
45
48
 
46
49
  /**
47
50
  * Amends an NGSIv2 Geoattribute from String to GeoJSON format
@@ -234,11 +237,13 @@ function generateNGSI2OperationHandler(operationName, entityName, typeInformatio
234
237
 
235
238
  logger.error(context, 'Operation ' + operationName + ' error connecting to the Context Broker: %j', body);
236
239
 
237
- const errorField = NGSIUtils.getErrorFieldV2(body);
238
- if (response.statusCode && response.statusCode === 404 && errorField !== undefined) {
240
+ let errorField = body.error;
241
+ if (body.description) {
242
+ errorField += ':' + body.description;
243
+ }
244
+
245
+ if (errorField !== undefined) {
239
246
  callback(new errors.DeviceNotFound(entityName));
240
- } else if (errorField.code && errorField.code === '404') {
241
- callback(new errors.AttributeNotFound());
242
247
  } else {
243
248
  callback(new errors.EntityGenericError(entityName, typeInformation.type, body));
244
249
  }
@@ -288,7 +293,6 @@ function sendQueryValueNgsi2(entityName, attributes, typeInformation, token, cal
288
293
 
289
294
  const options = NGSIUtils.createRequestObject(url, typeInformation, token);
290
295
  options.method = 'GET';
291
- options.json = true;
292
296
 
293
297
  if (!typeInformation || !typeInformation.type) {
294
298
  callback(new errors.TypeNotFound(null, entityName));
@@ -310,6 +314,92 @@ function sendQueryValueNgsi2(entityName, attributes, typeInformation, token, cal
310
314
  );
311
315
  }
312
316
 
317
+ /**
318
+ * Remove id, type and any hidden attrs after processing
319
+ *
320
+ * @param {Object} enities Unprocessed entities
321
+ * @param {Object} typeInformation Configuration information for the device.
322
+ */
323
+ function removeHiddenAttrsFromMultiEntity(entities, typeInformation) {
324
+ var explicitAttrsList = [];
325
+ if (typeInformation.explicitAttrs) {
326
+ explicitAttrsList.push('type');
327
+ explicitAttrsList.push('id');
328
+ if (typeof typeInformation.explicitAttrs === 'boolean') {
329
+ if (typeInformation.timestamp) {
330
+ explicitAttrsList.push(constants.TIMESTAMP_ATTRIBUTE);
331
+ }
332
+
333
+ if (typeInformation.active) {
334
+ typeInformation.active.forEach((attr) => {
335
+ explicitAttrsList.push(attr.name);
336
+ });
337
+ }
338
+ if (typeInformation.staticAttributes) {
339
+ typeInformation.staticAttributes.forEach((attr) => {
340
+ explicitAttrsList.push(attr.name);
341
+ });
342
+ }
343
+ } else if (typeof typeInformation.explicitAttrs === 'string') {
344
+ entities.forEach((entity) => {
345
+ const attsArray = pluginUtils.extractAttributesArrayFromNgsi2Entity(entity);
346
+ const ctx = jexlParser.extractContext(attsArray);
347
+ const res = jexlParser.applyExpression(typeInformation.explicitAttrs, ctx, typeInformation);
348
+ explicitAttrsList = explicitAttrsList.concat(res);
349
+ });
350
+ }
351
+ }
352
+ if (explicitAttrsList.length > 0) {
353
+ logger.debug(context, 'removeHiddenAttrsFromMultiEntity %s', explicitAttrsList);
354
+ entities.forEach((entity) => {
355
+ const hidden = _.difference(_.keys(entity), explicitAttrsList);
356
+ hidden.forEach((attr) => {
357
+ delete entity[attr];
358
+ });
359
+ });
360
+ }
361
+ return entities;
362
+ }
363
+ /**
364
+ * Remove id, type and any hidden attrs after processing
365
+ *
366
+ * @param {Object} result An Unprocessed entity
367
+ * @param {Object} typeInformation Configuration information for the device.
368
+ */
369
+ function removeHiddenAttrs(result, typeInformation) {
370
+ delete result.id;
371
+ delete result.type;
372
+ var explicitAttrsList = [];
373
+ if (typeInformation.explicitAttrs && typeof typeInformation.explicitAttrs === 'boolean') {
374
+ if (typeInformation.timestamp) {
375
+ explicitAttrsList.push(constants.TIMESTAMP_ATTRIBUTE);
376
+ }
377
+ if (typeInformation.active) {
378
+ typeInformation.active.forEach((attr) => {
379
+ explicitAttrsList.push(attr.name);
380
+ });
381
+ }
382
+ if (typeInformation.staticAttributes) {
383
+ typeInformation.staticAttributes.forEach((attr) => {
384
+ explicitAttrsList.push(attr.name);
385
+ });
386
+ }
387
+ } else if (typeInformation.explicitAttrs && typeof typeInformation.explicitAttrs === 'string') {
388
+ const attsArray = pluginUtils.extractAttributesArrayFromNgsi2Entity(result);
389
+ const ctx = jexlParser.extractContext(attsArray);
390
+ const res = jexlParser.applyExpression(typeInformation.explicitAttrs, ctx, typeInformation);
391
+ explicitAttrsList = res;
392
+ }
393
+ if (explicitAttrsList.length > 0) {
394
+ logger.debug(context, 'removeHiddenAttrs %s', explicitAttrsList);
395
+ const hidden = _.difference(_.keys(result), explicitAttrsList);
396
+ hidden.forEach((attr) => {
397
+ delete result[attr];
398
+ });
399
+ }
400
+ return result;
401
+ }
402
+
313
403
  /**
314
404
  * Makes an update in the Device's entity in the context broker, with the values given in the 'attributes' array. This
315
405
  * array should comply to the NGSIv2's attribute format.
@@ -324,7 +414,7 @@ function sendUpdateValueNgsi2(entityName, attributes, typeInformation, token, ca
324
414
 
325
415
  let url = '/v2/entities/' + entityName + '/attrs';
326
416
 
327
- if (typeInformation.type) {
417
+ if (typeInformation && typeInformation.type) {
328
418
  url += '?type=' + typeInformation.type;
329
419
  }
330
420
 
@@ -339,9 +429,6 @@ function sendUpdateValueNgsi2(entityName, attributes, typeInformation, token, ca
339
429
  return;
340
430
  }
341
431
 
342
- payload.id = entityName;
343
- payload.type = typeInformation.type;
344
-
345
432
  for (let i = 0; i < attributes.length; i++) {
346
433
  if (attributes[i].name && attributes[i].type) {
347
434
  payload[attributes[i].name] = {
@@ -357,7 +444,9 @@ function sendUpdateValueNgsi2(entityName, attributes, typeInformation, token, ca
357
444
  return;
358
445
  }
359
446
  }
360
-
447
+ //overwritte if id or type missnamed atributes reach this point
448
+ payload.id = entityName;
449
+ payload.type = typeInformation.type;
361
450
  payload = NGSIUtils.castJsonNativeAttributes(payload);
362
451
  async.waterfall(
363
452
  [
@@ -390,7 +479,7 @@ function sendUpdateValueNgsi2(entityName, attributes, typeInformation, token, ca
390
479
  }
391
480
  options.json = {
392
481
  actionType: 'append',
393
- entities: result
482
+ entities: removeHiddenAttrsFromMultiEntity(result, typeInformation)
394
483
  };
395
484
  if (config.getConfig().appendMode === true) {
396
485
  options.json.actionType = 'append';
@@ -398,9 +487,7 @@ function sendUpdateValueNgsi2(entityName, attributes, typeInformation, token, ca
398
487
  options.json.actionType = 'update';
399
488
  }
400
489
  } else {
401
- delete result.id;
402
- delete result.type;
403
- options.json = result;
490
+ options.json = removeHiddenAttrs(result, typeInformation);
404
491
  logger.debug(context, 'typeInformation: %j', typeInformation);
405
492
  if (
406
493
  'timestamp' in typeInformation && typeInformation.timestamp !== undefined
@@ -429,6 +516,13 @@ function sendUpdateValueNgsi2(entityName, attributes, typeInformation, token, ca
429
516
  // Purge object_id from entities before sent to CB
430
517
  // object_id was added by createNgsi2Entity to allow multientity
431
518
  // with duplicate attribute names.
519
+
520
+ //some entities may be empty if they had only wrong attributes id-type
521
+ //we filter the array
522
+ if (options.json.entities) {
523
+ options.json.entities = options.json.entities.filter((value) => Object.keys(value).length > 0);
524
+ }
525
+
432
526
  let att;
433
527
  if (options.json.entities) {
434
528
  for (let entity = 0; entity < options.json.entities.length; entity++) {
@@ -49,14 +49,11 @@ function init() {
49
49
  case 'ld':
50
50
  entityHandler = require('./entities-NGSI-LD');
51
51
  break;
52
- case 'v2':
53
- entityHandler = require('./entities-NGSI-v2');
54
- break;
55
52
  case 'mixed':
56
53
  entityHandler = require('./entities-NGSI-mixed');
57
54
  break;
58
55
  default:
59
- entityHandler = require('./entities-NGSI-v1');
56
+ entityHandler = require('./entities-NGSI-v2');
60
57
  }
61
58
  }
62
59
 
@@ -135,9 +132,10 @@ function executeWithDeviceInformation(operationFunction) {
135
132
  attributes,
136
133
  deviceInformation
137
134
  );
138
- config.getGroupRegistry().getType(type, function (error, deviceGroup) {
135
+ const currentType = type ? type : deviceInformation.type;
136
+ config.getGroupRegistry().getType(currentType, function (error, deviceGroup) {
139
137
  let typeInformation;
140
- const configDeviceInfo = config.getConfig().types[type];
138
+ const configDeviceInfo = config.getConfig().types[currentType];
141
139
  if (error) {
142
140
  logger.debug(context, 'error %j in get group device', error);
143
141
  }