|
| 1 | +from dataclasses import dataclass |
| 2 | +from typing import Annotated, Any |
| 3 | + |
| 4 | +from fastapi import BackgroundTasks, Depends |
| 5 | +from injection.ext.fastapi import Inject |
| 6 | + |
| 7 | +from cq import Bus, Command, CommandBus, DeferredBus, Event, EventBus, Query, QueryBus |
| 8 | + |
| 9 | +__all__ = ("DeferredCommandBus", "DeferredEventBus", "DeferredQueryBus") |
| 10 | + |
| 11 | + |
| 12 | +@dataclass(repr=False, eq=False, frozen=True, slots=True) |
| 13 | +class FastAPIDeferredBus[I](DeferredBus[I]): |
| 14 | + background_tasks: BackgroundTasks |
| 15 | + bus: Bus[I, Any] |
| 16 | + |
| 17 | + async def defer(self, input_value: I, /) -> None: |
| 18 | + self.background_tasks.add_task(self.bus.dispatch, input_value) |
| 19 | + |
| 20 | + |
| 21 | +async def new_deferred_command_bus[T]( |
| 22 | + background_tasks: BackgroundTasks, |
| 23 | + command_bus: Inject[CommandBus[T]], |
| 24 | +) -> DeferredBus[Command]: |
| 25 | + return FastAPIDeferredBus(background_tasks, command_bus) |
| 26 | + |
| 27 | + |
| 28 | +async def new_deferred_event_bus( |
| 29 | + background_tasks: BackgroundTasks, |
| 30 | + event_bus: Inject[EventBus], |
| 31 | +) -> DeferredBus[Event]: |
| 32 | + return FastAPIDeferredBus(background_tasks, event_bus) |
| 33 | + |
| 34 | + |
| 35 | +async def new_deferred_query_bus[T]( |
| 36 | + background_tasks: BackgroundTasks, |
| 37 | + query_bus: Inject[QueryBus[T]], |
| 38 | +) -> DeferredBus[Query]: |
| 39 | + return FastAPIDeferredBus(background_tasks, query_bus) |
| 40 | + |
| 41 | + |
| 42 | +DeferredCommandBus = Annotated[DeferredBus[Command], Depends(new_deferred_command_bus)] |
| 43 | +DeferredEventBus = Annotated[DeferredBus[Event], Depends(new_deferred_event_bus)] |
| 44 | +DeferredQueryBus = Annotated[DeferredBus[Query], Depends(new_deferred_query_bus)] |
0 commit comments