feat: Permettre aux enseignants de créer et gérer les devoirs
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

Les enseignants avaient besoin d'un outil pour créer des devoirs assignés
à leurs classes, avec filtrage automatique par matière selon la classe
sélectionnée. Le système valide que la date d'échéance tombe un jour
ouvrable (lundi-vendredi) et empêche les dates dans le passé.

Le domaine modélise le devoir comme un agrégat avec pièces jointes,
statut brouillon/publié, et événements métier (création, modification,
suppression). Les handlers de notification écoutent ces événements pour
les futurs envois aux parents et élèves.
This commit is contained in:
2026-03-12 10:11:06 +01:00
parent 56bc808d85
commit e9efb90f59
51 changed files with 4776 additions and 7 deletions

View File

@@ -0,0 +1,112 @@
<?php
declare(strict_types=1);
namespace App\Scolarite\Infrastructure\Api\Resource;
use ApiPlatform\Metadata\ApiProperty;
use ApiPlatform\Metadata\ApiResource;
use ApiPlatform\Metadata\Delete;
use ApiPlatform\Metadata\Get;
use ApiPlatform\Metadata\GetCollection;
use ApiPlatform\Metadata\Patch;
use ApiPlatform\Metadata\Post;
use App\Scolarite\Domain\Model\Homework\Homework;
use App\Scolarite\Infrastructure\Api\Processor\CreateHomeworkProcessor;
use App\Scolarite\Infrastructure\Api\Processor\DeleteHomeworkProcessor;
use App\Scolarite\Infrastructure\Api\Processor\UpdateHomeworkProcessor;
use App\Scolarite\Infrastructure\Api\Provider\HomeworkCollectionProvider;
use App\Scolarite\Infrastructure\Api\Provider\HomeworkItemProvider;
use DateTimeImmutable;
use Symfony\Component\Validator\Constraints as Assert;
#[ApiResource(
shortName: 'Homework',
operations: [
new GetCollection(
uriTemplate: '/homework',
provider: HomeworkCollectionProvider::class,
name: 'get_homework_list',
),
new Get(
uriTemplate: '/homework/{id}',
provider: HomeworkItemProvider::class,
name: 'get_homework',
),
new Post(
uriTemplate: '/homework',
processor: CreateHomeworkProcessor::class,
validationContext: ['groups' => ['Default', 'create']],
name: 'create_homework',
),
new Patch(
uriTemplate: '/homework/{id}',
provider: HomeworkItemProvider::class,
processor: UpdateHomeworkProcessor::class,
validationContext: ['groups' => ['Default', 'update']],
name: 'update_homework',
),
new Delete(
uriTemplate: '/homework/{id}',
provider: HomeworkItemProvider::class,
processor: DeleteHomeworkProcessor::class,
name: 'delete_homework',
),
],
)]
final class HomeworkResource
{
#[ApiProperty(identifier: true)]
public ?string $id = null;
#[Assert\NotBlank(message: 'La classe est requise.', groups: ['create'])]
#[Assert\Uuid(message: 'L\'identifiant de la classe doit être un UUID valide.', groups: ['create'])]
public ?string $classId = null;
#[Assert\NotBlank(message: 'La matière est requise.', groups: ['create'])]
#[Assert\Uuid(message: 'L\'identifiant de la matière doit être un UUID valide.', groups: ['create'])]
public ?string $subjectId = null;
public ?string $teacherId = null;
#[Assert\NotBlank(message: 'Le titre est requis.', groups: ['create', 'update'])]
#[Assert\Length(max: 255, maxMessage: 'Le titre ne peut pas dépasser 255 caractères.')]
public ?string $title = null;
public ?string $description = null;
#[Assert\NotBlank(message: 'La date d\'échéance est requise.', groups: ['create', 'update'])]
public ?string $dueDate = null;
public ?string $status = null;
public ?string $className = null;
public ?string $subjectName = null;
public ?DateTimeImmutable $createdAt = null;
public ?DateTimeImmutable $updatedAt = null;
public static function fromDomain(
Homework $homework,
?string $className = null,
?string $subjectName = null,
): self {
$resource = new self();
$resource->id = (string) $homework->id;
$resource->classId = (string) $homework->classId;
$resource->subjectId = (string) $homework->subjectId;
$resource->teacherId = (string) $homework->teacherId;
$resource->title = $homework->title;
$resource->description = $homework->description;
$resource->dueDate = $homework->dueDate->format('Y-m-d');
$resource->status = $homework->status->value;
$resource->className = $className;
$resource->subjectName = $subjectName;
$resource->createdAt = $homework->createdAt;
$resource->updatedAt = $homework->updatedAt;
return $resource;
}
}