This commit is contained in:
Julien Fastré 2022-02-08 19:37:59 +01:00
parent 6b571e87b4
commit 1e81256404
8 changed files with 36 additions and 33 deletions

View File

@ -97,7 +97,6 @@ class CalendarType extends AbstractType
return $res; return $res;
}, },
static function (?string $dateAsString): DateTimeImmutable { static function (?string $dateAsString): DateTimeImmutable {
return new DateTimeImmutable($dateAsString); return new DateTimeImmutable($dateAsString);
} }
)); ));

View File

@ -235,7 +235,9 @@ class NotificationController extends AbstractController
'id' => $notification->getId(), 'id' => $notification->getId(),
'_fragment' => 'comment-' . $commentId, '_fragment' => 'comment-' . $commentId,
]); ]);
} elseif ($editedCommentForm->isSubmitted() && !$editedCommentForm->isValid()) { }
if ($editedCommentForm->isSubmitted() && !$editedCommentForm->isValid()) {
$this->addFlash('error', $this->translator->trans('This form contains errors')); $this->addFlash('error', $this->translator->trans('This form contains errors'));
} }
} }
@ -258,7 +260,9 @@ class NotificationController extends AbstractController
return $this->redirectToRoute('chill_main_notification_show', [ return $this->redirectToRoute('chill_main_notification_show', [
'id' => $notification->getId(), 'id' => $notification->getId(),
]); ]);
} elseif ($appendCommentForm->isSubmitted() && !$appendCommentForm->isValid()) { }
if ($appendCommentForm->isSubmitted() && !$appendCommentForm->isValid()) {
$this->addFlash('error', $this->translator->trans('This form contains errors')); $this->addFlash('error', $this->translator->trans('This form contains errors'));
} }
} }

View File

@ -16,16 +16,16 @@ use Chill\MainBundle\Entity\Workflow\EntityWorkflow;
use Chill\MainBundle\Repository\Workflow\EntityWorkflowStepRepository; use Chill\MainBundle\Repository\Workflow\EntityWorkflowStepRepository;
use Chill\MainBundle\Templating\UI\NotificationCounterInterface; use Chill\MainBundle\Templating\UI\NotificationCounterInterface;
use Psr\Cache\CacheItemPoolInterface; use Psr\Cache\CacheItemPoolInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Core\User\UserInterface; use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Workflow\Event\Event; use Symfony\Component\Workflow\Event\Event;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
final class WorkflowByUserCounter implements NotificationCounterInterface, EventSubscriberInterface final class WorkflowByUserCounter implements NotificationCounterInterface, EventSubscriberInterface
{ {
private EntityWorkflowStepRepository $workflowStepRepository;
private CacheItemPoolInterface $cacheItemPool; private CacheItemPoolInterface $cacheItemPool;
private EntityWorkflowStepRepository $workflowStepRepository;
public function __construct(EntityWorkflowStepRepository $workflowStepRepository, CacheItemPoolInterface $cacheItemPool) public function __construct(EntityWorkflowStepRepository $workflowStepRepository, CacheItemPoolInterface $cacheItemPool)
{ {
$this->workflowStepRepository = $workflowStepRepository; $this->workflowStepRepository = $workflowStepRepository;
@ -54,14 +54,21 @@ final class WorkflowByUserCounter implements NotificationCounterInterface, Event
return $nb; return $nb;
} }
public static function generateCacheKeyWorkflowByUser(User $user): string
{
return 'chill_main_workflow_by_u_' . $user->getId();
}
public function getCountUnreadByUser(User $user): int public function getCountUnreadByUser(User $user): int
{ {
return $this->workflowStepRepository->countUnreadByUser($user); return $this->workflowStepRepository->countUnreadByUser($user);
} }
public static function generateCacheKeyWorkflowByUser(User $user): string public static function getSubscribedEvents()
{ {
return 'chill_main_workflow_by_u_'.$user->getId(); return [
'workflow.leave' => 'resetWorkflowCache',
];
} }
public function resetWorkflowCache(Event $event): void public function resetWorkflowCache(Event $event): void
@ -74,11 +81,12 @@ final class WorkflowByUserCounter implements NotificationCounterInterface, Event
$entityWorkflow = $event->getSubject(); $entityWorkflow = $event->getSubject();
$step = $entityWorkflow->getCurrentStep(); $step = $entityWorkflow->getCurrentStep();
if ($step === null) { if (null === $step) {
return; return;
} }
$keys = []; $keys = [];
foreach ($step->getDestUser() as $user) { foreach ($step->getDestUser() as $user) {
$keys[] = self::generateCacheKeyWorkflowByUser($user); $keys[] = self::generateCacheKeyWorkflowByUser($user);
} }
@ -86,15 +94,5 @@ final class WorkflowByUserCounter implements NotificationCounterInterface, Event
if ([] !== $keys) { if ([] !== $keys) {
$this->cacheItemPool->deleteItems($keys); $this->cacheItemPool->deleteItems($keys);
} }
} }
public static function getSubscribedEvents()
{
return [
'workflow.leave' => 'resetWorkflowCache',
];
}
} }

