ILIAS  trunk Revision v11.0_alpha-3011-gc6b235a2e85
class.ilMassMailTaskProcessor.php
Go to the documentation of this file.
1<?php
2
19declare(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;
32 private readonly \ILIAS\Mail\Object\MailPayloadEncoder $payload_encoder;
33
34 public function __construct(
35 private readonly int $anonymous_user_id = ANONYMOUS_USER_ID,
38 ?ilLanguage $language = null,
39 ?ilLogger $logger = null,
40 ?Container $dic = null,
41 ?\ILIAS\Mail\Object\MailPayloadEncoder $payload_encoder = 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 if ($payload_encoder === null) {
54 new ILIAS\Mail\Object\PureJsonMailEncoder(
56 ),
57 new ILIAS\Mail\Transformation\Utf8Mb4Sanitizer()
58 );
59 }
60 $this->payload_encoder = $payload_encoder;
61 }
62
71 public function run(
72 array $value_objects,
73 int $usr_id,
74 string $context_id,
75 array $context_parameters,
76 int $mails_per_task = 100
77 ): void {
78 $num_value_objects = count($value_objects);
79
80 if ($num_value_objects <= 0) {
81 throw new ilMailException('First parameter must contain at least 1 array element');
82 }
83
84 if ($mails_per_task <= 0) {
85 throw new ilMailException(
86 sprintf(
87 'The mails per task MUST be a positive integer, "%s" given',
88 $mails_per_task
89 )
90 );
91 }
92
93 foreach ($value_objects as $value_object) {
94 if (!($value_object instanceof ilMailValueObject)) {
95 throw new ilMailException('Array MUST contain ilMailValueObjects ONLY');
96 }
97 }
98
99 $task_counter = 0;
100 $remaining_objects = [];
101 foreach ($value_objects as $value_object) {
102 $task_counter++;
103
104 $remaining_objects[] = $value_object;
105 if ($task_counter === $mails_per_task) {
106 $interaction = $this->createInteraction($usr_id, $context_id, $context_parameters, $remaining_objects);
107
108 $this->runTask($interaction, $usr_id);
109
110 $task_counter = 0;
111 $remaining_objects = [];
112 }
113 }
114
115 if ([] !== $remaining_objects) {
116 $interaction = $this->createInteraction($usr_id, $context_id, $context_parameters, $remaining_objects);
117
118 $this->runTask($interaction, $usr_id);
119 }
120 }
121
122 private function runTask(\ILIAS\BackgroundTasks\Task $task, int $usr_id): void
123 {
124 $bucket = new BasicBucket();
125 $bucket->setUserId($usr_id);
126
127 $bucket->setTask($task);
128 $bucket->setTitle($this->language->txt('mail_bg_task_title'));
129
130 $this->logger->info('Delegated delivery to background task');
131 $this->task_manager->run($bucket);
132 }
133
134 private function createInteraction(
135 int $usr_id,
136 string $context_id,
137 array $context_parameters,
138 $remaining_objects
139 ): ILIAS\BackgroundTasks\Task {
140 $json_string = $this->payload_encoder->encode($remaining_objects);
141
142 $task = $this->task_factory->createTask(ilMassMailDeliveryJob::class, [
143 $usr_id,
144 $json_string,
145 $context_id,
146 serialize($context_parameters),
147 ]);
148
149 // Important: Don't return the task (e.g. as an early return for anonymous user id) https://mantis.ilias.de/view.php?id=33618
150
151 $parameters = [$task, $usr_id];
152
153 return $this->task_factory->createTask(
154 ilMailDeliveryJobUserInteraction::class,
155 $parameters
156 );
157 }
158}
Customizing of pimple-DIC for ILIAS.
Definition: Container.php:36
language handling
static getLogger(string $a_component_id)
Get component logger.
Component logger with individual log levels by component id.
readonly ILIAS Mail Object MailPayloadEncoder $payload_encoder
createInteraction(int $usr_id, string $context_id, array $context_parameters, $remaining_objects)
__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, ?\ILIAS\Mail\Object\MailPayloadEncoder $payload_encoder=null)
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
$dic
Definition: ltiresult.php:33
Interface Observer \BackgroundTasks Contains several chained tasks and infos about them.
RFC 822 Email address list validation Utility.
global $DIC
Definition: shib_login.php:26