ILIAS  trunk Revision v12.0_alpha-377-g3641b37b9db
class.ilMailbox.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
23
25{
26 private readonly ilLanguage $lng;
27 private readonly ilDBInterface $db;
28 private readonly ilTree $mtree;
29
39 private array $default_folders = [
40 'b_inbox' => 'inbox',
41 'c_trash' => 'trash',
42 'd_drafts' => 'drafts',
43 'e_outbox' => 'outbox',
44 'f_sent' => 'sent',
45 'z_local' => 'local',
46 ];
47 private readonly string $table_mail_obj_data;
48 private readonly string $table_tree;
49
50 public function __construct(protected int $usr_id)
51 {
52 global $DIC;
53
54 if ($usr_id < 1) {
55 throw new InvalidArgumentException('Cannot create mailbox without user id');
56 }
57
58 $this->lng = $DIC->language();
59 $this->db = $DIC->database();
60 $this->table_mail_obj_data = 'mail_obj_data';
61 $this->table_tree = 'mail_tree';
62
63 $this->mtree = new ilTree($this->usr_id);
64 $this->mtree->setTableNames($this->table_tree, $this->table_mail_obj_data);
65
66 $this->lng->loadLanguageModule('mail');
67 }
68
69 public function getRootFolder(): ?int
70 {
71 $res = $this->db->queryF(
72 'SELECT obj_id FROM ' . $this->table_mail_obj_data . ' WHERE user_id = %s AND m_type = %s',
73 ['integer', 'text'],
74 [$this->usr_id, 'root']
75 );
76
77 $row = $this->db->fetchAssoc($res);
78
79 return isset($row['obj_id']) ? (int) $row['obj_id'] : null;
80 }
81
82 public function getInboxFolder(): int
83 {
84 $res = $this->db->queryF(
85 'SELECT obj_id FROM ' . $this->table_mail_obj_data . ' WHERE user_id = %s AND m_type = %s',
86 ['integer', 'text'],
87 [$this->usr_id, 'inbox']
88 );
89
90 $row = $this->db->fetchAssoc($res);
91
92 return (int) $row['obj_id'];
93 }
94
95 public function getDraftsFolder(): int
96 {
97 $res = $this->db->queryF(
98 'SELECT obj_id FROM ' . $this->table_mail_obj_data . ' WHERE user_id = %s AND m_type = %s',
99 ['integer', 'text'],
100 [$this->usr_id, 'drafts']
101 );
102
103 $row = $this->db->fetchAssoc($res);
104
105 return (int) $row['obj_id'];
106 }
107
108 public function getOutboxFolder(): int
109 {
110 $res = $this->db->queryF(
111 'SELECT obj_id FROM ' . $this->table_mail_obj_data . ' WHERE user_id = %s AND m_type = %s',
113 [$this->usr_id, 'outbox']
114 );
115
116 $row = $this->db->fetchAssoc($res);
117 if ($row === null) {
118 return $this->microMigrateOutboxFolder();
119 }
120
121 return (int) $row['obj_id'];
122 }
123
124 private function microMigrateOutboxFolder(): int
125 {
126 $root_folder_id = $this->getRootFolder();
127 if ($root_folder_id === null) {
128 $this->createDefaultFolder();
129
130 $res = $this->db->queryF(
131 'SELECT obj_id FROM ' . $this->table_mail_obj_data . ' WHERE user_id = %s AND m_type = %s',
133 [$this->usr_id, 'outbox']
134 );
135 $row = $this->db->fetchAssoc($res);
136
137 return (int) ($row['obj_id'] ?? 0);
138 }
139
140 $last_id = $this->db->nextId($this->table_mail_obj_data);
141 $this->db->manipulateF(
142 'INSERT INTO ' . $this->table_mail_obj_data .
143 ' (obj_id, user_id, title, m_type) VALUES(%s, %s, %s, %s)',
145 [$last_id, $this->usr_id, 'e_outbox', 'outbox']
146 );
147
148 $this->mtree->insertNode($last_id, $root_folder_id, $this->getDraftsFolder());
149
150 return $last_id;
151 }
152
153 public function getTrashFolder(): int
154 {
155 $res = $this->db->queryF(
156 'SELECT obj_id FROM ' . $this->table_mail_obj_data . ' WHERE user_id = %s AND m_type = %s',
157 ['integer', 'text'],
158 [$this->usr_id, 'trash']
159 );
160
161 $row = $this->db->fetchAssoc($res);
162
163 return (int) $row['obj_id'];
164 }
165
166 public function getSentFolder(): int
167 {
168 $res = $this->db->queryF(
169 'SELECT obj_id FROM ' . $this->table_mail_obj_data . ' WHERE user_id = %s AND m_type = %s',
170 ['integer', 'text'],
171 [$this->usr_id, 'sent']
172 );
173
174 $row = $this->db->fetchAssoc($res);
175
176 return (int) $row['obj_id'];
177 }
178
182 public function createDefaultFolder(): void
183 {
184 $root_folder_id = $this->db->nextId($this->table_mail_obj_data);
185 $this->db->manipulateF(
186 'INSERT INTO ' . $this->table_mail_obj_data .
187 ' (obj_id, user_id, title, m_type) VALUES(%s, %s, %s, %s)',
188 ['integer', 'integer', 'text', 'text'],
189 [$root_folder_id, $this->usr_id, 'a_root', 'root']
190 );
191 $this->mtree->addTree($this->usr_id, $root_folder_id);
192
193 foreach ($this->default_folders as $key => $folder) {
194 $last_id = $this->db->nextId($this->table_mail_obj_data);
195 $this->db->manipulateF(
196 'INSERT INTO ' . $this->table_mail_obj_data .
197 ' (obj_id, user_id, title, m_type) VALUES(%s, %s, %s, %s)',
198 ['integer', 'integer', 'text', 'text'],
199 [$last_id, $this->usr_id, $key, $folder]
200 );
201 $this->mtree->insertNode($last_id, $root_folder_id);
202 }
203 }
204
205 public function addFolder(int $parent_folder_id, string $name): int
206 {
207 if ($this->folderNameExists($name)) {
208 return 0;
209 }
210
211 $next_id = $this->db->nextId($this->table_mail_obj_data);
212 $this->db->manipulateF(
213 'INSERT INTO ' . $this->table_mail_obj_data .
214 ' (obj_id, user_id, title, m_type) VALUES(%s,%s,%s,%s)',
215 ['integer', 'integer', 'text', 'text'],
216 [$next_id, $this->usr_id, $name, 'user_folder']
217 );
218 $this->mtree->insertNode($next_id, $parent_folder_id);
219
220 return $next_id;
221 }
222
223 public function renameFolder(int $folder_id, string $name): bool
224 {
225 if ($this->folderNameExists($name)) {
226 return false;
227 }
228
229 $this->db->manipulateF(
230 'UPDATE ' . $this->table_mail_obj_data . ' SET title = %s WHERE obj_id = %s AND user_id = %s',
231 ['text', 'integer', 'integer'],
232 [$name, $folder_id, $this->usr_id]
233 );
234
235 return true;
236 }
237
238 protected function folderNameExists(string $name): bool
239 {
240 $res = $this->db->queryF(
241 'SELECT obj_id FROM ' . $this->table_mail_obj_data . ' WHERE user_id = %s AND title = %s',
242 ['integer', 'text'],
243 [$this->usr_id, $name]
244 );
245 $row = $this->db->fetchAssoc($res);
246
247 return is_array($row) && $row['obj_id'] > 0;
248 }
249
253 public function deleteFolder(int $folder_id): bool
254 {
255 $query = $this->db->queryF(
256 'SELECT obj_id, title FROM ' . $this->table_mail_obj_data . ' WHERE obj_id = %s AND user_id = %s',
257 ['integer', 'integer'],
258 [$folder_id, $this->usr_id]
259 );
260 $row = $this->db->fetchAssoc($query);
261
262 if (!is_array($row) || array_key_exists($row['title'], $this->default_folders)) {
263 return false;
264 }
265
266 $mailer = new ilMail($this->usr_id);
267
268 $subtree = $this->mtree->getSubTree($this->mtree->getNodeData($folder_id));
269 $this->mtree->deleteTree($this->mtree->getNodeData($folder_id));
270
271 foreach ($subtree as $node) {
272 $node_id = (int) $node['obj_id'];
273
274 $mails = $mailer->getMailsOfFolder($node_id);
275
276 $mail_ids = [];
277 foreach ($mails as $mail) {
278 $mail_ids[] = (int) $mail['mail_id'];
279 }
280
281 $mailer->deleteMails($mail_ids);
282
283 $this->db->manipulateF(
284 'DELETE FROM ' . $this->table_mail_obj_data . ' WHERE obj_id = %s AND user_id = %s',
285 ['integer', 'integer'],
286 [$node_id, $this->usr_id]
287 );
288 }
289
290 return true;
291 }
292
293 public function getFolderData(int $folder_id): ?MailFolderData
294 {
295 $res = $this->db->queryF(
296 'SELECT * FROM ' . $this->table_mail_obj_data . ' WHERE user_id = %s AND obj_id = %s',
297 ['integer', 'integer'],
298 [$this->usr_id, $folder_id]
299 );
300 $row = $this->db->fetchAssoc($res);
301
302 if (is_array($row)) {
303 return $this->getFolderDataFromRow($row);
304 }
305
306 return null;
307 }
308
309 private function getFolderDataFromRow(array $row): MailFolderData
310 {
311 return new MailFolderData(
312 (int) $row['obj_id'],
313 (int) $row['user_id'],
314 MailFolderType::from($row['m_type']),
315 (string) ($row['m_type'] === MailFolderType::USER->value
316 ? $row['title']
317 : $this->lng->txt('mail_' . $row['title']))
318 );
319 }
320
321 public function getParentFolderId(int $folder_id): int
322 {
323 $res = $this->db->queryF(
324 'SELECT * FROM ' . $this->table_tree . ' WHERE child = %s AND tree = %s',
325 ['integer', 'integer'],
326 [$folder_id, $this->usr_id]
327 );
328 $row = $this->db->fetchAssoc($res);
329
330 return is_array($row) ? (int) $row['parent'] : 0;
331 }
332
336 public function getSubFolders(): array
337 {
338 $user_folders = [];
339
340 foreach (array_keys($this->default_folders) as $key) {
341 $res = $this->db->queryF(
342 'SELECT * FROM ' . $this->table_mail_obj_data . ' WHERE user_id = %s AND title = %s',
343 ['integer', 'text'],
344 [$this->usr_id, $key]
345 );
346 $row = $this->db->fetchAssoc($res);
347 if (is_array($row)) {
348 $user_folders[] = $this->getFolderDataFromRow($row);
349 }
350 }
351
352 $query = implode(' ', [
353 'SELECT * FROM ' . $this->table_tree . ', ' . $this->table_mail_obj_data,
354 'WHERE ' . $this->table_mail_obj_data . '.obj_id = ' . $this->table_tree . '.child',
355 'AND ' . $this->table_tree . '.depth > %s',
356 'AND ' . $this->table_tree . '.tree = %s',
357 'ORDER BY ' . $this->table_tree . '.lft, ' . $this->table_mail_obj_data . '.title',
358 ]);
359 $res = $this->db->queryF(
360 $query,
361 ['integer', 'integer'],
362 [2, $this->usr_id]
363 );
364 while ($row = $this->db->fetchAssoc($res)) {
365 $user_folders[] = $this->getFolderDataFromRow($row);
366 }
367
368 return $user_folders;
369 }
370
371 public function setUsrId(int $usr_id): void
372 {
373 $this->usr_id = $usr_id;
374 }
375
376 public function getUsrId(): int
377 {
378 return $this->usr_id;
379 }
380
381 public function delete(): void
382 {
383 $this->db->manipulateF(
384 'DELETE FROM mail_obj_data WHERE user_id = %s',
385 ['integer'],
386 [$this->usr_id]
387 );
388
389 $this->db->manipulateF(
390 'DELETE FROM mail_options WHERE user_id = %s',
391 ['integer'],
392 [$this->usr_id]
393 );
394
395 $this->db->manipulateF(
396 'DELETE FROM mail_saved WHERE user_id = %s',
397 ['integer'],
398 [$this->usr_id]
399 );
400
401 $this->db->manipulateF(
402 'DELETE FROM mail_tree WHERE tree = %s',
403 ['integer'],
404 [$this->usr_id]
405 );
406
407 $this->db->manipulateF(
408 'DELETE FROM mail_auto_responder WHERE sender_id = %s OR receiver_id = %s',
409 ['integer', 'integer'],
410 [$this->usr_id, $this->usr_id]
411 );
412
413 // Delete the user's files from filesystem:
414 // This has to be done before deleting the database entries in table 'mail'
415 $fdm = new ilFileDataMail($this->usr_id);
416 $fdm->onUserDelete();
417
418 // Delete mails of deleted user
419 $this->db->manipulateF(
420 'DELETE FROM mail WHERE user_id = %s',
421 ['integer'],
422 [$this->usr_id]
423 );
424 }
425
430 public function updateMailsOfDeletedUser(string $name_to_show): void
431 {
432 $this->db->manipulateF(
433 'UPDATE mail SET sender_id = %s, import_name = %s WHERE sender_id = %s',
434 ['integer', 'text', 'integer'],
435 [0, $name_to_show, $this->usr_id]
436 );
437 }
438
439 public function isOwnedFolder(int $folder_id): bool
440 {
441 $folder_data = $this->getFolderData($folder_id);
442
443 return $folder_data?->getFolderId() === $folder_id;
444 }
445}
language handling
renameFolder(int $folder_id, string $name)
updateMailsOfDeletedUser(string $name_to_show)
Update existing mails.
deleteFolder(int $folder_id)
isOwnedFolder(int $folder_id)
array $default_folders
getFolderData(int $folder_id)
readonly ilTree $mtree
createDefaultFolder()
Creates all default folders for a user.
readonly ilDBInterface $db
microMigrateOutboxFolder()
readonly ilLanguage $lng
getParentFolderId(int $folder_id)
setUsrId(int $usr_id)
getFolderDataFromRow(array $row)
readonly string $table_tree
readonly string $table_mail_obj_data
__construct(protected int $usr_id)
addFolder(int $parent_folder_id, string $name)
folderNameExists(string $name)
Tree class data representation in hierachical trees using the Nested Set Model with Gaps by Joe Celco...
Interface ilDBInterface.
$res
Definition: ltiservices.php:69
global $DIC
Definition: shib_login.php:26