refactor send_reminded function

This commit is contained in:
Nicolas Le Goff
2012-07-11 16:54:09 +02:00
parent d998184477
commit 66e84bcbfb
6 changed files with 81 additions and 41 deletions

View File

@@ -180,8 +180,6 @@ class Installer implements ControllerProviderInterface
\setup::rollback($conn, $connbas); \setup::rollback($conn, $connbas);
try { try {
$setupRegistry = new \Setup_Registry();
$setupRegistry->set('GV_ServerName', $servername, \registry::TYPE_STRING);
$appbox = \appbox::create($app['Core'], $setupRegistry, $conn, $appbox_name, true); $appbox = \appbox::create($app['Core'], $setupRegistry, $conn, $appbox_name, true);

View File

@@ -12,6 +12,7 @@
namespace Repositories; namespace Repositories;
use Doctrine\ORM\EntityRepository; use Doctrine\ORM\EntityRepository;
use Doctrine\DBAL\Types\Type;
/** /**
* *
@@ -21,5 +22,26 @@ use Doctrine\ORM\EntityRepository;
class ValidationParticipantRepository extends EntityRepository class ValidationParticipantRepository extends EntityRepository
{ {
/**
* Retrieve all not reminded participants where the validation has not expired
*
* @param $expireDate The expiration Date
* @return array
*/
public function findNotConfirmedAndNotRemindedParticipantsByExpireDate(\DateTime $expireDate)
{
$dql = '
SELECT p, s
FROM Entities\ValidationParticipant p
JOIN p.session s
JOIN s.basket b
WHERE p.is_confirmed = 0
AND p.reminded IS NULL
AND s.expires < :date';
return $this->_em->createQuery($dql)
->setParameter('date', $expireDate, Type::DATETIME)
->getResult();
}
} }

View File

@@ -367,16 +367,13 @@ class Session_Handler
throw new Exception_ServiceUnavailable(); throw new Exception_ServiceUnavailable();
} }
$registry = $this->appbox->get_registry();
$conn = $this->appbox->get_connection(); $conn = $this->appbox->get_connection();
$browser = Browser::getInstance(); $browser = Browser::getInstance();
$sbases = array();
$this->send_reminders(); $this->send_reminders();
$auth->prelog(); $auth->prelog();
if ($this->is_authenticated() && $this->get_usr_id() == $auth->get_user()->get_id()) { if ($this->is_authenticated() && $this->get_usr_id() == $auth->get_user()->get_id()) {
return $this; return $this;
} }
@@ -533,38 +530,31 @@ class Session_Handler
return $this; return $this;
} }
$Core = bootstrap::getCore(); $core = bootstrap::getCore();
$registry = $Core->getRegistry(); $registry = $core->getRegistry();
$date_two_day = new DateTime('+' . (int) $registry->get('GV_validation_reminder') . ' days');
$events_mngr = eventsmanager_broker::getInstance($this->appbox, $Core); $date = new DateTime('+' . (int) $registry->get('GV_validation_reminder') . ' days');
$sql = 'SELECT v.id as validate_id, v.usr_id, v.ssel_id $eventsMngr = eventsmanager_broker::getInstance($this->appbox, $core);
, s.usr_id as owner, t.value
FROM (validate v, ssel s)
INNER JOIN tokens t
ON (t.datas = s.ssel_id
AND v.usr_id=t.usr_id AND t.type="validate")
WHERE expires_on < :expires_on
AND ISNULL(last_reminder) AND confirmed="0" AND s.ssel_id = v.ssel_id ';
$stmt = $this->appbox->get_connection()->prepare($sql); $em = $core->getEntityManager();
$stmt->execute(array(':expires_on' => phraseadate::format_mysql($date_two_day))); /* @var $em \Doctrine\ORM\EntityManager */
$rs = $stmt->fetchAll(PDO::FETCH_ASSOC); $participantRepo = $em->getRepository('\Entities\ValidationParticipant');
$stmt->closeCursor(); /* @var $participantRepo \Repositories\ValidationParticipantRepository */
$participants = $participantRepo->findNotConfirmedAndNotRemindedParticipantsByExpireDate($date);
foreach ($rs as $row) { foreach ($participants as $participant) {
$params = array( /* @var $participant \Entities\ValidationParticipant */
'to' => $row['usr_id'], $validationSession = $participant->getSession();
'ssel_id' => $row['ssel_id'], $basketId = $validationSession->getBasket()->getId();
'from' => $row['owner'], $eventsMngr->trigger('__VALIDATION_REMINDER__', array(
'validate_id' => $row['validate_id'], 'to' => $participant->getUsrId(),
'url' => $registry->get('GV_ServerName') 'ssel_id' => $basketId,
. 'lightbox/validate/' . $row['ssel_id'] . '/?LOG=' . $row['value'] 'from' => $validationSession->getInitiatorId(),
); 'validate_id' => $validationSession->getId(),
'url' => $registry->get('GV_ServerName') . 'lightbox/validate/' . $basketId . '/'//?LOG=' . $row['value']
$events_mngr->trigger('__VALIDATION_REMINDER__', $params); ));
} }
return $this; return $this;

