# Copyright 2024 VyOS maintainers and contributors # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library. If not, see . # pylint: disable=import-outside-toplevel import typing from ariadne.asgi import GraphQL from starlette.middleware.cors import CORSMiddleware if typing.TYPE_CHECKING: from fastapi import FastAPI def graphql_init(app: 'FastAPI'): from ..session import SessionState from .libs.token_auth import get_user_context state = SessionState() # import after initializaion of state from .bindings import generate_schema schema = generate_schema() in_spec = state.introspection # remove route and reinstall below, for any changes; alternatively, test # for config_diff before proceeding graphql_clear(app) if state.origins: origins = state.origins app.add_route( '/graphql', CORSMiddleware( GraphQL( schema, context_value=get_user_context, debug=True, introspection=in_spec, ), allow_origins=origins, allow_methods=('GET', 'POST', 'OPTIONS'), allow_headers=('Authorization',), ), ) else: app.add_route( '/graphql', GraphQL( schema, context_value=get_user_context, debug=True, introspection=in_spec, ), ) def graphql_clear(app: 'FastAPI'): for r in app.routes: if r.path == '/graphql': app.routes.remove(r)