feat: Provisionner automatiquement un nouvel établissement
Some checks failed
CI / Backend Tests (push) Has been cancelled
CI / Frontend Tests (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
CI / Naming Conventions (push) Has been cancelled
CI / Build Check (push) Has been cancelled

Lorsqu'un super-admin crée un établissement via l'interface, le système
doit automatiquement créer la base tenant, exécuter les migrations,
créer le premier utilisateur admin et envoyer l'invitation — le tout
de manière asynchrone pour ne pas bloquer la réponse HTTP.

Ce mécanisme rend chaque établissement opérationnel dès sa création
sans intervention manuelle sur l'infrastructure.
This commit is contained in:
2026-04-08 13:55:41 +02:00
parent bec211ebf0
commit 3575d095a1
106 changed files with 9586 additions and 380 deletions

View File

@@ -21,6 +21,9 @@ use function sprintf;
use Symfony\Component\HttpClient\HttpClient;
use function sys_get_temp_dir;
use Throwable;
use function unlink;
/**
@@ -42,6 +45,16 @@ final class GouvFrCalendarApiTest extends TestCase
protected function setUp(): void
{
// Skip si l'API externe est injoignable (timeout réseau, DNS, etc.)
try {
$check = HttpClient::create()->request('GET', 'https://data.education.gouv.fr', [
'timeout' => 5,
]);
$check->getStatusCode();
} catch (Throwable) {
self::markTestSkipped('API data.education.gouv.fr injoignable — test ignoré.');
}
$this->tempDir = sys_get_temp_dir() . '/classeo-calendar-test-' . uniqid();
mkdir($this->tempDir);
@@ -55,6 +68,10 @@ final class GouvFrCalendarApiTest extends TestCase
protected function tearDown(): void
{
if (!isset($this->tempDir) || !is_dir($this->tempDir)) {
return;
}
// Supprimer les fichiers générés
$files = glob($this->tempDir . '/*.json');
foreach ($files as $file) {