From 4a2b0122304aab29daff63f3b53129cf538e7d97 Mon Sep 17 00:00:00 2001 From: provokateurin Date: Thu, 27 Mar 2025 08:22:53 +0100 Subject: [PATCH 1/4] fix(files_versions): Cache previews Signed-off-by: provokateurin --- .../lib/Controller/PreviewController.php | 4 +++- .../tests/Controller/PreviewControllerTest.php | 15 +++++++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/apps/files_versions/lib/Controller/PreviewController.php b/apps/files_versions/lib/Controller/PreviewController.php index 1365e7e50faf4..95f8f73a098b1 100644 --- a/apps/files_versions/lib/Controller/PreviewController.php +++ b/apps/files_versions/lib/Controller/PreviewController.php @@ -97,7 +97,9 @@ public function getPreview( $file = $userFolder->get($file); $versionFile = $this->versionManager->getVersionFile($user, $file, $version); $preview = $this->previewManager->getPreview($versionFile, $x, $y, true, IPreview::MODE_FILL, $versionFile->getMimetype()); - return new FileDisplayResponse($preview, Http::STATUS_OK, ['Content-Type' => $preview->getMimeType()]); + $response = new FileDisplayResponse($preview, Http::STATUS_OK, ['Content-Type' => $preview->getMimeType()]); + $response->cacheFor(3600 * 24, false, true); + return $response; } catch (NotFoundException $e) { return new DataResponse([], Http::STATUS_NOT_FOUND); } catch (\InvalidArgumentException $e) { diff --git a/apps/files_versions/tests/Controller/PreviewControllerTest.php b/apps/files_versions/tests/Controller/PreviewControllerTest.php index 0457d0d5f2491..228025b77b41d 100644 --- a/apps/files_versions/tests/Controller/PreviewControllerTest.php +++ b/apps/files_versions/tests/Controller/PreviewControllerTest.php @@ -22,13 +22,13 @@ * along with this program. If not, see . * */ + namespace OCA\Files_Versions\Tests\Controller; use OCA\Files_Versions\Controller\PreviewController; use OCA\Files_Versions\Versions\IVersionManager; use OCP\AppFramework\Http; use OCP\AppFramework\Http\DataResponse; -use OCP\AppFramework\Http\FileDisplayResponse; use OCP\Files\File; use OCP\Files\Folder; use OCP\Files\IMimeTypeDetector; @@ -39,6 +39,8 @@ use OCP\IRequest; use OCP\IUser; use OCP\IUserSession; +use OCP\Preview\IMimeIconProvider; +use PHPUnit\Framework\MockObject\MockObject; use Test\TestCase; class PreviewControllerTest extends TestCase { @@ -64,6 +66,8 @@ class PreviewControllerTest extends TestCase { /** @var IVersionManager|\PHPUnit\Framework\MockObject\MockObject */ private $versionManager; + private IMimeIconProvider|MockObject $mimeIconProvider; + protected function setUp(): void { parent::setUp(); @@ -79,6 +83,7 @@ protected function setUp(): void { ->method('getUser') ->willReturn($user); $this->versionManager = $this->createMock(IVersionManager::class); + $this->mimeIconProvider = $this->createMock(IMimeIconProvider::class); $this->controller = new PreviewController( 'files_versions', @@ -86,7 +91,8 @@ protected function setUp(): void { $this->rootFolder, $this->userSession, $this->versionManager, - $this->previewManager + $this->previewManager, + $this->mimeIconProvider, ); } @@ -150,9 +156,10 @@ public function testValidPreview() { ->willReturn('previewMime'); $res = $this->controller->getPreview('file', 10, 10, '42'); - $expected = new FileDisplayResponse($preview, Http::STATUS_OK, ['Content-Type' => 'previewMime']); - $this->assertEquals($expected, $res); + $this->assertEquals('previewMime', $res->getHeaders()['Content-Type']); + $this->assertEquals(Http::STATUS_OK, $res->getStatus()); + $this->assertEquals($preview, $this->invokePrivate($res, 'file')); } public function testVersionNotFound() { From b5bf32a1097afda6494f3e628d7009ba646763eb Mon Sep 17 00:00:00 2001 From: provokateurin Date: Thu, 27 Mar 2025 08:33:13 +0100 Subject: [PATCH 2/4] feat(files_versions): Implement preview mime icon fallback Signed-off-by: provokateurin --- .../lib/Controller/PreviewController.php | 21 ++++++++++++++--- apps/files_versions/openapi.json | 23 +++++++++++++++++++ 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/apps/files_versions/lib/Controller/PreviewController.php b/apps/files_versions/lib/Controller/PreviewController.php index 95f8f73a098b1..85030bebec6c0 100644 --- a/apps/files_versions/lib/Controller/PreviewController.php +++ b/apps/files_versions/lib/Controller/PreviewController.php @@ -29,11 +29,13 @@ use OCP\AppFramework\Http; use OCP\AppFramework\Http\DataResponse; use OCP\AppFramework\Http\FileDisplayResponse; +use OCP\AppFramework\Http\RedirectResponse; use OCP\Files\IRootFolder; use OCP\Files\NotFoundException; use OCP\IPreview; use OCP\IRequest; use OCP\IUserSession; +use OCP\Preview\IMimeIconProvider; class PreviewController extends Controller { @@ -55,7 +57,8 @@ public function __construct( IRootFolder $rootFolder, IUserSession $userSession, IVersionManager $versionManager, - IPreview $previewManager + IPreview $previewManager, + private IMimeIconProvider $mimeIconProvider, ) { parent::__construct($appName, $request); @@ -75,9 +78,11 @@ public function __construct( * @param int $x Width of the preview * @param int $y Height of the preview * @param string $version Version of the file to get the preview for - * @return FileDisplayResponse|DataResponse, array{}> + * @param bool $mimeFallback Whether to fallback to the mime icon if no preview is available + * @return FileDisplayResponse|DataResponse, array{}>|RedirectResponse * * 200: Preview returned + * 303: Redirect to the mime icon url if mimeFallback is true * 400: Getting preview is not possible * 404: Preview not found */ @@ -85,12 +90,14 @@ public function getPreview( string $file = '', int $x = 44, int $y = 44, - string $version = '' + string $version = '', + bool $mimeFallback = false, ) { if ($file === '' || $version === '' || $x === 0 || $y === 0) { return new DataResponse([], Http::STATUS_BAD_REQUEST); } + $versionFile = null; try { $user = $this->userSession->getUser(); $userFolder = $this->rootFolder->getUserFolder($user->getUID()); @@ -101,6 +108,14 @@ public function getPreview( $response->cacheFor(3600 * 24, false, true); return $response; } catch (NotFoundException $e) { + // If we have no preview enabled, we can redirect to the mime icon if any + if ($mimeFallback && $versionFile !== null) { + $url = $this->mimeIconProvider->getMimeIconUrl($versionFile->getMimeType()); + if ($url !== null) { + return new RedirectResponse($url); + } + } + return new DataResponse([], Http::STATUS_NOT_FOUND); } catch (\InvalidArgumentException $e) { return new DataResponse([], Http::STATUS_BAD_REQUEST); diff --git a/apps/files_versions/openapi.json b/apps/files_versions/openapi.json index 2ff4dcc2035ab..46bb85352e1e6 100644 --- a/apps/files_versions/openapi.json +++ b/apps/files_versions/openapi.json @@ -103,6 +103,19 @@ "type": "string", "default": "" } + }, + { + "name": "mimeFallback", + "in": "query", + "description": "Whether to fallback to the mime icon if no preview is available", + "schema": { + "type": "integer", + "default": 0, + "enum": [ + 0, + 1 + ] + } } ], "responses": { @@ -132,6 +145,16 @@ "schema": {} } } + }, + "303": { + "description": "Redirect to the mime icon url if mimeFallback is true", + "headers": { + "Location": { + "schema": { + "type": "string" + } + } + } } } } From 4d9cbee3721d27d18117bc1c6ebdde143c599ea8 Mon Sep 17 00:00:00 2001 From: provokateurin Date: Thu, 27 Mar 2025 08:39:53 +0100 Subject: [PATCH 3/4] fix(files_versions): Rely on server mime fallback icons Signed-off-by: provokateurin --- apps/files_versions/src/components/Version.vue | 2 +- apps/files_versions/src/utils/versions.ts | 6 ++---- apps/files_versions/src/views/VersionTab.vue | 5 ++--- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/apps/files_versions/src/components/Version.vue b/apps/files_versions/src/components/Version.vue index 0d83fc788a0fc..c9edbe9dc5a91 100644 --- a/apps/files_versions/src/components/Version.vue +++ b/apps/files_versions/src/components/Version.vue @@ -23,7 +23,7 @@