Skip to content

FastAPI Integration Example

This section demonstrates how to integrate forgeevent with a FastAPI-like application, showing how to register event listeners and dispatch events in an async context.

Event and Listener Definitions

First, define your event dataclasses and event types:

from dataclasses import dataclass
from enum import Enum
from forgeevent.handlers.local import LocalHandler
from forgeevent.typing import Event

@dataclass
class AbsPaymentEvent:
    order_id: str

@dataclass
class PaymentSucceededEvent(AbsPaymentEvent):
    pass

@dataclass
class PaymentFailedEvent(AbsPaymentEvent):
    error: str

class EventType(Enum):
    PAYMENT_FAILED = "PaymentFailedEvent"
    PAYMENT_SUCCEEDED = "PaymentSucceededEvent"

async def handle_payment_failed_model(event: Event[PaymentFailedEvent]) -> None:
    """
    Handle payment failed events.
    """
    event_name, payload = event
    print(
        f"Handling event {event_name} for order_id: {payload.order_id} with error: {payload.error}"
    )

def register_listeners(local_handler: LocalHandler) -> None:
    local_handler.register(
        event_name=EventType.PAYMENT_FAILED, listener=handle_payment_failed_model
    )

Application Lifespan and Event Dispatch

You can use an async context manager to manage application startup and shutdown, similar to FastAPI's lifespan events:

from fastapi import FastAPI
from contextlib import asynccontextmanager
from forgeevent.handlers.local import local_handler
from test_registry import EventType, register_listeners, PaymentFailedEvent

@asynccontextmanager
async def lifespan(app: FastAPI):
    register_listeners(local_handler)
    print("ProviderFactory and PaymentService initialized.")
    yield
    print("Cleaning up resources...")

app = FastAPI(lifespan=lifespan)

@app.post("/pay/fail")
async def trigger_failed_payment(order_id: str, error: str):
    """
    Endpoint to simulate a failed payment event and dispatch it through forgeevent.
    """
    await local_handler.handle((
        EventType.PAYMENT_FAILED,
        PaymentFailedEvent(order_id=order_id, error=error),
    ))
    return {"status": "event dispatched"}

# To run the FastAPI app:
if __name__ == "__main__":
    import uvicorn
    uvicorn.run("test_fastapi:app", host="127.0.0.1", port=8000, reload=True)

How it works

  • The register_listeners function registers your event handlers with the local handler.
  • The lifespan context manager simulates FastAPI's startup/shutdown hooks.
  • The main function dispatches a sample event, which will trigger the registered handler.

This pattern can be adapted to real FastAPI applications using the lifespan event or dependency injection.


For more advanced usage, see the Usage Guide and the API Reference.