]> BookStack Code Mirror - bookstack/blobdiff - app/Http/Controllers/AttachmentController.php
Added config to change Gravatar URL
[bookstack] / app / Http / Controllers / AttachmentController.php
index 62be0b852236f9109249e17834f32ae85ae7eaee..0289f8e1d8f09e5bdf1bde68c7437c2e5a4746be 100644 (file)
@@ -1,28 +1,29 @@
 <?php namespace BookStack\Http\Controllers;
 
+use BookStack\Entities\Repos\EntityRepo;
 use BookStack\Exceptions\FileUploadException;
-use BookStack\Attachment;
-use BookStack\Repos\PageRepo;
-use BookStack\Services\AttachmentService;
+use BookStack\Exceptions\NotFoundException;
+use BookStack\Uploads\Attachment;
+use BookStack\Uploads\AttachmentService;
 use Illuminate\Http\Request;
 
 class AttachmentController extends Controller
 {
     protected $attachmentService;
     protected $attachment;
-    protected $pageRepo;
+    protected $entityRepo;
 
     /**
      * AttachmentController constructor.
-     * @param AttachmentService $attachmentService
+     * @param \BookStack\Uploads\AttachmentService $attachmentService
      * @param Attachment $attachment
-     * @param PageRepo $pageRepo
+     * @param EntityRepo $entityRepo
      */
-    public function __construct(AttachmentService $attachmentService, Attachment $attachment, PageRepo $pageRepo)
+    public function __construct(AttachmentService $attachmentService, Attachment $attachment, EntityRepo $entityRepo)
     {
         $this->attachmentService = $attachmentService;
         $this->attachment = $attachment;
-        $this->pageRepo = $pageRepo;
+        $this->entityRepo = $entityRepo;
         parent::__construct();
     }
 
@@ -40,7 +41,7 @@ class AttachmentController extends Controller
         ]);
 
         $pageId = $request->get('uploaded_to');
-        $page = $this->pageRepo->getById($pageId, true);
+        $page = $this->entityRepo->getById('page', $pageId, true);
 
         $this->checkPermission('attachment-create-all');
         $this->checkOwnablePermission('page-update', $page);
@@ -70,14 +71,14 @@ class AttachmentController extends Controller
         ]);
 
         $pageId = $request->get('uploaded_to');
-        $page = $this->pageRepo->getById($pageId, true);
+        $page = $this->entityRepo->getById('page', $pageId, true);
         $attachment = $this->attachment->findOrFail($attachmentId);
 
         $this->checkOwnablePermission('page-update', $page);
         $this->checkOwnablePermission('attachment-create', $attachment);
         
         if (intval($pageId) !== intval($attachment->uploaded_to)) {
-            return $this->jsonError('Page mismatch during attached file update');
+            return $this->jsonError(trans('errors.attachment_page_mismatch'));
         }
 
         $uploadedFile = $request->file('file');
@@ -102,22 +103,22 @@ class AttachmentController extends Controller
         $this->validate($request, [
             'uploaded_to' => 'required|integer|exists:pages,id',
             'name' => 'required|string|min:1|max:255',
-            'link' =>  'url|min:1|max:255'
+            'link' =>  'string|min:1|max:255'
         ]);
 
         $pageId = $request->get('uploaded_to');
-        $page = $this->pageRepo->getById($pageId, true);
+        $page = $this->entityRepo->getById('page', $pageId, true);
         $attachment = $this->attachment->findOrFail($attachmentId);
 
         $this->checkOwnablePermission('page-update', $page);
         $this->checkOwnablePermission('attachment-create', $attachment);
 
         if (intval($pageId) !== intval($attachment->uploaded_to)) {
-            return $this->jsonError('Page mismatch during attachment update');
+            return $this->jsonError(trans('errors.attachment_page_mismatch'));
         }
 
         $attachment = $this->attachmentService->updateFile($attachment, $request->all());
-        return $attachment;
+        return response()->json($attachment);
     }
 
     /**
@@ -130,11 +131,11 @@ class AttachmentController extends Controller
         $this->validate($request, [
             'uploaded_to' => 'required|integer|exists:pages,id',
             'name' => 'required|string|min:1|max:255',
-            'link' =>  'required|url|min:1|max:255'
+            'link' =>  'required|string|min:1|max:255'
         ]);
 
         $pageId = $request->get('uploaded_to');
-        $page = $this->pageRepo->getById($pageId, true);
+        $page = $this->entityRepo->getById('page', $pageId, true);
 
         $this->checkPermission('attachment-create-all');
         $this->checkOwnablePermission('page-update', $page);
@@ -153,7 +154,7 @@ class AttachmentController extends Controller
      */
     public function listForPage($pageId)
     {
-        $page = $this->pageRepo->getById($pageId, true);
+        $page = $this->entityRepo->getById('page', $pageId, true);
         $this->checkOwnablePermission('page-view', $page);
         return response()->json($page->attachments);
     }
@@ -170,23 +171,29 @@ class AttachmentController extends Controller
             'files' => 'required|array',
             'files.*.id' => 'required|integer',
         ]);
-        $page = $this->pageRepo->getById($pageId);
+        $page = $this->entityRepo->getById('page', $pageId);
         $this->checkOwnablePermission('page-update', $page);
 
         $attachments = $request->get('files');
         $this->attachmentService->updateFileOrderWithinPage($attachments, $pageId);
-        return response()->json(['message' => 'Attachment order updated']);
+        return response()->json(['message' => trans('entities.attachments_order_updated')]);
     }
 
     /**
      * Get an attachment from storage.
      * @param $attachmentId
      * @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Symfony\Component\HttpFoundation\Response
+     * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
+     * @throws NotFoundException
      */
     public function get($attachmentId)
     {
         $attachment = $this->attachment->findOrFail($attachmentId);
-        $page = $this->pageRepo->getById($attachment->uploaded_to);
+        $page = $this->entityRepo->getById('page', $attachment->uploaded_to);
+        if ($page === null) {
+            throw new NotFoundException(trans('errors.attachment_not_found'));
+        }
+
         $this->checkOwnablePermission('page-view', $page);
 
         if ($attachment->external) {
@@ -194,22 +201,20 @@ class AttachmentController extends Controller
         }
 
         $attachmentContents = $this->attachmentService->getAttachmentFromStorage($attachment);
-        return response($attachmentContents, 200, [
-            'Content-Type' => 'application/octet-stream',
-            'Content-Disposition' => 'attachment; filename="'. $attachment->getFileName() .'"'
-        ]);
+        return $this->downloadResponse($attachmentContents, $attachment->getFileName());
     }
 
     /**
      * Delete a specific attachment in the system.
      * @param $attachmentId
      * @return mixed
+     * @throws \Exception
      */
     public function delete($attachmentId)
     {
         $attachment = $this->attachment->findOrFail($attachmentId);
         $this->checkOwnablePermission('attachment-delete', $attachment);
         $this->attachmentService->deleteFile($attachment);
-        return response()->json(['message' => 'Attachment deleted']);
+        return response()->json(['message' => trans('entities.attachments_deleted')]);
     }
 }