Skip to content

Advanced Server Features

Handling Various Activities

The @app.on() decorator can handle any type of ActivityPub activity, such as Create, Like, Announce, and Undo, in addition to Follow. By specifying the activity type as an argument, the handler will be executed when that activity is POSTed to the inbox.

from apkit.models import Create, Undo, Like
from apkit.server.types import Context

@app.on(Create)
async def on_create(ctx: Context):
    activity = ctx.activity
    if not isinstance(activity, Create): return
    # Process Create activity
    print(f"Received Create activity: {activity.id}")

@app.on(Undo)
async def on_undo(ctx: Context):
    activity = ctx.activity
    if not isinstance(activity, Undo): return
    # Process Undo activity (e.g., undoing a Like)
    if isinstance(activity.object, Like):
        print(f"Undo Like: {activity.object.id}")

Structuring with SubRouter

As your application grows, you can use SubRouter to modularize your endpoints, similar to FastAPI's APIRouter. apkit-specific decorators like @sub.nodeinfo() are also available on SubRouter.

# in routes/nodeinfo.py
from apkit.server import SubRouter

sub = SubRouter()

@sub.nodeinfo("/ni/2.0", "2.0")
async def nodeinfo_20_endpoint():
    # ...
    pass

# in main.py
from routes.nodeinfo import sub as nodeinfo_router

app.include_router(nodeinfo_router)