44
55namespace PhpList \Core \Domain \Messaging \Command ;
66
7+ use PhpList \Core \Domain \Messaging \Service \CampaignProcessor ;
78use Symfony \Component \Console \Command \Command ;
89use Symfony \Component \Console \Input \InputInterface ;
910use Symfony \Component \Console \Output \OutputInterface ;
10- use Doctrine \ORM \EntityManagerInterface ;
11- use PhpList \Core \Domain \Messaging \Model \Message ;
1211use PhpList \Core \Domain \Messaging \Repository \MessageRepository ;
1312use PhpList \Core \Domain \Messaging \Service \MessageProcessingPreparator ;
14- use PhpList \Core \Domain \Subscription \Service \Provider \SubscriberProvider ;
1513use Symfony \Component \Lock \LockFactory ;
16- use Symfony \Component \Mailer \MailerInterface ;
17- use Symfony \Component \Mime \Email ;
14+ use Symfony \Component \Console \Attribute \AsCommand ;
1815use Throwable ;
1916
17+ #[AsCommand(
18+ name: 'phplist:process-queue ' ,
19+ description: 'Processes the email campaign queue. '
20+ )]
2021class ProcessQueueCommand extends Command
2122{
22- protected static $ defaultName = 'phplist:process-queue ' ;
23-
2423 private MessageRepository $ messageRepository ;
25- private MailerInterface $ mailer ;
2624 private LockFactory $ lockFactory ;
27- private EntityManagerInterface $ entityManager ;
28- private SubscriberProvider $ subscriberProvider ;
2925 private MessageProcessingPreparator $ messagePreparator ;
26+ private CampaignProcessor $ campaignProcessor ;
3027
3128 public function __construct (
3229 MessageRepository $ messageRepository ,
33- MailerInterface $ mailer ,
3430 LockFactory $ lockFactory ,
35- EntityManagerInterface $ entityManager ,
36- SubscriberProvider $ subscriberProvider ,
37- MessageProcessingPreparator $ messagePreparator
31+ MessageProcessingPreparator $ messagePreparator ,
32+ CampaignProcessor $ campaignProcessor ,
3833 ) {
3934 parent ::__construct ();
4035 $ this ->messageRepository = $ messageRepository ;
41- $ this ->mailer = $ mailer ;
4236 $ this ->lockFactory = $ lockFactory ;
43- $ this ->entityManager = $ entityManager ;
44- $ this ->subscriberProvider = $ subscriberProvider ;
4537 $ this ->messagePreparator = $ messagePreparator ;
38+ $ this ->campaignProcessor = $ campaignProcessor ;
4639 }
4740
4841 /**
@@ -64,45 +57,16 @@ protected function execute(InputInterface $input, OutputInterface $output): int
6457 $ campaigns = $ this ->messageRepository ->findBy (['status ' => 'submitted ' ]);
6558
6659 foreach ($ campaigns as $ campaign ) {
67- $ this ->processCampaign ($ campaign , $ output );
60+ $ this ->campaignProcessor -> process ($ campaign , $ output );
6861 }
62+ } catch (Throwable $ throwable ) {
63+ $ output ->writeln ($ throwable ->getMessage ());
64+
65+ return Command::FAILURE ;
6966 } finally {
7067 $ lock ->release ();
7168 }
7269
7370 return Command::SUCCESS ;
7471 }
75-
76- private function processCampaign (Message $ campaign , OutputInterface $ output ): void
77- {
78- $ subscribers = $ this ->subscriberProvider ->getSubscribersForMessage ($ campaign );
79- // phpcs:ignore Generic.Commenting.Todo
80- // @todo check $ISPrestrictions logic
81- foreach ($ subscribers as $ subscriber ) {
82- if (!filter_var ($ subscriber ->getEmail (), FILTER_VALIDATE_EMAIL )) {
83- continue ;
84- }
85- $ this ->messagePreparator ->processMessageLinks ($ campaign , $ subscriber ->getId ());
86- $ email = (new Email ())
87- 88- ->to ($ subscriber ->getEmail ())
89- ->subject ($ campaign ->getContent ()->getSubject ())
90- ->text ($ campaign ->getContent ()->getTextMessage ())
91- ->html ($ campaign ->getContent ()->getText ());
92-
93- try {
94- $ this ->mailer ->send ($ email );
95-
96- // phpcs:ignore Generic.Commenting.Todo
97- // @todo log somewhere that this subscriber got email
98- } catch (Throwable $ e ) {
99- $ output ->writeln ('Failed to send to: ' . $ subscriber ->getEmail ());
100- }
101-
102- usleep (100000 );
103- }
104-
105- $ campaign ->getMetadata ()->setStatus ('sent ' );
106- $ this ->entityManager ->flush ();
107- }
10872}
0 commit comments