Les administrateurs peuvent désormais configurer l'identité visuelle de leur établissement : upload d'un logo (PNG/JPG, redimensionné automatiquement via Imagick) et choix d'une couleur principale appliquée aux boutons et à la navigation. La couleur est validée côté client et serveur pour garantir la conformité WCAG AA (contraste ≥ 4.5:1 sur fond blanc). Les personnalisations sont injectées dynamiquement via CSS variables et visibles immédiatement après sauvegarde.
43 lines
1.3 KiB
PHP
43 lines
1.3 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Administration\Application\Command\DeleteLogo;
|
|
|
|
use App\Administration\Application\Service\LogoUploader;
|
|
use App\Administration\Domain\Model\SchoolBranding\SchoolBranding;
|
|
use App\Administration\Domain\Model\SchoolClass\SchoolId;
|
|
use App\Administration\Domain\Repository\SchoolBrandingRepository;
|
|
use App\Shared\Domain\Clock;
|
|
use App\Shared\Domain\Tenant\TenantId;
|
|
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
|
|
|
|
#[AsMessageHandler(bus: 'command.bus')]
|
|
final readonly class DeleteLogoHandler
|
|
{
|
|
public function __construct(
|
|
private SchoolBrandingRepository $brandingRepository,
|
|
private LogoUploader $logoUploader,
|
|
private Clock $clock,
|
|
) {
|
|
}
|
|
|
|
public function __invoke(DeleteLogoCommand $command): SchoolBranding
|
|
{
|
|
$tenantId = TenantId::fromString($command->tenantId);
|
|
$schoolId = SchoolId::fromString($command->schoolId);
|
|
|
|
$branding = $this->brandingRepository->get($schoolId, $tenantId);
|
|
|
|
if ($branding->logoUrl !== null) {
|
|
$this->logoUploader->deleteByUrl($branding->logoUrl);
|
|
}
|
|
|
|
$branding->supprimerLogo($this->clock->now());
|
|
|
|
$this->brandingRepository->save($branding);
|
|
|
|
return $branding;
|
|
}
|
|
}
|