View File

@@ -110,13 +110,19 @@ class eventsmanager_notify_validationreminder extends eventsmanager_notifyAbstra
$mailed = true; $mailed = true;
} }
try { $core = \bootstrap::getCore();
$sql = 'UPDATE validate SET last_reminder=NOW() WHERE id = :validate_id';
$stmt = $this->appbox->get_connection()->prepare($sql);
$stmt->execute(array(':validate_id' => $params['validate_id']));
$stmt->closeCursor();
} catch (Exception $e) {
$em = $core->getEntityManager();
$validationParticipant = $em->getRepository('\Entities\ValidationParticipant')->find($params['to']);
/* @var $validationParticipant \Entities\ValidationParticipant */
if (null !== $validationParticipant) {
$validationParticipant->setReminded(new \DateTime('now'));
$em->persist($validationParticipant);
$em->flush();
} }
return $this->broker->notify($params['to'], __CLASS__, $datas, $mailed); return $this->broker->notify($params['to'], __CLASS__, $datas, $mailed);

View File

@@ -0,0 +1,21 @@
<?php
require_once __DIR__ . '/../../PhraseanetPHPUnitAuthenticatedAbstract.class.inc';
class ValidationParticipantRepositoryTest extends PhraseanetPHPUnitAuthenticatedAbstract
{
public function testFindNotConfirmedAndNotRemindedParticipants()
{
$this->insertOneValidationBasket(array(
'expires' => new \DateTime('+1 days')
));
$em = self::$core->getEntityManager();
$repo = $em->getRepository('\Entities\ValidationParticipant');
/* @var $repo \Repositories\ValidationParticipantRepository */
$expireDate = new \DateTime('+2 days');
$participants = $repo->findNotConfirmedAndNotRemindedParticipantsByExpireDate($expireDate);
$this->assertEquals(1, count($participants));
}
}

View File

@@ -373,7 +373,7 @@ abstract class PhraseanetPHPUnitAbstract extends WebTestCase
* *
* @return \Entities\Basket * @return \Entities\Basket
*/ */
protected function insertOneValidationBasket() protected function insertOneValidationBasket(array $parameters = array())
{ {
$em = self::$core->getEntityManager(); $em = self::$core->getEntityManager();
@@ -384,8 +384,11 @@ abstract class PhraseanetPHPUnitAbstract extends WebTestCase
$Validation->setBasket($basket); $Validation->setBasket($basket);
$Validation->setInitiator(self::$user); $Validation->setInitiator(self::$user);
if (isset($parameters['expires']) && $parameters['expires'] instanceof \DateTime) {
$Validation->setExpires($parameters['expires']);
}
$basket->setValidation($Validation); $basket->setValidation($Validation);
$em->persist($Validation); $em->persist($Validation);
$em->merge($basket); $em->merge($basket);