mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-06-07 18:44:08 +00:00
Merge remote-tracking branch 'origin/master' into issue543_double_click_household
This commit is contained in:
commit
bad39364c2
@ -15,6 +15,7 @@ and this project adheres to
|
|||||||
* [docgen] add more persons choices in docgen for course: amongst requestor (if person), resources of course (if person), and PersonResource (if person);
|
* [docgen] add more persons choices in docgen for course: amongst requestor (if person), resources of course (if person), and PersonResource (if person);
|
||||||
* [docgen] add a new context with a list of activities in course
|
* [docgen] add a new context with a list of activities in course
|
||||||
* [docgen] add a comment in budget lines
|
* [docgen] add a comment in budget lines
|
||||||
|
* [notifications] allow to send a notification to an email address. The address receive an access link
|
||||||
|
|
||||||
|
|
||||||
## Test releases
|
## Test releases
|
||||||
|
@ -22,6 +22,7 @@ use Chill\MainBundle\Pagination\PaginatorFactory;
|
|||||||
use Chill\MainBundle\Repository\NotificationRepository;
|
use Chill\MainBundle\Repository\NotificationRepository;
|
||||||
use Chill\MainBundle\Security\Authorization\NotificationVoter;
|
use Chill\MainBundle\Security\Authorization\NotificationVoter;
|
||||||
use Doctrine\ORM\EntityManagerInterface;
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
|
use Psr\Log\LoggerInterface;
|
||||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
use Symfony\Component\HttpFoundation\RedirectResponse;
|
use Symfony\Component\HttpFoundation\RedirectResponse;
|
||||||
use Symfony\Component\HttpFoundation\Request;
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
@ -31,14 +32,19 @@ use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
|
|||||||
use Symfony\Component\Routing\Annotation\Route;
|
use Symfony\Component\Routing\Annotation\Route;
|
||||||
use Symfony\Component\Security\Core\Security;
|
use Symfony\Component\Security\Core\Security;
|
||||||
use Symfony\Contracts\Translation\TranslatorInterface;
|
use Symfony\Contracts\Translation\TranslatorInterface;
|
||||||
|
use function in_array;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Route("/{_locale}/notification")
|
* @Route("/{_locale}/notification")
|
||||||
*/
|
*/
|
||||||
class NotificationController extends AbstractController
|
class NotificationController extends AbstractController
|
||||||
{
|
{
|
||||||
|
private LoggerInterface $chillLogger;
|
||||||
|
|
||||||
private EntityManagerInterface $em;
|
private EntityManagerInterface $em;
|
||||||
|
|
||||||
|
private LoggerInterface $logger;
|
||||||
|
|
||||||
private NotificationHandlerManager $notificationHandlerManager;
|
private NotificationHandlerManager $notificationHandlerManager;
|
||||||
|
|
||||||
private NotificationRepository $notificationRepository;
|
private NotificationRepository $notificationRepository;
|
||||||
@ -51,6 +57,8 @@ class NotificationController extends AbstractController
|
|||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
EntityManagerInterface $em,
|
EntityManagerInterface $em,
|
||||||
|
LoggerInterface $chillLogger,
|
||||||
|
LoggerInterface $logger,
|
||||||
Security $security,
|
Security $security,
|
||||||
NotificationRepository $notificationRepository,
|
NotificationRepository $notificationRepository,
|
||||||
NotificationHandlerManager $notificationHandlerManager,
|
NotificationHandlerManager $notificationHandlerManager,
|
||||||
@ -58,6 +66,8 @@ class NotificationController extends AbstractController
|
|||||||
TranslatorInterface $translator
|
TranslatorInterface $translator
|
||||||
) {
|
) {
|
||||||
$this->em = $em;
|
$this->em = $em;
|
||||||
|
$this->logger = $logger;
|
||||||
|
$this->chillLogger = $chillLogger;
|
||||||
$this->security = $security;
|
$this->security = $security;
|
||||||
$this->notificationRepository = $notificationRepository;
|
$this->notificationRepository = $notificationRepository;
|
||||||
$this->notificationHandlerManager = $notificationHandlerManager;
|
$this->notificationHandlerManager = $notificationHandlerManager;
|
||||||
@ -150,6 +160,49 @@ class NotificationController extends AbstractController
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Route("/{id}/access_key", name="chill_main_notification_grant_access_by_access_key")
|
||||||
|
*/
|
||||||
|
public function getAccessByAccessKey(Notification $notification, Request $request): Response
|
||||||
|
{
|
||||||
|
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_REMEMBERED');
|
||||||
|
|
||||||
|
if (!$this->security->getUser() instanceof User) {
|
||||||
|
throw new AccessDeniedHttpException('You must be authenticated and a user to create a notification');
|
||||||
|
}
|
||||||
|
|
||||||
|
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');
|
||||||
|
}
|
||||||
|
|
||||||
|
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->getDoctrine()->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()]);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Route("/inbox", name="chill_main_notification_my")
|
* @Route("/inbox", name="chill_main_notification_my")
|
||||||
*/
|
*/
|
||||||
|
@ -18,6 +18,9 @@ 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\Validator\Constraints as Assert;
|
||||||
|
use Symfony\Component\Validator\Context\ExecutionContextInterface;
|
||||||
|
use function count;
|
||||||
|
use function in_array;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\Entity
|
* @ORM\Entity
|
||||||
@ -31,15 +34,34 @@ use Symfony\Component\Validator\Constraints as Assert;
|
|||||||
*/
|
*/
|
||||||
class Notification implements TrackUpdateInterface
|
class Notification implements TrackUpdateInterface
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* @ORM\Column(type="text", nullable=false)
|
||||||
|
*/
|
||||||
|
private string $accessKey;
|
||||||
|
|
||||||
private array $addedAddresses = [];
|
private array $addedAddresses = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\ManyToMany(targetEntity=User::class)
|
* @ORM\ManyToMany(targetEntity=User::class)
|
||||||
* @ORM\JoinTable(name="chill_main_notification_addresses_user")
|
* @ORM\JoinTable(name="chill_main_notification_addresses_user")
|
||||||
* @Assert\Count(min="1", minMessage="notification.At least one addressee")
|
|
||||||
*/
|
*/
|
||||||
private Collection $addressees;
|
private Collection $addressees;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* a list of destinee which will receive notifications.
|
||||||
|
*
|
||||||
|
* @var array|string[]
|
||||||
|
* @ORM\Column(type="json")
|
||||||
|
*/
|
||||||
|
private array $addressesEmails = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* a list of emails adresses which were added to the notification.
|
||||||
|
*
|
||||||
|
* @var array|string[]
|
||||||
|
*/
|
||||||
|
private array $addressesEmailsAdded = [];
|
||||||
|
|
||||||
private ?ArrayCollection $addressesOnLoad = null;
|
private ?ArrayCollection $addressesOnLoad = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -111,6 +133,7 @@ class Notification implements TrackUpdateInterface
|
|||||||
$this->unreadBy = new ArrayCollection();
|
$this->unreadBy = new ArrayCollection();
|
||||||
$this->comments = new ArrayCollection();
|
$this->comments = new ArrayCollection();
|
||||||
$this->setDate(new DateTimeImmutable());
|
$this->setDate(new DateTimeImmutable());
|
||||||
|
$this->accessKey = bin2hex(openssl_random_pseudo_bytes(24));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addAddressee(User $addressee): self
|
public function addAddressee(User $addressee): self
|
||||||
@ -123,6 +146,14 @@ class Notification implements TrackUpdateInterface
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function addAddressesEmail(string $email)
|
||||||
|
{
|
||||||
|
if (!in_array($email, $this->addressesEmails, true)) {
|
||||||
|
$this->addressesEmails[] = $email;
|
||||||
|
$this->addressesEmailsAdded[] = $email;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public function addComment(NotificationComment $comment): self
|
public function addComment(NotificationComment $comment): self
|
||||||
{
|
{
|
||||||
if (!$this->comments->contains($comment)) {
|
if (!$this->comments->contains($comment)) {
|
||||||
@ -142,6 +173,30 @@ class Notification implements TrackUpdateInterface
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Assert\Callback
|
||||||
|
*
|
||||||
|
* @param array $payload
|
||||||
|
*/
|
||||||
|
public function assertCountAddresses(ExecutionContextInterface $context, $payload): void
|
||||||
|
{
|
||||||
|
if (0 === (count($this->getAddressesEmails()) + count($this->getAddressees()))) {
|
||||||
|
$context->buildViolation('notification.At least one addressee')
|
||||||
|
->atPath('addressees')
|
||||||
|
->addViolation();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getAccessKey(): string
|
||||||
|
{
|
||||||
|
return $this->accessKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getAddedAddresses(): array
|
||||||
|
{
|
||||||
|
return $this->addedAddresses;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return Collection|User[]
|
* @return Collection|User[]
|
||||||
*/
|
*/
|
||||||
@ -155,6 +210,22 @@ class Notification implements TrackUpdateInterface
|
|||||||
return $this->addressees;
|
return $this->addressees;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array|string[]
|
||||||
|
*/
|
||||||
|
public function getAddressesEmails(): array
|
||||||
|
{
|
||||||
|
return $this->addressesEmails;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array|string[]
|
||||||
|
*/
|
||||||
|
public function getAddressesEmailsAdded(): array
|
||||||
|
{
|
||||||
|
return $this->addressesEmailsAdded;
|
||||||
|
}
|
||||||
|
|
||||||
public function getComments(): Collection
|
public function getComments(): Collection
|
||||||
{
|
{
|
||||||
return $this->comments;
|
return $this->comments;
|
||||||
@ -271,6 +342,14 @@ class Notification implements TrackUpdateInterface
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function removeAddressesEmail(string $email)
|
||||||
|
{
|
||||||
|
if (in_array($email, $this->addressesEmails, true)) {
|
||||||
|
$this->addressesEmails = array_filter($this->addressesEmails, static fn ($e) => $e !== $email);
|
||||||
|
$this->addressesEmailsAdded = array_filter($this->addressesEmailsAdded, static fn ($e) => $e !== $email);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public function removeComment(NotificationComment $comment): self
|
public function removeComment(NotificationComment $comment): self
|
||||||
{
|
{
|
||||||
$this->comments->removeElement($comment);
|
$this->comments->removeElement($comment);
|
||||||
|
@ -12,12 +12,17 @@ declare(strict_types=1);
|
|||||||
namespace Chill\MainBundle\Form;
|
namespace Chill\MainBundle\Form;
|
||||||
|
|
||||||
use Chill\MainBundle\Entity\Notification;
|
use Chill\MainBundle\Entity\Notification;
|
||||||
|
use Chill\MainBundle\Form\Type\ChillCollectionType;
|
||||||
use Chill\MainBundle\Form\Type\ChillTextareaType;
|
use Chill\MainBundle\Form\Type\ChillTextareaType;
|
||||||
use Chill\MainBundle\Form\Type\PickUserDynamicType;
|
use Chill\MainBundle\Form\Type\PickUserDynamicType;
|
||||||
use Symfony\Component\Form\AbstractType;
|
use Symfony\Component\Form\AbstractType;
|
||||||
|
use Symfony\Component\Form\Extension\Core\Type\EmailType;
|
||||||
use Symfony\Component\Form\Extension\Core\Type\TextType;
|
use Symfony\Component\Form\Extension\Core\Type\TextType;
|
||||||
use Symfony\Component\Form\FormBuilderInterface;
|
use Symfony\Component\Form\FormBuilderInterface;
|
||||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||||
|
use Symfony\Component\Validator\Constraints\Email;
|
||||||
|
use Symfony\Component\Validator\Constraints\NotBlank;
|
||||||
|
use Symfony\Component\Validator\Constraints\NotNull;
|
||||||
|
|
||||||
class NotificationType extends AbstractType
|
class NotificationType extends AbstractType
|
||||||
{
|
{
|
||||||
@ -30,9 +35,27 @@ class NotificationType extends AbstractType
|
|||||||
])
|
])
|
||||||
->add('addressees', PickUserDynamicType::class, [
|
->add('addressees', PickUserDynamicType::class, [
|
||||||
'multiple' => true,
|
'multiple' => true,
|
||||||
|
'required' => false,
|
||||||
])
|
])
|
||||||
->add('message', ChillTextareaType::class, [
|
->add('message', ChillTextareaType::class, [
|
||||||
'required' => false,
|
'required' => false,
|
||||||
|
])
|
||||||
|
->add('addressesEmails', ChillCollectionType::class, [
|
||||||
|
'label' => 'notification.dest by email',
|
||||||
|
'help' => 'notification.dest by email help',
|
||||||
|
'by_reference' => false,
|
||||||
|
'allow_add' => true,
|
||||||
|
'allow_delete' => true,
|
||||||
|
'entry_type' => EmailType::class,
|
||||||
|
'button_add_label' => 'notification.Add an email',
|
||||||
|
'button_remove_label' => 'notification.Remove an email',
|
||||||
|
'empty_collection_explain' => 'notification.Any email',
|
||||||
|
'entry_options' => [
|
||||||
|
'constraints' => [
|
||||||
|
new NotNull(), new NotBlank(), new Email(['checkMX' => true]),
|
||||||
|
],
|
||||||
|
'label' => 'Email',
|
||||||
|
],
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,6 +73,17 @@ class NotificationMailer
|
|||||||
* Send a email after a notification is persisted.
|
* Send a email after a notification is persisted.
|
||||||
*/
|
*/
|
||||||
public function postPersistNotification(Notification $notification, LifecycleEventArgs $eventArgs): void
|
public function postPersistNotification(Notification $notification, LifecycleEventArgs $eventArgs): void
|
||||||
|
{
|
||||||
|
$this->sendNotificationEmailsToAddresses($notification);
|
||||||
|
$this->sendNotificationEmailsToAddressesEmails($notification);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function postUpdateNotification(Notification $notification, LifecycleEventArgs $eventArgs): void
|
||||||
|
{
|
||||||
|
$this->sendNotificationEmailsToAddressesEmails($notification);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function sendNotificationEmailsToAddresses(Notification $notification): void
|
||||||
{
|
{
|
||||||
foreach ($notification->getAddressees() as $addressee) {
|
foreach ($notification->getAddressees() as $addressee) {
|
||||||
if (null === $addressee->getEmail()) {
|
if (null === $addressee->getEmail()) {
|
||||||
@ -108,4 +119,31 @@ class NotificationMailer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function sendNotificationEmailsToAddressesEmails(Notification $notification): void
|
||||||
|
{
|
||||||
|
foreach ($notification->getAddressesEmailsAdded() as $emailAddress) {
|
||||||
|
$email = new TemplatedEmail();
|
||||||
|
$email
|
||||||
|
->textTemplate('@ChillMain/Notification/email_non_system_notification_content_to_email.fr.md.twig')
|
||||||
|
->context([
|
||||||
|
'notification' => $notification,
|
||||||
|
'dest' => $emailAddress,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$email
|
||||||
|
->subject($notification->getTitle())
|
||||||
|
->to($emailAddress);
|
||||||
|
|
||||||
|
try {
|
||||||
|
$this->mailer->send($email);
|
||||||
|
} catch (TransportExceptionInterface $e) {
|
||||||
|
$this->logger->warning('[NotificationMailer] could not send an email notification', [
|
||||||
|
'to' => $emailAddress,
|
||||||
|
'error_message' => $e->getMessage(),
|
||||||
|
'error_trace' => $e->getTraceAsString(),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -40,6 +40,11 @@
|
|||||||
{{ a|chill_entity_render_string }}
|
{{ a|chill_entity_render_string }}
|
||||||
</span>
|
</span>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
{% for a in c.notification.addressesEmails %}
|
||||||
|
<span class="badge-user" title="{{ 'notification.Email with access link'|trans|e('html_attr') }}">
|
||||||
|
{{ a }}
|
||||||
|
</span>
|
||||||
|
{% endfor %}
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -20,7 +20,9 @@
|
|||||||
|
|
||||||
{{ form_row(form.title, { 'label': 'notification.subject'|trans }) }}
|
{{ form_row(form.title, { 'label': 'notification.subject'|trans }) }}
|
||||||
{{ form_row(form.addressees, { 'label': 'notification.sent_to'|trans }) }}
|
{{ form_row(form.addressees, { 'label': 'notification.sent_to'|trans }) }}
|
||||||
|
|
||||||
|
{{ form_row(form.addressesEmails) }}
|
||||||
|
|
||||||
{% include handler.template(notification) with handler.templateData(notification) %}
|
{% include handler.template(notification) with handler.templateData(notification) %}
|
||||||
|
|
||||||
<div class="mb-3 row">
|
<div class="mb-3 row">
|
||||||
|
@ -21,6 +21,8 @@
|
|||||||
{{ form_row(form.title, { 'label': 'notification.subject'|trans }) }}
|
{{ form_row(form.title, { 'label': 'notification.subject'|trans }) }}
|
||||||
{{ form_row(form.addressees, { 'label': 'notification.sent_to'|trans }) }}
|
{{ form_row(form.addressees, { 'label': 'notification.sent_to'|trans }) }}
|
||||||
|
|
||||||
|
{{ form_row(form.addressesEmails) }}
|
||||||
|
|
||||||
{% include handler.template(notification) with handler.templateData(notification) %}
|
{% include handler.template(notification) with handler.templateData(notification) %}
|
||||||
|
|
||||||
<div class="mb-3 row">
|
<div class="mb-3 row">
|
||||||
|
@ -0,0 +1,20 @@
|
|||||||
|
{{ dest }},
|
||||||
|
|
||||||
|
{{ notification.sender.label }} a créé une notification pour vous:
|
||||||
|
|
||||||
|
> {{ notification.title }}
|
||||||
|
>
|
||||||
|
>
|
||||||
|
{%- for line in notification.message|split("\n") %}
|
||||||
|
> {{ line }}
|
||||||
|
{%- if not loop.last %}
|
||||||
|
>
|
||||||
|
{%- endif %}
|
||||||
|
{%- endfor %}
|
||||||
|
|
||||||
|
Vous pouvez cliquer sur ce lien pour obtenir un accès permanent à la notification:
|
||||||
|
|
||||||
|
{{ absolute_url(path('chill_main_notification_grant_access_by_access_key', {'_locale': 'fr', 'id': notification.id, 'accessKey': notification.accessKey, 'email': dest})) }}
|
||||||
|
|
||||||
|
--
|
||||||
|
Le logiciel Chill
|
@ -88,6 +88,24 @@ final class NotificationTest extends KernelTestCase
|
|||||||
$this->assertNotContains($user1, $notification->getUnreadBy()->toArray());
|
$this->assertNotContains($user1, $notification->getUnreadBy()->toArray());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testAddressesEmail(): void
|
||||||
|
{
|
||||||
|
$notification = new Notification();
|
||||||
|
|
||||||
|
$notification->addAddressesEmail('test');
|
||||||
|
$notification->addAddressesEmail('other');
|
||||||
|
|
||||||
|
$this->assertContains('test', $notification->getAddressesEmails());
|
||||||
|
$this->assertContains('other', $notification->getAddressesEmails());
|
||||||
|
$this->assertContains('test', $notification->getAddressesEmailsAdded());
|
||||||
|
$this->assertContains('other', $notification->getAddressesEmailsAdded());
|
||||||
|
|
||||||
|
$notification->removeAddressesEmail('other');
|
||||||
|
|
||||||
|
$this->assertNotContains('other', $notification->getAddressesEmails());
|
||||||
|
$this->assertNotContains('other', $notification->getAddressesEmailsAdded());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @dataProvider generateNotificationData
|
* @dataProvider generateNotificationData
|
||||||
*/
|
*/
|
||||||
|
@ -61,6 +61,15 @@ services:
|
|||||||
# set the 'lazy' option to TRUE to only instantiate listeners when they are used
|
# set the 'lazy' option to TRUE to only instantiate listeners when they are used
|
||||||
lazy: true
|
lazy: true
|
||||||
method: 'postPersistNotification'
|
method: 'postPersistNotification'
|
||||||
|
|
||||||
|
-
|
||||||
|
name: 'doctrine.orm.entity_listener'
|
||||||
|
event: 'postUpdate'
|
||||||
|
entity: 'Chill\MainBundle\Entity\Notification'
|
||||||
|
# set the 'lazy' option to TRUE to only instantiate listeners when they are used
|
||||||
|
lazy: true
|
||||||
|
method: 'postUpdateNotification'
|
||||||
|
|
||||||
-
|
-
|
||||||
name: 'doctrine.orm.entity_listener'
|
name: 'doctrine.orm.entity_listener'
|
||||||
event: 'postPersist'
|
event: 'postPersist'
|
||||||
|
@ -0,0 +1,46 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Chill\Migrations\Main;
|
||||||
|
|
||||||
|
use Doctrine\DBAL\Schema\Schema;
|
||||||
|
use Doctrine\Migrations\AbstractMigration;
|
||||||
|
|
||||||
|
final class Version20220413154743 extends AbstractMigration
|
||||||
|
{
|
||||||
|
public function down(Schema $schema): void
|
||||||
|
{
|
||||||
|
$this->addSql('ALTER TABLE chill_main_notification DROP adressesEmails');
|
||||||
|
$this->addSql('ALTER TABLE chill_main_notification DROP accessKey');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getDescription(): string
|
||||||
|
{
|
||||||
|
return 'add access keys and emails dest to notifications';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function up(Schema $schema): void
|
||||||
|
{
|
||||||
|
$this->addSql('ALTER TABLE chill_main_notification ADD addressesEmails JSON NOT NULL DEFAULT \'[]\';');
|
||||||
|
$this->addSql('ALTER TABLE chill_main_notification ADD accessKey TEXT DEFAULT NULL');
|
||||||
|
$this->addSql('WITH randoms AS (select
|
||||||
|
n.id,
|
||||||
|
string_agg(substr(characters, (random() * length(characters) + 0.5)::integer, 1), \'\') as random_word
|
||||||
|
from (values(\'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\')) as symbols(characters)
|
||||||
|
-- length of word
|
||||||
|
join generate_series(1, 16) on 1 = 1
|
||||||
|
JOIN chill_main_notification n ON true
|
||||||
|
GROUP BY n.id)
|
||||||
|
UPDATE chill_main_notification SET accessKey = randoms.random_word FROM randoms WHERE chill_main_notification.id = randoms.id');
|
||||||
|
$this->addSql('ALTER TABLE chill_main_notification ALTER accessKey DROP DEFAULT');
|
||||||
|
$this->addSql('ALTER TABLE chill_main_notification ALTER accessKey SET NOT NULL');
|
||||||
|
}
|
||||||
|
}
|
@ -450,4 +450,10 @@ notification:
|
|||||||
subject: Objet
|
subject: Objet
|
||||||
see_comments_thread: Voir le fil de commentaires associé
|
see_comments_thread: Voir le fil de commentaires associé
|
||||||
object_prefix: "[CHILL] notification - "
|
object_prefix: "[CHILL] notification - "
|
||||||
|
dest by email: Lien d'accès par email
|
||||||
|
Any email: Aucun email
|
||||||
|
Add an email: Ajouter un email
|
||||||
|
dest by email help: Les adresses email mentionnées ici recevront un lien d'accès. Un compte utilisateur sera toujours nécessaire.
|
||||||
|
Remove an email: Supprimer l'adresse email
|
||||||
|
Email with access link: Adresse email ayant reçu un lien d'accès
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user