*/
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);
}
*/
protected function checkPermission($permissionName)
{
- if (!$this->currentUser || !$this->currentUser->can($permissionName)) {
+ if (!user() || !user()->can($permissionName)) {
$this->showPermissionError();
}
return true;
{
// 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');
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
$files = $request->get('files');
$this->fileService->updateFileOrderWithinPage($files, $pageId);
- return response()->json(['message' => 'File order updated']);
+ return response()->json(['message' => 'Attachment order updated']);
}
/**
$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',
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']);
}
}
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.
*/
public function deleteFile(File $file)
{
+ if ($file->external) {
+ $file->delete();
+ return;
+ }
+
$storedFilePath = $this->getStorageBasePath() . $file->path;
$storage = $this->getStorage();
$dirPath = dirname($storedFilePath);
});
};
+ $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 = '';
+ };
+
}]);
};
<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">
<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
// 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');