Stockage Tenant-Aware

Le module de stockage organise les fichiers téléchargés par tenant pour prévenir l’accès cross-tenant aux fichiers.

Module : src.share_kernel.infrastructure.storage

TenantFileSystemStorage

class src.share_kernel.infrastructure.storage.TenantFileSystemStorage(FileSystemStorage)

Stockage sur le système de fichiers local, organisé par tenant.

Structure : MEDIA_ROOT/tenants/<tenant_slug>/<upload_path>

get_tenant_upload_root() str

Retourne le répertoire racine pour le tenant courant.

path(name: str) str

Retourne le chemin complet du fichier, scopé au tenant.

url(name: str) str

Retourne l’URL du fichier, scopée au tenant.

save(name, content, max_length=None) str

Sauvegarde un fichier sous le répertoire du tenant. Crée le répertoire automatiquement si nécessaire.

Configuration :

# settings.py
DEFAULT_FILE_STORAGE = 'src.share_kernel.infrastructure.storage.TenantFileSystemStorage'

Structure sur disque :

media/
├── tenants/
│   ├── acme-corp/
│   │   ├── invoices/
│   │   │   └── inv-001.pdf
│   │   └── logos/
│   │       └── logo.png
│   └── beta-inc/
│       └── invoices/
│           └── inv-002.pdf
└── shared/
    └── templates/
        └── default.pdf

TenantAzureBlobStorage

class src.share_kernel.infrastructure.storage.TenantAzureBlobStorage(Storage)

Backend Azure Blob Storage avec préfixes de blob scopés par tenant.

Structure : <container>/tenants/<tenant_slug>/<name>

Prérequis : pip install azure-storage-blob

Parameters:
  • connection_string – Chaîne de connexion Azure (ou AZURE_STORAGE_CONNECTION_STRING)

  • container_name – Nom du container (ou AZURE_STORAGE_CONTAINER_NAME, défaut: "media")

  • custom_domain – Domaine CDN personnalisé (optionnel)

  • overwrite_files – Autoriser l’écrasement (défaut: False)

_open(name, mode='rb') File

Ouvre et retourne un fichier depuis Azure Blob Storage.

_save(name, content) str

Sauvegarde un fichier dans Azure Blob Storage.

delete(name) None

Supprime un fichier d’Azure Blob Storage.

exists(name) bool

Vérifie si un fichier existe.

size(name) int

Retourne la taille du fichier en octets.

url(name) str

Retourne l’URL du fichier (CDN si configuré).

listdir(path='') tuple[list[str], list[str]]

Liste le contenu d’un répertoire (répertoires, fichiers).

Configuration :

# settings.py
DEFAULT_FILE_STORAGE = 'src.share_kernel.infrastructure.storage.TenantAzureBlobStorage'

AZURE_STORAGE_CONNECTION_STRING = "DefaultEndpointsProtocol=https;..."
AZURE_STORAGE_CONTAINER_NAME = "media"
AZURE_STORAGE_CUSTOM_DOMAIN = "cdn.example.com"  # Optionnel