Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 2 Current »

Python

Configuration Example (config.ini)

[api]
endpoint = [https://api-preview.trustwell.com/genesis | https://api.trustwell.com/genesis]
api_key = [YOUR_API_KEY]
[files]
output_file = graphql_responses.json
input_file = input_data.json

Import / Export

Bulk Export

Exports are limited to 10,000 entries at any one time. To further refine an export set the searchText value in the input variables.

import requests
import configparser
import json
import os

# Read the configuration file
config = configparser.ConfigParser()
config.read('config.ini')

# Retrieve the API settings
endpoint = config.get('api', 'endpoint')
api_key = config.get('api', 'api_key')

# Retrieve the output file path from the configuration
output_file = config.get('files', 'output_file')

# Ensure the file is written to the local directory
file_path = os.path.join(os.getcwd(), output_file)

# Delete the file if it already exists
if os.path.exists(file_path):
    os.remove(file_path)
    print(f"Existing file '{file_path}' has been deleted.")

# Define the headers
headers = {
    "X-API-KEY": api_key,
    "Content-Type": "application/json"
}

# Define the GraphQL query
query = """
query($input: FoodSearchInput!){
    foods{
        search(input: $input) {
            foodSearchResults{
                id
                name
                modified
                created
                versionName
                eshaCode
                foodType
                product
                supplier
                versionHistoryId
            }
            totalCount
            pageInfo{
                cursor
                hasNextPage
                startCursor
                endCursor
            }
        }
    }
}
"""


def run_query(graphql_query, variables):
    """Run a GraphQL query against the Genesis API with variables."""
    response = requests.post(
        endpoint,
        json={'query': graphql_query, 'variables': variables},
        headers=headers
    )
    if response.status_code == 200:
        return response.json()
    else:
        print(f"Request failed with status code {response.status_code}")
        print(response.text)
        return None


def export(graphql_query, food_type):
    first_entry = True
    """Iterate through each character in the corpus and update the searchText."""
    with open(file_path, "a") as file:

        file.write("[\n")  # Write the opening bracket for the JSON array

        variables = {
            "input": {
                "searchText": '*',
                "foodTypes": [food_type],
                "itemSourceFilter": "Customer",
                "versionFilter": "All",
                "first": 10000,
                "after": 0
            }
        }

        print(f"Running query...")
        result = run_query(graphql_query, variables)
        if result:
            total_count = result.get("data", {}).get("foods", {}).get("search", {}).get("totalCount", 0)
            print(f"Found {total_count} results")
            if total_count > 0:
                if not first_entry:
                    file.write(",\n")  # Add a comma before each entry - except the first
                json.dump(result, file, indent=4)  # Append the JSON response to the file
                first_entry = False
            else:
                print(f"No results found. Skipping write.")

        file.write("\n]")  # Write the closing bracket for the JSON array


if __name__ == "__main__":
    export(query, 'Ingredient')  # Ingredient or Recipe
    print(f"Complete. Exported results to {file_path}")

Bulk Import

import requests
import configparser
import json
import os
import uuid

# Read the configuration file
config = configparser.ConfigParser()
config.read('config.ini')

# Retrieve the API settings
endpoint = config.get('api', 'endpoint')
api_key = config.get('api', 'api_key')

# Define the headers with API Key
headers = {
    "X-API-KEY": api_key,
    "Content-Type": "application/json"
}

# Define the GraphQL mutation for creating an ingredient
mutation = """
mutation($input : CreateFoodInput!){
    foods{
        create(input:$input)
        {
            food{
                id
                name
                definingAmount{
                    quantity{
                        value
                    }
                    unit{
                        id
                        name
                    }
                }
                conversions{
                    from{
                        quantity{
                            value
                        }
                        unit{
                            id
                            name
                        }
                    }
                    to{
                        quantity{
                            value
                        }
                        unit{
                            id
                            name
                        }
                    }
                }
            }
        }
    }
}
"""


def run_mutation(food, food_type):
    """Run the GraphQL mutation to create an ingredient."""
    input_data = {
        "input": {
            "name": food.get("name") + ' ' + food_type + ':' + str(uuid.uuid4()),
            "foodType": food_type,
            # "definingAmount": food.get("definingAmount"),
            # "conversions": food.get("conversions")
        }
    }

    response = requests.post(endpoint, json={"query": mutation, "variables": input_data}, headers=headers)

    if response.status_code == 200:
        return response.json()
    else:
        print(f"Error: {response.status_code} - {response.text}")
        return None


def bulk_import(food_type, file_path):
    """Load JSON data from a file and run the mutation for each ingredient."""
    with open(file_path, 'r') as f:
        data = json.load(f)

    for food in data:
        print(f"Importing {food_type}: {food.get('name')}")
        result = run_mutation(food, food_type)

        if result and "errors" in result:
            print(f"Error while creating {food_type}: {food.get('name')}")
            print(result["errors"])
        elif result:
            created_food = result.get("data", {}).get("foods", {}).get("create", {}).get("food", {})
            print(f"Created {food_type}: {created_food.get('name')} (ID: {created_food.get('id')})")


def main():
    # Load the input file path from config
    input_file_path = config.get('files', 'input_file')

    # Ensure the file exists
    if not os.path.exists(input_file_path):
        print(f"Input file '{input_file_path}' does not exist.")
        return

    # Import ingredients
    bulk_import('Ingredient', input_file_path)

    # Import recipies
    bulk_import('Recipe', input_file_path)


if __name__ == "__main__":
    main()

Bulk Import - Example Data

[
  {
    "name": "API Bulk Add 1",
    "isApproved": false,
    "version": 1,
    "foodType": "Ingredient",
    "definingAmount": {
      "quantity": {
        "value": "100"
      },
      "unit": {
        "id": "a7df0af5-0008-0000-7484-751e8eaf05c6",
        "name": "Gram"
      }
    },
    "conversions": [
      {
        "from": {
          "quantity": {
            "value": "1"
          },
          "unit": {
            "id": "a7df0af5-0063-0000-7484-751e8eaf05c6",
            "name": "Batch Weight"
          }
        },
        "to": {
          "quantity": {
            "value": "100"
          },
          "unit": {
            "id": "a7df0af5-0008-0000-7484-751e8eaf05c6",
            "name": "Gram"
          }
        }
      },
      {
        "from": {
          "quantity": {
            "value": "100"
          },
          "unit": {
            "id": "a7df0af5-0008-0000-7484-751e8eaf05c6",
            "name": "Gram"
          }
        },
        "to": {
          "quantity": {
            "value": "1"
          },
          "unit": {
            "id": "a7df0af5-0064-0000-7484-751e8eaf05c6",
            "name": "Batch Yield"
          }
        }
      }
    ]
  },
  {
    "name": "API Bulk Add 2",
    "isApproved": true,
    "version": 1,
    "foodType": "Ingredient",
    "definingAmount": {
      "quantity": {
        "value": "200"
      },
      "unit": {
        "id": "a7df0af5-0008-0000-7484-751e8eaf05c6",
        "name": "Gram"
      }
    },
    "conversions": [
      {
        "from": {
          "quantity": {
            "value": "1"
          },
          "unit": {
            "id": "a7df0af5-0063-0000-7484-751e8eaf05c6",
            "name": "Batch Weight"
          }
        },
        "to": {
          "quantity": {
            "value": "200"
          },
          "unit": {
            "id": "a7df0af5-0008-0000-7484-751e8eaf05c6",
            "name": "Gram"
          }
        }
      }
    ]
  }
]
  • No labels