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
46 changes: 46 additions & 0 deletions database/Factories/AssetFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
<?php

declare(strict_types=1);

namespace CraftCms\Cms\Database\Factories;

use CraftCms\Cms\Asset\Models\Asset;
use CraftCms\Cms\Asset\Models\Volume;
use CraftCms\Cms\Asset\Models\VolumeFolder;
use CraftCms\Cms\Element\Models\Element;
use Illuminate\Database\Eloquent\Factories\Factory;
use Override;

final class AssetFactory extends Factory
{
protected $model = Asset::class;

#[Override]
public function definition(): array
{
return [
'id' => Element::factory()->set('type', \CraftCms\Cms\Element\Elements\Asset::class),
'volumeId' => Volume::factory(),
'folderId' => VolumeFolder::factory(),
'filename' => fake()->word().'.jpg',
'kind' => 'image',
];
}

#[\Override]
public function configure(): self
{
return $this->afterCreating(function (Asset $asset) {
// For some reason the element factory doesn't get saved properly
if ($asset->id === 0) {
$asset->update([
'id' => Element::query()
->where('type', \CraftCms\Cms\Element\Elements\Asset::class)
->latest('id')
->first()
->id,
]);
}
});
}
}
25 changes: 25 additions & 0 deletions database/Factories/VolumeFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?php

declare(strict_types=1);

namespace CraftCms\Cms\Database\Factories;

use craft\fs\Local;
use CraftCms\Cms\Asset\Models\Volume;
use Illuminate\Database\Eloquent\Factories\Factory;
use Override;

final class VolumeFactory extends Factory
{
protected $model = Volume::class;

#[Override]
public function definition(): array
{
return [
'name' => fake()->word(),
'handle' => fake()->slug(),
'fs' => Local::class,
];
}
}
24 changes: 24 additions & 0 deletions database/Factories/VolumeFolderFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php

declare(strict_types=1);

namespace CraftCms\Cms\Database\Factories;

use CraftCms\Cms\Asset\Models\Volume;
use CraftCms\Cms\Asset\Models\VolumeFolder;
use Illuminate\Database\Eloquent\Factories\Factory;
use Override;

final class VolumeFolderFactory extends Factory
{
protected $model = VolumeFolder::class;

#[Override]
public function definition(): array
{
return [
'volumeId' => Volume::factory(),
'name' => fake()->word(),
];
}
}
6 changes: 3 additions & 3 deletions src/Asset/Commands/Concerns/IndexesAssets.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
namespace CraftCms\Cms\Asset\Commands\Concerns;

