ILIAS  trunk Revision v11.0_alpha-1715-g7fc467680fb
All Data Structures Namespaces Files Functions Variables Enumerations Enumerator Modules Pages
class.ilBadgeTemplatesFilesMigration.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
25 
27 {
28  private const TABLE_NAME = 'badge_image_template';
29 
31  private ?IOWrapper $io = null;
32 
33  public function getLabel(): string
34  {
35  return 'Migration of files of badge templates to the resource storage service.';
36  }
37 
39  {
40  return 1000;
41  }
42 
43  public function getPreconditions(Environment $environment): array
44  {
46  }
47 
48  public function prepare(Environment $environment): void
49  {
50  $this->helper = new ilResourceStorageMigrationHelper(
52  $environment
53  );
54  $io = $environment->getResource(Environment::RESOURCE_ADMIN_INTERACTION);
55  if ($io instanceof IOWrapper) {
56  $this->io = $io;
57  }
58  }
59 
60  public function step(Environment $environment): void
61  {
62  $this->helper->getDatabase()->setLimit(1);
63  $res = $this->helper->getDatabase()->query(
64  'SELECT id, image, image_rid FROM ' . self::TABLE_NAME . " WHERE image_rid IS NULL OR image_rid = ''"
65  );
66  $row = $this->helper->getDatabase()->fetchObject($res);
67  if (!($row instanceof stdClass)) {
68  return;
69  }
70 
71  $id = (int) $row->id;
72  $image = $row->image;
73 
74  if ($image !== '' && $image !== null) {
75  $image_path = $this->getImagePath($id, $image);
76 
77  try {
78  $this->inform("Trying to move badge image template file $image_path for id $id to the storage service.");
79  $identification = $this->helper->movePathToStorage($image_path, ResourceCollection::NO_SPECIFIC_OWNER);
80  $this->inform('Migration proceeded without error.');
81  if ($identification === null) {
82  $this->error(
83  'IRSS returned NULL as identification when trying to move badge image template ' .
84  "file $image_path for id $id to the storage service."
85  );
86  } else {
87  $this->inform(
88  "IRSS identification for badge image template with id $id: {$identification->serialize()}",
89  true
90  );
91  }
92  } catch (Throwable $e) {
93  $this->error("Failed to move badge image template file $image_path for id $id to the storage service with exception: {$e->getMessage()}");
94  $this->error($e->getTraceAsString());
95  throw $e;
96  }
97 
98  if ($identification === null) {
99  $identification = '-';
100  } else {
101  $identification = $identification->serialize();
102  }
103 
104  $this->helper->getDatabase()->update(
105  self::TABLE_NAME,
106  [
107  'image_rid' => [ilDBConstants::T_TEXT, $identification],
108  'image' => [ilDBConstants::T_TEXT, null]
109  ],
110  ['id' => [ilDBConstants::T_INTEGER, $id]]
111  );
112  }
113  }
114 
115  private function getImagePath(int $id, string $image): string
116  {
117  $exp = explode('.', $image);
118  $suffix = strtolower(array_pop($exp));
119 
120  return $this->getFilePath($id) . '/img' . $id . '.' . $suffix;
121  }
122 
123  private function getFilePath(int $a_id): string
124  {
125  return ILIAS_ABSOLUTE_PATH . '/' . ILIAS_WEB_DIR . '/' . CLIENT_ID . '/sec/ilBadge/' . $this->createLegacyPathSegmentForBadgeTemplateId($a_id);
126  }
127 
128  private function createLegacyPathSegmentForBadgeTemplateId(int $id): string
129  {
130  $path = [];
131  $found = false;
132  $num = $id;
133  $path_string = '';
134  for ($i = 3; $i > 0; $i--) {
135  $factor = 100 ** $i;
136  if (($tmp = (int) ($num / $factor)) || $found) {
137  $path[] = $tmp;
138  $num %= $factor;
139  $found = true;
140  }
141  }
142 
143  if (count($path)) {
144  $path_string = (implode('/', $path) . '/');
145  }
146 
147  return $path_string . 'badgetmpl_' . $id;
148  }
149 
150  public function getRemainingAmountOfSteps(): int
151  {
152  $res = $this->helper->getDatabase()->query(
153  'SELECT COUNT(id) as amount FROM ' . self::TABLE_NAME . " WHERE image_rid IS NULL OR image_rid = ''"
154  );
155  $row = $this->helper->getDatabase()->fetchObject($res);
156 
157  return (int) ($row->amount ?? 0);
158  }
159 
160  private function inform(string $text, bool $force = false): void
161  {
162  if ($this->io === null || (!$force && !$this->io->isVerbose())) {
163  return;
164  }
165 
166  $this->io->inform($text);
167  }
168 
169  private function error(string $text): void
170  {
171  if ($this->io === null) {
172  return;
173  }
174 
175  $this->io->error($text);
176  }
177 }
$res
Definition: ltiservices.php:66
Wrapper around symfonies input and output facilities to provide just the functionality required for t...
Definition: IOWrapper.php:32
getPreconditions(Environment $environment)
Objectives the migration depend on.
getDefaultAmountOfStepsPerRun()
Tell the default amount of steps to be executed for one run of the migration.
step(Environment $environment)
Run one step of the migration.
A migration is a potentially long lasting operation that can be broken into discrete steps...
Definition: Migration.php:28
if(!file_exists('../ilias.ini.php'))
prepare(Environment $environment)
Prepare the migration by means of some environment.
$path
Definition: ltiservices.php:29
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
const CLIENT_ID
Definition: constants.php:41
getRemainingAmountOfSteps()
Count up how many "things" need to be migrated.
getResource(string $id)
Consumers of this method should check if the result is what they expect, e.g.
An environment holds resources to be used in the setup process.
Definition: Environment.php:27
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:23
const ILIAS_WEB_DIR
Definition: constants.php:45