ILIAS  release_9 Revision v9.13-25-g2c18ec4c24f
class.ilCmiXapiDelCron.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
22 
31 {
32  public const JOB_ID = 'xapi_deletion_cron';
33 
35 
37 
38  protected ilLogger $log;
39 
40  private \ILIAS\DI\Container $dic;
41 
42  public function __construct()
43  {
44  global $DIC; /* @var \ILIAS\DI\Container $DIC */
45  $this->dic = $DIC;
46 
47  $DIC->language()->loadLanguageModule('cmix');
48 
49  $this->log = ilLoggerFactory::getLogger('cmix');
50 
51  $settings = new ilSetting(self::JOB_ID);
52  $lrsTypeId = $settings->get('lrs_type_id', '0');
53 
54  if($lrsTypeId) {
55  $this->lrsType = new ilCmiXapiLrsType((int) $lrsTypeId);
56  } else {
57  $this->lrsType = null;
58  }
59 
60  $this->model = ilCmiXapiDelModel::init();
61  }
62 
63  public function getId(): string
64  {
65  return self::JOB_ID;
66  }
67 
68  public function getTitle(): string
69  {
70  return $this->dic->language()->txt("cron_xapi_del");
71  }
72 
73  public function getDescription(): string
74  {
75  return $this->dic->language()->txt("cron_xapi_del_desc");
76  }
77 
81  public function hasAutoActivation(): bool
82  {
83  return false;
84  }
85 
89  public function hasFlexibleSchedule(): bool
90  {
91  return true;
92  }
93 
95  {
96  return CronJobScheduleType::SCHEDULE_TYPE_DAILY;
97  }
98 
99  public function getDefaultScheduleValue(): int
100  {
101  return 1;
102  }
103 
104  protected function hasLrsType()
105  {
106  return $this->getLrsType() !== null;
107  }
108 
109  protected function getLrsType()
110  {
111  return $this->lrsType;
112  }
113 
114  public function run(): ilCronJobResult
115  {
116  global $DIC;
117  $cronResult = new ilCronJobResult();
118  $this->log->debug('run');
119 
120  // LRS - Ist Client gelöscht?
121  // LRS - Wenn Client gelöscht dann nix machen
122  // LRS - Wenn Client gelöscht wirklich alle Daten weg?
123  // Wenn Objekt gelöscht warum wird es nochmal bei Nutzer aufgeführt (Tabelle gucken)
124  // xxx Löschen wenn nut Lernerfahrung anzeigen dann nur anzeigen nicht löschen = kein Datenadmin
125 
126  /*
127  Fall 1:
128  * Objekt deleted (in Tabelle xapidel_object eingetragen mit Feld updated=null)
129  => xapidel_object aktualisieren mit updated
130  => hole alle Daten zu Users aus xxcf_users und die Daten zum lrs und activity_id aus xapidel_object inkl. xxcf_data_types
131  => Löschvorgang an LRS-typ schicken
132  => wenn's geklappt hat: Zeile aus xxcf_users löschen
133  => wenn's für alle user geklappt hat: Zeile aus xxcf_data_settings löschen
134  => wenn ggf. auch user gelöscht wurde und der user nur dieses objekt bearbeitet hat, dann lösche auch Zeile in xpidel_user
135 
136 
137  Fall 2:
138  * User deleted (in Tabelle xapidel_user eingetragen mit Feld updated=null)
139  * Objekt noch vorhanden (kein Eintrag in Tabelle xapidel_object)
140  => xapidel_user aktualisieren mit updated
141  => hole alle Daten zum User aus xxcf_users und die Daten zum lrs und activity_id aus xxcf_settings inkl. xxcf_data_types
142  => Löschvorgang an LRS-typ schicken
143  => wenn's geklappt hat: Zeile aus xxcf_users löschen
144  => wenn's für alle Objekte, die der User genutzt hat, gelöscht wurde: Zeile in xapidel_user löschen
145 
146  Fall 3:
147  * User deleted (in Tabelle xapidel_user eingetragen mit Feld updated=null)
148  * Objekt auch deleted (Eintrag in Tabelle xapidel_object mit updated=null)
149  => xapidel_user aktualisieren mit updated
150  => xapidel_object aktualisieren mit updated
151  => hole alle Daten zum User aus xxcf_users und die Daten zum lrs und activity_id aus xapidel_object inkl. xxcf_data_types
152  => Löschvorgang an LRS-typ schicken
153  => wenn's geklappt hat: Zeile aus xxcf_users löschen
154  => wenn's für alle Objekte, die der User genutzt hat, gelöscht wurde: Zeile in xapidel_user löschen
155  => Zeile in Tabelle xapidel_object löschen
156 
157  */
158 
159  // Fall 1:
160  // check deleted objects where updated = NULL
161 
162  $newDeletedObjects = $this->model->getNewDeletedXapiObjects();
163  //ilLoggerFactory::getRootLogger()->alert(var_export($newDeletedObjects,TRUE));
164 
165  $deletedObjectData = array();
166  $allDone = true;
167  foreach ($newDeletedObjects as $deletedObject) {
168  $this->log->debug("delete for " . (string)$deletedObject['obj_id']);
169  // set object to updated
170  $this->model->setXapiObjAsUpdated($deletedObject['obj_id']);
171  // delete data
172  $deleteRequest = new ilCmiXapiStatementsDeleteRequest(
173  (int) $deletedObject['obj_id'],
174  (int) $deletedObject['type_id'],
175  (string) $deletedObject['activity_id'],
176  null,
178  );
179  $done = $deleteRequest->delete();
180  // entry in xxcf_users is already deleted from ilXapiCmi5StatementsDeleteRequest
181  // delete in obj_id from xxcf_data_settings
182  if ($done) {
183  $this->log->debug("deleted data for object: " . (string)$deletedObject['obj_id']);
184  $deletedObjectData[] = $deletedObject['obj_id'];
185  $this->model->deleteXapiObjectEntry($deletedObject['obj_id']);
186  } else {
187  $this->log->debug("error: delete data for object: " . (string) $deletedObject['obj_id']);
188  $this->model->resetUpdatedXapiObj($deletedObject['obj_id']);
189  $allDone = false;
190  }
191  }
192 
193  // Fall 2:
194  // check deleted users where updated = NULL
195  $newDeletedUsers = $this->model->getNewDeletedUsers();
196  foreach ($newDeletedUsers as $deletedUser) {
197  $usrId = $deletedUser['usr_id'];
198  $objId = $deletedUser['obj_id'];
199  // set user to updated
200  $this->model->setUserAsUpdated($usrId);
201  $xapiObject = $this->model->getXapiObjectData($objId);
202  // check if all object data already successfully deleted in previous step within this run, because object was also deleted
203  if (in_array($objId, $deletedObjectData)) {
204  $this->log->debug("nothing to do, because of complete object data deletion in previous step");
205  continue;
206  }
207  $deleteRequest = new ilCmiXapiStatementsDeleteRequest(
208  (int) $objId,
209  (int) $xapiObject['lrs_type_id'],
210  (string) $xapiObject['activity_id'],
211  $usrId,
213  );
214  $done = $deleteRequest->delete();
215  // entry in xxcf_users is already deleted from ilXapiCmi5StatementsDeleteRequest
216  if ($done) {
217  $this->model->deleteUserEntry($usrId, $objId);
218  $this->log->debug("deleted object " . (string) $objId . " data for user " . (string) $usrId);
219  } else {
220  $this->log->debug("error deleting object " . (string) $objId . " data for user " . (string) $usrId);
221  $this->model->resetUpdatedXapiUser($usrId, $objId);
222  $allDone = false;
223  }
224  }
225 
226  // Fall 3 wird noch gebraucht? NEIN
227 
228  if ($allDone) {
229  $cronResult->setStatus(ilCronJobResult::STATUS_OK);
230  } else {
231  $cronResult->setStatus(ilCronJobResult::STATUS_FAIL);
232  }
233  return $cronResult;
234  }
235 }
array $settings
Setting values (LTI parameters, custom parameters and local parameters).
Definition: System.php:200
static getLogger(string $a_component_id)
Get component logger.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
hasAutoActivation()
@inheritdoc
$objId
Definition: xapitoken.php:57
Class ilCmiXapiStatementsDeleteRequest.
Class ilCmiXapiDelCron.
global $DIC
Definition: feed.php:28
hasFlexibleSchedule()
@inheritdoc
ilCmiXapiDelModel $model
Class ilCmiXapiDelModel.
ILIAS DI Container $dic
ilCmiXapiLrsType $lrsType