Files
Classeo/backend/src/Scolarite/Infrastructure/Api/Resource/GradeResource.php
Mathias STRASSER dc2be898d5
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
feat: Provisionner automatiquement un nouvel établissement
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.
2026-04-16 09:27:25 +02:00

105 lines
3.2 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Scolarite\Infrastructure\Api\Resource;
use ApiPlatform\Metadata\ApiProperty;
use ApiPlatform\Metadata\ApiResource;
use ApiPlatform\Metadata\GetCollection;
use ApiPlatform\Metadata\Post;
use ApiPlatform\Metadata\Put;
use App\Scolarite\Domain\Model\Grade\Grade;
use App\Scolarite\Infrastructure\Api\Processor\PublishGradesProcessor;
use App\Scolarite\Infrastructure\Api\Processor\SaveAppreciationProcessor;
use App\Scolarite\Infrastructure\Api\Processor\SaveGradesProcessor;
use App\Scolarite\Infrastructure\Api\Provider\GradeCollectionProvider;
use DateTimeImmutable;
#[ApiResource(
shortName: 'Grade',
operations: [
new GetCollection(
uriTemplate: '/evaluations/{evaluationId}/grades',
uriVariables: ['evaluationId'],
provider: GradeCollectionProvider::class,
itemUriTemplate: '/grades/{id}',
name: 'get_evaluation_grades',
),
new Put(
uriTemplate: '/evaluations/{evaluationId}/grades',
uriVariables: ['evaluationId'],
read: false,
processor: SaveGradesProcessor::class,
name: 'save_evaluation_grades',
),
new Put(
uriTemplate: '/grades/{id}/appreciation',
read: false,
processor: SaveAppreciationProcessor::class,
name: 'save_grade_appreciation',
),
new Post(
uriTemplate: '/evaluations/{evaluationId}/publish',
uriVariables: ['evaluationId'],
read: false,
processor: PublishGradesProcessor::class,
name: 'publish_evaluation_grades',
),
],
)]
final class GradeResource
{
#[ApiProperty(identifier: true)]
public ?string $id = null;
public ?string $evaluationId = null;
public ?string $studentId = null;
public ?string $studentName = null;
public ?float $value = null;
public ?string $status = null;
public ?string $appreciation = null;
public ?string $createdByName = null;
public ?bool $isReplacement = null;
public ?DateTimeImmutable $createdAt = null;
public ?DateTimeImmutable $updatedAt = null;
/** @var array<array{studentId: string, value: ?float, status: string}>|null */
public ?array $grades = null;
public ?bool $published = null;
public ?DateTimeImmutable $gradesPublishedAt = null;
public static function fromDomain(
Grade $grade,
?string $studentName = null,
?string $createdByName = null,
?bool $isReplacement = null,
): self {
$resource = new self();
$resource->id = (string) $grade->id;
$resource->evaluationId = (string) $grade->evaluationId;
$resource->studentId = (string) $grade->studentId;
$resource->studentName = $studentName;
$resource->value = $grade->value?->value;
$resource->status = $grade->status->value;
$resource->appreciation = $grade->appreciation;
$resource->createdByName = $createdByName;
$resource->isReplacement = $isReplacement;
$resource->createdAt = $grade->createdAt;
$resource->updatedAt = $grade->updatedAt;
return $resource;
}
}