]> BookStack Code Mirror - bookstack/commitdiff
Added attachment creation from link/name
authorDan Brown <redacted>
Mon, 10 Oct 2016 20:13:18 +0000 (21:13 +0100)
committerDan Brown <redacted>
Mon, 10 Oct 2016 20:13:18 +0000 (21:13 +0100)
app/Http/Controllers/Controller.php
app/Http/Controllers/FileController.php
app/Services/FileService.php
resources/assets/js/controllers.js
resources/views/pages/form-toolbox.blade.php
resources/views/pages/sidebar-tree-list.blade.php
routes/web.php

index 2dabc417be187f3d9e47398fdfb2912339d5aa85..ac430065a70caae150bf880044371193b55468d0 100644 (file)
@@ -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;
index e09fb98c6f140b8ff224c5ca46d938bbc906ea0f..9486298b2b5ad00ddd4de014e9bb99929eb9c6e2 100644 (file)
@@ -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']);
     }
 }
index 7429f0e6425224c7bb4fbbf5d154fa225e550e66..3674209a82055ef72bfb5624c93d1bf39f88cf84 100644 (file)
@@ -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);
index b5353e7d9d2b315df46456bf69336b725f2a1cc5..bc2d43fc8eb0e5e933cd46637b31821480de3b18 100644 (file)
@@ -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 = '';
+            };
+
         }]);
 
 };
index 9ebf223f0a6463b6c6601807c02d895cf6fbc016..e1481f50013f938382e02daa56c2767acf801d71 100644 (file)
             <p class="muted small">Upload some files to display on your page. This are visible in the page sidebar.</p>
             <drop-zone upload-url="@{{getUploadUrl()}}" uploaded-to="@{{uploadedTo}}" event-success="uploadSuccess"></drop-zone>
 
+            <hr class="even">
+
+            <div class="form-group">
+                <label for="attachment-via-link">File Name</label>
+                <input type="text" placeholder="File name" ng-model="fileName">
+            </div>
+            <div class="form-group">
+                <label for="attachment-via-link">Link to file</label>
+                <input type="text" placeholder="File url" ng-model="fileLink">
+            </div>
+            <button type="button" ng-click="attachLinkSubmit(fileName, fileLink)" class="button pos">Attach</button>
+
+
             <table class="no-style" tag-autosuggestions style="width: 100%;">
                 <tbody ui-sortable="sortOptions" ng-model="files" >
                 <tr ng-repeat="file in files track by $index">
index fa9cc84aa9e2a62a59a7e835fd2516f4fae03b1a..bf0e5761a892b236d4a556d289dc60c22fbcc13a 100644 (file)
@@ -5,7 +5,7 @@
         <h6 class="text-muted">Attachments</h6>
         @foreach($page->files as $file)
             <div class="attachment">
-                <a href="{{ $file->getUrl() }}"><i class="zmdi zmdi-file"></i> {{ $file->name }}</a>
+                <a href="{{ $file->getUrl() }}" @if($file->external) target="_blank" @endif><i class="zmdi zmdi-file"></i> {{ $file->name }}</a>
             </div>
         @endforeach
     @endif
index 514f82f99e9158252fcd1da9fb601e685b12690f..a55eb224f3143ec0767a5177a17b65d3e42508f7 100644 (file)
@@ -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');
Morty Proxy This is a proxified and sanitized view of the page, visit original site.