<?php
namespace App\Service\Scholar;
use App\DTO\Channel\ChannelDTO;
use App\DTO\Scholar\TrainingDTO;
use App\Entity\Scholar\Training\Training;
use App\Service\Advice\AdviceManager;
use App\Service\Channel\Image\ImageUrlGenerator;
use App\Service\ChannelUserData\CursusService;
use Knp\Component\Pager\Pagination\PaginationInterface;
use Nellapp\Bundle\SDKBundle\Twig\Runtime\ImageRunTime;
class TrainingTransformerService
{
public function __construct(
private ImageRunTime $imageRunTime,
private ImageUrlGenerator $imageUrlGenerator,
private TrainingService $trainingService,
private CursusService $cursusService,
private AdviceManager $adviceManager,
)
{
}
public function toDTO(Training $training): TrainingDTO
{
$channel = $training->getOwnerChannel();
$channelImage = $this->imageRunTime->getChannelLogoThumbnail($channel);
$channelDTO = new ChannelDTO(
id: $channel->getId(),
imagePath: $channel->getImagePath(),
image: $channel->getImage(),
name: $channel->getName(),
logoUrl: $channelImage,
trainingCount: $this->trainingService->countByChannel($channel),
);
$trainingImageUrl = $this->imageUrlGenerator->getImageUrl($training->getImage(), $channelImage);
$trainingPrice = null;
if (
($trainingProduct = $training->getTrainingProduct()) !== null
&& $trainingProduct->getPrice() !== null
&& $trainingProduct->getPrice() !== "0"
&& $trainingProduct->getPrice() !== "0.00" // Dirty, fix data
&& $trainingProduct->getPrice() !== 0
) {
$trainingPrice = $trainingProduct->getPrice();
}
return new TrainingDTO(
id: $training->getId(),
channel: $channelDTO,
name: $training->getName(),
imageUrl: $trainingImageUrl,
time: $training->getTotalHourDescription() ?: null,
type: $training->getTrainingType(),
diploma: $this->trainingService->getTrainingDiplomaStatusKey($training),
price: $trainingPrice,
freeLessonsCount: count($this->trainingService->getFreeLessonsInTraining($training)),
cursusCount: $this->cursusService->countCursusByTraining($training),
adviceAvg: $this->adviceManager->getAvgValueAdviceByTraining($training),
);
}
/**
* @param Training[] $trainings
* @return TrainingDTO[]
*/
public function toDTOs(iterable $trainings): array
{
return array_map([$this, 'toDTO'], $trainings);
}
public function toPaginationDTOs(PaginationInterface $trainingsPagination): PaginationInterface
{
$trainingsPagination->setItems($this->toDTOs($trainingsPagination->getItems()));
return $trainingsPagination;
}
}