Tenant — Services Domaine

Les services domaine du Tenant Context encapsulent la logique métier qui ne relève pas d’un seul agrégat.

Module : src.module.tenant.domain.services

provision_tenant

src.module.tenant.domain.services.provision_tenant(tenant, isolation_backend, event_publisher) None[source]

Provisionne le stockage d’un nouveau tenant et émet l’événement de création.

  1. Appelle isolation_backend.create_tenant_storage(tenant)

  2. Publie TenantCreated

Parameters:
  • tenant – Instance du modèle Tenant

  • isolation_backend – Backend d’isolation (schema, RLS, shared_fk)

  • event_publisher – Callable pour publier les événements

from src.module.tenant.domain.services import provision_tenant
from src.share_kernel.infrastructure.isolation import get_isolation_backend
from src.share_kernel.infrastructure.event_bus import publish_event

provision_tenant(
    tenant=my_tenant,
    isolation_backend=get_isolation_backend(),
    event_publisher=publish_event,
)

resolve_tenant_from_identifier

src.module.tenant.domain.services.resolve_tenant_from_identifier(identifier, tenant_queryset) Tenant[source]

Résout un tenant depuis un UUID ou un slug. Valide que le tenant est actif.

Parameters:
  • identifier – UUID string ou slug

  • tenant_queryset – QuerySet pour la recherche

Returns:

Instance Tenant

Raises:

Ordre de résolution :

  1. Tente de parser comme UUID

  2. Si échec, cherche par slug

from src.module.tenant.domain.services import resolve_tenant_from_identifier
from src.module.tenant.models import Tenant

tenant = resolve_tenant_from_identifier("acme-corp", Tenant.objects.all())
tenant = resolve_tenant_from_identifier("550e8400-...", Tenant.objects.all())

validate_membership

src.module.tenant.domain.services.validate_membership(user_id, tenant_id, membership_queryset) TenantMembership[source]

Vérifie qu’un utilisateur a une membership active dans un tenant.

Parameters:
  • user_id – UUID de l’utilisateur

  • tenant_id – UUID du tenant

  • membership_queryset – QuerySet pour la recherche

Returns:

Instance TenantMembership

Raises:

MembershipNotFoundError – Si pas de membership active

Événements domaine

Module : src.module.tenant.domain.events

Tous les événements héritent de DomainEvent et sont enregistrés avec @register_event.

class src.module.tenant.domain.events.TenantCreated(DomainEvent)[source]

Émis lors de la création d’un tenant.

Champs:

tenant_slug, schema_name

Event_type:

"tenant.created"

class src.module.tenant.domain.events.TenantSuspended(DomainEvent)[source]

Émis lors de la suspension d’un tenant.

Champs:

tenant_slug

Event_type:

"tenant.suspended"

class src.module.tenant.domain.events.TenantActivated(DomainEvent)[source]

Émis lors de la réactivation d’un tenant.

Champs:

tenant_slug

Event_type:

"tenant.activated"

class src.module.tenant.domain.events.TenantArchived(DomainEvent)[source]

Émis lors de l’archivage d’un tenant.

Champs:

tenant_slug

Event_type:

"tenant.archived"

class src.module.tenant.domain.events.MemberAdded(DomainEvent)[source]

Émis lors de l’ajout d’un membre au tenant.

Champs:

user_id, roles

Event_type:

"tenant.member_added"

class src.module.tenant.domain.events.MemberRemoved(DomainEvent)[source]

Émis lors de la suppression d’un membre.

Champs:

user_id

Event_type:

"tenant.member_removed"

class src.module.tenant.domain.events.MemberRolesUpdated(DomainEvent)[source]

Émis lors de la mise à jour des rôles d’un membre.

Champs:

user_id, membership_id, old_roles, new_roles

Event_type:

"tenant.member_roles_updated"

class src.module.tenant.domain.events.InvitationSent(DomainEvent)[source]

Émis lors de l’envoi d’une invitation.

Champs:

email, invited_by_id

Event_type:

"tenant.invitation_sent"

class src.module.tenant.domain.events.InvitationAccepted(DomainEvent)[source]

Émis lors de l’acceptation d’une invitation.

Champs:

email, user_id

Event_type:

"tenant.invitation_accepted"

Value Objects

Module : src.module.tenant.domain.value_objects

class src.module.tenant.domain.value_objects.TenantContext[source]

Snapshot immuable du contexte tenant courant.

Champs:

tenant_id, tenant_slug, schema_name, status

class src.module.tenant.domain.value_objects.MembershipInfo[source]

Snapshot immuable des informations de membership.

Champs:

membership_id, user_id, tenant_id, roles, abac_attributes, status