Homepage

Sharing Data Between Instances

Last edit: Jul 14, 2023

This guide will help you share data between Instances using the remote_records and remote_users functionality. They are available on the Profile, User, and Record GraphQL result types.

You can use this functionality to keep data that is the same across the globe and you don't want to change it (or deploy it) in multiple places every time it changes. For example, a list of countries, country ISO codes, or timezones.

Find an example below.

Requirements

To follow the steps in this tutorial, you should be familiar with Records and Users.

Steps

Step 1: Create model

First, create a model named child_model with the schema below:

---
name: child_model
custom_attributes:
- name: child_title
  type: string
- name: child_id
  type: integer
- name: parent_id_array
  type: array
---

Step 2: Create child objects

To ensure you have some data in the child_model table, create two objects with the data below:

{
  "child_id": 1,
  "child_title": "Title 1",
  "parent_id_array": [
    "100",
    "101"
  ]
}
{
  "child_id": 2,
  "child_title": "Title 2",
  "parent_id_array": [
    "101"
  ]
}

Step 3: Prepare Graph query

Create the get_main_records query that will retrieve records including the referenced remote data:

query get_main_records {
  records(
    page: 1
    per_page: 10
    sort: [{id: {order: ASC}}]
    filter: {
      table: { value: "child_model" }
    }
  ) {
    results {
      id
      properties
      remote: remote_records(
        endpoint: {
          url: "https://some-remote-api/linked-records.json",
          token: "secret-token"
        }
        join_on_property: "parent_id_array"
      ) {
        id
        properties
      }
    }
  }
}

You will not execute the above query for now because you first need to ensure the Instance at https://some-remote-api/linked-records.json returns the correct data that you need.

Step 4: Create page

Create the page below inside the some-remote-api Instance:


---
slug: linked-records
format: json
authorization_policies:
  - api_key_check
---

{% graphql g = 'get_linked_records', ids: params.ids %}

{{ g.records.results | json | html_safe }}

Step 5: Create authorization policy and Graph query

Create the referenced authorization policy and Graph query.

Authorization policy:


---
name: api_key_check
redirect_to: /
---
{% if context.headers.HTTP_AUTHENTICATION_TOKEN == "secret-token" -%}true{% endif -%}  

Graph query:

query get_linked_records($ids: [String!]) {
  records(
    page: 1
    per_page: 10
    sort: [{id: {order: ASC}}]
    filter: {
      properties: [
        { name: "parent_id", value_in: $ids }
      ]
    }
  ) {
    results {
      id
      properties
    }
  }
}

Step 6: Create model

Create the model with the schema below in the some-remote-api instance.

---
name: parent_model
custom_attributes:
- name: parent_title
  type: string
- name: parent_id
  type: integer
---

Step 7: Create parent objects

{
  "parent_id": 100,
  "parent_title": "Parent Title 1"
}
{
  "parent_id": 101,
  "parent_title": "Parent Title 2"
}

Step 8: Execute Graph query

You are now ready to execute the get_main_records query, in the first Instance.

For each object returned, under remote, a list of records retrieved from the remote endpoint (https://some-remote-api/linked-records.json) will be listed if their ids (parent_id) are included in the current object's parent_id_array list of ids. Note that all remote objects will be retrieved in a single remote API call, so ensure the per_page parameter in get_linked_records is sufficiently large to accomodate all items to be retrieved.

Questions?

We are always happy to help with any questions you may have.

contact us