mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-10-04 20:39:40 +00:00
# Conflicts: # docs/source/_static/code/exports/BirthdateFilter.php # rector.php # src/Bundle/ChillActivityBundle/Export/Aggregator/ACPAggregators/ByActivityTypeAggregator.php # src/Bundle/ChillActivityBundle/Export/Aggregator/ACPAggregators/BySocialActionAggregator.php # src/Bundle/ChillActivityBundle/Export/Aggregator/ACPAggregators/BySocialIssueAggregator.php # src/Bundle/ChillActivityBundle/Export/Aggregator/ActivityLocationAggregator.php # src/Bundle/ChillActivityBundle/Export/Aggregator/ActivityPresenceAggregator.php # src/Bundle/ChillActivityBundle/Export/Aggregator/ActivityReasonAggregator.php # src/Bundle/ChillActivityBundle/Export/Aggregator/ActivityTypeAggregator.php # src/Bundle/ChillActivityBundle/Export/Aggregator/ActivityUserAggregator.php # src/Bundle/ChillActivityBundle/Export/Aggregator/ActivityUsersAggregator.php # src/Bundle/ChillActivityBundle/Export/Aggregator/ActivityUsersJobAggregator.php # src/Bundle/ChillActivityBundle/Export/Aggregator/ActivityUsersScopeAggregator.php # src/Bundle/ChillActivityBundle/Export/Aggregator/ByCreatorAggregator.php # src/Bundle/ChillActivityBundle/Export/Aggregator/ByThirdpartyAggregator.php # src/Bundle/ChillActivityBundle/Export/Aggregator/CreatorJobAggregator.php # src/Bundle/ChillActivityBundle/Export/Aggregator/CreatorScopeAggregator.php # src/Bundle/ChillActivityBundle/Export/Aggregator/DateAggregator.php # src/Bundle/ChillActivityBundle/Export/Aggregator/LocationTypeAggregator.php # src/Bundle/ChillActivityBundle/Export/Aggregator/PersonAggregators/HouseholdAggregator.php # src/Bundle/ChillActivityBundle/Export/Aggregator/PersonAggregators/PersonAggregator.php # src/Bundle/ChillActivityBundle/Export/Aggregator/PersonsAggregator.php # src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/SumActivityDuration.php # src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/SumActivityVisitDuration.php # src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/ActivityTypeFilter.php # src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/BySocialActionFilter.php # src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/BySocialIssueFilter.php # src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/HasNoActivityFilter.php # src/Bundle/ChillActivityBundle/Export/Filter/ACPFilters/PeriodHavingActivityBetweenDatesFilter.php # src/Bundle/ChillActivityBundle/Export/Filter/ActivityDateFilter.php # src/Bundle/ChillActivityBundle/Export/Filter/ActivityPresenceFilter.php # src/Bundle/ChillActivityBundle/Export/Filter/ActivityTypeFilter.php # src/Bundle/ChillActivityBundle/Export/Filter/ActivityUsersFilter.php # src/Bundle/ChillActivityBundle/Export/Filter/ByCreatorFilter.php # src/Bundle/ChillActivityBundle/Export/Filter/CreatorJobFilter.php # src/Bundle/ChillActivityBundle/Export/Filter/CreatorScopeFilter.php # src/Bundle/ChillActivityBundle/Export/Filter/EmergencyFilter.php # src/Bundle/ChillActivityBundle/Export/Filter/LocationFilter.php # src/Bundle/ChillActivityBundle/Export/Filter/LocationTypeFilter.php # src/Bundle/ChillActivityBundle/Export/Filter/PersonFilters/ActivityReasonFilter.php # src/Bundle/ChillActivityBundle/Export/Filter/PersonsFilter.php # src/Bundle/ChillActivityBundle/Export/Filter/SentReceivedFilter.php # src/Bundle/ChillActivityBundle/Export/Filter/UserFilter.php # src/Bundle/ChillActivityBundle/Export/Filter/UsersJobFilter.php # src/Bundle/ChillActivityBundle/Export/Filter/UsersScopeFilter.php # src/Bundle/ChillActivityBundle/Validator/Constraints/ActivityValidity.php # src/Bundle/ChillAsideActivityBundle/src/Export/Aggregator/ByActivityTypeAggregator.php # src/Bundle/ChillAsideActivityBundle/src/Export/Aggregator/ByUserJobAggregator.php # src/Bundle/ChillAsideActivityBundle/src/Export/Aggregator/ByUserScopeAggregator.php # src/Bundle/ChillAsideActivityBundle/src/Export/Filter/ByActivityTypeFilter.php # src/Bundle/ChillAsideActivityBundle/src/Export/Filter/ByDateFilter.php # src/Bundle/ChillAsideActivityBundle/src/Export/Filter/ByUserFilter.php # src/Bundle/ChillAsideActivityBundle/src/Export/Filter/ByUserJobFilter.php # src/Bundle/ChillAsideActivityBundle/src/Export/Filter/ByUserScopeFilter.php # src/Bundle/ChillCalendarBundle/Export/Aggregator/AgentAggregator.php # src/Bundle/ChillCalendarBundle/Export/Aggregator/CancelReasonAggregator.php # src/Bundle/ChillCalendarBundle/Export/Aggregator/JobAggregator.php # src/Bundle/ChillCalendarBundle/Export/Aggregator/LocationAggregator.php # src/Bundle/ChillCalendarBundle/Export/Aggregator/LocationTypeAggregator.php # src/Bundle/ChillCalendarBundle/Export/Aggregator/MonthYearAggregator.php # src/Bundle/ChillCalendarBundle/Export/Aggregator/ScopeAggregator.php # src/Bundle/ChillCalendarBundle/Export/Aggregator/UrgencyAggregator.php # src/Bundle/ChillCalendarBundle/Export/Filter/AgentFilter.php # src/Bundle/ChillCalendarBundle/Export/Filter/BetweenDatesFilter.php # src/Bundle/ChillCalendarBundle/Export/Filter/CalendarRangeFilter.php # src/Bundle/ChillCalendarBundle/Export/Filter/JobFilter.php # src/Bundle/ChillCalendarBundle/Export/Filter/ScopeFilter.php # src/Bundle/ChillEventBundle/Export/Aggregator/EventDateAggregator.php # src/Bundle/ChillEventBundle/Export/Aggregator/EventTypeAggregator.php # src/Bundle/ChillEventBundle/Export/Aggregator/RoleAggregator.php # src/Bundle/ChillEventBundle/Export/Filter/EventDateFilter.php # src/Bundle/ChillEventBundle/Export/Filter/EventTypeFilter.php # src/Bundle/ChillEventBundle/Export/Filter/RoleFilter.php # src/Bundle/ChillMainBundle/Controller/ExportController.php # src/Bundle/ChillMainBundle/Controller/SavedExportController.php # src/Bundle/ChillMainBundle/DependencyInjection/CompilerPass/ExportsCompilerPass.php # src/Bundle/ChillMainBundle/Entity/Notification.php # src/Bundle/ChillMainBundle/Export/ExportManager.php # src/Bundle/ChillMainBundle/Export/Formatter/CSVFormatter.php # src/Bundle/ChillMainBundle/Export/Formatter/CSVListFormatter.php # src/Bundle/ChillMainBundle/Export/Formatter/CSVPivotedListFormatter.php # src/Bundle/ChillMainBundle/Export/Formatter/SpreadSheetFormatter.php # src/Bundle/ChillMainBundle/Export/Formatter/SpreadsheetListFormatter.php # src/Bundle/ChillMainBundle/Form/SavedExportType.php # src/Bundle/ChillMainBundle/Form/Type/DataTransformer/EntityToJsonTransformer.php # src/Bundle/ChillMainBundle/Tests/Export/ExportManagerTest.php # src/Bundle/ChillMainBundle/Tests/Export/SortExportElementTest.php # src/Bundle/ChillPersonBundle/Export/Aggregator/AccompanyingCourseAggregators/AdministrativeLocationAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/AccompanyingCourseAggregators/ClosingDateAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/AccompanyingCourseAggregators/ClosingMotiveAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/AccompanyingCourseAggregators/ConfidentialAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/AccompanyingCourseAggregators/CreatorJobAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/AccompanyingCourseAggregators/DurationAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/AccompanyingCourseAggregators/EmergencyAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/AccompanyingCourseAggregators/EvaluationAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/AccompanyingCourseAggregators/GeographicalUnitStatAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/AccompanyingCourseAggregators/IntensityAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/AccompanyingCourseAggregators/JobWorkingOnCourseAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/AccompanyingCourseAggregators/OpeningDateAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/AccompanyingCourseAggregators/OriginAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/AccompanyingCourseAggregators/PersonParticipatingAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/AccompanyingCourseAggregators/ReferrerAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/AccompanyingCourseAggregators/ReferrerScopeAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/AccompanyingCourseAggregators/RequestorAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/AccompanyingCourseAggregators/ScopeAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/AccompanyingCourseAggregators/ScopeWorkingOnCourseAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/AccompanyingCourseAggregators/SocialActionAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/AccompanyingCourseAggregators/SocialIssueAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/AccompanyingCourseAggregators/StepAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/AccompanyingCourseAggregators/UserJobAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/AccompanyingCourseAggregators/UserWorkingOnCourseAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/AccompanyingPeriodStepHistoryAggregators/ByClosingMotiveAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/AccompanyingPeriodStepHistoryAggregators/ByDateAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/AccompanyingPeriodStepHistoryAggregators/ByStepAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/EvaluationAggregators/ByEndDateAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/EvaluationAggregators/ByMaxDateAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/EvaluationAggregators/ByStartDateAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/EvaluationAggregators/EvaluationTypeAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/EvaluationAggregators/HavingEndDateAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/HouseholdAggregators/ChildrenNumberAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/HouseholdAggregators/CompositionAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/AdministrativeStatusAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/AgeAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/ByHouseholdCompositionAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/CenterAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/EmploymentStatusAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/GenderAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/HouseholdPositionAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/MaritalStatusAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/NationalityAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/PostalCodeAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/ActionTypeAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorJobAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorScopeAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/GoalAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/GoalResultAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/HandlingThirdPartyAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/JobAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/ReferrerAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/ResultAggregator.php # src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/ScopeAggregator.php # src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/ActiveOnDateFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/ActiveOneDayBetweenDatesFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/AdministrativeLocationFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/ClosingMotiveFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/ConfidentialFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/CreatorFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/CreatorJobFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/EmergencyFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/EvaluationFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/GeographicalUnitStatFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/HandlingThirdPartyFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/HasNoReferrerFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/HasTemporaryLocationFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/IntensityFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/NotAssociatedWithAReferenceAddressFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/OpenBetweenDatesFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/OriginFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/ReferrerFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/ReferrerFilterBetweenDates.php # src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/RequestorFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/SocialActionFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/SocialIssueFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/StepFilterBetweenDates.php # src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/StepFilterOnDate.php # src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/UserJobFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingPeriodStepHistoryFilters/ByDateFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingPeriodStepHistoryFilters/ByStepFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/EvaluationFilters/EvaluationTypeFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/EvaluationFilters/MaxDateFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/AddressRefStatusFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/AgeFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/BirthdateFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/ByHouseholdCompositionFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/DeadOrAliveFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/DeathdateFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/GenderFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/GeographicalUnitFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/MaritalStatusFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/NationalityFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/ResidentialAddressAtThirdpartyFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/ResidentialAddressAtUserFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/WithParticipationBetweenDatesFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/WithoutHouseholdComposition.php # src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/WithoutParticipationBetweenDatesFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorJobFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorScopeFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/JobFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/ReferrerFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/ScopeFilter.php # src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/SocialWorkTypeFilter.php # src/Bundle/ChillPersonBundle/Export/Helper/FilterListAccompanyingPeriodHelper.php # src/Bundle/ChillPersonBundle/Security/Authorization/AccompanyingPeriodVoter.php # src/Bundle/ChillPersonBundle/Tests/Export/Export/ListAccompanyingPeriodTest.php # src/Bundle/ChillPersonBundle/Validator/Constraints/AccompanyingPeriod/AccompanyingPeriodValidity.php # src/Bundle/ChillPersonBundle/Validator/Constraints/AccompanyingPeriod/ConfidentialCourseMustHaveReferrer.php # src/Bundle/ChillPersonBundle/Validator/Constraints/AccompanyingPeriod/LocationValidity.php # src/Bundle/ChillPersonBundle/Validator/Constraints/Household/MaxHolder.php # src/Bundle/ChillReportBundle/Export/Export/ReportList.php # src/Bundle/ChillReportBundle/Export/Filter/ReportDateFilter.php
323 lines
14 KiB
PHP
323 lines
14 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
/*
|
|
* Chill is a software for social workers
|
|
*
|
|
* For the full copyright and license information, please view
|
|
* the LICENSE file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Chill\MainBundle\Controller;
|
|
|
|
use Chill\MainBundle\Entity\Notification;
|
|
use Chill\MainBundle\Entity\NotificationComment;
|
|
use Chill\MainBundle\Form\NotificationCommentType;
|
|
use Chill\MainBundle\Form\NotificationType;
|
|
use Chill\MainBundle\Notification\Exception\NotificationHandlerNotFound;
|
|
use Chill\MainBundle\Notification\FlagProviders\NotificationByUserFlagProvider;
|
|
use Chill\MainBundle\Notification\NotificationHandlerManager;
|
|
use Chill\MainBundle\Pagination\PaginatorFactory;
|
|
use Chill\MainBundle\Repository\NotificationRepository;
|
|
use Chill\MainBundle\Repository\UserRepository;
|
|
use Chill\MainBundle\Security\Authorization\NotificationVoter;
|
|
use Chill\MainBundle\Security\ChillSecurity;
|
|
use Doctrine\ORM\EntityManagerInterface;
|
|
use Psr\Log\LoggerInterface;
|
|
use Symfony\Bridge\Doctrine\Attribute\MapEntity;
|
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
|
use Symfony\Component\HttpFoundation\RedirectResponse;
|
|
use Symfony\Component\HttpFoundation\Request;
|
|
use Symfony\Component\HttpFoundation\Response;
|
|
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
|
|
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
|
|
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
|
use Symfony\Component\Routing\Annotation\Route;
|
|
use Symfony\Contracts\Translation\TranslatorInterface;
|
|
use function in_array;
|
|
|
|
#[\Symfony\Component\Routing\Attribute\Route(path: '/{_locale}/notification')]
|
|
class NotificationController extends AbstractController
|
|
{
|
|
public function __construct(private readonly EntityManagerInterface $em, private readonly LoggerInterface $chillLogger, private readonly LoggerInterface $logger, private readonly ChillSecurity $security, private readonly NotificationRepository $notificationRepository, private readonly NotificationHandlerManager $notificationHandlerManager, private readonly PaginatorFactory $paginatorFactory, private readonly TranslatorInterface $translator, private readonly UserRepository $userRepository, private readonly \Doctrine\Persistence\ManagerRegistry $managerRegistry) {}
|
|
|
|
#[\Symfony\Component\Routing\Attribute\Route(path: '/create', name: 'chill_main_notification_create')]
|
|
public function createAction(Request $request): Response
|
|
{
|
|
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_REMEMBERED');
|
|
|
|
if (!$request->query->has('entityClass')) {
|
|
throw new BadRequestHttpException('Missing entityClass parameter');
|
|
}
|
|
|
|
if (!$request->query->has('entityId')) {
|
|
throw new BadRequestHttpException('missing entityId parameter');
|
|
}
|
|
|
|
$notification = new Notification();
|
|
$notification
|
|
->setRelatedEntityClass($request->query->get('entityClass'))
|
|
->setRelatedEntityId($request->query->getInt('entityId'))
|
|
->setSender($this->security->getUser())
|
|
->setType(NotificationByUserFlagProvider::FLAG);
|
|
|
|
$tos = $request->query->all('tos');
|
|
|
|
foreach ($tos as $toId) {
|
|
if (null === $to = $this->userRepository->find($toId)) {
|
|
throw new NotFoundHttpException("user with id {$toId} is not found");
|
|
}
|
|
$notification->addAddressee($to);
|
|
}
|
|
|
|
try {
|
|
$handler = $this->notificationHandlerManager->getHandler($notification);
|
|
} catch (NotificationHandlerNotFound) {
|
|
throw new BadRequestHttpException('no handler for this notification');
|
|
}
|
|
|
|
$form = $this->createForm(NotificationType::class, $notification);
|
|
|
|
$form->handleRequest($request);
|
|
|
|
if ($form->isSubmitted() && $form->isValid()) {
|
|
$this->em->persist($notification);
|
|
$this->em->flush();
|
|
|
|
$this->addFlash('success', $this->translator->trans('notification.Notification created'));
|
|
|
|
if ($request->query->has('returnPath')) {
|
|
return new RedirectResponse($request->query->get('returnPath'));
|
|
}
|
|
|
|
return $this->redirectToRoute('chill_main_homepage');
|
|
}
|
|
|
|
return $this->render('@ChillMain/Notification/create.html.twig', [
|
|
'form' => $form,
|
|
'handler' => $handler,
|
|
'notification' => $notification,
|
|
]);
|
|
}
|
|
|
|
#[\Symfony\Component\Routing\Attribute\Route(path: '/{id}/edit', name: 'chill_main_notification_edit')]
|
|
public function editAction(#[MapEntity(id: 'id')] Notification $notification, Request $request): Response
|
|
{
|
|
$this->denyAccessUnlessGranted(NotificationVoter::NOTIFICATION_UPDATE, $notification);
|
|
|
|
$form = $this->createForm(NotificationType::class, $notification);
|
|
|
|
$form->handleRequest($request);
|
|
|
|
if ($form->isSubmitted() && $form->isValid()) {
|
|
$this->em->flush();
|
|
|
|
$this->addFlash('success', $this->translator->trans('notification.Notification updated'));
|
|
|
|
if ($request->query->has('returnPath')) {
|
|
return new RedirectResponse($request->query->get('returnPath'));
|
|
}
|
|
|
|
return $this->redirectToRoute('chill_main_notification_my');
|
|
}
|
|
|
|
return $this->render('@ChillMain/Notification/edit.html.twig', [
|
|
'form' => $form,
|
|
'handler' => $this->notificationHandlerManager->getHandler($notification),
|
|
'notification' => $notification,
|
|
]);
|
|
}
|
|
|
|
#[\Symfony\Component\Routing\Attribute\Route(path: '/{id}/access_key', name: 'chill_main_notification_grant_access_by_access_key')]
|
|
public function getAccessByAccessKey(#[MapEntity(id: 'id')] Notification $notification, Request $request): Response
|
|
{
|
|
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_REMEMBERED');
|
|
|
|
foreach (['accessKey'/* , 'email' */] as $param) {
|
|
if (!$request->query->has($param)) {
|
|
throw new BadRequestHttpException("Missing {$param} parameter");
|
|
}
|
|
}
|
|
|
|
if ($notification->getAccessKey() !== $request->query->getAlnum('accessKey')) {
|
|
throw new AccessDeniedHttpException('access key is invalid');
|
|
}
|
|
|
|
/*
|
|
desactivated due to escaped '&' in email links
|
|
if (!in_array($request->query->get('email'), $notification->getAddressesEmails(), true)) {
|
|
return (new Response('The email address is no more associated with this notification'))
|
|
->setStatusCode(Response::HTTP_FORBIDDEN);
|
|
}
|
|
*/
|
|
|
|
$notification->addAddressee($this->security->getUser());
|
|
|
|
$this->managerRegistry->getManager()->flush();
|
|
|
|
$logMsg = '[Notification] a user is granted access to notification trough an access key';
|
|
$context = [
|
|
'notificationId' => $notification->getId(),
|
|
'email' => $request->query->get('email'),
|
|
'user' => $this->security->getUser()->getId(),
|
|
];
|
|
|
|
$this->logger->info($logMsg, $context);
|
|
$this->chillLogger->info($logMsg, $context);
|
|
|
|
return $this->redirectToRoute('chill_main_notification_show', ['id' => $notification->getId()]);
|
|
}
|
|
|
|
#[\Symfony\Component\Routing\Attribute\Route(path: '/inbox', name: 'chill_main_notification_my')]
|
|
public function inboxAction(): Response
|
|
{
|
|
$this->denyAccessUnlessGranted('ROLE_USER');
|
|
$currentUser = $this->security->getUser();
|
|
|
|
$notificationsNbr = $this->notificationRepository->countAllForAttendee($currentUser);
|
|
$paginator = $this->paginatorFactory->create($notificationsNbr);
|
|
|
|
$notifications = $this->notificationRepository->findAllForAttendee(
|
|
$currentUser,
|
|
$paginator->getItemsPerPage(),
|
|
$paginator->getCurrentPage()->getFirstItemNumber()
|
|
);
|
|
|
|
return $this->render('@ChillMain/Notification/list.html.twig', [
|
|
'datas' => $this->itemsForTemplate($notifications),
|
|
'notifications' => $notifications,
|
|
'paginator' => $paginator,
|
|
'step' => 'inbox',
|
|
'unreads' => $this->countUnread(),
|
|
]);
|
|
}
|
|
|
|
#[\Symfony\Component\Routing\Attribute\Route(path: '/sent', name: 'chill_main_notification_sent')]
|
|
public function sentAction(): Response
|
|
{
|
|
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_REMEMBERED');
|
|
$currentUser = $this->security->getUser();
|
|
|
|
$notificationsNbr = $this->notificationRepository->countAllForSender($currentUser);
|
|
$paginator = $this->paginatorFactory->create($notificationsNbr);
|
|
|
|
$notifications = $this->notificationRepository->findAllForSender(
|
|
$currentUser,
|
|
$limit = $paginator->getItemsPerPage(),
|
|
$offset = $paginator->getCurrentPage()->getFirstItemNumber()
|
|
);
|
|
|
|
return $this->render('@ChillMain/Notification/list.html.twig', [
|
|
'datas' => $this->itemsForTemplate($notifications),
|
|
'notifications' => $notifications,
|
|
'paginator' => $paginator,
|
|
'step' => 'sent',
|
|
'unreads' => $this->countUnread(),
|
|
]);
|
|
}
|
|
|
|
#[\Symfony\Component\Routing\Attribute\Route(path: '/{id}/show', name: 'chill_main_notification_show')]
|
|
public function showAction(#[MapEntity(id: 'id')] Notification $notification, Request $request): Response
|
|
{
|
|
$this->denyAccessUnlessGranted(NotificationVoter::NOTIFICATION_SEE, $notification);
|
|
|
|
if ($request->query->has('edit')) {
|
|
$commentId = $request->query->getInt('edit');
|
|
$editedComment = $notification->getComments()->filter(static fn (NotificationComment $c) => $c->getId() === $commentId)->first();
|
|
|
|
if (false === $editedComment) {
|
|
throw $this->createNotFoundException("Comment with id {$commentId} does not exists nor belong to this notification");
|
|
}
|
|
|
|
$this->denyAccessUnlessGranted(NotificationVoter::COMMENT_EDIT, $editedComment);
|
|
|
|
$editedCommentForm = $this->createForm(NotificationCommentType::class, $editedComment);
|
|
|
|
if (Request::METHOD_POST === $request->getMethod() && 'edit' === $request->request->get('form')) {
|
|
$editedCommentForm->handleRequest($request);
|
|
|
|
if ($editedCommentForm->isSubmitted() && $editedCommentForm->isValid()) {
|
|
$this->em->flush();
|
|
|
|
$this->addFlash('success', $this->translator->trans('notification.comment_updated'));
|
|
|
|
return $this->redirectToRoute('chill_main_notification_show', [
|
|
'id' => $notification->getId(),
|
|
'_fragment' => 'comment-'.$commentId,
|
|
]);
|
|
}
|
|
|
|
if ($editedCommentForm->isSubmitted() && !$editedCommentForm->isValid()) {
|
|
$this->addFlash('error', $this->translator->trans('This form contains errors'));
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($this->isGranted(NotificationVoter::COMMENT_ADD, $notification)) {
|
|
$appendComment = new NotificationComment();
|
|
$appendCommentForm = $this->createForm(NotificationCommentType::class, $appendComment);
|
|
|
|
if (Request::METHOD_POST === $request->getMethod() && 'append' === $request->request->get('form')) {
|
|
$appendCommentForm->handleRequest($request);
|
|
|
|
if ($appendCommentForm->isSubmitted() && $appendCommentForm->isValid()) {
|
|
$notification->addComment($appendComment);
|
|
$this->em->persist($appendComment);
|
|
$this->em->flush();
|
|
|
|
$this->addFlash('success', $this->translator->trans('notification.comment_appended'));
|
|
|
|
return $this->redirectToRoute('chill_main_notification_show', [
|
|
'id' => $notification->getId(),
|
|
]);
|
|
}
|
|
|
|
if ($appendCommentForm->isSubmitted() && !$appendCommentForm->isValid()) {
|
|
$this->addFlash('error', $this->translator->trans('This form contains errors'));
|
|
}
|
|
}
|
|
}
|
|
|
|
$response = $this->render('@ChillMain/Notification/show.html.twig', [
|
|
'notification' => $notification,
|
|
'handler' => $this->notificationHandlerManager->getHandler($notification),
|
|
'appendCommentForm' => isset($appendCommentForm) ? $appendCommentForm->createView() : null,
|
|
'editedCommentForm' => isset($editedCommentForm) ? $editedCommentForm->createView() : null,
|
|
'editedCommentId' => $commentId ?? null,
|
|
]);
|
|
|
|
// we mark the notification as read after having computed the response
|
|
if (!$notification->isReadBy($this->security->getUser())) {
|
|
$notification->markAsReadBy($this->security->getUser());
|
|
$this->em->flush();
|
|
}
|
|
|
|
return $response;
|
|
}
|
|
|
|
private function countUnread(): array
|
|
{
|
|
return [
|
|
'sent' => $this->notificationRepository->countUnreadByUserWhereSender($this->security->getUser()),
|
|
'inbox' => $this->notificationRepository->countUnreadByUserWhereAddressee($this->security->getUser()),
|
|
];
|
|
}
|
|
|
|
private function itemsForTemplate(array $notifications): array
|
|
{
|
|
$templateData = [];
|
|
|
|
foreach ($notifications as $notification) {
|
|
$templateData[] = [
|
|
'template' => $this->notificationHandlerManager->getTemplate($notification),
|
|
'template_data' => $this->notificationHandlerManager->getTemplateData($notification),
|
|
'handler' => $this->notificationHandlerManager->getHandler($notification),
|
|
'notification' => $notification,
|
|
];
|
|
}
|
|
|
|
return $templateData;
|
|
}
|
|
}
|