53 lines
2.0 KiB
Python
53 lines
2.0 KiB
Python
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")
|