ExportXMLWordPrintable

    • Type: New Feature
    • Resolution: Fixed
    • Priority: Major
    • Component/s: Cloud Integrations
    • None

      It would be helpful to be able to "merge" updates into Cloud Integration entities with service properties, such that existing properties are preserved while new properties are added, as well as being able to replace existing properties. For example given an existing datum stream with service properties like

      {
        "foo": "bar",
        "sourceIdMap": {
      	"/1/inv/a": "/INV/1",
      	"/1/inv/b": "/INV/2"
        },
        "virtualSourceIds": [
      	"/GEN/1"
        ],
        "placeholders": {
          "siteId": 1
        }
      }
      

      Then given an "update" object like:

      {
        "sourceIdMap": {
      	"/1/inv/c": "/INV/2"
        },
        "virtualSourceIds": [
      	"/GEN/2"
        ],
        "placeholders": null,
        "operationalDateRanges": {
      	"/1/inv/b": "/2025-10-29T16:00:00Z",
      	"/1/inv/c": "2025-11-04T15:00:00Z/"
        }
      }
      

      to reach a final merged object like:

      {
        "foo": "bar",
        "sourceIdMap": {
      	"/1/inv/a": "/INV/1",
      	"/1/inv/b": "/INV/2",
      	"/1/inv/c": "/INV/2"
        },
        "virtualSourceIds": [
      	"/GEN/1", "/GEN/2"
        ],
        "placeholders": null,
        "operationalDateRanges": {
      	"/1/inv/b": "/2025-10-29T16:00:00Z",
      	"/1/inv/c": "2025-11-04T15:00:00Z/"
        }
      }
      

      It might not always be desirable to merge nested objects/arrays as done there, so another "simple" mode should be supported. In the previous example, if "simple" mode had been enabled, the final object would instead look like:

      {
        "foo": "bar",
        "sourceIdMap": {
      	"/1/inv/c": "/INV/2"
        },
        "virtualSourceIds": [
      	"/GEN/2"
        ],
        "placeholders": null,
        "operationalDateRanges": {
      	"/1/inv/b": "/2025-10-29T16:00:00Z",
      	"/1/inv/c": "2025-11-04T15:00:00Z/"
        }
      }
      

      Special care must be taken to preserve *sensitive* properties, which are encrypted in the database and returned as hashed values from API endpoints: the original encrypted form should remain as-is after the merge. For example, the service properties in the database might look like:

      {
        "password": "{AES}vne4qcnijehgPi1CkXlcf..."
      }
      

      and returned from an API endpoint like:

      {
        "password": "{SSHA-256}46wg6pvN8/lzU4ZR5Y..."
      }
      

      Given an update object like

      {
        "foo": "bar"
      }
      

      then the final database object should preseve the password value like:

      {
        "password": "{AES}vne4qcnijehgPi1CkXlcf...",
        "foo": "bar"
      }
      

            Assignee:
            Matt Magoffin
            Reporter:
            Matt Magoffin
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved: