Esempio n. 1
0
def test_graphql():
    type_defs = load_schema_from_path('schema.graphql')

    query = QueryType()
    building = ObjectType('Building')
    resident = ObjectType('Resident')

    # test dataset
    rec = building_with_id(None, None, "1")
    assert rec == {'id': '1', 'buildYear': 2009}
    residents = resolve_residents_in_building(rec, None)
    assert len(residents) > 0

    # field holders
    query.set_field('building_with_id', building_with_id)
    building.set_field('residents', resolve_residents_in_building)

    schema = make_executable_schema(type_defs, [building, resident, query])

    q = """{
        building_with_id(_id:"1"){
            id
            residents {
                id
                name
            }
        }
    }
    """
    result = graphql_sync(schema, q)
    pprint(result.data)
    assert result.data['building_with_id']['id'] == '1'
Esempio n. 2
0
class User():
    def __init__(self, username, name):
        self.username = username
        self.name = name
        self.type = ObjectType("User")
        self.type.set_field("username", lambda _, info: self.username)
        self.type.set_field("name", lambda _, info: self.name)
Esempio n. 3
0
def test_field_resolver_can_be_set_using_setter(schema):
    query = ObjectType("Query")
    query.set_field("hello", lambda *_: "World")
    query.bind_to_schema(schema)

    result = graphql_sync(schema, "{ hello }")
    assert result.errors is None
    assert result.data == {"hello": "World"}
Esempio n. 4
0
    def __init__(self):
        from sagas.conf import resource_path
        self.type_defs = load_schema_from_path(resource_path('schemas.graphql'))
        query = QueryType()
        bucket = ObjectType('Bucket')
        behave = ObjectType('Behave')
        desc = ObjectType('Desc')

        query.set_field('bucket_behaves', bucket_behaves)
        bucket.set_field('behaves', resolve_behaves)
        self.schema = make_executable_schema(self.type_defs, [behave, bucket, query])
Esempio n. 5
0
def test_interface_resolver_doesnt_override_existing_resolver(schema, interface):
    user = ObjectType("User")
    user.set_field("summary", test_resolver)
    user.bind_to_schema(schema)

    def interface_resolver(*_):
        pass  # pragma: no cover

    interface.set_field("summary", interface_resolver)
    interface.bind_to_schema(schema)

    field = schema.type_map.get("User").fields["summary"]
    assert field.resolve is test_resolver
Esempio n. 6
0
def test_default_fallback_is_not_replacing_already_set_resolvers(schema):
    resolvers_map = ObjectType("Query")
    resolvers_map.set_field("hello", lambda *_: False)
    resolvers_map.set_field("snake_case", lambda *_: False)
    resolvers_map.bind_to_schema(schema)
    fallback_resolvers.bind_to_schema(schema)
    query_root = {
        "hello": True,
        "snake_case": True,
        "camel": True,
        "camel_case": True
    }
    result = graphql_sync(schema, query, root_value=query_root)
    assert result.data == {
        "hello": False,
        "snake_case": False,
        "Camel": None,
        "camelCase": None,
    }
Esempio n. 7
0
def test_custom_resolver_is_called_to_resolve_custom_type_field_value():
    type_defs = """
        type Query {
            test: Custom
        }

        type Custom {
            node: String
        }
    """

    query = QueryType()
    query.set_field("test", lambda *_: {"node": "custom"})

    custom = ObjectType("Custom")
    custom.set_field("node", lambda *_: "deep")

    schema = make_executable_schema(type_defs, [query, custom])

    result = graphql_sync(schema, "{ test { node } }")
    assert result.errors is None
    assert result.data == {"test": {"node": "deep"}}
Esempio n. 8
0
def test_custom_and_default_resolvers_are_combined_to_resolve_custom_type_fields(
):
    type_defs = """
        type Query {
            test: Custom
        }

        type Custom {
            node: String
            default: String
        }
    """

    query = QueryType()
    query.set_field("test", lambda *_: {"node": "custom", "default": "ok"})

    custom = ObjectType("Custom")
    custom.set_field("node", lambda *_: "deep")

    schema = make_executable_schema(type_defs, [query, custom])

    result = graphql_sync(schema, "{ test { node default } }")
    assert result.errors is None
    assert result.data == {"test": {"node": "deep", "default": "ok"}}
Esempio n. 9
0
from api import app, db


