Lines
100.00%
12 / 12
Methods
100.00%
2 / 2
Classes
100.00%
1 / 1
| 23 | final class DoneAt extends BaseController | |
| 24 | { | |
| 25 | public const string CSRF_TOKEN = 'done-banner'; | |
| 26 | ||
| 27 | public function __invoke(Request $request, DoneBanner $banner, EntityManagerInterface $entityManager): Response | |
| 28 | { | |
| 29 | $value = $request->getPayload()->getString('doneAt'); | |
| 30 | $doneAt = $this->day($value); | |
| 31 | ||
| 32 | if (!$this->isCsrfTokenValid(self::CSRF_TOKEN, $request->getPayload()->getString('_token')) || false === $doneAt) { | |
| 33 | $this->addFlash('danger', 'bannergress.date_invalid'); | |
| 34 | } else { | |
| 35 | $banner->doneAt = $doneAt; | |
| 36 | $entityManager->flush(); | |
| 37 | $this->addFlash('success', $doneAt instanceof \DateTimeImmutable ? 'bannergress.date_saved' : 'bannergress.date_removed'); | |
| 38 | } | |
| 39 | ||
| 40 | return $this->redirect($this->generateUrl('app_banners').'#done-banner-'.$banner->id, Response::HTTP_SEE_OTHER); | |
| 41 | } | |
| 42 | ||
| 43 | /** The day of a Y-m-d value; null for none (empty), false for no date. */ | |
| 44 | private function day(string $value): \DateTimeImmutable|false|null | |
| 45 | { | |
| 46 | if ('' === $value) { | |
| 47 | return null; | |
| 48 | } | |
| 49 | ||
| 50 | $day = \DateTimeImmutable::createFromFormat('!'.TimelineEvent::DATE_FORMAT, $value); | |
| 51 | ||
| 52 | return $day instanceof \DateTimeImmutable && $day->format(TimelineEvent::DATE_FORMAT) === $value ? $day : false; | |
| 53 | } | |
| 54 | } |