ILIAS  release_7 Revision v7.30-3-g800a261c036
All Data Structures Namespaces Files Functions Variables Modules Pages
class.ilUserCertificateRepository.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (c) 1998-2018 ILIAS open source, Extended GPL, see docs/LICENSE */
3 
8 {
12  private $database;
13 
17  private $logger;
18 
22  private $defaultTitle;
23 
29  public function __construct(
30  \ilDBInterface $database = null,
31  ilLogger $logger = null,
32  string $defaultTitle = null
33  ) {
34  if (null === $database) {
35  global $DIC;
36  $database = $DIC->database();
37  }
38  $this->database = $database;
39 
40  if (null === $logger) {
41  global $DIC;
42  $logger = $DIC->logger()->cert();
43  }
44  $this->logger = $logger;
45 
46  if (null === $defaultTitle) {
47  global $DIC;
48  $defaultTitle = $DIC->language()->txt('certificate_no_object_title');
49  }
50  $this->defaultTitle = $defaultTitle;
51  }
52 
58  public function save(ilUserCertificate $userCertificate) : ilUserCertificate
59  {
60  $this->logger->info('START - saving of user certificate');
61 
62  $version = (int) $this->fetchLatestVersion($userCertificate->getObjId(), $userCertificate->getUserId());
63  $version += 1;
64 
65  $id = (int) $this->database->nextId('il_cert_user_cert');
66 
67  $objId = $userCertificate->getObjId();
68  $userId = $userCertificate->getUserId();
69 
70  $this->deactivatePreviousCertificates($objId, $userId);
71 
72  $columns = array(
73  'id' => array('integer', $id),
74  'pattern_certificate_id' => array('integer', $userCertificate->getPatternCertificateId()),
75  'obj_id' => array('integer', $objId),
76  'obj_type' => array('text', $userCertificate->getObjType()),
77  'user_id' => array('integer', $userId),
78  'user_name' => array('text', $userCertificate->getUserName()),
79  'acquired_timestamp' => array('integer', $userCertificate->getAcquiredTimestamp()),
80  'certificate_content' => array('clob', $userCertificate->getCertificateContent()),
81  'template_values' => array('clob', $userCertificate->getTemplateValues()),
82  'valid_until' => array('integer', $userCertificate->getValidUntil()),
83  'version' => array('integer', $version),
84  'ilias_version' => array('text', $userCertificate->getIliasVersion()),
85  'currently_active' => array('integer', (integer) $userCertificate->isCurrentlyActive()),
86  'background_image_path' => array('text', $userCertificate->getBackgroundImagePath()),
87  'thumbnail_image_path' => array('text', $userCertificate->getThumbnailImagePath())
88  );
89 
90  $this->logger->debug(sprintf('END - Save certificate with following values: %s', json_encode($columns, JSON_PRETTY_PRINT)));
91 
92  $this->database->insert('il_cert_user_cert', $columns);
93 
94  return $userCertificate->withId($id)->withVersion($version);
95  }
96 
102  public function fetchActiveCertificates(int $userId) : array
103  {
104  $this->logger->info(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.user_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  (CASE WHEN (object_data.title IS NULL)
124  THEN
125  CASE WHEN (object_data_del.title IS NULL)
126  THEN ' . $this->database->quote($this->defaultTitle, 'text') . '
127  ELSE object_data_del.title
128  END
129  ELSE object_data.title
130  END
131  ) as title
132 FROM il_cert_user_cert
133 LEFT JOIN object_data ON object_data.obj_id = il_cert_user_cert.obj_id
134 LEFT JOIN object_data_del ON object_data_del.obj_id = il_cert_user_cert.obj_id
135 WHERE user_id = ' . $this->database->quote($userId, 'integer') . '
136 AND currently_active = 1';
137 
138  $query = $this->database->query($sql);
139 
140  $result = array();
141  while ($row = $this->database->fetchAssoc($query)) {
142  $userCertificate = $this->createUserCertificate($row);
143 
144  $presentation = new ilUserCertificatePresentation(
145  (int) $row['obj_id'],
146  (string) $row['obj_type'],
147  $userCertificate,
148  $row['title'],
149  ''
150  );
151  $result[] = $presentation;
152  }
153 
154  $this->logger->debug(sprintf('Actual results: "%s"', json_encode($result)));
155  $this->logger->info(sprintf('END - All active certificates for user: "%s" total: "%s"', $userId, count($result)));
156 
157  return $result;
158  }
159 
165  public function fetchActiveCertificatesInIntervalForPresentation(int $userId, int $startTimestamp, int $endTimeStamp) : array
166  {
167  $this->logger->info(sprintf('START - Fetching all active certificates for user: "%s"', $userId));
168 
169  $sql = '
170 SELECT
171  il_cert_user_cert.pattern_certificate_id,
172  il_cert_user_cert.obj_id,
173  il_cert_user_cert.obj_type,
174  il_cert_user_cert.user_id,
175  il_cert_user_cert.user_name,
176  il_cert_user_cert.acquired_timestamp,
177  il_cert_user_cert.certificate_content,
178  il_cert_user_cert.template_values,
179  il_cert_user_cert.valid_until,
180  il_cert_user_cert.version,
181  il_cert_user_cert.ilias_version,
182  il_cert_user_cert.currently_active,
183  il_cert_user_cert.background_image_path,
184  il_cert_user_cert.id,
185  il_cert_user_cert.thumbnail_image_path,
186  (CASE WHEN (object_data.title IS NULL)
187  THEN
188  CASE WHEN (object_data_del.title IS NULL)
189  THEN ' . $this->database->quote($this->defaultTitle, 'text') . '
190  ELSE object_data_del.title
191  END
192  ELSE object_data.title
193  END
194  ) as title
195 FROM il_cert_user_cert
196 LEFT JOIN object_data ON object_data.obj_id = il_cert_user_cert.obj_id
197 LEFT JOIN object_data_del ON object_data_del.obj_id = il_cert_user_cert.obj_id
198 WHERE user_id = ' . $this->database->quote($userId, 'integer') . '
199 AND currently_active = 1
200 AND acquired_timestamp >= ' . $this->database->quote($startTimestamp, 'integer') . '
201 AND acquired_timestamp <= ' . $this->database->quote($endTimeStamp, 'integer');
202 
203  $query = $this->database->query($sql);
204 
205  $result = array();
206  while ($row = $this->database->fetchAssoc($query)) {
207  $userCertificate = $this->createUserCertificate($row);
208 
209  $presentation = new ilUserCertificatePresentation(
210  (int) $row['obj_id'],
211  (string) $row['obj_type'],
212  $userCertificate,
213  $row['title'],
214  ''
215  );
216  $result[] = $presentation;
217  }
218 
219  $this->logger->debug(sprintf('Actual results: "%s"', json_encode($result)));
220  $this->logger->info(sprintf('END - All active certificates for user: "%s" total: "%s"', $userId, count($result)));
221 
222  return $result;
223  }
224 
225  public function fetchActiveCertificate(int $userId, int $objectId) : ilUserCertificate
226  {
227  $this->logger->info(sprintf('START - Fetching all active certificates for user: "%s" and object: "%s"', $userId, $objectId));
228 
229  $sql = 'SELECT *
230 FROM il_cert_user_cert
231 WHERE user_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)));
239 
240  $this->logger->info(sprintf('END -Found active user certificate for user: "%s" and object: "%s"', $userId, $objectId));
241 
242  return $this->createUserCertificate($row);
243  }
244 
245  throw new ilException(sprintf('There is no active entry for user id: "%s" and object id: "%s"', $userId, $objectId));
246  }
247 
254  public function fetchActiveCertificateForPresentation(int $userId, int $objectId) : ilUserCertificatePresentation
255  {
256  $this->logger->info(sprintf('START - Fetching all active certificates for user: "%s" and object: "%s"', $userId, $objectId));
257 
258  $sql = 'SELECT
259  il_cert_user_cert.pattern_certificate_id,
260  il_cert_user_cert.obj_id,
261  il_cert_user_cert.obj_type,
262  il_cert_user_cert.user_id,
263  il_cert_user_cert.user_name,
264  il_cert_user_cert.acquired_timestamp,
265  il_cert_user_cert.certificate_content,
266  il_cert_user_cert.template_values,
267  il_cert_user_cert.valid_until,
268  il_cert_user_cert.version,
269  il_cert_user_cert.ilias_version,
270  il_cert_user_cert.currently_active,
271  il_cert_user_cert.background_image_path,
272  il_cert_user_cert.id,
273  il_cert_user_cert.thumbnail_image_path,
274  usr_data.lastname,
275  (CASE WHEN (object_data.title IS NULL)
276  THEN
277  CASE WHEN (object_data_del.title IS NULL)
278  THEN ' . $this->database->quote($this->defaultTitle, 'text') . '
279  ELSE object_data_del.title
280  END
281  ELSE object_data.title
282  END
283  ) as title
284 FROM il_cert_user_cert
285 LEFT JOIN object_data ON object_data.obj_id = il_cert_user_cert.obj_id
286 LEFT JOIN object_data_del ON object_data_del.obj_id = il_cert_user_cert.obj_id
287 LEFT JOIN usr_data ON usr_data.usr_id = il_cert_user_cert.user_id
288 WHERE il_cert_user_cert.user_id = ' . $this->database->quote($userId, 'integer') . '
289 AND il_cert_user_cert.obj_id = ' . $this->database->quote($objectId, 'integer') . '
290 AND il_cert_user_cert.currently_active = 1';
291 
292  $query = $this->database->query($sql);
293 
294  while ($row = $this->database->fetchAssoc($query)) {
295  $this->logger->debug(sprintf('Active certificate values: %s', json_encode($row)));
296 
297  $this->logger->info(sprintf('END -Found active user certificate for user: "%s" and object: "%s"', $userId, $objectId));
298 
299  $userCertificate = $this->createUserCertificate($row);
301  (int) $row['obj_id'],
302  (string) $row['obj_type'],
303  $userCertificate,
304  $row['title'],
305  '',
306  $row['lastname']
307  );
308  }
309 
310  throw new ilException(sprintf('There is no active entry for user id: "%s" and object id: "%s"', $userId, $objectId));
311  }
312 
318  public function fetchActiveCertificatesByTypeForPresentation(int $userId, string $type) : array
319  {
320  $this->logger->info(sprintf('START - Fetching all active certificates for user: "%s" and type: "%s"', $userId, $type));
321 
322  $sql = 'SELECT
323  il_cert_user_cert.pattern_certificate_id,
324  il_cert_user_cert.obj_id,
325  il_cert_user_cert.obj_type,
326  il_cert_user_cert.user_id,
327  il_cert_user_cert.user_name,
328  il_cert_user_cert.acquired_timestamp,
329  il_cert_user_cert.certificate_content,
330  il_cert_user_cert.template_values,
331  il_cert_user_cert.valid_until,
332  il_cert_user_cert.version,
333  il_cert_user_cert.ilias_version,
334  il_cert_user_cert.currently_active,
335  il_cert_user_cert.background_image_path,
336  il_cert_user_cert.id,
337  il_cert_user_cert.thumbnail_image_path,
338  (CASE WHEN (object_data.title IS NULL)
339  THEN
340  CASE WHEN (object_data_del.title IS NULL)
341  THEN ' . $this->database->quote($this->defaultTitle, 'text') . '
342  ELSE object_data_del.title
343  END
344  ELSE object_data.title
345  END
346  ) as title
347 FROM il_cert_user_cert
348 LEFT JOIN object_data ON object_data.obj_id = il_cert_user_cert.obj_id
349 LEFT JOIN object_data_del ON object_data_del.obj_id = il_cert_user_cert.obj_id
350 WHERE user_id = ' . $this->database->quote($userId, 'integer') . '
351  AND obj_type = ' . $this->database->quote($type, 'text') . '
352  AND currently_active = 1';
353 
354  $query = $this->database->query($sql);
355 
356  $result = array();
357  while ($row = $this->database->fetchAssoc($query)) {
358  $userCertificate = $this->createUserCertificate($row);
359 
360  $presentation = new ilUserCertificatePresentation(
361  (int) $row['obj_id'],
362  (string) $row['obj_type'],
363  $userCertificate,
364  $row['title'],
365  ''
366  );
367  $result[] = $presentation;
368  }
369 
370  $this->logger->info(sprintf('END - Fetching all active certificates for user: "%s" and type: "%s"', $userId, $type));
371 
372  return $result;
373  }
374 
380  public function fetchCertificate(int $id) : ilUserCertificate
381  {
382  $this->logger->info(sprintf('START - Fetch certificate by id: "%s"', $id));
383 
384  $sql = 'SELECT * FROM il_cert_user_cert WHERE id = ' . $this->database->quote($id, 'integer');
385 
386  $query = $this->database->query($sql);
387 
388  while ($row = $this->database->fetchAssoc($query)) {
389  $this->logger->debug(sprintf('Fetched certificate: "%s"', json_encode($row)));
390 
391  $this->logger->info(sprintf('END - Fetch certificate by id: "%s"', $id));
392 
393  return $this->createUserCertificate($row);
394  }
395 
396  throw new ilException('No certificate found for user certificate id: ' . $id);
397  }
398 
399  public function fetchObjectIdsWithCertificateForUser(int $userId, array $objectIds)
400  {
401  $this->logger->info(sprintf('START - Fetch certificate for user("%s") and ids: "%s"', $userId, json_encode($objectIds)));
402 
403  if (0 === count($objectIds)) {
404  return [];
405  }
406 
407  $inStatementObjectIds = $this->database->in(
408  'obj_id',
409  $objectIds,
410  false,
411  'integer'
412  );
413 
414  $sql = 'SELECT obj_id FROM il_cert_user_cert
415  WHERE user_id = ' . $this->database->quote($userId, 'integer') .
416 ' AND ' . $inStatementObjectIds .
417 ' AND currently_active = ' . $this->database->quote(1, 'integer');
418 
419  $query = $this->database->query($sql);
420 
421  $result = array();
422 
423  while ($row = $this->database->fetchAssoc($query)) {
424  $this->logger->debug(sprintf('Fetched certificate: "%s"', json_encode($row)));
425  $result[] = $row['obj_id'];
426  }
427 
428  return $result;
429  }
430 
431  public function fetchUserIdsWithCertificateForObject(int $objectId)
432  {
433  $this->logger->info(sprintf('START - Fetch certificate for object("%s")"', $objectId));
434 
435  $sql = 'SELECT user_id FROM il_cert_user_cert
436 WHERE obj_id = ' . $this->database->quote($objectId, 'integer') . '
437  AND currently_active = ' . $this->database->quote(1, 'integer');
438 
439  $query = $this->database->query($sql);
440 
441  $result = array();
442 
443  while ($row = $this->database->fetchAssoc($query)) {
444  $this->logger->debug(sprintf('Fetched certificate: "%s"', json_encode($row)));
445  $result[] = $row['user_id'];
446  }
447 
448  return $result;
449  }
450 
451  public function deleteUserCertificates(int $userId)
452  {
453  $this->logger->info(sprintf('START - Delete certificate for user("%s")"', $userId));
454 
455  $sql = 'DELETE FROM il_cert_user_cert WHERE user_id = ' . $this->database->quote($userId, 'integer');
456 
457  $this->database->manipulate($sql);
458 
459  $this->logger->info(sprintf('END - Successfully deleted certificate for user("%s")"', $userId));
460  }
461 
467  private function fetchCertificatesOfObject(int $objId, int $userId) : array
468  {
469  $this->logger->info(sprintf(
470  'START - fetching all certificates of object(user id: "%s", object id: "%s")',
471  $userId,
472  $objId
473  ));
474 
475  $sql = 'SELECT * FROM il_cert_user_cert
476 WHERE user_id = ' . $this->database->quote($userId, 'integer') . '
477 AND obj_id = ' . $this->database->quote($objId, 'integer');
478 
479  $query = $this->database->query($sql);
480 
481  $result = array();
482  while ($row = $this->database->fetchAssoc($query)) {
483  $this->logger->debug(sprintf(
484  'Certificate found: "%s")',
485  json_encode($row, JSON_PRETTY_PRINT)
486  ));
487 
488  $this->logger->info(sprintf('Certificate: "%s"', json_encode($row)));
489 
490  $result[] = $this->createUserCertificate($row);
491  }
492 
493  $this->logger->info(sprintf(
494  'END - fetching all certificates of object(user id: "%s", object id: "%s")',
495  $userId,
496  $objId
497  ));
498 
499  return $result;
500  }
501 
507  private function fetchLatestVersion(int $objId, int $userId) : string
508  {
509  $this->logger->info(sprintf(
510  'START - fetching of latest certificates of object(user id: "%s", object id: "%s")',
511  $userId,
512  $objId
513  ));
514 
515  $templates = $this->fetchCertificatesOfObject($objId, $userId);
516 
517  $version = 0;
518  foreach ($templates as $template) {
519  if ($template->getVersion() > $version) {
520  $version = $template->getVersion();
521  }
522  }
523 
524  $this->logger->info(sprintf(
525  'END - fetching of latest certificates of object(user id: "%s", object id: "%s") with version "%s"',
526  $userId,
527  $objId,
528  $version
529  ));
530 
531  return $version;
532  }
533 
539  private function deactivatePreviousCertificates(int $objId, int $userId)
540  {
541  $this->logger->info(sprintf('START - deactivating previous certificates for user id: "%s" and object id: "%s"', $userId, $objId));
542 
543  $sql = '
544 UPDATE il_cert_user_cert
545 SET currently_active = 0
546 WHERE obj_id = ' . $this->database->quote($objId, 'integer') . '
547 AND user_id = ' . $this->database->quote($userId, 'integer');
548 
549  $this->database->manipulate($sql);
550 
551  $this->logger->info(sprintf('END - deactivating previous certificates for user id: "%s" and object id: "%s"', $userId, $objId));
552  }
553 
554  public function isBackgroundImageUsed(string $relativeImagePath) : bool
555  {
556  $this->logger->debug(sprintf(
557  'START - Checking if any certificate template uses background image path "%s"',
558  $relativeImagePath
559  ));
560 
561  $result = $this->database->queryF(
562  'SELECT EXISTS(SELECT 1 FROM il_cert_user_cert WHERE background_image_path = %s AND currently_active = 1) AS does_exist',
563  ['text'],
564  [$relativeImagePath]
565  );
566 
567  $exists = (bool) ($this->database->fetchAssoc($result)['does_exist'] ?? false);
568 
569  $this->logger->debug(sprintf(
570  'END - Image path "%s" is ' . $exists ? "in use" : "unused",
571  $relativeImagePath
572  ));
573 
574  return $exists;
575  }
576 
581  private function createUserCertificate($row) : ilUserCertificate
582  {
583  return new ilUserCertificate(
584  $row['pattern_certificate_id'],
585  $row['obj_id'],
586  $row['obj_type'],
587  $row['user_id'],
588  $row['user_name'],
589  (int) $row['acquired_timestamp'],
590  $row['certificate_content'],
591  $row['template_values'],
592  $row['valid_until'],
593  $row['version'],
594  $row['ilias_version'],
595  $row['currently_active'],
596  $row['background_image_path'],
597  $row['thumbnail_image_path'],
598  $row['id']
599  );
600  }
601 }
$result
fetchActiveCertificatesByTypeForPresentation(int $userId, string $type)
$type
fetchActiveCertificatesInIntervalForPresentation(int $userId, int $startTimestamp, int $endTimeStamp)
save(ilUserCertificate $userCertificate)
$objId
Definition: xapitoken.php:39
__construct(\ilDBInterface $database=null, ilLogger $logger=null, string $defaultTitle=null)
fetchActiveCertificate(int $userId, int $objectId)
deactivatePreviousCertificates(int $objId, int $userId)
isBackgroundImageUsed(string $relativeImagePath)
global $DIC
Definition: goto.php:24
$query
Component logger with individual log levels by component id.
fetchObjectIdsWithCertificateForUser(int $userId, array $objectIds)
if(! $in) $columns
Definition: Utf8Test.php:45
fetchActiveCertificateForPresentation(int $userId, int $objectId)