ILIAS  release_8 Revision v8.19
All Data Structures Namespaces Files Functions Variables Modules Pages
class.ilUserCertificateTableProvider.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
25 {
27  private ilLogger $logger;
28  private string $defaultTitle;
29 
30  public function __construct(
31  ilDBInterface $database,
32  ilLogger $logger,
33  string $defaultTitle
34  ) {
35  $this->database = $database;
36  $this->logger = $logger;
37  $this->defaultTitle = $defaultTitle;
38  }
39 
46  public function fetchDataSet(int $userId, array $params, array $filter): array
47  {
48  $this->logger->debug(sprintf('START - Fetching all active certificates for user: "%s"', $userId));
49 
50  $sql = 'SELECT
51  il_cert_user_cert.id,
52  il_cert_user_cert.obj_type,
53  il_cert_user_cert.thumbnail_image_path,
54  il_cert_user_cert.acquired_timestamp,
55  usr_data.firstname,
56  usr_data.lastname,
57  il_cert_user_cert.obj_id,
58  (CASE
59  WHEN (trans.title IS NOT NULL AND LENGTH(trans.title) > 0) THEN trans.title
60  WHEN (object_data.title IS NOT NULL AND LENGTH(object_data.title) > 0) THEN object_data.title
61  WHEN (object_data_del.title IS NOT NULL AND LENGTH(object_data_del.title) > 0) THEN object_data_del.title
62  ELSE ' . $this->database->quote($this->defaultTitle, 'text') . '
63  END
64  ) as title,
65  (CASE
66  WHEN (trans.description IS NOT NULL AND LENGTH(trans.description) > 0) THEN trans.description
67  WHEN (object_data.description IS NOT NULL AND LENGTH(object_data.description) > 0) THEN object_data.description
68  WHEN (object_data_del.description IS NOT NULL AND LENGTH(object_data_del.description) > 0) THEN object_data_del.description
69  ELSE ""
70  END
71  ) as description
72 FROM il_cert_user_cert
73 LEFT JOIN object_data ON object_data.obj_id = il_cert_user_cert.obj_id
74 LEFT JOIN object_translation trans ON trans.obj_id = object_data.obj_id
75 AND trans.lang_code = ' . $this->database->quote($params['language'], 'text') . '
76 LEFT JOIN object_data_del ON object_data_del.obj_id = il_cert_user_cert.obj_id
77 LEFT JOIN usr_data ON usr_data.usr_id = il_cert_user_cert.usr_id
78 WHERE il_cert_user_cert.usr_id = ' . $this->database->quote($userId, 'integer') . ' AND currently_active = 1';
79 
80  if ([] !== $params) {
81  $sql .= $this->getOrderByPart($params, $filter);
82  }
83 
84  if (isset($params['limit'])) {
85  if (!is_numeric($params['limit'])) {
86  throw new InvalidArgumentException('Please provide a valid numerical limit.');
87  }
88 
89  if (!isset($params['offset'])) {
90  $params['offset'] = 0;
91  } elseif (!is_numeric($params['offset'])) {
92  throw new InvalidArgumentException('Please provide a valid numerical offset.');
93  }
94 
95  $this->database->setLimit($params['limit'], $params['offset']);
96  }
97 
98  $query = $this->database->query($sql);
99 
100  $data = [
101  'items' => [],
102  ];
103 
104  while ($row = $this->database->fetchAssoc($query)) {
105  $title = $row['title'];
106 
107  $data['items'][] = [
108  'id' => (int) $row['id'],
109  'title' => $title,
110  'obj_id' => (int) $row['obj_id'],
111  'obj_type' => $row['obj_type'],
112  'date' => (int) $row['acquired_timestamp'],
113  'thumbnail_image_path' => $row['thumbnail_image_path'],
114  'description' => $row['description'],
115  'firstname' => $row['firstname'],
116  'lastname' => $row['lastname'],
117  ];
118  }
119 
120  if (isset($params['limit'])) {
121  $cnt_sql = '
122  SELECT COUNT(*) cnt
123  FROM il_cert_user_cert
124  WHERE usr_id = ' . $this->database->quote($userId, 'integer') . ' AND currently_active = 1';
125 
126  $row_cnt = $this->database->fetchAssoc($this->database->query($cnt_sql));
127 
128  $data['cnt'] = (int) $row_cnt['cnt'];
129 
130  $this->logger->debug(sprintf(
131  'All active certificates for user: "%s" total: "%s"',
132  $userId,
133  $data['cnt']
134  ));
135  } else {
136  $data['cnt'] = count($data['items']);
137  }
138 
139  $this->logger->debug(sprintf('END - Actual results: "%s"', json_encode($data, JSON_THROW_ON_ERROR)));
140 
141  return $data;
142  }
143 
144  protected function getOrderByPart(array $params, array $filter): string
145  {
146  if (isset($params['order_field'])) {
147  if (!is_string($params['order_field'])) {
148  throw new InvalidArgumentException('Please provide a valid order field.');
149  }
150 
151  if (!in_array($params['order_field'], ['date', 'id', 'title'])) {
152  throw new InvalidArgumentException('Please provide a valid order field.');
153  }
154 
155  if ($params['order_field'] === 'date') {
156  $params['order_field'] = 'acquired_timestamp';
157  }
158 
159  if (!isset($params['order_direction'])) {
160  $params['order_direction'] = 'ASC';
161  } elseif (!in_array(strtolower($params['order_direction']), ['asc', 'desc'])) {
162  throw new InvalidArgumentException('Please provide a valid order direction.');
163  }
164 
165  return ' ORDER BY ' . $params['order_field'] . ' ' . $params['order_direction'];
166  }
167 
168  return '';
169  }
170 }
if(! $DIC->user() ->getId()||!ilLTIConsumerAccess::hasCustomProviderCreationAccess()) $params
Definition: ltiregstart.php:33
$query
fetchDataSet(int $userId, array $params, array $filter)
__construct(ilDBInterface $database, ilLogger $logger, string $defaultTitle)