use craft\console\Application;
use craft\elements\Asset;
use craft\errors\AssetDisallowedExtensionException;
use craft\errors\AssetNotIndexableException;
use craft\errors\MissingAssetException;
Expand All @@ -15,6 +14,7 @@
use craft\models\Volume;
use craft\services\AssetIndexer;
use CraftCms\Cms\Database\Table;
use CraftCms\Cms\Element\Elements\Asset;
use CraftCms\Cms\Support\Str;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB;
Expand Down Expand Up @@ -109,8 +109,8 @@ protected function indexAssets(Application $craft, array $volumes, string $path
$this->components->task(
'Deleting the'.($totalMissingFiles > 1 ? ' '.$totalMissingFiles : '').' missing asset record'.Str::plural('record', $totalMissingFiles),
function () use ($craft, $assetIds) {
/** @var Asset[] $assets */
$assets = Asset::find()->id($assetIds)->all();
/** @var \craft\elements\ElementCollection<Asset> $assets */
$assets = Asset::find()->id($assetIds)->get();

foreach ($assets as $asset) {
$craft->getImageTransforms()->deleteCreatedTransformsForAsset($asset);
Expand Down
75 changes: 75 additions & 0 deletions src/Asset/Models/Asset.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
<?php

declare(strict_types=1);

namespace CraftCms\Cms\Asset\Models;

use CraftCms\Cms\Database\Table;
use CraftCms\Cms\Element\Models\Element;
use CraftCms\Cms\Shared\BaseModel;
use CraftCms\Cms\Site\Models\Site;
use CraftCms\Cms\User\Models\User;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\Pivot;

final class Asset extends BaseModel
{
use HasFactory;

protected $table = Table::ASSETS;

protected function casts(): array
{
return [
'width' => 'int',
'height' => 'int',
'size' => 'int',
'deletedWithVolume' => 'bool',
'keptFile' => 'bool',
'dateModified' => 'datetime',
];
}

/**
* @return BelongsTo<Element, $this>
*/
public function element(): BelongsTo
{
return $this->belongsTo(Element::class, 'id');
}

/**
* @return BelongsToMany<Site, $this, Pivot>
*/
public function sites(): BelongsToMany
{
return $this->belongsToMany(Site::class, 'assets_sites', 'assetId', 'siteId')
->withPivot('alt');
}

/**
* @return BelongsTo<Volume, $this>
*/
public function volume(): BelongsTo
{
return $this->belongsTo(Volume::class, 'volumeId');
}

/**
* @return BelongsTo<VolumeFolder, $this>
*/
public function folder(): BelongsTo
{
return $this->belongsTo(VolumeFolder::class, 'folderId');
}

/**
* @return BelongsTo<User, $this>
*/
public function uploader(): BelongsTo
{
return $this->belongsTo(User::class, 'uploaderId');
}
}
37 changes: 37 additions & 0 deletions src/Asset/Models/Volume.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?php

declare(strict_types=1);

namespace CraftCms\Cms\Asset\Models;

use CraftCms\Cms\Database\Table;
use CraftCms\Cms\FieldLayout\Models\FieldLayout;
use CraftCms\Cms\Shared\BaseModel;
use CraftCms\Cms\Shared\Concerns\HasUid;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;

final class Volume extends BaseModel
{
use HasFactory;
use HasUid;
use SoftDeletes;

protected $table = Table::VOLUMES;

protected function casts(): array
{
return [
'sortOrder' => 'int',
];
}

/**
* @return BelongsTo<FieldLayout, $this>
*/
public function fieldLayout(): BelongsTo
{
return $this->belongsTo(FieldLayout::class, 'fieldLayoutId');
}
}
44 changes: 44 additions & 0 deletions src/Asset/Models/VolumeFolder.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<?php

declare(strict_types=1);

namespace CraftCms\Cms\Asset\Models;

use CraftCms\Cms\Database\Table;
use CraftCms\Cms\Shared\BaseModel;
use CraftCms\Cms\Shared\Concerns\HasUid;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;

final class VolumeFolder extends BaseModel
{
use HasFactory;
use HasUid;

protected $table = Table::VOLUMEFOLDERS;

/**
* @return BelongsTo<VolumeFolder, $this>
*/
public function parent(): BelongsTo
{
return $this->belongsTo(self::class, 'parentId');
}

/**
* @return HasMany<VolumeFolder, $this>
*/
public function children(): HasMany
{
return $this->hasMany(self::class, 'parentId');
}

/**
* @return BelongsTo<Volume, $this>
*/
public function volume(): BelongsTo
{
return $this->belongsTo(Volume::class, 'volumeId');
}
}
21 changes: 10 additions & 11 deletions src/Console/Commands/Utils/AsciiFilenamesCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@
namespace CraftCms\Cms\Console\Commands\Utils;

use Craft;
use craft\elements\Asset;
use craft\errors\InvalidElementException;
use craft\helpers\FileHelper;
use CraftCms\Cms\Config\GeneralConfig;
use CraftCms\Cms\Console\CraftCommand;
use CraftCms\Cms\Element\Elements\Asset;
use Exception;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Throwable;
use yii\db\Expression;

use function Laravel\Prompts\confirm;

Expand Down Expand Up @@ -42,15 +42,15 @@ public function handle(GeneralConfig $generalConfig): int

match (DB::connection()->getDriverName()) {
// h/t https://stackoverflow.com/a/11741314/1688568
'mysql' => $query->andWhere(new Expression('[[filename]] <> CONVERT([[filename]] USING ASCII)')),
'mysql' => $query->whereRaw('filename <> CONVERT(filename USING ASCII)'),
// h/t https://dba.stackexchange.com/a/167571/205387
'pgsql' => $query->andWhere(new Expression("[[filename]] ~ '[^[:ascii:]]'")),
default => throw new \Exception('Invalid driver name: '.DB::connection()->getDriverName().'.')
'pgsql' => $query->whereRaw("filename ~ '[^[:ascii:]]'"),
default => throw new Exception('Invalid driver name: '.DB::connection()->getDriverName().'.')
};

/** @var Asset[] $assets */
$assets = $query->all();
$total = count($assets);
/** @var \Illuminate\Support\Collection<Asset> $assets */
$assets = $query->get();
$total = $assets->count();

if ($total === 0) {
$this->components->success('No assets found with non-ASCII filenames.');
Expand All @@ -60,10 +60,9 @@ public function handle(GeneralConfig $generalConfig): int

$this->components->info("$total assets found with non-ASCII filenames:");

$this->components->bulletList(array_map(
$this->components->bulletList($assets->map(
fn (Asset $asset) => $asset->getFilename(),
$assets,
));
)->all());

if (! confirm('Ready to rename these filenames as ASCII?')) {
return self::SUCCESS;
Expand Down
Loading
Loading