mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-08-21 07:03:49 +00:00
[accompanyingPeriodWork] add evaluation to normalizer
This commit is contained in:
@@ -0,0 +1,132 @@
|
||||
<?php
|
||||
|
||||
namespace Chill\PersonBundle\Serializer\Normalizer;
|
||||
|
||||
use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWork;
|
||||
use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluation;
|
||||
use Chill\PersonBundle\Entity\Person;
|
||||
use Chill\PersonBundle\Entity\SocialWork\Goal;
|
||||
use Chill\PersonBundle\Entity\SocialWork\Result;
|
||||
use Chill\PersonBundle\Entity\SocialWork\SocialAction;
|
||||
use Chill\PersonBundle\Repository\AccompanyingPeriod\AccompanyingPeriodWorkRepository;
|
||||
use Chill\ThirdPartyBundle\Entity\ThirdParty;
|
||||
use Doctrine\ORM\EntityManagerInterface;
|
||||
use Symfony\Component\Serializer\Exception\BadMethodCallException;
|
||||
use Symfony\Component\Serializer\Exception\ExceptionInterface;
|
||||
use Symfony\Component\Serializer\Exception\ExtraAttributesException;
|
||||
use Symfony\Component\Serializer\Exception\InvalidArgumentException;
|
||||
use Symfony\Component\Serializer\Exception\LogicException;
|
||||
use Symfony\Component\Serializer\Exception\RuntimeException;
|
||||
use Symfony\Component\Serializer\Exception\UnexpectedValueException;
|
||||
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
|
||||
use Symfony\Component\Serializer\Normalizer\ContextAwareDenormalizerInterface;
|
||||
use Symfony\Component\Serializer\Normalizer\DenormalizerAwareInterface;
|
||||
use Symfony\Component\Serializer\Normalizer\DenormalizerAwareTrait;
|
||||
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
|
||||
use Symfony\Component\Serializer\Normalizer\ObjectToPopulateTrait;
|
||||
|
||||
/**
|
||||
* This denormalizer rely on AbstractNormalizer for most of the job, and
|
||||
* add some logic for synchronizing collection.
|
||||
*/
|
||||
class AccompanyingPeriodWorkDenormalizer implements DenormalizerAwareInterface, ContextAwareDenormalizerInterface
|
||||
{
|
||||
use DenormalizerAwareTrait;
|
||||
use ObjectToPopulateTrait;
|
||||
|
||||
private AccompanyingPeriodWorkRepository $workRepository;
|
||||
private EntityManagerInterface $em;
|
||||
|
||||
public const GROUP_CREATE = 'accompanying_period_work:create';
|
||||
public const GROUP_EDIT = 'accompanying_period_work:edit';
|
||||
|
||||
/**
|
||||
* @param AccompanyingPeriodWorkRepository $workRepository
|
||||
*/
|
||||
public function __construct(
|
||||
AccompanyingPeriodWorkRepository $workRepository,
|
||||
EntityManagerInterface $em
|
||||
) {
|
||||
$this->workRepository = $workRepository;
|
||||
$this->em = $em;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function denormalize($data, string $type, string $format = null, array $context = [])
|
||||
{
|
||||
$work = $this->denormalizer->denormalize($data, $type, $format, \array_merge($context,
|
||||
['skip' => self::class]));
|
||||
|
||||
if (\in_array('accompanying_period_work:edit', $context['groups'] ?? [])) {
|
||||
$this->handleEvaluationCollection($data, $work, $format, $context);
|
||||
}
|
||||
|
||||
return $work;
|
||||
}
|
||||
|
||||
private function handleEvaluationCollection(array $data, AccompanyingPeriodWork $work, string $format, array $context)
|
||||
{
|
||||
$dataById = [];
|
||||
$dataWithoutId = [];
|
||||
foreach ($data['accompanyingPeriodWorkEvaluations'] as $e) {
|
||||
if (\array_key_exists('id', $e)) {
|
||||
$dataById[$e['id']] = $e;
|
||||
} else {
|
||||
$dataWithoutId[] = $e;
|
||||
}
|
||||
}
|
||||
|
||||
// partition the separate kept evaluations and removed one
|
||||
list($kept, $removed) = $work->getAccompanyingPeriodWorkEvaluations()
|
||||
->partition(
|
||||
fn(int $key, AccompanyingPeriodWorkEvaluation $a) => \array_key_exists($a->getId(), $dataById)
|
||||
);
|
||||
|
||||
// remove the evaluations from work
|
||||
foreach ($removed as $r) {
|
||||
$work->removeAccompanyingPeriodWorkEvaluation($r);
|
||||
}
|
||||
// handle the evaluation kept
|
||||
foreach ($kept as $k) {
|
||||
$this->denormalizer->denormalize(
|
||||
$dataById[$k->getId()],
|
||||
AccompanyingPeriodWorkEvaluation::class,
|
||||
$format,
|
||||
\array_merge(
|
||||
$context,
|
||||
[
|
||||
'groups' => [ 'write' ],
|
||||
AbstractNormalizer::OBJECT_TO_POPULATE => $k
|
||||
]
|
||||
)
|
||||
);
|
||||
}
|
||||
// create new evaluation
|
||||
foreach ($dataWithoutId as $newData) {
|
||||
$evaluation = $this->denormalizer->denormalize(
|
||||
$newData,
|
||||
AccompanyingPeriodWorkEvaluation::class,
|
||||
$format,
|
||||
\array_merge($context, ['groups' => [ 'accompanying_period_work_evaluation:create']]
|
||||
)
|
||||
);
|
||||
$work->addAccompanyingPeriodWorkEvaluation($evaluation);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function supportsDenormalization($data, string $type, string $format = null, array $context = []): bool
|
||||
{
|
||||
return $type === AccompanyingPeriodWork::class
|
||||
&& ($context['skip'] ?? null) !== self::class
|
||||
&& \is_array($data)
|
||||
&& \array_key_exists("type", $data)
|
||||
&& $data["type"] === 'accompanying_period_work';
|
||||
}
|
||||
|
||||
|
||||
}
|
Reference in New Issue
Block a user