from typing import AsyncGenerator import strawberry from channels.db import database_sync_to_async from strawberry.types import Info from core.graphql.pubsub import pubsub from core.graphql.types.account import AccountContactType from core.graphql.utils import _extract_id from core.models.account import AccountContact @strawberry.type class Subscription: @strawberry.subscription(description="Subscribe to account contact creation events") async def account_contact_created(self, info: Info) -> AsyncGenerator[AccountContactType, None]: user = info.context.user if not user or not user.is_authenticated: raise PermissionError("Authentication required") async with pubsub.subscribe("account_contact_created") as subscriber: async for payload in subscriber: entity_id = await _extract_id(payload) try: instance = await database_sync_to_async(AccountContact.objects.get)(pk=entity_id) except AccountContact.DoesNotExist: continue yield instance @strawberry.subscription(description="Subscribe to account contact updates") async def account_contact_updated(self, info: Info) -> AsyncGenerator[AccountContactType, None]: user = info.context.user if not user or not user.is_authenticated: raise PermissionError("Authentication required") async with pubsub.subscribe("account_contact_updated") as subscriber: async for payload in subscriber: entity_id = await _extract_id(payload) try: instance = await database_sync_to_async(AccountContact.objects.get)(pk=entity_id) except AccountContact.DoesNotExist: continue yield instance @strawberry.subscription(description="Subscribe to account contact deletion events") async def account_contact_deleted(self, info: Info) -> AsyncGenerator[strawberry.ID, None]: user = info.context.user if not user or not user.is_authenticated: raise PermissionError("Authentication required") async with pubsub.subscribe("account_contact_deleted") as subscriber: async for payload in subscriber: entity_id = await _extract_id(payload) yield strawberry.ID(entity_id)