Skip to content

Commit

Permalink
[Petition] add reminder command
Browse files Browse the repository at this point in the history
  • Loading branch information
ottaviano committed Jan 31, 2025
1 parent 7d7d286 commit 663986c
Show file tree
Hide file tree
Showing 6 changed files with 125 additions and 3 deletions.
19 changes: 19 additions & 0 deletions migrations/2025/Version20250131151354.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

namespace Migrations;

use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;

final class Version20250131151354 extends AbstractMigration
{
public function up(Schema $schema): void
{
$this->addSql('ALTER TABLE petition_signature ADD reminded_at DATETIME DEFAULT NULL');
}

public function down(Schema $schema): void
{
$this->addSql('ALTER TABLE petition_signature DROP reminded_at');
}
}
33 changes: 33 additions & 0 deletions src/Command/RemindUnconfirmedPetitionSignatureCommand.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?php

namespace App\Command;

use App\Renaissance\Petition\SignatureManager;
use App\Repository\PetitionSignatureRepository;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

#[AsCommand(
name: 'app:petition:remind-signature',
description: 'Remind unconfirmed petition signatures',
)]
class RemindUnconfirmedPetitionSignatureCommand extends Command
{
public function __construct(
private readonly PetitionSignatureRepository $repository,
private readonly SignatureManager $manager,
) {
parent::__construct();
}

public function execute(InputInterface $input, OutputInterface $output): int
{
foreach ($this->repository->findAllToRemind() as $signature) {
$this->manager->remind($signature);
}

return self::SUCCESS;
}
}
6 changes: 5 additions & 1 deletion src/Entity/PetitionSignature.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@

use App\Enum\CivilityEnum;
use App\Renaissance\Petition\SignatureRequest;
use App\Repository\PetitionSignatureRepository;
use Doctrine\ORM\Mapping as ORM;
use libphonenumber\PhoneNumber;
use Ramsey\Uuid\Uuid;

#[ORM\Entity]
#[ORM\Entity(repositoryClass: PetitionSignatureRepository::class)]
class PetitionSignature
{
use EntityIdentityTrait;
Expand Down Expand Up @@ -45,6 +46,9 @@ class PetitionSignature
#[ORM\Column(type: 'datetime', nullable: true)]
public ?\DateTime $validatedAt = null;

#[ORM\Column(type: 'datetime', nullable: true)]
public ?\DateTime $remindedAt = null;

public function __construct()
{
$this->uuid = Uuid::uuid4();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?php

namespace App\Mailer\Message\Renaissance;

use App\Entity\PetitionSignature;
use App\Mailer\Message\Message;
use Ramsey\Uuid\Uuid;

class PetitionConfirmationReminderMessage extends AbstractRenaissanceMessage
{
public static function create(PetitionSignature $signature, string $url): Message
{
return new self(
Uuid::uuid4(),
$signature->emailAddress,
$signature->getFullName(),
'Confirmez votre signature à la pétition',
[
'first_name' => $signature->firstName,
'petition_name' => $signature->petitionName,
'primary_link' => $url,
],
);
}
}
16 changes: 14 additions & 2 deletions src/Renaissance/Petition/SignatureManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
use App\Entity\PetitionSignature;
use App\Mailer\MailerService;
use App\Mailer\Message\Renaissance\PetitionConfirmationMessage;
use App\Mailer\Message\Renaissance\PetitionConfirmationReminderMessage;
use Doctrine\ORM\EntityManagerInterface;
use Firebase\JWT\JWT;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
Expand All @@ -23,10 +24,21 @@ public function save(SignatureRequest $request): void
$this->entityManager->persist($signature = PetitionSignature::createFromRequest($request));
$this->entityManager->flush();

$this->transactionalMailer->sendMessage(PetitionConfirmationMessage::create($signature, $this->generateUrl($signature)));
$this->transactionalMailer->sendMessage(PetitionConfirmationMessage::create($signature, $this->generateConfirmUrl($signature)));
}

private function generateUrl(PetitionSignature $signature): string
public function remind(PetitionSignature $signature): void
{
if ($signature->validatedAt || $signature->remindedAt) {
return;
}

$this->transactionalMailer->sendMessage(PetitionConfirmationReminderMessage::create($signature, $this->generateConfirmUrl($signature)));
$signature->remindedAt = new \DateTime();
$this->entityManager->flush();
}

private function generateConfirmUrl(PetitionSignature $signature): string
{
return $this->urlGenerator->generate('app_petition_validate', [
'uuid' => $signature->getUuid(),
Expand Down
29 changes: 29 additions & 0 deletions src/Repository/PetitionSignatureRepository.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

namespace App\Repository;

use App\Entity\PetitionSignature;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;

class PetitionSignatureRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, PetitionSignature::class);
}

/**
* @return PetitionSignature[]
*/
public function findAllToRemind(): array
{
return $this->createQueryBuilder('ps')
->where('ps.validatedAt IS NULL AND ps.remindedAt IS NULL')
->andWhere('ps.createdAt < :date')
->setParameter('date', new \DateTime('-1 week'))
->getQuery()
->getResult()
;
}
}

0 comments on commit 663986c

Please sign in to comment.