from datetime import timedelta from fastapi import FastAPI, Security, Depends, BackgroundTasks, APIRouter from fastapi_jwt import JwtAuthorizationCredentials from fastapi_jwt.jwt import JwtAccessBearerCookie from sqlalchemy import select from starlette.responses import RedirectResponse from strawberry.fastapi import GraphQLRouter from config import GRAPHIQL, APP_DEBUG from database import async_session, models from graphql_schema.schema import GraphQLContext, schema def setup_graphql_endpoint(app: FastAPI, access_security: JwtAccessBearerCookie): if APP_DEBUG: debug_router = APIRouter() @debug_router.get("/graphql/autologin") async def autologin(): access_token = access_security.create_access_token(subject={"id": 6, "name": "Franta Vomacka"}) response = RedirectResponse(url="/graphql") access_security.set_access_cookie(response, access_token, expires_delta=timedelta(days=14)) return response app.include_router(debug_router) async def setup_graphql_context(credentials: JwtAuthorizationCredentials = Security(access_security)): user_id = credentials['id'] if credentials else None organization_ids = set() if user_id: async with async_session() as db: organization_ids = set((await db.scalars( select(models.user_is_in_organization.c.organization_id) .filter(models.user_is_in_organization.c.user_id == user_id) )).all()) return GraphQLContext( user_id=user_id, organization_ids=organization_ids, jwt_auth_credentials=credentials, jwt=access_security, background_tasks=Depends(BackgroundTasks) ) graphql_app = GraphQLRouter( schema, graphiql=GRAPHIQL, debug=APP_DEBUG, context_getter=setup_graphql_context ) app.include_router(graphql_app, prefix="/graphql")