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