From 89509b487af222ae9c9bc6c58c04b0790cc29b09 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Mon, 10 Oct 2016 21:13:18 +0100 Subject: [PATCH] Added attachment creation from link/name --- app/Http/Controllers/Controller.php | 11 ++++-- app/Http/Controllers/FileController.php | 39 +++++++++++++++++-- app/Services/FileService.php | 26 +++++++++++++ resources/assets/js/controllers.js | 12 ++++++ resources/views/pages/form-toolbox.blade.php | 13 +++++++ .../views/pages/sidebar-tree-list.blade.php | 2 +- routes/web.php | 1 + 7 files changed, 96 insertions(+), 8 deletions(-) diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index 2dabc417b..ac430065a 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -71,8 +71,13 @@ abstract class Controller extends BaseController */ protected function showPermissionError() { - Session::flash('error', trans('errors.permission')); - $response = request()->wantsJson() ? response()->json(['error' => trans('errors.permissionJson')], 403) : redirect('/'); + if (request()->wantsJson()) { + $response = response()->json(['error' => trans('errors.permissionJson')], 403); + } else { + $response = redirect('/'); + session()->flash('error', trans('errors.permission')); + } + throw new HttpResponseException($response); } @@ -83,7 +88,7 @@ abstract class Controller extends BaseController */ protected function checkPermission($permissionName) { - if (!$this->currentUser || !$this->currentUser->can($permissionName)) { + if (!user() || !user()->can($permissionName)) { $this->showPermissionError(); } return true; diff --git a/app/Http/Controllers/FileController.php b/app/Http/Controllers/FileController.php index e09fb98c6..9486298b2 100644 --- a/app/Http/Controllers/FileController.php +++ b/app/Http/Controllers/FileController.php @@ -36,7 +36,8 @@ class FileController extends Controller { // TODO - ensure uploads are deleted on page delete. $this->validate($request, [ - 'uploaded_to' => 'required|integer|exists:pages,id' + 'uploaded_to' => 'required|integer|exists:pages,id', + 'file' => 'required|file' ]); $pageId = $request->get('uploaded_to'); @@ -56,6 +57,32 @@ class FileController extends Controller return response()->json($file); } + /** + * Attach a link to a page as a file. + * @param Request $request + * @return mixed + */ + public function attachLink(Request $request) + { + $this->validate($request, [ + 'uploaded_to' => 'required|integer|exists:pages,id', + 'name' => 'string', + 'link' => 'url' + ]); + + $pageId = $request->get('uploaded_to'); + $page = $this->pageRepo->getById($pageId); + + $this->checkPermission('file-create-all'); + $this->checkOwnablePermission('page-update', $page); + + $fileName = $request->get('name'); + $link = $request->get('link'); + $file = $this->fileService->saveNewFromLink($fileName, $link, $pageId); + + return response()->json($file); + } + /** * Get the files for a specific page. * @param $pageId @@ -85,7 +112,7 @@ class FileController extends Controller $files = $request->get('files'); $this->fileService->updateFileOrderWithinPage($files, $pageId); - return response()->json(['message' => 'File order updated']); + return response()->json(['message' => 'Attachment order updated']); } /** @@ -98,6 +125,10 @@ class FileController extends Controller $page = $this->pageRepo->getById($file->uploaded_to); $this->checkOwnablePermission('page-view', $page); + if ($file->external) { + return redirect($file->path); + } + $fileContents = $this->fileService->getFile($file); return response($fileContents, 200, [ 'Content-Type' => 'application/octet-stream', @@ -113,8 +144,8 @@ class FileController extends Controller public function delete($fileId) { $file = $this->file->findOrFail($fileId); - $this->checkOwnablePermission($file, 'file-delete'); + $this->checkOwnablePermission('file-delete', $file); $this->fileService->deleteFile($file); - return response()->json(['message' => 'File deleted']); + return response()->json(['message' => 'Attachment deleted']); } } diff --git a/app/Services/FileService.php b/app/Services/FileService.php index 7429f0e64..3674209a8 100644 --- a/app/Services/FileService.php +++ b/app/Services/FileService.php @@ -66,6 +66,27 @@ class FileService extends UploadService return $file; } + /** + * Save a new File attachment from a given link and name. + * @param string $name + * @param string $link + * @param int $page_id + * @return File + */ + public function saveNewFromLink($name, $link, $page_id) + { + $largestExistingOrder = File::where('uploaded_to', '=', $page_id)->max('order'); + return File::forceCreate([ + 'name' => $name, + 'path' => $link, + 'external' => true, + 'uploaded_to' => $page_id, + 'created_by' => user()->id, + 'updated_by' => user()->id, + 'order' => $largestExistingOrder + 1 + ]); + } + /** * Get the file storage base path, amended for storage type. * This allows us to keep a generic path in the database. @@ -94,6 +115,11 @@ class FileService extends UploadService */ public function deleteFile(File $file) { + if ($file->external) { + $file->delete(); + return; + } + $storedFilePath = $this->getStorageBasePath() . $file->path; $storage = $this->getStorage(); $dirPath = dirname($storedFilePath); diff --git a/resources/assets/js/controllers.js b/resources/assets/js/controllers.js index b5353e7d9..bc2d43fc8 100644 --- a/resources/assets/js/controllers.js +++ b/resources/assets/js/controllers.js @@ -606,6 +606,18 @@ module.exports = function (ngApp, events) { }); }; + $scope.attachLinkSubmit = function(fileName, fileLink) { + $http.post('/files/link', { + uploaded_to: pageId, + name: fileName, + link: fileLink + }).then(resp => { + $scope.files.unshift(resp.data); + events.emit('success', 'Link attached'); + }); + $scope.fileName = $scope.fileLink = ''; + }; + }]); }; diff --git a/resources/views/pages/form-toolbox.blade.php b/resources/views/pages/form-toolbox.blade.php index 9ebf223f0..e1481f500 100644 --- a/resources/views/pages/form-toolbox.blade.php +++ b/resources/views/pages/form-toolbox.blade.php @@ -41,6 +41,19 @@

Upload some files to display on your page. This are visible in the page sidebar.

+
+ +
+ + +
+
+ + +
+ + + diff --git a/resources/views/pages/sidebar-tree-list.blade.php b/resources/views/pages/sidebar-tree-list.blade.php index fa9cc84aa..bf0e5761a 100644 --- a/resources/views/pages/sidebar-tree-list.blade.php +++ b/resources/views/pages/sidebar-tree-list.blade.php @@ -5,7 +5,7 @@
Attachments
@foreach($page->files as $file)
- {{ $file->name }} + external) target="_blank" @endif> {{ $file->name }}
@endforeach @endif diff --git a/routes/web.php b/routes/web.php index 514f82f99..a55eb224f 100644 --- a/routes/web.php +++ b/routes/web.php @@ -90,6 +90,7 @@ Route::group(['middleware' => 'auth'], function () { // File routes Route::get('/files/{id}', 'FileController@get'); Route::post('/files/upload', 'FileController@upload'); + Route::post('/files/link', 'FileController@attachLink'); Route::get('/files/get/page/{pageId}', 'FileController@listForPage'); Route::put('/files/sort/page/{pageId}', 'FileController@sortForPage'); Route::delete('/files/{id}', 'FileController@delete');