View File

@ -45,7 +45,7 @@ class AccompanyingPeriodWork implements AccompanyingPeriodLinkedWithSocialIssues
/** /**
* @ORM\ManyToOne(targetEntity=AccompanyingPeriod::class) * @ORM\ManyToOne(targetEntity=AccompanyingPeriod::class)
* @Serializer\Groups({"read", "read:accompanyingPeriodWork:light"}) * @Serializer\Groups({"read", "read:accompanyingPeriodWork:light"})
* @Serializer\Context(normalizationContext={"groups"={"read"}}, groups={"read:accompanyingPeriodWork:light"}) * @Serializer\Context(normalizationContext={"groups": {"read"}}, groups={"read:accompanyingPeriodWork:light"})
*/ */
private ?AccompanyingPeriod $accompanyingPeriod = null; private ?AccompanyingPeriod $accompanyingPeriod = null;

View File

@ -75,7 +75,6 @@ class AccompanyingCourseMenuBuilder implements LocalMenuBuilderInterface
], ]) ], ])
->setExtras(['order' => 30]); ->setExtras(['order' => 30]);
$menu->addChild($this->translator->trans('Accompanying Course Comment'), [ $menu->addChild($this->translator->trans('Accompanying Course Comment'), [
'route' => 'chill_person_accompanying_period_comment_list', 'route' => 'chill_person_accompanying_period_comment_list',
'routeParameters' => [ 'routeParameters' => [
@ -93,7 +92,6 @@ class AccompanyingCourseMenuBuilder implements LocalMenuBuilderInterface
->setExtras(['order' => 40]); ->setExtras(['order' => 40]);
} }
$workflow = $this->registry->get($period, 'accompanying_period_lifecycle'); $workflow = $this->registry->get($period, 'accompanying_period_lifecycle');
if (null !== $period->getClosingDate()) { if (null !== $period->getClosingDate()) {

View File

@ -25,10 +25,10 @@ use Doctrine\Persistence\ObjectRepository;
final class AccompanyingPeriodWorkRepository implements ObjectRepository final class AccompanyingPeriodWorkRepository implements ObjectRepository
{ {
private EntityRepository $repository;
private EntityManagerInterface $em; private EntityManagerInterface $em;
private EntityRepository $repository;
public function __construct(EntityManagerInterface $entityManager) public function __construct(EntityManagerInterface $entityManager)
{ {
$this->em = $entityManager; $this->em = $entityManager;
@ -84,7 +84,7 @@ final class AccompanyingPeriodWorkRepository implements ObjectRepository
} }
/** /**
* Return a list of accompanying period with a defined order: * Return a list of accompanying period with a defined order:.
* *
* * first, opened works * * first, opened works
* * then, closed works * * then, closed works
@ -96,7 +96,7 @@ final class AccompanyingPeriodWorkRepository implements ObjectRepository
$rsm = new ResultSetMappingBuilder($this->em); $rsm = new ResultSetMappingBuilder($this->em);
$rsm->addRootEntityFromClassMetadata(AccompanyingPeriodWork::class, 'w'); $rsm->addRootEntityFromClassMetadata(AccompanyingPeriodWork::class, 'w');
$sql = "SELECT ${rsm} FROM chill_person_accompanying_period_work w $sql = "SELECT {$rsm} FROM chill_person_accompanying_period_work w
WHERE accompanyingPeriod_id = :periodId WHERE accompanyingPeriod_id = :periodId
ORDER BY ORDER BY
CASE WHEN enddate IS NULL THEN '-infinity'::timestamp ELSE 'infinity'::timestamp END ASC, CASE WHEN enddate IS NULL THEN '-infinity'::timestamp ELSE 'infinity'::timestamp END ASC,
@ -108,8 +108,7 @@ final class AccompanyingPeriodWorkRepository implements ObjectRepository
$nq = $this->em->createNativeQuery($sql, $rsm) $nq = $this->em->createNativeQuery($sql, $rsm)
->setParameter('periodId', $period->getId(), Types::INTEGER) ->setParameter('periodId', $period->getId(), Types::INTEGER)
->setParameter('limit', $limit, Types::INTEGER) ->setParameter('limit', $limit, Types::INTEGER)
->setParameter('offset', $offset, Types::INTEGER) ->setParameter('offset', $offset, Types::INTEGER);
;
return $nq->getResult(); return $nq->getResult();
} }

View File

@ -17,12 +17,15 @@ use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter; use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\Security; use Symfony\Component\Security\Core\Security;
use UnexpectedValueException; use UnexpectedValueException;
use function get_class;
use function in_array; use function in_array;
class AccompanyingPeriodWorkVoter extends Voter class AccompanyingPeriodWorkVoter extends Voter
{ {
public const CREATE = 'CHILL_MAIN_ACCOMPANYING_PERIOD_WORK_CREATE'; public const CREATE = 'CHILL_MAIN_ACCOMPANYING_PERIOD_WORK_CREATE';
public const SEE = 'CHILL_MAIN_ACCOMPANYING_PERIOD_WORK_SEE'; public const SEE = 'CHILL_MAIN_ACCOMPANYING_PERIOD_WORK_SEE';
public const UPDATE = 'CHILL_MAIN_ACCOMPANYING_PERIOD_WORK_UPDATE'; public const UPDATE = 'CHILL_MAIN_ACCOMPANYING_PERIOD_WORK_UPDATE';
private Security $security; private Security $security;
@ -40,7 +43,7 @@ class AccompanyingPeriodWorkVoter extends Voter
&& in_array($attribute, $this->getRoles(), true) && in_array($attribute, $this->getRoles(), true)
) || ( ) || (
$subject instanceof AccompanyingPeriod $subject instanceof AccompanyingPeriod
&& in_array($attribute, [self::SEE, self::CREATE]) && in_array($attribute, [self::SEE, self::CREATE], true)
); );
} }
@ -64,8 +67,10 @@ class AccompanyingPeriodWorkVoter extends Voter
return $this->security->isGranted(AccompanyingPeriodVoter::SEE_DETAILS, $subject); return $this->security->isGranted(AccompanyingPeriodVoter::SEE_DETAILS, $subject);
default: default:
throw new UnexpectedValueException(sprintf("attribute {$attribute} is not supported on instance %s", throw new UnexpectedValueException(sprintf(
AccompanyingPeriod::class)); "attribute {$attribute} is not supported on instance %s",
AccompanyingPeriod::class
));
} }
} }

View File

@ -17,8 +17,8 @@ use DateTimeImmutable;
use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection; use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Serializer\Annotation as Serializer; use Symfony\Component\Serializer\Annotation as Serializer;
use Symfony\Component\Validator\Constraints as Assert;
/** /**
* SingleTask. * SingleTask.