Skip to content

Commit 2e04869

Browse files
authored
Merge pull request #18472 from craftcms/feature/port-assets-service
[6.x] Assets & Folders
2 parents 45e3d43 + 762a095 commit 2e04869

71 files changed

Lines changed: 4396 additions & 2524 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CHANGELOG-WIP.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,10 @@ Craft's Mutex classes have been deprecated. [Laravel's atomic locking](https://l
137137

138138
## Assets
139139

140+
- Added `CraftCms\Cms\Support\Facades\Assets`.
140141
- Added `CraftCms\Cms\Support\Facades\AssetIndexer` facade.
142+
- Added `CraftCms\Cms\Support\Facades\Folders`.
143+
- Deprecated `craft\services\Assets`. `CraftCms\Cms\Asset\Assets` and `CraftCms\Cms\Asset\Folders` should be used instead.
141144
- Deprecated `\craft\records\Asset`. `\CraftCms\Cms\Asset\Models\Asset` should be used instead.
142145
- Deprecated `\craft\records\AssetIndexData`. `\CraftCms\Cms\Asset\Models\AssetIndexData` should be used instead.
143146
- Deprecated `\craft\records\AssetIndexingSession`. `\CraftCms\Cms\Asset\Models\AssetIndexingSession` should be used instead.
@@ -157,6 +160,14 @@ Craft's Mutex classes have been deprecated. [Laravel's atomic locking](https://l
157160
- Deprecated `craft\errors\MissingVolumeFolderException`. `CraftCms\Cms\Asset\Exceptions\MissingVolumeFolderException` should be used instead.
158161
- Deprecated `craft\errors\VolumeException`. `CraftCms\Cms\Asset\Exceptions\VolumeException` should be used instead.
159162

163+
### Events
164+
165+
- Deprecated `craft\events\ReplaceAssetEvent` in favor of the following new events:
166+
- `craft\services\Assets::EVENT_BEFORE_REPLACE_ASSET` => `CraftCms\Cms\Asset\Events\BeforeReplaceAsset`
167+
- `craft\services\Assets::EVENT_AFTER_REPLACE_ASSET` => `CraftCms\Cms\Asset\Events\AfterReplaceAsset`
168+
- Deprecated `craft\events\DefineAssetThumbUrlEvent`. `CraftCms\Cms\Asset\Events\DefineThumbUrl` should be used instead.
169+
- Deprecated `craft\events\AssetPreviewEvent`. `CraftCms\Cms\Asset\Events\RegisterPreviewHandler` should be used instead.
170+
160171
## Auth
161172

162173
- Refactored the authentication system to use Laravel's authentication system.

routes/actions.php

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,13 @@
77
use CraftCms\Cms\Http\Controllers\AddressesController;
88
use CraftCms\Cms\Http\Controllers\AnnouncementsController;
99
use CraftCms\Cms\Http\Controllers\ApiController;
10+
use CraftCms\Cms\Http\Controllers\Assets\ActionController as AssetsActionController;
11+
use CraftCms\Cms\Http\Controllers\Assets\FolderController as AssetsFolderController;
12+
use CraftCms\Cms\Http\Controllers\Assets\IconController as AssetsIconController;
13+
use CraftCms\Cms\Http\Controllers\Assets\ImageEditorController;
14+
use CraftCms\Cms\Http\Controllers\Assets\PreviewController as AssetsPreviewController;
15+
use CraftCms\Cms\Http\Controllers\Assets\TransformController;
16+
use CraftCms\Cms\Http\Controllers\Assets\UploadController as AssetsUploadController;
1017
use CraftCms\Cms\Http\Controllers\Auth\LoginController;
1118
use CraftCms\Cms\Http\Controllers\Auth\PasskeyController;
1219
use CraftCms\Cms\Http\Controllers\Auth\SessionInfoController;
@@ -108,6 +115,10 @@
108115
Route::any('users/get-elevated-session-timeout', [SessionInfoController::class, 'confirmTimeout']);
109116
Route::middleware('throttle:1,1')->post('users/send-password-reset-email', [PasswordController::class, 'sendPasswordResetEmail']);
110117
Route::post('users/save-user', SaveUserController::class);
118+
119+
// Asset Transforms (anonymous access)
120+
Route::any('assets/generate-transform', [TransformController::class, 'generate']);
121+
Route::get('assets/generate-fallback-transform', [TransformController::class, 'generateFallback']);
111122
});
112123
}
113124

@@ -252,6 +263,26 @@
252263
Route::post('asset-indexes/indexing-session-overview', [AssetIndexesController::class, 'indexingSessionOverview']);
253264
Route::post('asset-indexes/finish-indexing-session', [AssetIndexesController::class, 'finishIndexingSession']);
254265