from ariadne import load_schema_from_path, make_executable_schema, \
    graphql_sync, snake_case_fallback_resolvers, ObjectType
from ariadne.constants import PLAYGROUND_HTML
from flask import request, jsonify

from api.mutations import resolve_create_todo, resolve_mark_done, \
    resolve_delete_todo, resolve_update_due_date
from api.queries import resolve_todos, resolve_todo

query = ObjectType("Query")
mutation = ObjectType("Mutation")

query.set_field("todos", resolve_todos)
query.set_field("todo", resolve_todo)

mutation.set_field("createTodo", resolve_create_todo)
mutation.set_field("markDone", resolve_mark_done)
mutation.set_field("deleteTodo", resolve_delete_todo)
mutation.set_field("updateDueDate", resolve_update_due_date)

type_defs = load_schema_from_path("schema.graphql")
schema = make_executable_schema(type_defs, query, mutation,
                                snake_case_fallback_resolvers)


@app.route("/graphql", methods=["GET"])
def graphql_playground():
    return PLAYGROUND_HTML, 200
Esempio n. 10
0
import resolver as r

app = Flask(__name__)

type_defs = load_schema_from_path('schema.graphql')

query = QueryType()
students = ObjectType('Students')
classes = ObjectType('Classes')
mutation = ObjectType('Mutation')

query.set_field('student_with_id', r.student_with_id)
query.set_field('class_with_id', r.class_with_id)
query.set_field('all_students', r.all_students)
query.set_field('all_classes', r.all_classes)
mutation.set_field('add_student', r.add_student)
mutation.set_field('add_class', r.add_class)
mutation.set_field('add_student_to_class', r.add_student_to_class)


schema = make_executable_schema(type_defs, [students, classes, query, mutation])


@app.route('/graphql', methods=['GET'])
def playground():
    return PLAYGROUND_HTML, 200


@app.route('/graphql', methods=['POST'])
def graphql_server():
    data = request.get_json()
Esempio n. 11
0
from ariadne import load_schema_from_path, ObjectType, QueryType, MutationType
from features.Composers.composer import resolve_composer
from features.Songs.song import resolve_song, create_song, update_song, get_songs


songQueries = QueryType()
songMutations = MutationType()

songTypes = load_schema_from_path("./features/Songs/song.gql")
songObjectType = ObjectType('FBSong')
songObjectType.set_field("composer", resolve_composer)
songQueries.set_field('getSong', resolve_song)
songQueries.set_field('getSongs', get_songs)
songMutations.set_field('createSong', create_song)
songMutations.set_field('updateSong', update_song)
Esempio n. 12
0
from ariadne.constants import PLAYGROUND_HTML
from flask import Flask, request, jsonify
import resolver as r

app = Flask(__name__)

type_defs = load_schema_from_path('schema.graphql')

#query = QueryType()
query = ObjectType("Query")
mutation = ObjectType("Mutation")
student = ObjectType('Student')
classes = ObjectType('Classes')

#Set Query fields
query.set_field("student", r.getStudents)
query.set_field("class", r.getClasses)

#Set Mutation fields
mutation.set_field("newStudent", r.addStudent)
mutation.set_field("newClass", r.addClass)
mutation.set_field("updateClass", r.updateClass)

schema = make_executable_schema(type_defs, [query, student, classes, mutation])


@app.route('/graphql', methods=['GET'])
def playground():
    return PLAYGROUND_HTML, 200

Esempio n. 13
0
from ariadne import ObjectType

from . import auth
from . import user
from . import forum
from . import thread

query = ObjectType("Query")

query.set_field("user", auth.resolve_login)
query.set_field("pubkey", auth.resolve_pubkey)
query.set_field("isAuthenticated", auth.resolve_isAuthenticated)
query.set_field("isAuthenticated1", auth.resolve_isAuthenticated1)
query.set_field("updateToken", auth.resolve_updateToken)
query.set_field("userProfile", user.resolve_userProfile)
query.set_field("isSuper", user.resolve_isSuper)
query.set_field("sections", forum.resolve_sections)
query.set_field("threads", thread.resolve_threads)
query.set_field("thread", thread.resolve_thread)
Esempio n. 14
0
# Type
query = ObjectType("Query")
mutation = ObjectType("Mutation")
vehicle = ObjectType("Vehicle")
vehicle_type = ObjectType("VehicleType")
location = ObjectType("Location")
membership = ObjectType("Membership")
creditcardinfo = ObjectType("CreditCardInfo")
user = ObjectType("User")
token = ObjectType("Token")
Available_interval = ObjectType("Available_interval")
comment = ObjectType("Comment")

