ILIAS  trunk Revision v11.0_alpha-3011-gc6b235a2e85
class.ilBadgesFilesMigration.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
25
27{
28 private const TABLE_NAME = 'badge_badge';
29
31 private ?IOWrapper $io = null;
32
33 public function getLabel(): string
34 {
35 return 'Migration of files of badges 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 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 ' .
84 "file $image_path for id $id to the storage service."
85 );
86 } else {
87 $this->inform("IRSS identification for badge with id $id: {$identification->serialize()}", true);
88 }
89 } catch (Throwable $e) {
90 $this->error("Failed to move badge file {$image_path} for id {$id} to the storage service with exception: {$e->getMessage()}");
91 $this->error($e->getTraceAsString());
92 throw $e;
93 }
94
95 if ($identification === null) {
96 $identification = '-';
97 } else {
98 $identification = $identification->serialize();
99 }
100
101 $this->helper->getDatabase()->update(
102 self::TABLE_NAME,
103 [
104 'image_rid' => [ilDBConstants::T_TEXT, $identification],
105 'image' => [ilDBConstants::T_TEXT, null]
106 ],
107 ['id' => [ilDBConstants::T_INTEGER, $id]]
108 );
109 } else {
110 $this->inform(
111 'Cannot migrate badge with id ' . $id
112 . ' (table: ' . self::TABLE_NAME . ') because no image is set.',
113 true
114 );
115 }
116 }
117
118 private function getImagePath(int $id, string $image): string
119 {
120 $exp = explode('.', $image);
121 $suffix = strtolower(array_pop($exp));
122
123 return $this->getFilePath($id) . '/img' . $id . '.' . $suffix;
124 }
125
126 private function getFilePath(int $a_id): string
127 {
128 return ILIAS_ABSOLUTE_PATH . '/' . ILIAS_WEB_DIR . '/' . CLIENT_ID . '/sec/ilBadge/' . $this->createLegacyPathSegmentForBadgeId($a_id);
129 }
130
131 private function createLegacyPathSegmentForBadgeId(int $id): string
132 {
133 $path = [];
134 $found = false;
135 $num = $id;
136 $path_string = '';
137 for ($i = 3; $i > 0; $i--) {
138 $factor = 100 ** $i;
139 if (($tmp = (int) ($num / $factor)) || $found) {
140 $path[] = $tmp;
141 $num %= $factor;
142 $found = true;
143 }
144 }
145
146 if (count($path)) {
147 $path_string = (implode('/', $path) . '/');
148 }
149
150 return $path_string . 'badge_' . $id;
151 }
152
154 {
155 $res = $this->helper->getDatabase()->query(
156 'SELECT COUNT(id) as amount FROM ' . self::TABLE_NAME . " WHERE image_rid IS NULL OR image_rid = ''"
157 );
158 $row = $this->helper->getDatabase()->fetchObject($res);
159
160 return (int) ($row->amount ?? 0);
161 }
162
166 public function getRevisionNameCallback(): Closure
167 {
168 return static function (string $file_name): string {
169 return md5($file_name);
170 };
171 }
172
173 private function inform(string $text, bool $force = false): void
174 {
175 if ($this->io === null || (!$force && !$this->io->isVerbose())) {
176 return;
177 }
178
179 $this->io->inform($text);
180 }
181
182 private function error(string $text): void
183 {
184 if ($this->io === null) {
185 return;
186 }
187
188 $this->io->error($text);
189 }
190}
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:23
Wrapper around symfonies input and output facilities to provide just the functionality required for t...
Definition: IOWrapper.php:33
ilResourceStorageMigrationHelper $helper
inform(string $text, bool $force=false)
getImagePath(int $id, string $image)
getRemainingAmountOfSteps()
Count up how many "things" need to be migrated.
getPreconditions(Environment $environment)
Objectives the migration depend on.
getDefaultAmountOfStepsPerRun()
Tell the default amount of steps to be executed for one run of the migration.
prepare(Environment $environment)
Prepare the migration by means of some environment.
step(Environment $environment)
Run one step of the migration.
const CLIENT_ID
Definition: constants.php:41
const ILIAS_WEB_DIR
Definition: constants.php:45
An environment holds resources to be used in the setup process.
Definition: Environment.php:28
getResource(string $id)
Consumers of this method should check if the result is what they expect, e.g.
A migration is a potentially long lasting operation that can be broken into discrete steps.
Definition: Migration.php:29
$path
Definition: ltiservices.php:30
$res
Definition: ltiservices.php:69
if(!file_exists('../ilias.ini.php'))