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.
Appelle
isolation_backend.create_tenant_storage(tenant)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:
TenantNotFoundError – Si le tenant n’existe pas
TenantInactiveError – Si le tenant est suspendu ou archivé
Ordre de résolution :
Tente de parser comme UUID
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"
Value Objects¶
Module : src.module.tenant.domain.value_objects