Skip to content

Commit 8716c55

Browse files
committed
[#201] Batch demo image downloads
1 parent 0358b70 commit 8716c55

2 files changed

Lines changed: 109 additions & 29 deletions

File tree

helpers/functions.php

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
* @link https://quantumphp.io
77
*/
88

9+
use Quantum\HttpClient\Contracts\CurlAdapterInterface;
910
use Quantum\HttpClient\Exceptions\HttpClientException;
11+
use Quantum\HttpClient\Adapters\MultiCurlAdapter;
1012
use Quantum\Storage\Factories\FileSystemFactory;
1113
use Quantum\Config\Exceptions\ConfigException;
1214
use Quantum\App\Exceptions\BaseException;
@@ -86,6 +88,62 @@ function save_remote_image(string $imageUrl, string $userDirectory, string $imag
8688
return $imageName;
8789
}
8890

91+
/**
92+
* Saves remote images
93+
* @param array<int, array{url: string, directory: string, name: string}> $images
94+
* @return array<int, string>
95+
* @throws ReflectionException
96+
* @throws BaseException
97+
* @throws ConfigException
98+
* @throws DiException
99+
*/
100+
function save_remote_images(array $images): array
101+
{
102+
if ($images === []) {
103+
return [];
104+
}
105+
106+
$fs = FileSystemFactory::get();
107+
$multiCurl = (new MultiCurlAdapter())
108+
->setOpt(CURLOPT_FOLLOWLOCATION, true);
109+
$jobs = [];
110+
$imageNames = [];
111+
112+
foreach ($images as $index => $image) {
113+
/** @var CurlAdapterInterface $request */
114+
$request = $multiCurl->addGet($image['url']);
115+
$imageNames[$index] = slugify($image['name']) . '.jpg';
116+
$jobs[$request->getId()] = [
117+
'directory' => $image['directory'],
118+
'name' => $imageNames[$index],
119+
];
120+
}
121+
122+
$multiCurl->complete(function (CurlAdapterInterface $request) use ($fs, $jobs): void {
123+
if (!isset($jobs[$request->getId()])) {
124+
return;
125+
}
126+
127+
if ($request->isError()) {
128+
throw new RuntimeException(
129+
$request->getErrorMessage() ?? 'Unable to download remote image',
130+
$request->getErrorCode()
131+
);
132+
}
133+
134+
$job = $jobs[$request->getId()];
135+
136+
$fs->put(
137+
uploads_dir() . DS . $job['directory'] . DS . $job['name'],
138+
$request->getResponse()
139+
);
140+
});
141+
142+
$multiCurl->start();
143+
144+
return $imageNames;
145+
}
146+
89147
/**
90148
* Creates user directory
91149
* @param string $uuid

shared/Commands/DemoCommand.php

Lines changed: 51 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -241,11 +241,22 @@ private function createModule(string $moduleName, string $template, bool $withAs
241241
private function generateUsers(): array
242242
{
243243
$users = [];
244+
$images = [];
245+
244246
for ($i = 0; $i < self::COUNTS['users']; $i++) {
245-
$user = $this->generateUserData();
247+
$generated = $this->generateUserData();
248+
$users[] = $generated['data'];
249+
$images[] = $generated['image'];
250+
}
251+
252+
$imageNames = save_remote_images($images);
253+
254+
foreach ($users as $index => $user) {
255+
$user['image'] = $imageNames[$index];
246256
$this->runCommandInternally(self::COMMANDS['user_create'], $user);
247-
$users[] = $user;
257+
$users[$index] = $user;
248258
}
259+
249260
return $users;
250261
}
251262

@@ -262,15 +273,24 @@ private function generateUsers(): array
262273
private function generatePosts(array $users): array
263274
{
264275
$posts = [];
276+
$images = [];
265277

266278
foreach ($users as $user) {
267279
for ($i = 0; $i < self::COUNTS['posts_per_user']; $i++) {
268-
$post = $this->generatePostData($user);
269-
$this->runCommandInternally(self::COMMANDS['post_create'], $post);
270-
$posts[] = $post;
280+
$generated = $this->generatePostData($user);
281+
$posts[] = $generated['data'];
282+
$images[] = $generated['image'];
271283
}
272284
}
273285

286+
$imageNames = save_remote_images($images);
287+
288+
foreach ($posts as $index => $post) {
289+
$post['image'] = $imageNames[$index];
290+
$this->runCommandInternally(self::COMMANDS['post_create'], $post);
291+
$posts[$index] = $post;
292+
}
293+
274294
return $posts;
275295
}
276296

@@ -309,20 +329,21 @@ private function generateUserData(): array
309329

310330
create_user_directory($userUuid);
311331

312-
$imageName = save_remote_image(
313-
$this->faker->gravatarUrl(),
314-
$userUuid,
315-
$email
316-
);
317-
318332
return [
319-
'email' => $email,
320-
'password' => self::DEFAULT_PASSWORD,
321-
'firstname' => $this->faker->name(),
322-
'lastname' => $this->faker->lastName(),
323-
'uuid' => $userUuid,
324-
'role' => Role::EDITOR,
325-
'image' => $imageName,
333+
'data' => [
334+
'email' => $email,
335+
'password' => self::DEFAULT_PASSWORD,
336+
'firstname' => $this->faker->name(),
337+
'lastname' => $this->faker->lastName(),
338+
'uuid' => $userUuid,
339+
'role' => Role::EDITOR,
340+
'image' => '',
341+
],
342+
'image' => [
343+
'url' => $this->faker->gravatarUrl(),
344+
'directory' => $userUuid,
345+
'name' => $email,
346+
],
326347
];
327348
}
328349

@@ -340,18 +361,19 @@ private function generatePostData(array $user): array
340361
$postUuid = $this->faker->uuid();
341362
$title = textCleanUp($this->faker->realText(50));
342363

343-
$imageName = save_remote_image(
344-
$this->faker->imageUrl(640, 480, true, 0),
345-
$user['uuid'],
346-
$title
347-
);
348-
349364
return [
350-
'title' => $title,
351-
'description' => textCleanUp($this->faker->realText(1000)),
352-
'user_uuid' => $user['uuid'],
353-
'uuid' => $postUuid,
354-
'image' => $imageName,
365+
'data' => [
366+
'title' => $title,
367+
'description' => textCleanUp($this->faker->realText(1000)),
368+
'user_uuid' => $user['uuid'],
369+
'uuid' => $postUuid,
370+
'image' => '',
371+
],
372+
'image' => [
373+
'url' => $this->faker->imageUrl(640, 480, true, 0),
374+
'directory' => $user['uuid'],
375+
'name' => $title,
376+
],
355377
];
356378
}
357379

0 commit comments

Comments
 (0)