"""Context management logic.""" import copy from typing import Any from flask import g, request from video.constants import header from video.models.ows import account from video.models.sql import queries def create_context() -> None: """Create a context.""" if g.get("context"): raise Exception correlation_id = g.correlation_id account_type = request.headers.get(header.GRASS_ACCOUNT_TYPE) account_id = int(request.headers.get(header.GRASS_ACCOUNT_ID, 0)) or None user_id = request.headers.get(header.ORCHARD_USER_ID) vendor_id = account_id if account_type == "vendor" else None subaccount_id = account_id if account_type == "subaccount" else None if subaccount_id and not vendor_id: vendor_id = account.get_subaccount(subaccount_id)["vendor_id"] initial_context = {"correlation_id": correlation_id} if vendor_id: initial_context["vendor_id"] = vendor_id if subaccount_id: initial_context["subaccount_id"] = subaccount_id if user_id: initial_context["user_id"] = user_id if request.method in ["POST", "PUT", "PATCH", "DELETE"]: context_id = queries.persist_context(initial_context) initial_context_with_id = copy.deepcopy(initial_context) initial_context_with_id["id"] = context_id g.context = initial_context_with_id else: g.context = initial_context def add_to_context(additional_context: dict[str, Any]) -> None: """Add to context. Args: additional_context (dict): Context to add. """ if request.method in ["POST", "PUT", "PATCH", "DELETE"]: additional_context["id"] = g.context["id"] queries.persist_context(additional_context) g.context.update(additional_context)