Files
user-engine/docs/examples.md

2.9 KiB

Examples

Register An Application And Catalog

from user_engine.adapters.local import InMemoryUserEngineStore, LocalAuthorizationCheckPort
from user_engine.service import UserEngineService
from user_engine.testing.fixtures import (
    FixtureIdentityClaimsAdapter,
    human_actor_claims,
    sample_application,
    sample_application_binding,
    sample_catalog,
)

service = UserEngineService(
    store=InMemoryUserEngineStore(),
    identity_adapter=FixtureIdentityClaimsAdapter(),
    authorization=LocalAuthorizationCheckPort(),
)

session = service.me(human_actor_claims(), correlation_id="corr-me")
service.register_application(
    session.actor,
    sample_application(),
    binding=sample_application_binding(),
    correlation_id="corr-app",
)
service.publish_catalog(session.actor, sample_catalog(), correlation_id="corr-cat")

Request An Application Projection

from user_engine.domain import ProfileScope, ProjectionType

service.set_profile_value(
    session.actor,
    session.user.user_id,
    "demo.display_density",
    "compact",
    scope=ProfileScope.APPLICATION,
    scope_id="app.demo",
    tenant="tenant:coulomb",
    application_id="app.demo",
    correlation_id="corr-profile",
)

projection = service.projection(
    session.actor,
    session.user.user_id,
    ProjectionType.APPLICATION_RUNTIME,
    tenant="tenant:coulomb",
    application_id="app.demo",
    correlation_id="corr-projection",
)

Handle Profile Change Events

Profile mutations append audit records and outbox events in the same service operation. Outbox consumers should treat event_id as the delivery id and correlation_id as the cross-system trace key.

for event in service.outbox_events():
    print(event.event_type, event.aggregate_id, event.correlation_id)

Onboard A Family Dataspace

from user_engine.domain import FamilyDataspaceRequest, FamilyMemberSpec, FamilyRole

owner = service.me(owner_claims, correlation_id="corr-owner")
onboarding = service.onboard_family_dataspace(
    owner.actor,
    FamilyDataspaceRequest(
        tenant="tenant:worsch-family",
        family_scope_id="family:worsch",
        family_display_name="Worsch Family",
        application_id="app.personal-dataspace",
        oidc_client_id="personal-dataspace-client",
        protected_system_id="dataspace.personal.worsch",
        member_specs=(
            FamilyMemberSpec(
                primary_email="child@example.test",
                display_name="Child Member",
                role=FamilyRole.CHILD,
            ),
        ),
    ),
    correlation_id="corr-family-onboard",
)

accepted = service.accept_family_invitation(
    child_claims,
    onboarding.invitations[0].invitation.invitation_id,
    correlation_id="corr-child-accept",
)

accepted.identity_context is the canon-facing context for the SSO adapter. accepted.claims_projection is the application-visible profile projection for the personal dataspace.