From 56ed3bd0174b4dd24fb439cd99d1f3525e129784 Mon Sep 17 00:00:00 2001 From: sshakndr Date: Mon, 16 Dec 2024 11:58:14 +0700 Subject: [PATCH] feat(php-laravel): refresh file config --- CHANGELOG.md | 1 + .../app/Http/Controllers/EditorController.php | 1 + .../app/Http/Controllers/FileController.php | 62 +++++++++++++++++++ .../app/Repositories/UserRepository.php | 1 + .../resources/views/editor.blade.php | 12 ++++ .../php-laravel/routes/web.php | 1 + 6 files changed, 78 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 52e7b4895..727f75bf3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ # Change Log +- php-laravel: refresh config - php: refresh config - ruby: refresh config - python: refresh config diff --git a/web/documentserver-example/php-laravel/app/Http/Controllers/EditorController.php b/web/documentserver-example/php-laravel/app/Http/Controllers/EditorController.php index 2622a405e..a9ac57de4 100644 --- a/web/documentserver-example/php-laravel/app/Http/Controllers/EditorController.php +++ b/web/documentserver-example/php-laravel/app/Http/Controllers/EditorController.php @@ -245,6 +245,7 @@ public function index(Request $request, JWT $jwt) if ($user['id'] != 'uid-0') { $historyLayout .= "// add mentions for not anonymous users + config.events['onRequestRefreshFile'] = onRequestRefreshFile; config.events['onRequestClose'] = onRequestClose; config.events['onRequestUsers'] = onRequestUsers; config.events['onRequestSaveAs'] = onRequestSaveAs; diff --git a/web/documentserver-example/php-laravel/app/Http/Controllers/FileController.php b/web/documentserver-example/php-laravel/app/Http/Controllers/FileController.php index c337217ad..4f448dc69 100644 --- a/web/documentserver-example/php-laravel/app/Http/Controllers/FileController.php +++ b/web/documentserver-example/php-laravel/app/Http/Controllers/FileController.php @@ -19,8 +19,10 @@ use App\Helpers\Path\Path; use App\Helpers\Path\PathInfo; +use App\Helpers\URL\FileURL; use App\Helpers\URL\URL; use App\Repositories\FormatRepository; +use App\Services\JWT; use App\Services\ServerConfig; use App\Services\StorageConfig; use App\UseCases\Common\Http\DownloadFileCommand; @@ -41,6 +43,8 @@ use App\UseCases\Document\Find\FindDocumentHistoryQueryHandler; use App\UseCases\Document\Find\FindDocumentQuery; use App\UseCases\Document\Find\FindDocumentQueryHandler; +use App\UseCases\File\Find\FileExistsQuery; +use App\UseCases\File\Find\FileExistsQueryHandler; use Exception; use Illuminate\Http\Request; use Illuminate\Support\Facades\Log; @@ -311,4 +315,62 @@ public function destroy(Request $request) return response(status: 201); } + + public function config(Request $request, JWT $jwt) + { + try { + $request->validate([ + 'fileName' => 'string', + 'directUrl' => 'nullable|string', + 'permissions' => 'nullable|string', + ]); + + $fileName = $request->fileName; + $directUrl = $request->directUrl == 'true'; + + $fileExists = app(FileExistsQueryHandler::class) + ->__invoke(new FileExistsQuery($fileName, $request->ip())); + + if (! $fileExists) { + throw new Exception('File not found: '.$fileName); + } + + $file = app(FindDocumentQueryHandler::class) + ->__invoke(new FindDocumentQuery($fileName, $request->ip())); + $url = FileURL::download($fileName, $request->ip()); + + $config = [ + 'document' => [ + 'title' => $fileName, + 'key' => $file['key'], + 'url' => $url, + 'directUrl' => $directUrl ? $url : null, + 'permissions' => json_decode($request->permissions), + 'referenceData' => [ + 'fileKey' => json_encode([ + 'fileName' => $fileName, + 'userAddress' => $request->ip(), + ]), + 'instanceId' => $request->serverAddress, + ], + ], + 'editorConfig' => [ + 'mode' => 'edit', + 'callbackUrl' => FileURL::callback($fileName, $request->ip()), + ], + ]; + + if ($this->serverConfig->get('jwt.enabled')) { + $config['token'] = $jwt->encode($config); + } + + return response() + ->json($config); + } catch (Exception $e) { + return response() + ->json([ + 'error' => $e->getMessage(), + ], 500); + } + } } diff --git a/web/documentserver-example/php-laravel/app/Repositories/UserRepository.php b/web/documentserver-example/php-laravel/app/Repositories/UserRepository.php index 489c47de9..55f53e829 100644 --- a/web/documentserver-example/php-laravel/app/Repositories/UserRepository.php +++ b/web/documentserver-example/php-laravel/app/Repositories/UserRepository.php @@ -75,6 +75,7 @@ public function __construct() "Can't view chat", 'View file without collaboration', 'Can’t submit forms', + 'Can’t refresh outdated file', ]; $this->users = [ new User( diff --git a/web/documentserver-example/php-laravel/resources/views/editor.blade.php b/web/documentserver-example/php-laravel/resources/views/editor.blade.php index 7dd3b42c8..b6d2691cc 100644 --- a/web/documentserver-example/php-laravel/resources/views/editor.blade.php +++ b/web/documentserver-example/php-laravel/resources/views/editor.blade.php @@ -133,6 +133,18 @@ }); }; + var onRequestRefreshFile = function(event) { + let xhr = new XMLHttpRequest(); + xhr.open("GET", "files/config?fileName=" + encodeURIComponent(config.document.title) + + "&directUrl=" + !!config.document.directUrl + + "&permissions=" + encodeURIComponent(JSON.stringify(config.document.permissions))); + xhr.send(); + xhr.onload = function () { + innerAlert(xhr.responseText); + docEditor.refreshFile(JSON.parse(xhr.responseText)); + }; + }; + var onRequestReferenceData = function(event) { // user refresh external data source innerAlert("onRequestReferenceData"); diff --git a/web/documentserver-example/php-laravel/routes/web.php b/web/documentserver-example/php-laravel/routes/web.php index de5b0a5dc..eead77b86 100644 --- a/web/documentserver-example/php-laravel/routes/web.php +++ b/web/documentserver-example/php-laravel/routes/web.php @@ -24,6 +24,7 @@ Route::post('/saveas', [FileController::class, 'saveAs'])->name('saveas'); Route::get('/history', [FileController::class, 'history'])->name('history'); Route::post('/rename', [FileController::class, 'rename'])->name('rename'); + Route::get('/config', [FileController::class, 'config'])->name('config'); Route::middleware(EnsureJWTTokenIsPresent::class)->group(function () { Route::get('/download', [FileController::class, 'download'])->name('download');