Toggle navigation
Toggle navigation
This project
Loading...
Sign in
Зуев Егор
/
wiki.dev
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Snippets
Network
Create a new issue
Commits
Issue Boards
Files
Commits
Network
Compare
Branches
Tags
Authored by
Dan Brown
2016-10-10 21:13:18 +0100
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
Commit
89509b487af222ae9c9bc6c58c04b0790cc29b09
89509b48
1 parent
ac0b29fb
Added attachment creation from link/name
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
96 additions
and
8 deletions
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
app/Http/Controllers/Controller.php
View file @
89509b4
...
...
@@ -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
;
...
...
app/Http/Controllers/FileController.php
View file @
89509b4
...
...
@@ -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'
);
...
...
@@ -57,6 +58,32 @@ class FileController extends Controller
}
/**
* 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
* @return mixed
...
...
@@ -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'
]);
}
}
...
...
app/Services/FileService.php
View file @
89509b4
...
...
@@ -67,6 +67,27 @@ class FileService extends UploadService
}
/**
* 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.
* @return string
...
...
@@ -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
);
...
...
resources/assets/js/controllers.js
View file @
89509b4
...
...
@@ -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
=
''
;
};
}]);
};
...
...
resources/views/pages/form-toolbox.blade.php
View file @
89509b4
...
...
@@ -41,6 +41,19 @@
<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"
>
...
...
resources/views/pages/sidebar-tree-list.blade.php
View file @
89509b4
...
...
@@ -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
...
...
routes/web.php
View file @
89509b4
...
...
@@ -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'
);
...
...
Please
register
or
sign in
to post a comment