|
import requests
|
|
import os
|
|
import json
|
|
from utils import TEMP_DIR
|
|
|
|
def connect_graphql(graphql_url, api_token, graphql_token_header, session_hash):
|
|
try:
|
|
|
|
query = """
|
|
query IntrospectionQuery {
|
|
__schema {
|
|
queryType { name }
|
|
mutationType { name }
|
|
subscriptionType { name }
|
|
types {
|
|
...FullType
|
|
}
|
|
directives {
|
|
name
|
|
description
|
|
locations
|
|
args {
|
|
...InputValue
|
|
}
|
|
}
|
|
}
|
|
}
|
|
fragment FullType on __Type {
|
|
kind
|
|
name
|
|
description
|
|
fields(includeDeprecated: true) {
|
|
name
|
|
description
|
|
args {
|
|
...InputValue
|
|
}
|
|
type {
|
|
...TypeRef
|
|
}
|
|
isDeprecated
|
|
deprecationReason
|
|
}
|
|
inputFields {
|
|
...InputValue
|
|
}
|
|
interfaces {
|
|
...TypeRef
|
|
}
|
|
enumValues(includeDeprecated: true) {
|
|
name
|
|
description
|
|
isDeprecated
|
|
deprecationReason
|
|
}
|
|
possibleTypes {
|
|
...TypeRef
|
|
}
|
|
}
|
|
fragment InputValue on __InputValue {
|
|
name
|
|
description
|
|
type { ...TypeRef }
|
|
defaultValue
|
|
}
|
|
fragment TypeRef on __Type {
|
|
kind
|
|
name
|
|
ofType {
|
|
kind
|
|
name
|
|
ofType {
|
|
kind
|
|
name
|
|
ofType {
|
|
kind
|
|
name
|
|
ofType {
|
|
kind
|
|
name
|
|
ofType {
|
|
kind
|
|
name
|
|
ofType {
|
|
kind
|
|
name
|
|
ofType {
|
|
kind
|
|
name
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
"""
|
|
print("Connecting to GraphQL Endpoint")
|
|
|
|
|
|
headers = {"Content-Type": "application/json"}
|
|
if graphql_token_header and api_token:
|
|
headers[graphql_token_header] = api_token
|
|
response = requests.post(graphql_url, headers=headers, json={"query": query})
|
|
response.raise_for_status()
|
|
|
|
introspection_result = response.json()
|
|
|
|
client_schema = introspection_result["data"]["__schema"]
|
|
|
|
|
|
type_names_query = """
|
|
query IntrospectionQuery {
|
|
__schema {
|
|
types {
|
|
name
|
|
}
|
|
}
|
|
}
|
|
"""
|
|
types_response = requests.post(graphql_url, headers=headers, json={"query": type_names_query})
|
|
|
|
types_response_results =types_response.json()
|
|
|
|
types_names = types_response_results["data"]
|
|
|
|
type_names = []
|
|
for name in types_names["__schema"]["types"]:
|
|
type_names.append(name["name"])
|
|
|
|
session_path = 'graphql'
|
|
|
|
dir_path = TEMP_DIR / str(session_hash) / str(session_path)
|
|
os.makedirs(dir_path, exist_ok=True)
|
|
|
|
with open(f'{dir_path}/schema.json', 'w') as fp:
|
|
json.dump(client_schema, fp, indent=2)
|
|
|
|
return ["success","<p style='color:green;text-align:center;font-size:18px;'>GraphQL API connected successful</p>", type_names]
|
|
except Exception as e:
|
|
print("GraphQL CONNECTION ERROR")
|
|
print(e)
|
|
return ["error",f"<p style='color:red;text-align:center;font-size:18px;font-weight:bold;'>ERROR: {e}</p>"]
|
|
|
|
|