1. Data exchange format - nuvoleweb/integration GitHub Wiki

Data is exchanged using a pre-defined format providing support for:

  • Custom metadata
  • Multilingual content
  • References between content items

Metadata

Each document must have the following list of metadata properties on its root level.

| Name | Description | | --- | --- | --- | | _id | Document ID, unique per Backend. For example g39g84hb0428bhf0s1389xziv7r83f33 | | type | Document type, it usually matches with the Resource Schema this document refers to. For example article | | default_language | Default document language as ISO639 codes or und for "Undetermined" as defined by ISO639-2. For example en, fr or und. | | languages | List of languages the document is available into, generally expressed in a form of an array. For example in JSON: ['en', 'fr']. | | producer_content_id | Content ID unique to the document producer. For example if the producer is a Drupal site then the triplet entity_type-entity_bundle-entity_id is generally a good candidate, like node-article-1. | | producer | Name uniquely identifying a Producer withing a specific Backend. | | created | Creation date as YYYY-MM-DD HH:MM:SS. For example 2015-02-19 20:35:34 | | updated | Last update date as YYYY-MM-DD HH:MM:SS. For example 2015-02-19 20:35:34 |

Other custom metadata properties can be added but they would need to be handled separately.

Fields

The exchanged data is stored in a section rooted by the fields property, having the actual fields as sub-property. Each field will express its data as a list language codes having an array of strings as values. For example:

Referenced fields

Referenced fields will use the und language code and they will contain a list of other documents' IDs.

Default JSON format

JSON is the preferred notation for the data exchange format, although that can be changed by writing a custom formatter plugin to produce and consume data in any other formats.

Below an example of a valid data exchange document:

{
  "_id": "b849bh0qh0qnciwpvi3tn342kc39c24b",
  "type": "article",
  "default_language": "en",
  "producer_content_id": "producer_id",
  "producer": "producer",
  "created": "2015-02-19 20:35:34",
  "updated": "2015-02-23 10:52:34",
  "languages": [
    "fr",
    "en"
  ],
  "fields": {
    "title": {
      "en": [
        "English title article 1"
      ],
      "fr": [
        "French title article 1"
      ]
    },
    "abstract": {
      "en": [
        "English abstract article 1"
      ],
      "fr": [
        "French abstract article 1"
      ]
    },
    "reference": {
      "und": [
        "73765236mkxc3ib92293r9id9guw84u9"
      ]
    }
  }
}

JSON Schema

Documents must validate against the JSON schema below (for example using http://jsonschemalint.com/ or similar tools):

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "version": "1.0",
  "type": "object",
  "properties": {
    "_id": {
      "type": "string",
      "pattern": "^[0-9A-Za-z-_]*$"
    },
    "type": {
      "type": "string",
      "pattern": "^[0-9A-Za-z-_]*$"
    },
    "producer": {
      "type": "string"
    },
    "producer_content_id": {
      "type": "string"
    },
    "created": {
      "type": "string",
      "pattern": "^([0-9]{2,4})-([0-1][0-9])-([0-3][0-9])(?:( [0-2][0-9]):([0-5][0-9]):([0-5][0-9]))$"
    },
    "updated": {
      "type": "string",
      "pattern": "^([0-9]{2,4})-([0-1][0-9])-([0-3][0-9])(?:( [0-2][0-9]):([0-5][0-9]):([0-5][0-9]))$"
    },
    "default_language": {
      "type": "string",
      "pattern": "^([a-z]{2}|und)$"
    },
    "languages": {
      "type": "array",
      "items": {
        "type": "string",
        "pattern": "^([a-z]{2}|und)$"
      },
      "additionalProperties": false
    },
    "fields": {
      "type": "object",
      "patternProperties": {
        "^[a-z_]*$": {
          "type": "object",
          "patternProperties": {
            "^([a-z]{2}|und)$": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          "additionalProperties": false
        }
      },
      "additionalProperties": false
    }
  },
  "required": [
    "_id",
    "fields",
    "type",
    "producer",
    "producer_content_id",
    "created",
    "updated",
    "default_language",
    "languages"
  ]
}