mirror of
https://github.com/alchemy-fr/Phraseanet.git
synced 2025-10-23 18:03:17 +00:00
Merge pull request #3331 from alchemy-fr/PHRAS-2913_create-tokens-faster_4.1
PHRAS-2913 #comment create publication tokens faster in 4.1
This commit is contained in:
@@ -19,8 +19,10 @@ use Alchemy\Phrasea\Core\PhraseaEvents;
|
||||
use Alchemy\Phrasea\Feed\Aggregate;
|
||||
use Alchemy\Phrasea\Feed\Link\AggregateLinkGenerator;
|
||||
use Alchemy\Phrasea\Feed\Link\FeedLinkGenerator;
|
||||
use Alchemy\Phrasea\Model\Entities\Feed;
|
||||
use Alchemy\Phrasea\Model\Entities\FeedEntry;
|
||||
use Alchemy\Phrasea\Model\Entities\FeedItem;
|
||||
use Alchemy\Phrasea\Model\Entities\FeedPublisher;
|
||||
use Alchemy\Phrasea\Model\Repositories\FeedEntryRepository;
|
||||
use Alchemy\Phrasea\Model\Repositories\FeedItemRepository;
|
||||
use Alchemy\Phrasea\Model\Repositories\FeedPublisherRepository;
|
||||
@@ -46,6 +48,7 @@ class FeedController extends Controller
|
||||
}
|
||||
|
||||
public function createFeedEntryAction(Request $request) {
|
||||
/** @var Feed $feed */
|
||||
$feed = $this->getFeedRepository()->find($request->request->get('feed_id'));
|
||||
|
||||
if (null === $feed) {
|
||||
@@ -53,6 +56,8 @@ class FeedController extends Controller
|
||||
}
|
||||
|
||||
$user = $this->getAuthenticatedUser();
|
||||
|
||||
/** @var FeedPublisher $publisher */
|
||||
$publisher = $this->getFeedPublisherRepository()->findOneBy([
|
||||
'feed' => $feed,
|
||||
'user' => $user,
|
||||
|
@@ -13,7 +13,9 @@ namespace Alchemy\Phrasea\Core\Event\Subscriber;
|
||||
|
||||
use Alchemy\Phrasea\Core\Event\FeedEntryEvent;
|
||||
use Alchemy\Phrasea\Core\PhraseaEvents;
|
||||
use Alchemy\Phrasea\Model\Entities\User;
|
||||
use Alchemy\Phrasea\Model\Entities\WebhookEvent;
|
||||
use Alchemy\Phrasea\Model\Manipulator\TokenManipulator;
|
||||
use Alchemy\Phrasea\Notification\Receiver;
|
||||
use Alchemy\Phrasea\Notification\Mail\MailInfoNewPublication;
|
||||
|
||||
@@ -53,36 +55,43 @@ class FeedEntrySubscriber extends AbstractNotificationSubscriber
|
||||
do {
|
||||
$results = $Query->limit($start, $perLoop)->execute()->get_results();
|
||||
|
||||
foreach ($results as $user_to_notif) {
|
||||
$mailed = false;
|
||||
$users_emailed = []; // for all users
|
||||
$users_to_email = []; // list only users who must be emailed (=create tokens)
|
||||
|
||||
if ($params['notify_email'] && $this->shouldSendNotificationFor($user_to_notif, 'eventsmanager_notify_feed')) {
|
||||
$readyToSend = false;
|
||||
try {
|
||||
$token = $this->app['manipulator.token']->createFeedEntryToken($user_to_notif, $entry);
|
||||
$url = $this->app->url('lightbox', ['LOG' => $token->getValue()]);
|
||||
|
||||
$receiver = Receiver::fromUser($user_to_notif);
|
||||
$readyToSend = true;
|
||||
} catch (\Exception $e) {
|
||||
|
||||
}
|
||||
|
||||
if ($readyToSend) {
|
||||
$mail = MailInfoNewPublication::create($this->app, $receiver);
|
||||
$mail->setButtonUrl($url);
|
||||
$mail->setAuthor($entry->getAuthorName());
|
||||
$mail->setTitle($entry->getTitle());
|
||||
|
||||
$this->deliver($mail);
|
||||
$mailed = true;
|
||||
}
|
||||
/** @var User $user */
|
||||
foreach ($results as $user) {
|
||||
$users_emailed[$user->getId()] = false;
|
||||
if ($params['notify_email'] && $this->shouldSendNotificationFor($user, 'eventsmanager_notify_feed')) {
|
||||
$users_to_email[$user->getId()] = $user;
|
||||
}
|
||||
|
||||
$this->app['events-manager']->notify($user_to_notif->getId(), 'eventsmanager_notify_feed', $datas, $mailed);
|
||||
}
|
||||
|
||||
// get many tokens in one shot
|
||||
$tokens = $this->getTokenManipulator()->createFeedEntryTokens($users_to_email, $entry);
|
||||
foreach($tokens as $token) {
|
||||
try {
|
||||
$url = $this->app->url('lightbox', ['LOG' => $token->getValue()]);
|
||||
$receiver = Receiver::fromUser($token->getUser());
|
||||
|
||||
$mail = MailInfoNewPublication::create($this->app, $receiver);
|
||||
$mail->setButtonUrl($url);
|
||||
$mail->setAuthor($entry->getAuthorName());
|
||||
$mail->setTitle($entry->getTitle());
|
||||
|
||||
$this->deliver($mail);
|
||||
$users_emailed[$token->getUser()->getId()] = true;
|
||||
}
|
||||
catch (\Exception $e) {
|
||||
// no-op
|
||||
}
|
||||
}
|
||||
foreach($users_emailed as $id => $emailed) {
|
||||
$this->app['events-manager']->notify($id, 'eventsmanager_notify_feed', $datas, $emailed);
|
||||
}
|
||||
|
||||
$start += $perLoop;
|
||||
} while (count($results) > 0);
|
||||
}
|
||||
while (count($results) > 0);
|
||||
}
|
||||
|
||||
public static function getSubscribedEvents()
|
||||
@@ -91,4 +100,12 @@ class FeedEntrySubscriber extends AbstractNotificationSubscriber
|
||||
PhraseaEvents::FEED_ENTRY_CREATE => 'onCreate',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @return TokenManipulator
|
||||
*/
|
||||
private function getTokenManipulator()
|
||||
{
|
||||
return $this->app['manipulator.token'];
|
||||
}
|
||||
}
|
||||
|
@@ -22,7 +22,6 @@ use RandomLib\Generator;
|
||||
class TokenManipulator implements ManipulatorInterface
|
||||
{
|
||||
const LETTERS_AND_NUMBERS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
||||
|
||||
const TYPE_FEED_ENTRY = 'FEED_ENTRY';
|
||||
const TYPE_PASSWORD = 'password';
|
||||
const TYPE_ACCOUNT_UNLOCK = 'account-unlock';
|
||||
@@ -126,6 +125,38 @@ class TokenManipulator implements ManipulatorInterface
|
||||
return $this->create($user, self::TYPE_FEED_ENTRY, null, $entry->getId());
|
||||
}
|
||||
|
||||
/**
|
||||
* Create feedEntryTokens for many users in one shot
|
||||
*
|
||||
* @param User[] $users
|
||||
* @param FeedEntry $entry
|
||||
* @return Token[]
|
||||
* @throws \Doctrine\DBAL\DBALException
|
||||
*/
|
||||
public function createFeedEntryTokens($users, FeedEntry $entry)
|
||||
{
|
||||
// $this->removeExpiredTokens();
|
||||
|
||||
$tokens = [];
|
||||
foreach ($users as $user) {
|
||||
$value = $this->random->generateString(32, self::LETTERS_AND_NUMBERS) . $user->getId();
|
||||
|
||||
$token = new Token();
|
||||
$token->setUser($user)
|
||||
->setType(self::TYPE_FEED_ENTRY)
|
||||
->setValue($value)
|
||||
->setExpiration(null)
|
||||
->setData($entry->getId());
|
||||
$tokens[] = $token;
|
||||
|
||||
$this->om->persist($token);
|
||||
}
|
||||
$this->om->flush();
|
||||
$this->om->clear();
|
||||
|
||||
return $tokens;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param User $user
|
||||
* @param $data
|
||||
|
@@ -72,4 +72,9 @@ class TokenRepository extends EntityRepository
|
||||
|
||||
return $query->getResult();
|
||||
}
|
||||
|
||||
public function getEntityManager()
|
||||
{
|
||||
return parent::getEntityManager();
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user