ILIAS  release_10 Revision v10.1-43-ga1241a92c2f
class.ilMassMailTaskProcessor.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
25 
27 {
28  private readonly TaskManager $taskManager;
29  private readonly TaskFactory $taskFactory;
30  private readonly ilLanguage $language;
31  private readonly ilLogger $logger;
32  private readonly \ILIAS\Mail\Object\MailPayloadEncoder $payload_encoder;
33 
34  public function __construct(
35  private readonly int $anonymousUserId = ANONYMOUS_USER_ID,
36  TaskManager $taskManager = null,
37  TaskFactory $taskFactory = null,
38  ilLanguage $language = null,
39  ilLogger $logger = null,
40  Container $dic = null,
41  \ILIAS\Mail\Object\MailPayloadEncoder $payload_encoder = null
42  ) {
43  if (null === $dic) {
44  global $DIC;
45  $dic = $DIC;
46  }
47 
48  if (null === $taskManager) {
49  $taskManager = $dic->backgroundTasks()->taskManager();
50  }
51  $this->taskManager = $taskManager;
52 
53  if (null === $taskFactory) {
54  $taskFactory = $dic->backgroundTasks()->taskFactory();
55  }
56  $this->taskFactory = $taskFactory;
57 
58  if (null === $language) {
59  $language = $dic->language();
60  }
61  $this->language = $language;
62 
63  if (null === $logger) {
64  $logger = ilLoggerFactory::getLogger('mail');
65  }
66  $this->logger = $logger;
67 
68  if ($payload_encoder === null) {
69  $payload_encoder = new ILIAS\Mail\Object\Mb3SafeMailEncoder(
70  new ILIAS\Mail\Object\PureJsonMailEncoder(
72  ),
73  new ILIAS\Mail\Transformation\Utf8Mb4Sanitizer()
74  );
75  }
76  $this->payload_encoder = $payload_encoder;
77  }
78 
87  public function run(
88  array $mailValueObjects,
89  int $userId,
90  string $contextId,
91  array $contextParameters,
92  int $mailsPerTask = 100
93  ): void {
94  $objectsServiceSize = count($mailValueObjects);
95 
96  if ($objectsServiceSize <= 0) {
97  throw new ilMailException('First parameter must contain at least 1 array element');
98  }
99 
100  if ($mailsPerTask <= 0) {
101  throw new ilMailException(
102  sprintf(
103  'The mails per task MUST be a positive integer, "%s" given',
104  $mailsPerTask
105  )
106  );
107  }
108 
109  foreach ($mailValueObjects as $mailValueObject) {
110  if (!($mailValueObject instanceof ilMailValueObject)) {
111  throw new ilMailException('Array MUST contain ilMailValueObjects ONLY');
112  }
113  }
114  $taskCounter = 0;
115 
116  $remainingObjects = [];
117  foreach ($mailValueObjects as $mailValueObject) {
118  $taskCounter++;
119 
120  $remainingObjects[] = $mailValueObject;
121  if ($taskCounter === $mailsPerTask) {
122  $interaction = $this->createInteraction($userId, $contextId, $contextParameters, $remainingObjects);
123 
124  $this->runTask($interaction, $userId);
125 
126  $taskCounter = 0;
127  $remainingObjects = [];
128  }
129  }
130 
131  if ([] !== $remainingObjects) {
132  $interaction = $this->createInteraction($userId, $contextId, $contextParameters, $remainingObjects);
133 
134  $this->runTask($interaction, $userId);
135  }
136  }
137 
138  private function runTask(\ILIAS\BackgroundTasks\Task $task, int $userId): void
139  {
140  $bucket = new BasicBucket();
141  $bucket->setUserId($userId);
142 
143  $bucket->setTask($task);
144  $bucket->setTitle($this->language->txt('mail_bg_task_title'));
145 
146  $this->logger->info('Delegated delivery to background task');
147  $this->taskManager->run($bucket);
148  }
149 
150  private function createInteraction(
151  int $userId,
152  string $contextId,
153  array $contextParameters,
154  $remainingObjects
155  ): ILIAS\BackgroundTasks\Task {
156  $jsonString = $this->payload_encoder->encode($remainingObjects);
157 
158  $task = $this->taskFactory->createTask(ilMassMailDeliveryJob::class, [
159  $userId,
160  $jsonString,
161  $contextId,
162  serialize($contextParameters),
163  ]);
164 
165  // Important: Don't return the task (e.g. as an early return for anonymous user id) https://mantis.ilias.de/view.php?id=33618
166 
167  $parameters = [$task, $userId];
168 
169  return $this->taskFactory->createTask(
170  ilMailDeliveryJobUserInteraction::class,
171  $parameters
172  );
173  }
174 }
__construct(private readonly int $anonymousUserId=ANONYMOUS_USER_ID, TaskManager $taskManager=null, TaskFactory $taskFactory=null, ilLanguage $language=null, ilLogger $logger=null, Container $dic=null, \ILIAS\Mail\Object\MailPayloadEncoder $payload_encoder=null)
const ANONYMOUS_USER_ID
Definition: constants.php:27
static getLogger(string $a_component_id)
Get component logger.
Interface Observer Contains several chained tasks and infos about them.
createInteraction(int $userId, string $contextId, array $contextParameters, $remainingObjects)
run(array $mailValueObjects, int $userId, string $contextId, array $contextParameters, int $mailsPerTask=100)
Customizing of pimple-DIC for ILIAS.
Definition: Container.php:35
runTask(\ILIAS\BackgroundTasks\Task $task, int $userId)
readonly ILIAS Mail Object MailPayloadEncoder $payload_encoder
global $DIC
Definition: shib_login.php:25
RFC 822 Email address list validation Utility.
$dic
Definition: ltiresult.php:33
language()
description: > Example for rendring a language glyph.
Definition: language.php:25