266+
// Assets
267+
Route::post('assets/upload', [AssetsUploadController::class, 'upload']);
268+
Route::post('assets/replace-file', [AssetsUploadController::class, 'replaceFile']);
269+
Route::post('assets/delete-asset', [AssetsActionController::class, 'deleteAsset']);
270+
Route::post('assets/move-asset', [AssetsActionController::class, 'moveAsset']);
271+
Route::post('assets/download-asset', [AssetsActionController::class, 'downloadAsset']);
272+
Route::any('assets/show-in-folder', [AssetsActionController::class, 'showInFolder']);
273+
Route::post('assets/move-info', [AssetsActionController::class, 'moveInfo']);
274+
Route::post('assets/preview-thumb', [AssetsPreviewController::class, 'previewThumb']);
275+
Route::post('assets/preview-file', [AssetsPreviewController::class, 'previewFile']);
276+
Route::post('assets/create-folder', [AssetsFolderController::class, 'create']);
277+
Route::post('assets/delete-folder', [AssetsFolderController::class, 'delete']);
278+
Route::post('assets/rename-folder', [AssetsFolderController::class, 'rename']);
279+
Route::post('assets/move-folder', [AssetsFolderController::class, 'move']);
280+
Route::post('assets/image-editor', [ImageEditorController::class, 'show']);
281+
Route::get('assets/edit-image', [ImageEditorController::class, 'editImage']);
282+
Route::post('assets/save-image', [ImageEditorController::class, 'save']);
283+
Route::post('assets/update-focal-position', [ImageEditorController::class, 'updateFocalPoint']);
284+
Route::get('assets/icon/{extension?}', AssetsIconController::class);
285+
255286
// Preview
256287
Route::any('preview/create-token', [PreviewController::class, 'createToken']);
257288

routes/cp.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use CraftCms\Cms\Auth\Enums\CpAuthPath;
66
use CraftCms\Cms\Edition;
7+
use CraftCms\Cms\Http\Controllers\Assets\IndexController as AssetsIndexController;
78
use CraftCms\Cms\Http\Controllers\Auth\LoginController;
89
use CraftCms\Cms\Http\Controllers\Auth\SetPasswordController;
910
use CraftCms\Cms\Http\Controllers\Auth\TwoFactorAuthenticationController;
@@ -101,6 +102,12 @@
101102

102103
Route::get('users/{slug?}', [UsersController::class, 'index']);
103104

105+
/**
106+
* Assets
107+
*/
108+
Route::get('assets/{defaultSource?}', AssetsIndexController::class)
109+
->where('defaultSource', '.*');
110+
104111
/**
105112
* Routes that require admin, but do not require admin changes
106113
*/

src/Asset/AssetIndexer.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ final class AssetIndexer
5151

5252
public function __construct(
5353
private readonly Volumes $volumes,
54+
private readonly Folders $folders,
5455
) {}
5556

5657
public function getIndexListOnVolume(Volume $volume, string $directory = ''): Generator
@@ -591,8 +592,7 @@ public function indexFileByEntry(
591592
$path = "$dirname/";
592593
}
593594

594-
$assets = Craft::$app->getAssets();
595-
$folder = $assets->findFolder([
595+
$folder = $this->folders->findFolder([
596596
'volumeId' => $indexEntry->volumeId,
597597
'path' => $path,
598598
'parentId' => $parentId,
@@ -601,7 +601,7 @@ public function indexFileByEntry(
601601
if (! $folder) {
602602
/** @var Volume $volume */
603603
$volume = $this->volumes->getVolumeById($indexEntry->volumeId);
604-
$folder = $assets->ensureFolderByFullPathAndVolume($path, $volume);
604+
$folder = $this->folders->ensureFolderByFullPathAndVolume($path, $volume);
605605
} else {
606606
$volume = $folder->getVolume();
607607
}
@@ -707,7 +707,7 @@ public function indexFolderByEntry(AssetIndexEntry $indexEntry, bool $createIfMi
707707
}
708708
}
709709

710-
$folder = Craft::$app->getAssets()->findFolder([
710+
$folder = $this->folders->findFolder([
711711
'path' => "$indexEntry->uri/",
712712
'volumeId' => $indexEntry->volumeId,
713713
]);
@@ -719,7 +719,7 @@ public function indexFolderByEntry(AssetIndexEntry $indexEntry, bool $createIfMi
719719
throw new MissingVolumeFolderException($indexEntry, $volume, $indexEntry->uri);
720720
}
721721

722-
return Craft::$app->getAssets()->ensureFolderByFullPathAndVolume($indexEntry->uri ?? '', $volume);
722+
return $this->folders->ensureFolderByFullPathAndVolume($indexEntry->uri ?? '', $volume);
723723
}
724724

725725
private function storeIndexingSession(IndexingSession $session): void

0 commit comments

Comments
 (0)