Untitled

 avatar
unknown
plain_text
5 months ago
2.0 kB
2
Indexable
from typing import Annotated

from fastapi import BackgroundTasks, Depends
from sqlalchemy import select
from sqlalchemy.orm import Session
from strawberry.dataloader import DataLoader
from strawberry.fastapi import BaseContext

from app.dependencies import current_user, get_db
from app.helpers.custom_logger import get_backend_logger
from app.models import User

from .loaders import StatusLoader, UserByLoginLoader, UserLoader, ValidationLoader


class Context(BaseContext):
    """
    Represents the context for GraphQL resolvers.

    Args:
        current_user (str | None): The current user.
        session (Session): The database session.

    Attributes:
        current_user (int | None): The ID of the current user.
        session (Session): The database session.
    """

    def __init__(
        self,
        current_user: str | None,
        session: Session,
        background_tasks: BackgroundTasks,
    ):
        self.current_user = None
        self.session = session
        self.background_tasks = background_tasks
        self.backend_logger = get_backend_logger()
        if current_user is not None:
            self.current_user = session.scalar(
                select(User).filter(User.email.ilike(current_user))
            )

        # Create all the data loaders for this context
        self.load_user = DataLoader(load_fn=UserLoader(session))
        self.load_user_by_login = DataLoader(load_fn=UserByLoginLoader(session))
        self.load_status = DataLoader(load_fn=StatusLoader(session))
        self.load_validation = DataLoader(load_fn=ValidationLoader(session))


def context_dependency(
    current_user: Annotated[current_user, Depends()],
    session: Annotated[get_db, Depends()],
    background_tasks: BackgroundTasks,
) -> Context:
    return Context(current_user, session, background_tasks)


def get_context(context: Annotated[context_dependency, Depends()]):
    return context
Editor is loading...
Leave a Comment