diff --git a/helpers/functions.php b/helpers/functions.php index 602b4a6..2fa65bc 100644 --- a/helpers/functions.php +++ b/helpers/functions.php @@ -6,7 +6,9 @@ * @link https://quantumphp.io */ +use Quantum\HttpClient\Contracts\CurlAdapterInterface; use Quantum\HttpClient\Exceptions\HttpClientException; +use Quantum\HttpClient\Adapters\MultiCurlAdapter; use Quantum\Storage\Factories\FileSystemFactory; use Quantum\Config\Exceptions\ConfigException; use Quantum\App\Exceptions\BaseException; @@ -86,6 +88,62 @@ function save_remote_image(string $imageUrl, string $userDirectory, string $imag return $imageName; } +/** + * Saves remote images + * @param array $images + * @return array + * @throws ReflectionException + * @throws BaseException + * @throws ConfigException + * @throws DiException + */ +function save_remote_images(array $images): array +{ + if ($images === []) { + return []; + } + + $fs = FileSystemFactory::get(); + $multiCurl = (new MultiCurlAdapter()) + ->setOpt(CURLOPT_FOLLOWLOCATION, true); + $jobs = []; + $imageNames = []; + + foreach ($images as $index => $image) { + /** @var CurlAdapterInterface $request */ + $request = $multiCurl->addGet($image['url']); + $imageNames[$index] = slugify($image['name']) . '.jpg'; + $jobs[$request->getId()] = [ + 'directory' => $image['directory'], + 'name' => $imageNames[$index], + ]; + } + + $multiCurl->complete(function (CurlAdapterInterface $request) use ($fs, $jobs): void { + if (!isset($jobs[$request->getId()])) { + return; + } + + if ($request->isError()) { + throw new RuntimeException( + $request->getErrorMessage() ?? 'Unable to download remote image', + $request->getErrorCode() + ); + } + + $job = $jobs[$request->getId()]; + + $fs->put( + uploads_dir() . DS . $job['directory'] . DS . $job['name'], + $request->getResponse() + ); + }); + + $multiCurl->start(); + + return $imageNames; +} + /** * Creates user directory * @param string $uuid diff --git a/shared/Commands/DemoCommand.php b/shared/Commands/DemoCommand.php index 1b9bbbd..42c0ffb 100644 --- a/shared/Commands/DemoCommand.php +++ b/shared/Commands/DemoCommand.php @@ -241,11 +241,22 @@ private function createModule(string $moduleName, string $template, bool $withAs private function generateUsers(): array { $users = []; + $images = []; + for ($i = 0; $i < self::COUNTS['users']; $i++) { - $user = $this->generateUserData(); + $generated = $this->generateUserData(); + $users[] = $generated['data']; + $images[] = $generated['image']; + } + + $imageNames = save_remote_images($images); + + foreach ($users as $index => $user) { + $user['image'] = $imageNames[$index]; $this->runCommandInternally(self::COMMANDS['user_create'], $user); - $users[] = $user; + $users[$index] = $user; } + return $users; } @@ -262,15 +273,24 @@ private function generateUsers(): array private function generatePosts(array $users): array { $posts = []; + $images = []; foreach ($users as $user) { for ($i = 0; $i < self::COUNTS['posts_per_user']; $i++) { - $post = $this->generatePostData($user); - $this->runCommandInternally(self::COMMANDS['post_create'], $post); - $posts[] = $post; + $generated = $this->generatePostData($user); + $posts[] = $generated['data']; + $images[] = $generated['image']; } } + $imageNames = save_remote_images($images); + + foreach ($posts as $index => $post) { + $post['image'] = $imageNames[$index]; + $this->runCommandInternally(self::COMMANDS['post_create'], $post); + $posts[$index] = $post; + } + return $posts; } @@ -309,20 +329,21 @@ private function generateUserData(): array create_user_directory($userUuid); - $imageName = save_remote_image( - $this->faker->gravatarUrl(), - $userUuid, - $email - ); - return [ - 'email' => $email, - 'password' => self::DEFAULT_PASSWORD, - 'firstname' => $this->faker->name(), - 'lastname' => $this->faker->lastName(), - 'uuid' => $userUuid, - 'role' => Role::EDITOR, - 'image' => $imageName, + 'data' => [ + 'email' => $email, + 'password' => self::DEFAULT_PASSWORD, + 'firstname' => $this->faker->name(), + 'lastname' => $this->faker->lastName(), + 'uuid' => $userUuid, + 'role' => Role::EDITOR, + 'image' => '', + ], + 'image' => [ + 'url' => $this->faker->gravatarUrl(), + 'directory' => $userUuid, + 'name' => $email, + ], ]; } @@ -340,18 +361,19 @@ private function generatePostData(array $user): array $postUuid = $this->faker->uuid(); $title = textCleanUp($this->faker->realText(50)); - $imageName = save_remote_image( - $this->faker->imageUrl(640, 480, true, 0), - $user['uuid'], - $title - ); - return [ - 'title' => $title, - 'description' => textCleanUp($this->faker->realText(1000)), - 'user_uuid' => $user['uuid'], - 'uuid' => $postUuid, - 'image' => $imageName, + 'data' => [ + 'title' => $title, + 'description' => textCleanUp($this->faker->realText(1000)), + 'user_uuid' => $user['uuid'], + 'uuid' => $postUuid, + 'image' => '', + ], + 'image' => [ + 'url' => $this->faker->imageUrl(640, 480, true, 0), + 'directory' => $user['uuid'], + 'name' => $title, + ], ]; }