<?php
namespace App\DTO\Offer;
use App\Constant\Common;
use AutoMapperPlus\AutoMapperPlusBundle\AutoMapperConfiguratorInterface;
use AutoMapperPlus\Configuration\AutoMapperConfigInterface;
use App\Service\BaseService;
class OfferMapper extends BaseService implements AutoMapperConfiguratorInterface
{
public function configure(AutoMapperConfigInterface $config): void
{
$mapping = $this->autoMapper->getConfiguration()->registerMapping('App\Entity\Offer', 'App\DTO\Offer\OfferOutputList')
->forMember('url', function (\App\Entity\Offer $offer) {
return $this->offerService->getUrl($offer);
})
->forMember('urlReview', function (\App\Entity\Offer $offer) {
return $this->offerService->getUrl($offer, Common::REVIEW);
})
->forMember('campuses', function (\App\Entity\Offer $offer) {
$campuses = $offer->getCampuses();
if (!$campuses) return null;
$result = [];
foreach ($campuses as $campus) {
$result[] = [
'id' => $campus->getId(),
'name' => $campus->getName()
];
}
return $result;
})
->forMember('contract', function (\App\Entity\Offer $offer) {
$contact = $offer->getContract();
if (!$contact) return null;
return [
'id' => $contact->getId(),
'name' => $contact->getName(),
'name_display' => $contact->getNameDisplay()
];
})
->forMember('expertise', function (\App\Entity\Offer $offer) {
$expertises = $offer->getExpertise();
if (!$expertises) return null;
$result = [];
foreach ($expertises as $expertise) {
$result[] = [
'id' => $expertise->getId(),
'name' => $expertise->getName()
];
}
return $result;
})
->forMember('studyLevel', function (\App\Entity\Offer $offer) {
$studyLevel = $offer->getStudyLevel();
if (!$studyLevel) return null;
return [
'id' => $studyLevel->getId(),
'name' => $studyLevel->getName()
];
})
->forMember('skill', function (\App\Entity\Offer $offer) {
$skills = $offer->getSkill();
if (!$skills) return null;
$result = [];
foreach ($skills as $skill) {
$result[] = [
'id' => $skill->getId(),
'name' => $skill->getName()
];
}
return $result;
})
->forMember('validDate', function (\App\Entity\Offer $offer) {
return $offer->getValidDate() ? $offer->getValidDate()->format('Y-m-d') : null;
})
->forMember('fullName', function (\App\Entity\Offer $offer) {
return $offer->getFirstName() . " " . $offer->getLastName();
})
->forMember('totalApply', function (\App\Entity\Offer $offer) {
return count($this->autoMapper->mapMultiple($offer->getJobCandidates(), 'App\DTO\JobCandidate\JobCandidateOutput'));
});
$mappingOutput = $config->registerMapping('App\Entity\Offer', 'App\DTO\Offer\OfferOutput')
->copyFromMapping($mapping)
->forMember('gender', function (\App\Entity\Offer $offer) {
return $offer->getGender() ? 1 : 0;
})
->forMember('logoUrl', function (\App\Entity\Offer $offer) {
if (!$offer->getLogo()) return null;
return $this->uploadsStorage->publicUrl($offer->getLogo());
})
->forMember('descriptionFileUrl', function (\App\Entity\Offer $offer) {
if (!$offer->getDescriptionFile()) return null;
return $this->uploadsStorage->publicUrl($offer->getDescriptionFile());
});
$config->registerMapping('App\Entity\Offer', 'App\DTO\Offer\OfferOutputEmail')
->copyFromMapping($mappingOutput);
}
}