ILIAS  release_9 Revision v9.13-25-g2c18ec4c24f
class.ilUserCertificateRepository.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
25 {
26  private readonly ilDBInterface $database;
27  private readonly ilLogger $logger;
28  private readonly string $defaultTitle;
29 
30  public function __construct(
31  ?ilDBInterface $database = null,
32  ?ilLogger $logger = null,
33  ?string $defaultTitle = null
34  ) {
35  if (null === $database) {
36  global $DIC;
37  $database = $DIC->database();
38  }
39  $this->database = $database;
40 
41  if (null === $logger) {
42  global $DIC;
43  $logger = $DIC->logger()->cert();
44  }
45  $this->logger = $logger;
46 
47  if (null === $defaultTitle) {
48  global $DIC;
49  $defaultTitle = $DIC->language()->txt('certificate_no_object_title');
50  }
51  $this->defaultTitle = $defaultTitle;
52  }
53 
57  public function save(ilUserCertificate $userCertificate): ilUserCertificate
58  {
59  $this->logger->debug('START - saving of user certificate');
60 
61  $version = (int) $this->fetchLatestVersion($userCertificate->getObjId(), $userCertificate->getUserId());
62  ++$version;
63 
64  $id = $this->database->nextId('il_cert_user_cert');
65 
66  $objId = $userCertificate->getObjId();
67  $userId = $userCertificate->getUserId();
68 
69  $this->deactivatePreviousCertificates($objId, $userId);
70 
71  $columns = [
72  'id' => ['integer', $id],
73  'pattern_certificate_id' => ['integer', $userCertificate->getPatternCertificateId()],
74  'obj_id' => ['integer', $objId],
75  'obj_type' => ['text', $userCertificate->getObjType()],
76  'usr_id' => ['integer', $userId],
77  'user_name' => ['text', $userCertificate->getUserName()],
78  'acquired_timestamp' => ['integer', $userCertificate->getAcquiredTimestamp()],
79  'certificate_content' => ['clob', $userCertificate->getCertificateContent()],
80  'template_values' => ['clob', $userCertificate->getTemplateValues()],
81  'valid_until' => ['integer', $userCertificate->getValidUntil()],
82  'version' => ['integer', $version],
83  'ilias_version' => ['text', $userCertificate->getIliasVersion()],
84  'currently_active' => ['integer', (int) $userCertificate->isCurrentlyActive()],
85  'background_image_path' => ['text', $userCertificate->getBackgroundImagePath()],
86  'thumbnail_image_path' => ['text', $userCertificate->getThumbnailImagePath()]
87  ];
88 
89  $this->logger->debug(sprintf(
90  'END - Save certificate with following values: %s',
91  json_encode($columns, JSON_THROW_ON_ERROR | JSON_PRETTY_PRINT)
92  ));
93 
94  $this->database->insert('il_cert_user_cert', $columns);
95 
96  return $userCertificate->withId($id)->withVersion($version);
97  }
98 
102  public function fetchActiveCertificates(int $userId): array
103  {
104  $this->logger->debug(sprintf('START - Fetching all active certificates for user: "%s"', $userId));
105 
106  $sql = '
107 SELECT
108  il_cert_user_cert.pattern_certificate_id,
109  il_cert_user_cert.obj_id,
110  il_cert_user_cert.obj_type,
111  il_cert_user_cert.usr_id,
112  il_cert_user_cert.user_name,
113  il_cert_user_cert.acquired_timestamp,
114  il_cert_user_cert.certificate_content,
115  il_cert_user_cert.template_values,
116  il_cert_user_cert.valid_until,
117  il_cert_user_cert.version,
118  il_cert_user_cert.ilias_version,
119  il_cert_user_cert.currently_active,
120  il_cert_user_cert.background_image_path,
121  il_cert_user_cert.id,
122  il_cert_user_cert.thumbnail_image_path,
123  COALESCE(object_data.title, object_data_del.title, ' . $this->database->quote($this->defaultTitle, 'text') . ') AS title
124 FROM il_cert_user_cert
125 LEFT JOIN object_data ON object_data.obj_id = il_cert_user_cert.obj_id
126 LEFT JOIN object_data_del ON object_data_del.obj_id = il_cert_user_cert.obj_id
127 WHERE usr_id = ' . $this->database->quote($userId, 'integer') . '
128 AND currently_active = 1';
129 
130  $query = $this->database->query($sql);
131 
132  $result = [];
133  while ($row = $this->database->fetchAssoc($query)) {
134  $userCertificate = $this->createUserCertificate($row);
135 
136  $presentation = new ilUserCertificatePresentation(
137  (int) $row['obj_id'],
138  (string) $row['obj_type'],
139  $userCertificate,
140  $row['title'],
141  ''
142  );
143  $result[] = $presentation;
144  }
145 
146  $this->logger->debug(sprintf('Actual results: "%s"', json_encode($result, JSON_THROW_ON_ERROR)));
147  $this->logger->debug(sprintf(
148  'END - All active certificates for user: "%s" total: "%s"',
149  $userId,
150  count($result)
151  ));
152 
153  return $result;
154  }
155 
160  int $userId,
161  int $startTimestamp,
162  int $endTimeStamp
163  ): array {
164  $this->logger->debug(sprintf('START - Fetching all active certificates for user: "%s"', $userId));
165 
166  $sql = '
167 SELECT
168  il_cert_user_cert.pattern_certificate_id,
169  il_cert_user_cert.obj_id,
170  il_cert_user_cert.obj_type,
171  il_cert_user_cert.usr_id,
172  il_cert_user_cert.user_name,
173  il_cert_user_cert.acquired_timestamp,
174  il_cert_user_cert.certificate_content,
175  il_cert_user_cert.template_values,
176  il_cert_user_cert.valid_until,
177  il_cert_user_cert.version,
178  il_cert_user_cert.ilias_version,
179  il_cert_user_cert.currently_active,
180  il_cert_user_cert.background_image_path,
181  il_cert_user_cert.id,
182  il_cert_user_cert.thumbnail_image_path,
183  COALESCE(object_data.title, object_data_del.title, ' . $this->database->quote($this->defaultTitle, 'text') . ') AS title
184 FROM il_cert_user_cert
185 LEFT JOIN object_data ON object_data.obj_id = il_cert_user_cert.obj_id
186 LEFT JOIN object_data_del ON object_data_del.obj_id = il_cert_user_cert.obj_id
187 WHERE usr_id = ' . $this->database->quote($userId, 'integer') . '
188 AND currently_active = 1
189 AND acquired_timestamp >= ' . $this->database->quote($startTimestamp, 'integer') . '
190 AND acquired_timestamp <= ' . $this->database->quote($endTimeStamp, 'integer');
191 
192  $query = $this->database->query($sql);
193 
194  $result = [];
195  while ($row = $this->database->fetchAssoc($query)) {
196  $userCertificate = $this->createUserCertificate($row);
197 
198  $presentation = new ilUserCertificatePresentation(
199  (int) $row['obj_id'],
200  (string) $row['obj_type'],
201  $userCertificate,
202  $row['title'],
203  ''
204  );
205  $result[] = $presentation;
206  }
207 
208  $this->logger->debug(sprintf('Actual results: "%s"', json_encode($result, JSON_THROW_ON_ERROR)));
209  $this->logger->debug(sprintf(
210  'END - All active certificates for user: "%s" total: "%s"',
211  $userId,
212  count($result)
213  ));
214 
215  return $result;
216  }
217 
221  public function fetchActiveCertificate(int $userId, int $objectId): ilUserCertificate
222  {
223  $this->logger->debug(sprintf(
224  'START - Fetching all active certificates for user: "%s" and object: "%s"',
225  $userId,
226  $objectId
227  ));
228 
229  $sql = 'SELECT *
230 FROM il_cert_user_cert
231 WHERE usr_id = ' . $this->database->quote($userId, 'integer') . '
232 AND obj_id = ' . $this->database->quote($objectId, 'integer') . '
233 AND currently_active = 1';
234 
235  $query = $this->database->query($sql);
236 
237  while ($row = $this->database->fetchAssoc($query)) {
238  $this->logger->debug(sprintf('Active certificate values: %s', json_encode($row, JSON_THROW_ON_ERROR)));
239 
240  $this->logger->debug(sprintf(
241  'END -Found active user certificate for user: "%s" and object: "%s"',
242  $userId,
243  $objectId
244  ));
245 
246  return $this->createUserCertificate($row);
247  }
248 
249  throw new ilException(sprintf(
250  'There is no active entry for user id: "%s" and object id: "%s"',
251  $userId,
252  $objectId
253  ));
254  }
255 
259  public function fetchActiveCertificateForPresentation(int $userId, int $objectId): ilUserCertificatePresentation
260  {
261  $this->logger->debug(sprintf(
262  'START - Fetching all active certificates for user: "%s" and object: "%s"',
263  $userId,
264  $objectId
265  ));
266 
267  $sql = 'SELECT
268  il_cert_user_cert.pattern_certificate_id,
269  il_cert_user_cert.obj_id,
270  il_cert_user_cert.obj_type,
271  il_cert_user_cert.usr_id,
272  il_cert_user_cert.user_name,
273  il_cert_user_cert.acquired_timestamp,
274  il_cert_user_cert.certificate_content,
275  il_cert_user_cert.template_values,
276  il_cert_user_cert.valid_until,
277  il_cert_user_cert.version,
278  il_cert_user_cert.ilias_version,
279  il_cert_user_cert.currently_active,
280  il_cert_user_cert.background_image_path,
281  il_cert_user_cert.id,
282  il_cert_user_cert.thumbnail_image_path,
283  usr_data.lastname,
284  COALESCE(object_data.title, object_data_del.title, ' . $this->database->quote($this->defaultTitle, 'text') . ') AS title
285 FROM il_cert_user_cert
286 LEFT JOIN object_data ON object_data.obj_id = il_cert_user_cert.obj_id
287 LEFT JOIN object_data_del ON object_data_del.obj_id = il_cert_user_cert.obj_id
288 LEFT JOIN usr_data ON usr_data.usr_id = il_cert_user_cert.usr_id
289 WHERE il_cert_user_cert.usr_id = ' . $this->database->quote($userId, 'integer') . '
290 AND il_cert_user_cert.obj_id = ' . $this->database->quote($objectId, 'integer') . '
291 AND il_cert_user_cert.currently_active = 1';
292 
293  $query = $this->database->query($sql);
294 
295  while ($row = $this->database->fetchAssoc($query)) {
296  $this->logger->debug(sprintf('Active certificate values: %s', json_encode($row, JSON_THROW_ON_ERROR)));
297 
298  $this->logger->debug(sprintf(
299  'END -Found active user certificate for user: "%s" and object: "%s"',
300  $userId,
301  $objectId
302  ));
303 
304  $userCertificate = $this->createUserCertificate($row);
306  (int) $row['obj_id'],
307  (string) $row['obj_type'],
308  $userCertificate,
309  $row['title'],
310  '',
311  $row['lastname']
312  );
313  }
314 
315  throw new ilException(sprintf(
316  'There is no active entry for user id: "%s" and object id: "%s"',
317  $userId,
318  $objectId
319  ));
320  }
321 
325  public function fetchActiveCertificatesByTypeForPresentation(int $userId, string $type): array
326  {
327  $this->logger->debug(sprintf(
328  'START - Fetching all active certificates for user: "%s" and type: "%s"',
329  $userId,
330  $type
331  ));
332 
333  $sql = 'SELECT
334  il_cert_user_cert.pattern_certificate_id,
335  il_cert_user_cert.obj_id,
336  il_cert_user_cert.obj_type,
337  il_cert_user_cert.usr_id,
338  il_cert_user_cert.user_name,
339  il_cert_user_cert.acquired_timestamp,
340  il_cert_user_cert.certificate_content,
341  il_cert_user_cert.template_values,
342  il_cert_user_cert.valid_until,
343  il_cert_user_cert.version,
344  il_cert_user_cert.ilias_version,
345  il_cert_user_cert.currently_active,
346  il_cert_user_cert.background_image_path,
347  il_cert_user_cert.id,
348  il_cert_user_cert.thumbnail_image_path,
349  COALESCE(object_data.title, object_data_del.title, ' . $this->database->quote($this->defaultTitle, 'text') . ') AS title
350 FROM il_cert_user_cert
351 LEFT JOIN object_data ON object_data.obj_id = il_cert_user_cert.obj_id
352 LEFT JOIN object_data_del ON object_data_del.obj_id = il_cert_user_cert.obj_id
353 WHERE usr_id = ' . $this->database->quote($userId, 'integer') . '
354  AND obj_type = ' . $this->database->quote($type, 'text') . '
355  AND currently_active = 1';
356 
357  $query = $this->database->query($sql);
358 
359  $result = [];
360  while ($row = $this->database->fetchAssoc($query)) {
361  $userCertificate = $this->createUserCertificate($row);
362 
363  $presentation = new ilUserCertificatePresentation(
364  (int) $row['obj_id'],
365  (string) $row['obj_type'],
366  $userCertificate,
367  $row['title'],
368  ''
369  );
370  $result[] = $presentation;
371  }
372 
373  $this->logger->debug(sprintf(
374  'END - Fetching all active certificates for user: "%s" and type: "%s"',
375  $userId,
376  $type
377  ));
378 
379  return $result;
380  }
381 
385  public function fetchCertificate(int $id): ilUserCertificate
386  {
387  $this->logger->debug(sprintf('START - Fetch certificate by id: "%s"', $id));
388 
389  $sql = 'SELECT * FROM il_cert_user_cert WHERE id = ' . $this->database->quote($id, 'integer');
390 
391  $query = $this->database->query($sql);
392 
393  while ($row = $this->database->fetchAssoc($query)) {
394  $this->logger->debug(sprintf('Fetched certificate: "%s"', json_encode($row, JSON_THROW_ON_ERROR)));
395 
396  $this->logger->debug(sprintf('END - Fetch certificate by id: "%s"', $id));
397 
398  return $this->createUserCertificate($row);
399  }
400 
401  throw new ilException('No certificate found for user certificate id: ' . $id);
402  }
403 
408  public function fetchObjectIdsWithCertificateForUser(int $userId, array $objectIds): array
409  {
410  $this->logger->debug(sprintf(
411  'START - Fetch certificate for user("%s") and ids: "%s"',
412  $userId,
413  json_encode($objectIds, JSON_THROW_ON_ERROR)
414  ));
415 
416  if ([] === $objectIds) {
417  return [];
418  }
419 
420  $inStatementObjectIds = $this->database->in(
421  'obj_id',
422  $objectIds,
423  false,
424  'integer'
425  );
426 
427  $sql = 'SELECT obj_id FROM il_cert_user_cert
428  WHERE usr_id = ' . $this->database->quote($userId, 'integer') .
429  ' AND ' . $inStatementObjectIds .
430  ' AND currently_active = ' . $this->database->quote(1, 'integer');
431 
432  $query = $this->database->query($sql);
433 
434  $result = [];
435 
436  while ($row = $this->database->fetchAssoc($query)) {
437  $this->logger->debug(sprintf('Fetched certificate: "%s"', json_encode($row, JSON_THROW_ON_ERROR)));
438  $result[] = (int) $row['obj_id'];
439  }
440 
441  return $result;
442  }
443 
447  public function fetchUserIdsWithCertificateForObject(int $objectId): array
448  {
449  $this->logger->debug(sprintf('START - Fetch certificate for object("%s")"', $objectId));
450 
451  $sql = 'SELECT usr_id FROM il_cert_user_cert
452 WHERE obj_id = ' . $this->database->quote($objectId, 'integer') . '
453  AND currently_active = ' . $this->database->quote(1, 'integer');
454 
455  $query = $this->database->query($sql);
456 
457  $result = [];
458 
459  while ($row = $this->database->fetchAssoc($query)) {
460  $this->logger->debug(sprintf('Fetched certificate: "%s"', json_encode($row, JSON_THROW_ON_ERROR)));
461  $result[] = (int) $row['usr_id'];
462  }
463 
464  return $result;
465  }
466 
467  public function deleteUserCertificates(int $userId): void
468  {
469  $this->logger->debug(sprintf('START - Delete certificate for user("%s")"', $userId));
470 
471  $sql = 'DELETE FROM il_cert_user_cert WHERE usr_id = ' . $this->database->quote($userId, 'integer');
472 
473  $this->database->manipulate($sql);
474 
475  $this->logger->debug(sprintf('END - Successfully deleted certificate for user("%s")"', $userId));
476  }
477 
481  private function fetchCertificatesOfObject(int $objId, int $userId): array
482  {
483  $this->logger->debug(sprintf(
484  'START - fetching all certificates of object(user id: "%s", object id: "%s")',
485  $userId,
486  $objId
487  ));
488 
489  $sql = 'SELECT * FROM il_cert_user_cert
490 WHERE usr_id = ' . $this->database->quote($userId, 'integer') . '
491 AND obj_id = ' . $this->database->quote($objId, 'integer');
492 
493  $query = $this->database->query($sql);
494 
495  $result = [];
496  while ($row = $this->database->fetchAssoc($query)) {
497  $this->logger->debug(sprintf(
498  'Certificate found: "%s")',
499  json_encode($row, JSON_THROW_ON_ERROR | JSON_PRETTY_PRINT)
500  ));
501 
502  $this->logger->debug(sprintf('Certificate: "%s"', json_encode($row, JSON_THROW_ON_ERROR)));
503 
504  $result[] = $this->createUserCertificate($row);
505  }
506 
507  $this->logger->debug(sprintf(
508  'END - fetching all certificates of object(user id: "%s", object id: "%s")',
509  $userId,
510  $objId
511  ));
512 
513  return $result;
514  }
515 
516  private function fetchLatestVersion(int $objId, int $userId): string
517  {
518  $this->logger->debug(sprintf(
519  'START - fetching of latest certificates of object(user id: "%s", object id: "%s")',
520  $userId,
521  $objId
522  ));
523 
524  $templates = $this->fetchCertificatesOfObject($objId, $userId);
525 
526  $version = 0;
527  foreach ($templates as $template) {
528  if ($template->getVersion() > $version) {
529  $version = $template->getVersion();
530  }
531  }
532 
533  $this->logger->debug(sprintf(
534  'END - fetching of latest certificates of object(user id: "%s", object id: "%s") with version "%s"',
535  $userId,
536  $objId,
537  $version
538  ));
539 
540  return (string) $version;
541  }
542 
543  private function deactivatePreviousCertificates(int $objId, int $userId): void
544  {
545  $this->logger->debug(sprintf(
546  'START - deactivating previous certificates for user id: "%s" and object id: "%s"',
547  $userId,
548  $objId
549  ));
550 
551  $sql = '
552 UPDATE il_cert_user_cert
553 SET currently_active = 0
554 WHERE obj_id = ' . $this->database->quote($objId, 'integer') . '
555 AND usr_id = ' . $this->database->quote($userId, 'integer');
556 
557  $this->database->manipulate($sql);
558 
559  $this->logger->debug(sprintf(
560  'END - deactivating previous certificates for user id: "%s" and object id: "%s"',
561  $userId,
562  $objId
563  ));
564  }
565 
566  public function isBackgroundImageUsed(string $relative_image_path): bool
567  {
568  $this->logger->debug(sprintf(
569  'START - Checking if any certificate template uses background image path "%s"',
570  $relative_image_path
571  ));
572 
573  $result = $this->database->queryF(
574  'SELECT EXISTS(SELECT 1 FROM il_cert_user_cert WHERE background_image_path = %s AND currently_active = 1) AS does_exist',
575  ['text'],
576  [$relative_image_path]
577  );
578 
579  $exists = (bool) ($this->database->fetchAssoc($result)['does_exist'] ?? false);
580 
581  $this->logger->debug(sprintf(
582  'END - Image path "%s" is ' . $exists ? "in use" : "unused",
583  $relative_image_path
584  ));
585 
586  return $exists;
587  }
588 
592  private function createUserCertificate(array $row): ilUserCertificate
593  {
594  return new ilUserCertificate(
595  (int) $row['pattern_certificate_id'],
596  (int) $row['obj_id'],
597  $row['obj_type'],
598  (int) $row['usr_id'],
599  $row['user_name'],
600  (int) $row['acquired_timestamp'],
601  $row['certificate_content'],
602  $row['template_values'],
603  (int) $row['valid_until'],
604  (int) $row['version'],
605  $row['ilias_version'],
606  (bool) $row['currently_active'],
607  (string) $row['background_image_path'],
608  (string) $row['thumbnail_image_path'],
609  isset($row['id']) ? (int) $row['id'] : null
610  );
611  }
612 
613  public function deleteUserCertificatesForObject(int $userId, int $obj_id): void
614  {
615  $this->logger->debug(sprintf('START - Delete certificate for user("%s") in object (obj_id: %s)"', $userId, $obj_id));
616 
617  $sql = 'DELETE FROM il_cert_user_cert ' . PHP_EOL
618  . ' WHERE usr_id = ' . $this->database->quote($userId, 'integer') . PHP_EOL
619  . ' AND obj_id = ' . $this->database->quote($obj_id, 'integer');
620 
621  $this->database->manipulate($sql);
622 
623  $this->logger->debug(sprintf('END - Successfully deleted certificate for user("%s") in object (obj_id: %s)"', $userId, $obj_id));
624  }
625 }
deleteUserCertificatesForObject(int $userId, int $obj_id)
fetchActiveCertificatesByTypeForPresentation(int $userId, string $type)
isBackgroundImageUsed(string $relative_image_path)
fetchActiveCertificatesInIntervalForPresentation(int $userId, int $startTimestamp, int $endTimeStamp)
save(ilUserCertificate $userCertificate)
$objId
Definition: xapitoken.php:57
fetchActiveCertificate(int $userId, int $objectId)
global $DIC
Definition: feed.php:28
deactivatePreviousCertificates(int $objId, int $userId)
__construct(?ilDBInterface $database=null, ?ilLogger $logger=null, ?string $defaultTitle=null)
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:23
fetchObjectIdsWithCertificateForUser(int $userId, array $objectIds)
$version
Definition: plugin.php:24
fetchActiveCertificateForPresentation(int $userId, int $objectId)