# Set Query fields
query.set_field("vehicles", r.getVehicles)
query.set_field("vehicle", r.getVehicle)
query.set_field("vehicle_types", r.getVehicleTypes)
query.set_field("vehicle_type", r.getVehicleType)
query.set_field("searchLocations", r.searchLocations)
query.set_field("location", r.getLocation)
query.set_field("membership", r.getMembership)
query.set_field("creditcardinfo", r.getCreditCardInfo)
query.set_field("user", r.getUser)
query.set_field("userbytoken", r.tokenGetUser)
query.set_field("searchUsers", r.searchUsers)
query.set_field("login", r.login)
query.set_field("get_available_time", r.get_available_time)
query.set_field("reservation", r.get_reservation)
query.set_field("reservations", r.search_reservations)
query.set_field("search_user_reservations", r.search_user_reservations)
Esempio n. 15
0
from api import app, db
from api import models
from ariadne import load_schema_from_path, make_executable_schema, \
    graphql_sync, snake_case_fallback_resolvers, ObjectType
from ariadne.constants import PLAYGROUND_HTML
from flask import request, jsonify
from api.queries import resolve_employees, resolve_emp
from api.mutations import resolve_create_employee

query = ObjectType("Query")
print(resolve_employees)
query.set_field("employees", resolve_employees)
query.set_field("employee", resolve_emp)

print(resolve_create_employee)
mutation = ObjectType("Mutation")
mutation.set_field("createEmployee", resolve_create_employee)

type_defs = load_schema_from_path("employee.graphql")
schema = make_executable_schema(type_defs, query,
                                snake_case_fallback_resolvers)


@app.route("/graphql", methods=["GET"])
def graphql_playground():
    return PLAYGROUND_HTML, 200


@app.route("/graphql", methods=["POST"])
def graphql_server():
    data = request.get_json()
Esempio n. 16
0
    graphql_sync, snake_case_fallback_resolvers, ObjectType
from ariadne.constants import PLAYGROUND_HTML
from flask import request, jsonify

from api.queries import resolve_match_phrases, resolve_match_tokens, resolve_match_skill, resolve_spacy_meta, \
    resolve_is_english, \
    resolve_language,  resolve_analysis, resolve_wolfram_query, resolve_wolfram_voice, resolve_wolfram_check, \
    resolve_wolfram_conversation

from api.mutations import resolve_register_skill, resolve_register_domain

# The queries
query = ObjectType("Query")
mutation = ObjectType("Mutation")

query.set_field("match_skill", resolve_match_skill)
query.set_field("match_phrases", resolve_match_phrases)
query.set_field("match_tokens", resolve_match_tokens)
query.set_field("spacy_meta", resolve_spacy_meta)
query.set_field("english", resolve_is_english)
query.set_field("language", resolve_language)
query.set_field("analysis", resolve_analysis)
query.set_field("wolfram_query", resolve_wolfram_query)
query.set_field("wolfram_voice", resolve_wolfram_voice)
query.set_field("wolfram_check", resolve_wolfram_check)
query.set_field("wolfram_conversation", resolve_wolfram_conversation)

# Mutations
mutation.set_field("register_skill", resolve_register_skill)
mutation.set_field("register_domain", resolve_register_domain)
Esempio n. 17
0
def create_entity(name, key_resolvers, key_name):
    object_type = ObjectType(name)
    setattr(object_type, "key_resolver", key_resolvers)
    object_type.set_field(key_name, key_resolvers)
    return object_type
Esempio n. 18
0
            mtmPnl=mtmPnl,
            buySell=buySell,
        )
        db.session.add(trade)
        db.session.commit()
        payload = {"success": True, "trade": trade.to_dict()}
    except Exception as e:
        payload = {"success": False, "errors": [str(e)]}
    return payload


def resolve_trades(obj, info, symbol: str = "") -> Dict:
    try:
        trades = [x.to_dict() for x in Trade.query.all()]
        payload = {"success": True, "trades": trades}
    except Exception as e:
        payload = {"success": False, "errors": [str(e)]}
    return payload


