Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
<?php

namespace craft\cloud\cli\controllers;
namespace craft\cloud\cli\controllers\assets;

use Craft;
use craft\cloud\fs\Fs;
use craft\console\Controller;
use craft\db\Table;
use craft\elements\Asset;
use craft\helpers\FileHelper;
Expand All @@ -13,13 +12,8 @@
use yii\console\ExitCode;
use yii\helpers\Console;

class AssetsController extends Controller
trait AssetRepairTrait
{
private const CRAFT_STREAM_DIMENSION_FIX_VERSION = [
'4' => '4.18.4',
'5' => '5.10.9',
];

/**
* @var array<string>|null
*/
Expand All @@ -33,8 +27,7 @@ class AssetsController extends Controller
public function options($actionID): array
{
return array_merge(parent::options($actionID), match ($actionID) {
'replace-metadata',
'repair-metadata',
'index',
'missing',
'metadata' => ['volume', 'assetId'],
default => []
Expand Down Expand Up @@ -110,7 +103,7 @@ protected function repairMissingAssetData(): int
return ExitCode::OK;
}

public function actionRepairMetadata(): int
protected function repairAssetObjectMetadataForAssets(): int
Comment thread
timkelty marked this conversation as resolved.
{
$assets = Asset::find()
->volume($this->volume)
Expand All @@ -127,16 +120,6 @@ public function actionRepairMetadata(): int
return ExitCode::OK;
}

public function actionReplaceMetadata(): int
{
$this->stdout(
'Deprecated: use `cloud/assets/repair/metadata` to repair object metadata instead.' . PHP_EOL,
Console::FG_YELLOW,
);

return $this->actionRepairMetadata();
}

/**
* @return array{int,int}|null
*/
Expand Down Expand Up @@ -199,7 +182,7 @@ protected function repairAssetSize(Asset $asset): ?int
protected function warnIfCraftStreamDimensionFixMissing(): void
{
$craftVersion = Craft::$app->getVersion();
$fixedVersion = self::CRAFT_STREAM_DIMENSION_FIX_VERSION[explode('.', $craftVersion)[0] ?? ''] ?? null;
$fixedVersion = $this->fixedCraftStreamDimensionVersion($craftVersion);

if ($fixedVersion === null || version_compare($craftVersion, $fixedVersion, '>=')) {
return;
Expand Down Expand Up @@ -228,4 +211,12 @@ protected function repairAssetObjectMetadata(Asset $asset): void

$fs->replaceMetadata($path, $config);
}

private function fixedCraftStreamDimensionVersion(string $craftVersion): ?string
{
return [
'4' => '4.18.4',
'5' => '5.10.9',
][explode('.', $craftVersion)[0] ?? ''] ?? null;
}
}
17 changes: 5 additions & 12 deletions src/cli/controllers/assets/RepairController.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,13 @@

namespace craft\cloud\cli\controllers\assets;

use craft\cloud\cli\controllers\AssetsController;
use craft\console\Controller;

class RepairController extends AssetsController
class RepairController extends Controller
{
public $defaultAction = 'missing';

public function createAction($id)
{
if (!in_array($id, ['missing', 'metadata'], true)) {
return null;
}
use AssetRepairTrait;

return parent::createAction($id);
}
public $defaultAction = 'missing';

public function actionMissing(): int
{
Expand All @@ -24,6 +17,6 @@ public function actionMissing(): int

public function actionMetadata(): int
{
return $this->actionRepairMetadata();
return $this->repairAssetObjectMetadataForAssets();
}
}
21 changes: 21 additions & 0 deletions src/cli/controllers/assets/ReplaceMetadataController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php

namespace craft\cloud\cli\controllers\assets;

use craft\console\Controller;
use yii\helpers\Console;

class ReplaceMetadataController extends Controller
{
use AssetRepairTrait;

public function actionIndex(): int
{
$this->stdout(
'Deprecated: use `cloud/assets/repair/metadata` to repair object metadata instead.' . PHP_EOL,
Console::FG_YELLOW,
);

return $this->repairAssetObjectMetadataForAssets();
}
}
66 changes: 66 additions & 0 deletions tests/unit/AssetsControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,15 @@

use Codeception\Test\Unit;
use Craft;
use craft\cloud\cli\controllers\assets\RepairController;
use craft\cloud\cli\controllers\assets\ReplaceMetadataController;
use craft\cloud\controllers\AssetsController;
use craft\cloud\fs\Fs;
use craft\console\Controller as ConsoleController;
use craft\elements\Asset;
use craft\models\Volume;
use ReflectionMethod;
use yii\base\Module as BaseModule;
use yii\web\BadRequestHttpException;

class AssetsControllerTest extends Unit
Expand Down Expand Up @@ -125,6 +129,36 @@ public function testUploadedImageDimensionsStopAfterBoundedRanges(): void
$this->assertSame(0, $fs->streamReadCount);
}

public function testCliAssetsRepairRoutesResolveThroughYiiModule(): void
{
$module = new BaseModule('cloud');
$module->controllerNamespace = 'craft\\cloud\\cli\\controllers';

$this->assertCliRoute($module, 'assets/repair', RepairController::class, '', 'missing');
$this->assertCliRoute($module, 'assets/repair/missing', RepairController::class, 'missing');
$this->assertCliRoute($module, 'assets/repair/metadata', RepairController::class, 'metadata');
$this->assertCliRoute($module, 'assets/replace-metadata', ReplaceMetadataController::class, '', 'index');
}

public function testCliAssetsCommandsDoNotExposeTopLevelOrUnreleasedRoutes(): void
{
$module = new BaseModule('cloud');
$module->controllerNamespace = 'craft\\cloud\\cli\\controllers';

$this->assertFalse($module->createController('assets'));
$this->assertFalse($module->createController('assets/repair-metadata'));
}

public function testCliAssetsCommandsExposeAssetFilters(): void
{
$repairController = new RepairController('assets/repair', Craft::$app);
$replaceMetadataController = new ReplaceMetadataController('assets/replace-metadata', Craft::$app);

$this->assertCliAssetFilterOptions($repairController, 'missing');
$this->assertCliAssetFilterOptions($repairController, 'metadata');
$this->assertCliAssetFilterOptions($replaceMetadataController, 'index');
}

private function invokeVolumeSubpath(Volume $volume): string
{
$controller = new AssetsController('cloud-assets', Craft::$app);
Expand All @@ -133,6 +167,38 @@ private function invokeVolumeSubpath(Volume $volume): string

return $method->invoke($controller, $volume);
}

/**
* @param class-string $controllerClass
*/
private function assertCliRoute(
BaseModule $module,
string $route,
string $controllerClass,
string $actionId,
?string $effectiveActionId = null,
): void {
$result = $module->createController($route);

$this->assertIsArray($result);

[$controller, $resolvedActionId] = $result;
$this->assertInstanceOf($controllerClass, $controller);
$this->assertSame($actionId, $resolvedActionId);

$action = $controller->createAction($resolvedActionId);

$this->assertNotNull($action);
$this->assertSame($effectiveActionId ?? $actionId, $action->id);
}

private function assertCliAssetFilterOptions(ConsoleController $controller, string $actionId): void
{
$options = $controller->options($actionId);

$this->assertContains('volume', $options);
$this->assertContains('assetId', $options);
}
}

class SizeTestAssetsController extends AssetsController
Expand Down
Loading