Genesis Foods GraphQL API Playground
Genesis Foods GraphQL API Playground Repository
GitHub - esha/genesis-foods-api-examples: Genesis Foods GraphQL API Playground
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()