query = ObjectType("Query")
query.set_field("trades", resolve_trades)

mutation = ObjectType("Mutation")
mutation.set_field("createTrade", resolve_create_trade)

type_defs = load_schema_from_path("api/schema.graphql")

schema = make_executable_schema(type_defs, query, mutation,
                                snake_case_fallback_resolvers)
Esempio n. 19
0
all_resolvers = []

# Map resolver functions to Query fields using QueryType
if 'Query' in resolvers and len(resolvers['Query']) > 0:
    query = QueryType()
    for q in resolvers['Query']:
        query.set_field(q, resolvers['Query'][q])
    all_resolvers.append(query)

# Map resolver functions to custom type fields using ObjectType
if 'Object' in resolvers and len(resolvers['Object']) > 0:
    for obj in resolvers['Object']:
        objType = ObjectType(obj)
        for fld in resolvers['Object'][obj]:
            objType.set_field(fld, resolvers['Object'][obj][fld])
        all_resolvers.append(objType)

# Map resolver functions to Mutation fields using MutationType
if 'Mutation' in resolvers and len(resolvers['Mutation']) > 0:
    mutation = MutationType()
    for m in resolvers['Mutation']:
        mutation.set_field(m, resolvers['Mutation'][m])
    all_resolvers.append(mutation)

