ILIAS  trunk Revision v11.0_alpha-2638-g80c1d007f79
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 $task_manager;
29  private readonly TaskFactory $task_factory;
30  private readonly ilLanguage $language;
31  private readonly ilLogger $logger;
33 
34  public function __construct(
35  private readonly int $anonymous_user_id = ANONYMOUS_USER_ID,
36  ?TaskManager $task_manager = null,
37  ?TaskFactory $task_factory = null,
38  ?ilLanguage $language = null,
39  ?ilLogger $logger = null,
40  ?Container $dic = null,
41  ?ilMailValueObjectJsonService $object_json_service = null
42  ) {
43  if ($dic === null) {
44  global $DIC;
45  $dic = $DIC;
46  }
47 
48  $this->task_manager = $task_manager ?? $dic->backgroundTasks()->taskManager();
49  $this->task_factory = $task_factory ?? $dic->backgroundTasks()->taskFactory();
50  $this->language = $language ?? $dic->language();
51  $this->logger = $logger ?? ilLoggerFactory::getLogger('mail');
52  $this->object_json_service = $object_json_service ?? new ilMailValueObjectJsonService();
53  }
54 
63  public function run(
64  array $value_objects,
65  int $usr_id,
66  string $context_id,
67  array $context_parameters,
68  int $mails_per_task = 100
69  ): void {
70  $num_value_objects = count($value_objects);
71 
72  if ($num_value_objects <= 0) {
73  throw new ilMailException('First parameter must contain at least 1 array element');
74  }
75 
76  if ($mails_per_task <= 0) {
77  throw new ilMailException(
78  sprintf(
79  'The mails per task MUST be a positive integer, "%s" given',
80  $mails_per_task
81  )
82  );
83  }
84 
85  foreach ($value_objects as $value_object) {
86  if (!($value_object instanceof ilMailValueObject)) {
87  throw new ilMailException('Array MUST contain ilMailValueObjects ONLY');
88  }
89  }
90 
91  $task_counter = 0;
92  $remaining_objects = [];
93  foreach ($value_objects as $value_object) {
94  $task_counter++;
95 
96  $remaining_objects[] = $value_object;
97  if ($task_counter === $mails_per_task) {
98  $interaction = $this->createInteraction($usr_id, $context_id, $context_parameters, $remaining_objects);
99 
100  $this->runTask($interaction, $usr_id);
101 
102  $task_counter = 0;
103  $remaining_objects = [];
104  }
105  }
106 
107  if ([] !== $remaining_objects) {
108  $interaction = $this->createInteraction($usr_id, $context_id, $context_parameters, $remaining_objects);
109 
110  $this->runTask($interaction, $usr_id);
111  }
112  }
113 
114  private function runTask(\ILIAS\BackgroundTasks\Task $task, int $usr_id): void
115  {
116  $bucket = new BasicBucket();
117  $bucket->setUserId($usr_id);
118 
119  $bucket->setTask($task);
120  $bucket->setTitle($this->language->txt('mail_bg_task_title'));
121 
122  $this->logger->info('Delegated delivery to background task');
123  $this->task_manager->run($bucket);
124  }
125 
126  private function createInteraction(
127  int $usr_id,
128  string $context_id,
129  array $context_parameters,
130  $remaining_objects
131  ): ILIAS\BackgroundTasks\Task {
132  $json_string = $this->object_json_service->convertToJson($remaining_objects);
133 
134  $task = $this->task_factory->createTask(ilMassMailDeliveryJob::class, [
135  $usr_id,
136  $json_string,
137  $context_id,
138  serialize($context_parameters),
139  ]);
140 
141  // Important: Don't return the task (e.g. as an early return for anonymous user id) https://mantis.ilias.de/view.php?id=33618
142 
143  $parameters = [$task, $usr_id];
144 
145  return $this->task_factory->createTask(
146  ilMailDeliveryJobUserInteraction::class,
147  $parameters
148  );
149  }
150 }
runTask(\ILIAS\BackgroundTasks\Task $task, int $usr_id)
run(array $value_objects, int $usr_id, string $context_id, array $context_parameters, int $mails_per_task=100)
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.
Customizing of pimple-DIC for ILIAS.
Definition: Container.php:35
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
readonly ilMailValueObjectJsonService $object_json_service
global $DIC
Definition: shib_login.php:26
createInteraction(int $usr_id, string $context_id, array $context_parameters, $remaining_objects)
$dic
Definition: result.php:31
__construct(private readonly int $anonymous_user_id=ANONYMOUS_USER_ID, ?TaskManager $task_manager=null, ?TaskFactory $task_factory=null, ?ilLanguage $language=null, ?ilLogger $logger=null, ?Container $dic=null, ?ilMailValueObjectJsonService $object_json_service=null)
language()
description: > Example for rendring a language glyph.
Definition: language.php:41