# Map resolver functions to custom scalars using ScalarType
if 'Scalar' in resolvers and len(resolvers['Scalar']) > 0:
    for scalar in resolvers['Scalar']:
        scalarType = ScalarType(scalar)
        scalarType.set_serializer(resolvers['Scalar'][scalar]['serializer'])
        scalarType.set_literal_parser(
Esempio n. 20
0
class Service:
    def __init__(self, service_name, schema, query):
        self.gql_type = ObjectType("_Service")
        self.service_name = service_name
        self.query = query
        self.directives = {
            "key": KeyDirective,
            "requires": RequiresDirective,
            "provides": ProvidesDirective,
            "external": ExternalDirective,
            "extends": ExtendsDirective
        }
        self.sdl = schema
        self.entities = {}
        self.federation_types = [self.gql_type]
        self.query.set_field("_service", self.resolve_service)
        self.gql_type.set_field("sdl", self.resolve_sdl)
        self.gql_type.set_field("name", self.resolve_name)

    def resolve_name(self, info, context):
        return self.service_name

    def resolve_service(self, info, context):
        return self.gql_type

    def resolve_sdl(self, info, context):
        return self.sdl

    def resolve_entities(self, obj, *_):
        return obj["__typename"]

    def _entities(self, *_, representations=None):
        rv = []
        for representation in representations:
            entity_type = self.entities[representation["__typename"]]
            key = {
                k: v
                for (k, v) in representation.items() if k != "__typename"
            }
            entity = entity_type.key_resolver(key)
            entity["__typename"] = representation["__typename"]
            rv.append(entity)
        return rv

    def create_schema_from_template(self):
        template = SERVICE_TEMPLATE
        entity_union_str = self._make_entity_str()
        entity_query_str = ""
        if entity_union_str != "":
            entity_union = UnionType("_Entity")
            entity_union.set_type_resolver(self.resolve_entities)
            self.query.set_field("_entities", self._entities)
            entity_query_str = ENTITY_QUERY
            self.federation_types.append(entity_union)
        template = template.format(union_entities=entity_union_str,
                                   entity_query=entity_query_str,
                                   query_str=self.sdl)
        return make_executable_schema(
            template, [self.query, _Any, _FieldSet] +
            [ObjectType(entity_name)
             for entity_name in self.entities.keys()] + self.federation_types,
            directives=self.directives)

    def _make_entity_str(self):
        if len(self.entities) <= 0:
            return ""
        entity_names = list(self.entities.keys())
        union_str = "union _Entity = " + entity_names[0]
        for entity_name in entity_names[1:]:
            union_str += " | "
            union_str += entity_name
        return union_str

    def add_entity(self, entity_type):
        self.entities[entity_type.name] = entity_type
Esempio n. 21
0
from scoreboardapi import app, db


from ariadne import load_schema_from_path, make_executable_schema, \
    graphql_sync, snake_case_fallback_resolvers, ObjectType
from ariadne.constants import PLAYGROUND_HTML
from flask import request, jsonify

from scoreboardapi.mutations import resolve_create_player,  \
    resolve_delete_player, resolve_update_score
from scoreboardapi.queries import resolve_players, resolve_player

query = ObjectType("Query")
mutation = ObjectType("Mutation")

query.set_field("players", resolve_players)
query.set_field("player", resolve_player)

mutation.set_field("createPlayer", resolve_create_player)
mutation.set_field("deletePlayer", resolve_delete_player)
mutation.set_field("updateScore", resolve_update_score)


type_defs = load_schema_from_path("schema.graphql")
schema = make_executable_schema(
    type_defs, query, mutation, snake_case_fallback_resolvers
)


# access to the main dashboard
@app.route("/graphql", methods=["GET"])
Esempio n. 22
0

@convert_kwargs_to_snake_case
def resolve_update_courses(obj, info, courses):
    courseIdList = []
    for i in range(NO_OF_OBJECTS):
        if courseList[i]["id"] == courses[i]["id"]:
            courseList[i]["course_name"] = courses[i]["course_name"]
            courseList[i]["avg_marks"] = courses[i]["avg_marks"]
            courseIdList.append({"id": courseList[i]["id"]})
    return courseIdList


query = ObjectType("Query")

query.set_field("getCourses", resolve_get_courses)
query.set_field("getCourse", resolve_get_course)

mutation = ObjectType("Mutation")
mutation.set_field("updateCourse", resolve_update_course)
mutation.set_field("updateCourses", resolve_update_courses)

type_defs = load_schema_from_path("course.graphql")
schema = make_executable_schema(type_defs, query, mutation,
                                snake_case_fallback_resolvers)

if __name__ == "__main__":
    populate()
    app.run(debug=True)
"""
query {
Esempio n. 23
0
mutation_query_graphql = MutationType()
mutation_query_graphql.set_field('add_student', r.resolve_student_create)
mutation_query_graphql.set_field('add_class', r.resolve_class_create)
mutation_query_graphql.set_field('add_student_to_class', r.resolve_add_student_to_class)


query_graphql = QueryType()
student_type = ObjectType('Student')
class_type = ObjectType('Class')

query_graphql.set_field('student_by_id', r.resolve_student_by_id)
query_graphql.set_field('class_by_id', r.resolve_class_by_id)
query_graphql.set_field('students', r.resolve_students)
query_graphql.set_field('classes', r.resolve_classes)
class_type.set_field('students', r.resolve_students_in_classes)

schema = make_executable_schema(type_defs, [student_type, class_type, query_graphql, mutation_query_graphql])


@app.route('/graphql', methods=['GET'])
def playground():
    return PLAYGROUND_HTML, 200


@app.route('/graphql', methods=['POST'])
def graphql_server():
    data = request.get_json()
    success, result = graphql_sync(
        schema,
        data,
Esempio n. 24
0
    request: HttpRequest = info.context["request"]

    queryset = Object.objects.filter_for_user(
        request.user).filter(bucket__name=kwargs["bucketS3Name"])

    if "parentS3Key" in kwargs:
        queryset = queryset.filter(
            parent_key=f"{kwargs['bucketS3Name']}/{kwargs['parentS3Key']}", )
    else:
        queryset = queryset.filter(parent_key=f"{kwargs['bucketS3Name']}/", )

    return result_page(queryset=queryset, page=kwargs["page"])


bucket = ObjectType("S3Bucket")
bucket.set_field("tags", resolve_tags)
bucket.set_alias("s3Name", "name")


@bucket.field("icon")
def resolve_icon(obj: Bucket, info):
    request: HttpRequest = info.context["request"]
    return request.build_absolute_uri(static("connector_s3/img/symbol.svg"))


@bucket.field("contentType")
def resolve_content_type(obj: Bucket, info):
    return trans("S3 Bucket")


@bucket.field("objects")
Esempio n. 25
0
from database import init_db


app = Flask(__name__)

type_defs = load_schema_from_path('schema.graphql')

#query = QueryType()
query = ObjectType("Query")
mutation = ObjectType("Mutation")
vehicle = ObjectType("Vehicle")
booking = ObjectType("Booking")


#Set Query fields
query.set_field("vehicle", r.getVehicles)
query.set_field("booking", r.getBookings)

#Set Mutation fields
mutation.set_field("newBooking",r.addBooking)


schema = make_executable_schema(type_defs, [query, booking, vehicle, mutation])

@app.route('/graphql', methods=['GET'])
def playground():
    return PLAYGROUND_HTML, 200
    
@app.route('/graphql', methods=['POST'])
def graphql_server():
    data = request.get_json()
Esempio n. 26
0
    resolved_instance = Instance.objects.filter_for_user(
        request.user).get(pk=kwargs["id"])

    return resolved_instance


instance = ObjectType("Dhis2Instance")


@instance.field("icon")
def resolve_icon(obj: Instance, info):
    request: HttpRequest = info.context["request"]
    return request.build_absolute_uri(static("connector_dhis2/img/symbol.svg"))


instance.set_field("tags", resolve_tags)


@instance.field("contentType")
def resolve_content_type(obj: Instance, info):
    return _("DHIS2 Instance")


dhis2_mutation = MutationType()


@dhis2_mutation.field("dhis2InstanceUpdate")
def resolve_dhis2_instance_update(_, info, **kwargs):
    updated_instance = Instance.objects.get(id=kwargs["id"])
    instance_data = kwargs["input"]
Esempio n. 27
0
from ariadne import QueryType, graphql_sync, make_executable_schema, load_schema_from_path, ObjectType
import resolver as r

type_defs = load_schema_from_path('schema.graphql')
query = QueryType()
mutation = ObjectType('Mutation')
student = ObjectType('student')
classes = ObjectType('classes')
app = Flask(__name__)

#GET method
query.set_field('get_student', r.get_student)
query.set_field('get_class', r.get_class)

#POST method
mutation.set_field('create_student', r.create_student)
mutation.set_field('create_class', r.create_class)

#PATCH method
mutation.set_field('update_stu_class', r.update_stu_class)

schema = make_executable_schema(type_defs, [student, classes, query, mutation])


@app.route('/')
def hello():
    name = request.args.get("name", "World")
    return f'Hello, {escape(name)}!'


@app.route("/graphql", methods=["GET"])
Esempio n. 28
0
from ariadne import ObjectType
from . import auth
from . import user
from . import forum
from . import thread
from . import post

mutation = ObjectType("Mutation")

mutation.set_field("login", auth.resolve_login)
mutation.set_field("register", auth.resolve_register)
mutation.set_field("resetPassword", auth.resolve_resetPassword)
mutation.set_field("updateSetting", user.resolve_updateSetting)
mutation.set_field("sectionAct", forum.resolve_sectionAct)
mutation.set_field("threadAct", thread.resolve_threadAct)
mutation.set_field("postAct", post.resolve_postAct)
Esempio n. 29
0
from ariadne import load_schema_from_path, ObjectType, QueryType, MutationType
from features.Composers.composer import resolve_composer, create_composer, update_composer, get_composers
from features.Songs.song import resolve_songs
from features.Songs.songTypes import songQueries

composerQueries = QueryType()
composerMutations = MutationType()

composerTypes = load_schema_from_path("./features/Composers/composer.gql")
composerObjectType = ObjectType('FBComposer')
composerObjectType.set_field("songs", resolve_songs)
composerQueries.set_field('getComposer', resolve_composer)
songQueries.set_field('getComposers', get_composers)

composerMutations.set_field('createComposer', create_composer)
composerMutations.set_field('updateComposer', update_composer)

Esempio n. 30
0
from api import app, db
from ariadne import load_schema_from_path, make_executable_schema, \
    graphql_sync, snake_case_fallback_resolvers, ObjectType
from ariadne.constants import PLAYGROUND_HTML
from flask import request, jsonify
from api.queries import fetch_wallets, fetch_one_wallet
from api.mutations import create_wallet, delete_wallet, add_coin_to_wallet

query = ObjectType("Query")
mutation = ObjectType("Mutation")

query.set_field("wallets", fetch_wallets)
query.set_field("wallet", fetch_one_wallet)

mutation.set_field("createWallet", create_wallet)
mutation.set_field("deleteWallet", delete_wallet)
mutation.set_field("addNewCoinToWallet", add_coin_to_wallet)

type_defs = load_schema_from_path("schema.graphql")

schema = make_executable_schema(type_defs, query, mutation,
                                snake_case_fallback_resolvers)


@app.route("/graphql", methods=["GET"])
def graphql_playground():
    return PLAYGROUND_HTML, 200


@app.route("/graphql", methods=["POST"])
def graphql_server():