]>
BookStack Code Mirror - bookstack/commitdiff
projects
/
bookstack
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
| inline |
side by side
(parent:
f91f33c
)
Started refactor to merge entity repos
author
Dan Brown
<redacted>
Sun, 1 Jan 2017 16:05:44 +0000
(16:05 +0000)
committer
Dan Brown
<redacted>
Sun, 1 Jan 2017 16:05:44 +0000
(16:05 +0000)
14 files changed:
app/Chapter.php
patch
|
blob
|
history
app/Http/Controllers/AttachmentController.php
patch
|
blob
|
history
app/Http/Controllers/BookController.php
patch
|
blob
|
history
app/Http/Controllers/ChapterController.php
patch
|
blob
|
history
app/Http/Controllers/HomeController.php
patch
|
blob
|
history
app/Http/Controllers/PageController.php
patch
|
blob
|
history
app/Page.php
patch
|
blob
|
history
app/Repos/BookRepo.php
patch
|
blob
|
history
app/Repos/ChapterRepo.php
patch
|
blob
|
history
app/Repos/EntityRepo.php
patch
|
blob
|
history
app/Repos/PageRepo.php
patch
|
blob
|
history
app/Repos/UserRepo.php
patch
|
blob
|
history
app/Services/PermissionService.php
patch
|
blob
|
history
tests/Permissions/RestrictionsTest.php
patch
|
blob
|
history
diff --git
a/app/Chapter.php
b/app/Chapter.php
index cc5518b7a831ea73a41681043a3deddeb214d946..586ce3fe37e6b97a1d3721c96c9aab9bdf903aeb 100644
(file)
--- a/
app/Chapter.php
+++ b/
app/Chapter.php
@@
-5,6
+5,8
@@
class Chapter extends Entity
{
protected $fillable = ['name', 'description', 'priority', 'book_id'];
+ protected $with = ['book'];
+
/**
* Get the book this chapter is within.
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
diff --git
a/app/Http/Controllers/AttachmentController.php
b/app/Http/Controllers/AttachmentController.php
index b5e7db41ee3aa89d76f37faee3eee3406c7dd056..715cd2bd8af66565c1c700fe8ffe458b8a0c85c3 100644
(file)
--- a/
app/Http/Controllers/AttachmentController.php
+++ b/
app/Http/Controllers/AttachmentController.php
@@
-2,6
+2,7
@@
use BookStack\Exceptions\FileUploadException;
use BookStack\Attachment;
+use BookStack\Repos\EntityRepo;
use BookStack\Repos\PageRepo;
use BookStack\Services\AttachmentService;
use Illuminate\Http\Request;
@@
-11,6
+12,7
@@
class AttachmentController extends Controller
protected $attachmentService;
protected $attachment;
protected $pageRepo;
+ protected $entityRepo;
/**
* AttachmentController constructor.
@@
-18,11
+20,13
@@
class AttachmentController extends Controller
* @param Attachment $attachment
* @param PageRepo $pageRepo
*/
- public function __construct(AttachmentService $attachmentService, Attachment $attachment, PageRepo $pageRepo)
+ public function __construct(AttachmentService $attachmentService, Attachment $attachment,
EntityRepo $entityRepo,
PageRepo $pageRepo)
{
$this->attachmentService = $attachmentService;
$this->attachment = $attachment;
+ // TODO - Remove this
$this->pageRepo = $pageRepo;
+ $this->entityRepo = $entityRepo;
parent::__construct();
}
@@
-40,7
+44,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,7
+74,7
@@
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);
@@
-106,7
+110,7
@@
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);
@@
-134,7
+138,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);
@@
-153,7
+157,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,7
+174,7
@@
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');
@@
-186,7
+190,7
@@
class AttachmentController extends Controller
public function get($attachmentId)
{
$attachment = $this->attachment->findOrFail($attachmentId);
- $page = $this->
pageRepo->getById(
$attachment->uploaded_to);
+ $page = $this->
entityRepo->getById('page',
$attachment->uploaded_to);
$this->checkOwnablePermission('page-view', $page);
if ($attachment->external) {
diff --git
a/app/Http/Controllers/BookController.php
b/app/Http/Controllers/BookController.php
index 80a6c24b3c40686e81b1a036fe636eb24ff8d8d9..0b4749a48fa73958b7c653ee0972cdc195a1a7c7 100644
(file)
--- a/
app/Http/Controllers/BookController.php
+++ b/
app/Http/Controllers/BookController.php
@@
-1,6
+1,7
@@
<?php namespace BookStack\Http\Controllers;
use Activity;
+use BookStack\Repos\EntityRepo;
use BookStack\Repos\UserRepo;
use Illuminate\Http\Request;
use BookStack\Http\Requests;
@@
-13,6
+14,7
@@
use Views;
class BookController extends Controller
{
+ protected $entityRepo;
protected $bookRepo;
protected $pageRepo;
protected $chapterRepo;
@@
-25,8
+27,10
@@
class BookController extends Controller
* @param ChapterRepo $chapterRepo
* @param UserRepo $userRepo
*/
- public function __construct(BookRepo $bookRepo, PageRepo $pageRepo, ChapterRepo $chapterRepo, UserRepo $userRepo)
+ public function __construct(
EntityRepo $entityRepo,
BookRepo $bookRepo, PageRepo $pageRepo, ChapterRepo $chapterRepo, UserRepo $userRepo)
{
+ $this->entityRepo = $entityRepo;
+ // TODO - Remove below
$this->bookRepo = $bookRepo;
$this->pageRepo = $pageRepo;
$this->chapterRepo = $chapterRepo;
@@
-40,9
+44,9
@@
class BookController extends Controller
*/
public function index()
{
- $books = $this->
bookRepo->getAllPaginated(
10);
- $recents = $this->signedIn ? $this->
bookRepo->getRecentlyViewed(
4, 0) : false;
- $popular = $this->
bookRepo->getPopular(
4, 0);
+ $books = $this->
entityRepo->getAllPaginated('book',
10);
+ $recents = $this->signedIn ? $this->
entityRepo->getRecentlyViewed('book',
4, 0) : false;
+ $popular = $this->
entityRepo->getPopular('book',
4, 0);
$this->setPageTitle('Books');
return view('books/index', ['books' => $books, 'recents' => $recents, 'popular' => $popular]);
}
@@
-83,7
+87,7
@@
class BookController extends Controller
*/
public function show($slug)
{
- $book = $this->
bookRepo->getBySlug(
$slug);
+ $book = $this->
entityRepo->getBySlug('book',
$slug);
$this->checkOwnablePermission('book-view', $book);
$bookChildren = $this->bookRepo->getChildren($book);
Views::add($book);
@@
-98,7
+102,7
@@
class BookController extends Controller
*/
public function edit($slug)
{
- $book = $this->
bookRepo->getBySlug(
$slug);
+ $book = $this->
entityRepo->getBySlug('book',
$slug);
$this->checkOwnablePermission('book-update', $book);
$this->setPageTitle(trans('entities.books_edit_named',['bookName'=>$book->getShortName()]));
return view('books/edit', ['book' => $book, 'current' => $book]);
@@
-112,7
+116,7
@@
class BookController extends Controller
*/
public function update(Request $request, $slug)
{
- $book = $this->
bookRepo->getBySlug(
$slug);
+ $book = $this->
entityRepo->getBySlug('book',
$slug);
$this->checkOwnablePermission('book-update', $book);
$this->validate($request, [
'name' => 'required|string|max:255',
@@
-130,7
+134,7
@@
class BookController extends Controller
*/
public function showDelete($bookSlug)
{
- $book = $this->
bookRepo->getBySlug(
$bookSlug);
+ $book = $this->
entityRepo->getBySlug('book',
$bookSlug);
$this->checkOwnablePermission('book-delete', $book);
$this->setPageTitle(trans('entities.books_delete_named', ['bookName'=>$book->getShortName()]));
return view('books/delete', ['book' => $book, 'current' => $book]);
@@
-143,10
+147,10
@@
class BookController extends Controller
*/
public function sort($bookSlug)
{
- $book = $this->
bookRepo->getBySlug(
$bookSlug);
+ $book = $this->
entityRepo->getBySlug('book',
$bookSlug);
$this->checkOwnablePermission('book-update', $book);
$bookChildren = $this->bookRepo->getChildren($book, true);
- $books = $this->
bookRepo->getAll(
false);
+ $books = $this->
entityRepo->getAll('book',
false);
$this->setPageTitle(trans('entities.books_sort_named', ['bookName'=>$book->getShortName()]));
return view('books/sort', ['book' => $book, 'current' => $book, 'books' => $books, 'bookChildren' => $bookChildren]);
}
@@
-159,7
+163,7
@@
class BookController extends Controller
*/
public function getSortItem($bookSlug)
{
- $book = $this->
bookRepo->getBySlug(
$bookSlug);
+ $book = $this->
entityRepo->getBySlug('book',
$bookSlug);
$bookChildren = $this->bookRepo->getChildren($book);
return view('books/sort-box', ['book' => $book, 'bookChildren' => $bookChildren]);
}
@@
-172,7
+176,7
@@
class BookController extends Controller
*/
public function saveSort($bookSlug, Request $request)
{
- $book = $this->
bookRepo->getBySlug(
$bookSlug);
+ $book = $this->
entityRepo->getBySlug('book',
$bookSlug);
$this->checkOwnablePermission('book-update', $book);
// Return if no map sent
@@
-191,9
+195,9
@@
class BookController extends Controller
$priority = $bookChild->sort;
$id = intval($bookChild->id);
$isPage = $bookChild->type == 'page';
- $bookId = $this->
bookRepo->exists(
$bookChild->book) ? intval($bookChild->book) : $defaultBookId;
+ $bookId = $this->
entityRepo->exists('book',
$bookChild->book) ? intval($bookChild->book) : $defaultBookId;
$chapterId = ($isPage && $bookChild->parentChapter === false) ? 0 : intval($bookChild->parentChapter);
- $model = $
isPage ? $this->pageRepo->getById($id) : $this->chapterRepo->getById(
$id);
+ $model = $
this->entityRepo->getById($isPage?'page':'chapter',
$id);
// Update models only if there's a change in parent chain or ordering.
if ($model->priority !== $priority || $model->book_id !== $bookId || ($isPage && $model->chapter_id !== $chapterId)) {
@@
-212,7
+216,7
@@
class BookController extends Controller
// Add activity for books
foreach ($sortedBooks as $bookId) {
- $updatedBook = $this->
bookRepo->getById(
$bookId);
+ $updatedBook = $this->
entityRepo->getById('book',
$bookId);
Activity::add($updatedBook, 'book_sort', $updatedBook->id);
}
@@
-229,7
+233,7
@@
class BookController extends Controller
*/
public function destroy($bookSlug)
{
- $book = $this->
bookRepo->getBySlug(
$bookSlug);
+ $book = $this->
entityRepo->getBySlug('book',
$bookSlug);
$this->checkOwnablePermission('book-delete', $book);
Activity::addMessage('book_delete', 0, $book->name);
Activity::removeEntity($book);
@@
-244,7
+248,7
@@
class BookController extends Controller
*/
public function showRestrict($bookSlug)
{
- $book = $this->
bookRepo->getBySlug(
$bookSlug);
+ $book = $this->
entityRepo->getBySlug('book',
$bookSlug);
$this->checkOwnablePermission('restrictions-manage', $book);
$roles = $this->userRepo->getRestrictableRoles();
return view('books/restrictions', [
@@
-262,7
+266,7
@@
class BookController extends Controller
*/
public function restrict($bookSlug, Request $request)
{
- $book = $this->
bookRepo->getBySlug(
$bookSlug);
+ $book = $this->
entityRepo->getBySlug('book',
$bookSlug);
$this->checkOwnablePermission('restrictions-manage', $book);
$this->bookRepo->updateEntityPermissionsFromRequest($request, $book);
session()->flash('success', trans('entities.books_permissions_updated'));
diff --git
a/app/Http/Controllers/ChapterController.php
b/app/Http/Controllers/ChapterController.php
index 84983518514d8342f9fbba4aeb63a7a34bd82887..e71ed4d98661064adb75a2f3a9a56986d71d3f14 100644
(file)
--- a/
app/Http/Controllers/ChapterController.php
+++ b/
app/Http/Controllers/ChapterController.php
@@
-1,6
+1,7
@@
<?php namespace BookStack\Http\Controllers;
use Activity;
+use BookStack\Repos\EntityRepo;
use BookStack\Repos\UserRepo;
use Illuminate\Http\Request;
use BookStack\Repos\BookRepo;
@@
-14,15
+15,19
@@
class ChapterController extends Controller
protected $bookRepo;
protected $chapterRepo;
protected $userRepo;
+ protected $entityRepo;
/**
* ChapterController constructor.
+ * @param EntityRepo $entityRepo
* @param BookRepo $bookRepo
* @param ChapterRepo $chapterRepo
* @param UserRepo $userRepo
*/
- public function __construct(BookRepo $bookRepo, ChapterRepo $chapterRepo, UserRepo $userRepo)
+ public function __construct(
EntityRepo $entityRepo,
BookRepo $bookRepo, ChapterRepo $chapterRepo, UserRepo $userRepo)
{
+ $this->entityRepo = $entityRepo;
+ // TODO - Remove below
$this->bookRepo = $bookRepo;
$this->chapterRepo = $chapterRepo;
$this->userRepo = $userRepo;
@@
-36,7
+41,7
@@
class ChapterController extends Controller
*/
public function create($bookSlug)
{
- $book = $this->
bookRepo->getBySlug(
$bookSlug);
+ $book = $this->
entityRepo->getBySlug('book',
$bookSlug);
$this->checkOwnablePermission('chapter-create', $book);
$this->setPageTitle(trans('entities.chapters_create'));
return view('chapters/create', ['book' => $book, 'current' => $book]);
@@
-54,7
+59,7
@@
class ChapterController extends Controller
'name' => 'required|string|max:255'
]);
- $book = $this->
bookRepo->getBySlug(
$bookSlug);
+ $book = $this->
entityRepo->getBySlug('book',
$bookSlug);
$this->checkOwnablePermission('chapter-create', $book);
$input = $request->all();
@@
-72,15
+77,14
@@
class ChapterController extends Controller
*/
public function show($bookSlug, $chapterSlug)
{
- $book = $this->bookRepo->getBySlug($bookSlug);
- $chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
+ $chapter = $this->entityRepo->getBySlug('chapter', $chapterSlug, $bookSlug);
$this->checkOwnablePermission('chapter-view', $chapter);
- $sidebarTree = $this->bookRepo->getChildren($book);
+ $sidebarTree = $this->bookRepo->getChildren($
chapter->
book);
Views::add($chapter);
$this->setPageTitle($chapter->getShortName());
$pages = $this->chapterRepo->getChildren($chapter);
return view('chapters/show', [
- 'book' => $book,
+ 'book' => $
chapter->
book,
'chapter' => $chapter,
'current' => $chapter,
'sidebarTree' => $sidebarTree,
@@
-96,11
+100,10
@@
class ChapterController extends Controller
*/
public function edit($bookSlug, $chapterSlug)
{
- $book = $this->bookRepo->getBySlug($bookSlug);
- $chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
+ $chapter = $this->entityRepo->getBySlug('chapter', $chapterSlug, $bookSlug);
$this->checkOwnablePermission('chapter-update', $chapter);
$this->setPageTitle(trans('entities.chapters_edit_named', ['chapterName' => $chapter->getShortName()]));
- return view('chapters/edit', ['book' => $book, 'chapter' => $chapter, 'current' => $chapter]);
+ return view('chapters/edit', ['book' => $
chapter->
book, 'chapter' => $chapter, 'current' => $chapter]);
}
/**
@@
-112,16
+115,15
@@
class ChapterController extends Controller
*/
public function update(Request $request, $bookSlug, $chapterSlug)
{
- $book = $this->bookRepo->getBySlug($bookSlug);
- $chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
+ $chapter = $this->entityRepo->getBySlug('chapter', $chapterSlug, $bookSlug);
$this->checkOwnablePermission('chapter-update', $chapter);
if ($chapter->name !== $request->get('name')) {
- $chapter->slug = $this->chapterRepo->findSuitableSlug($request->get('name'), $book->id, $chapter->id);
+ $chapter->slug = $this->chapterRepo->findSuitableSlug($request->get('name'), $
chapter->
book->id, $chapter->id);
}
$chapter->fill($request->all());
$chapter->updated_by = user()->id;
$chapter->save();
- Activity::add($chapter, 'chapter_update', $book->id);
+ Activity::add($chapter, 'chapter_update', $
chapter->
book->id);
return redirect($chapter->getUrl());
}
@@
-133,11
+135,10
@@
class ChapterController extends Controller
*/
public function showDelete($bookSlug, $chapterSlug)
{
- $book = $this->bookRepo->getBySlug($bookSlug);
- $chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
+ $chapter = $this->entityRepo->getBySlug('chapter', $chapterSlug, $bookSlug);
$this->checkOwnablePermission('chapter-delete', $chapter);
$this->setPageTitle(trans('entities.chapters_delete_named', ['chapterName' => $chapter->getShortName()]));
- return view('chapters/delete', ['book' => $book, 'chapter' => $chapter, 'current' => $chapter]);
+ return view('chapters/delete', ['book' => $
chapter->
book, 'chapter' => $chapter, 'current' => $chapter]);
}
/**
@@
-148,8
+149,8
@@
class ChapterController extends Controller
*/
public function destroy($bookSlug, $chapterSlug)
{
- $
book = $this->bookRepo->getBySlug(
$bookSlug);
- $
chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id)
;
+ $
chapter = $this->entityRepo->getBySlug('chapter', $chapterSlug,
$bookSlug);
+ $
book = $chapter->book
;
$this->checkOwnablePermission('chapter-delete', $chapter);
Activity::addMessage('chapter_delete', $book->id, $chapter->name);
$this->chapterRepo->destroy($chapter);
@@
-164,13
+165,12
@@
class ChapterController extends Controller
* @throws \BookStack\Exceptions\NotFoundException
*/
public function showMove($bookSlug, $chapterSlug) {
- $book = $this->bookRepo->getBySlug($bookSlug);
- $chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
+ $chapter = $this->entityRepo->getBySlug('chapter', $chapterSlug, $bookSlug);
$this->setPageTitle(trans('entities.chapters_move_named', ['chapterName' => $chapter->getShortName()]));
$this->checkOwnablePermission('chapter-update', $chapter);
return view('chapters/move', [
'chapter' => $chapter,
- 'book' => $book
+ 'book' => $
chapter->
book
]);
}
@@
-183,8
+183,7
@@
class ChapterController extends Controller
* @throws \BookStack\Exceptions\NotFoundException
*/
public function move($bookSlug, $chapterSlug, Request $request) {
- $book = $this->bookRepo->getBySlug($bookSlug);
- $chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
+ $chapter = $this->entityRepo->getBySlug('chapter', $chapterSlug, $bookSlug);
$this->checkOwnablePermission('chapter-update', $chapter);
$entitySelection = $request->get('entity_selection', null);
@@
-199,7
+198,7
@@
class ChapterController extends Controller
$parent = false;
if ($entityType == 'book') {
- $parent = $this->
bookRepo->getById(
$entityId);
+ $parent = $this->
entityRepo->getById('book',
$entityId);
}
if ($parent === false || $parent === null) {
@@
-222,8
+221,7
@@
class ChapterController extends Controller
*/
public function showRestrict($bookSlug, $chapterSlug)
{
- $book = $this->bookRepo->getBySlug($bookSlug);
- $chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
+ $chapter = $this->entityRepo->getBySlug('chapter', $chapterSlug, $bookSlug);
$this->checkOwnablePermission('restrictions-manage', $chapter);
$roles = $this->userRepo->getRestrictableRoles();
return view('chapters/restrictions', [
@@
-241,8
+239,7
@@
class ChapterController extends Controller
*/
public function restrict($bookSlug, $chapterSlug, Request $request)
{
- $book = $this->bookRepo->getBySlug($bookSlug);
- $chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
+ $chapter = $this->entityRepo->getBySlug('chapter', $chapterSlug, $bookSlug);
$this->checkOwnablePermission('restrictions-manage', $chapter);
$this->chapterRepo->updateEntityPermissionsFromRequest($request, $chapter);
session()->flash('success', trans('entities.chapters_permissions_success'));
diff --git
a/app/Http/Controllers/HomeController.php
b/app/Http/Controllers/HomeController.php
index e325b93229868c60bd7135068953f90b8603cd7d..f4706a5c4444316429decbd23cb63673a2e2bc78 100644
(file)
--- a/
app/Http/Controllers/HomeController.php
+++ b/
app/Http/Controllers/HomeController.php
@@
-5,6
+5,7
@@
namespace BookStack\Http\Controllers;
use Activity;
use BookStack\Repos\EntityRepo;
use BookStack\Http\Requests;
+use Illuminate\Http\Response;
use Views;
class HomeController extends Controller
@@
-31,9
+32,9
@@
class HomeController extends Controller
$activity = Activity::latest(10);
$draftPages = $this->signedIn ? $this->entityRepo->getUserDraftPages(6) : [];
$recentFactor = count($draftPages) > 0 ? 0.5 : 1;
- $recents = $this->signedIn ? Views::getUserRecentlyViewed(12*$recentFactor, 0) : $this->entityRepo->getRecentlyCreated
Books(
10*$recentFactor);
- $recentlyCreatedPages = $this->entityRepo->getRecentlyCreated
Pages(
5);
- $recentlyUpdatedPages = $this->entityRepo->getRecentlyUpdated
Pages(
5);
+ $recents = $this->signedIn ? Views::getUserRecentlyViewed(12*$recentFactor, 0) : $this->entityRepo->getRecentlyCreated
('book',
10*$recentFactor);
+ $recentlyCreatedPages = $this->entityRepo->getRecentlyCreated
('page',
5);
+ $recentlyUpdatedPages = $this->entityRepo->getRecentlyUpdated
('page',
5);
return view('home', [
'activity' => $activity,
'recents' => $recents,
diff --git
a/app/Http/Controllers/PageController.php
b/app/Http/Controllers/PageController.php
index e40d7668a4fedd3fe46d747b3ab10e0830274a6f..0d6678e048d422e47acafcbabf7b52bd3e0d4c0c 100644
(file)
--- a/
app/Http/Controllers/PageController.php
+++ b/
app/Http/Controllers/PageController.php
@@
-2,22
+2,22
@@
use Activity;
use BookStack\Exceptions\NotFoundException;
+use BookStack\Repos\EntityRepo;
use BookStack\Repos\UserRepo;
use BookStack\Services\ExportService;
use Carbon\Carbon;
use Illuminate\Http\Request;
-use BookStack\Http\Requests;
use BookStack\Repos\BookRepo;
use BookStack\Repos\ChapterRepo;
use BookStack\Repos\PageRepo;
use Illuminate\Http\Response;
-use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Views;
use GatherContent\Htmldiff\Htmldiff;
class PageController extends Controller
{
+ protected $entityRepo;
protected $pageRepo;
protected $bookRepo;
protected $chapterRepo;
@@
-32,8
+32,10
@@
class PageController extends Controller
* @param ExportService $exportService
* @param UserRepo $userRepo
*/
- public function __construct(PageRepo $pageRepo, BookRepo $bookRepo, ChapterRepo $chapterRepo, ExportService $exportService, UserRepo $userRepo)
+ public function __construct(
EntityRepo $entityRepo,
PageRepo $pageRepo, BookRepo $bookRepo, ChapterRepo $chapterRepo, ExportService $exportService, UserRepo $userRepo)
{
+ $this->entityRepo = $entityRepo;
+ // TODO - remove below;
$this->pageRepo = $pageRepo;
$this->bookRepo = $bookRepo;
$this->chapterRepo = $chapterRepo;
@@
-51,8
+53,8
@@
class PageController extends Controller
*/
public function create($bookSlug, $chapterSlug = null)
{
- $book = $this->
bookRepo->getBySlug(
$bookSlug);
- $chapter = $chapterSlug ? $this->
chapterRepo->getBySlug($chapterSlug, $book->id
) : null;
+ $book = $this->
entityRepo->getBySlug('book',
$bookSlug);
+ $chapter = $chapterSlug ? $this->
entityRepo->getBySlug('chapter', $chapterSlug, $bookSlug
) : null;
$parent = $chapter ? $chapter : $book;
$this->checkOwnablePermission('page-create', $parent);
@@
-81,8
+83,8
@@
class PageController extends Controller
'name' => 'required|string|max:255'
]);
- $book = $this->
bookRepo->getBySlug(
$bookSlug);
- $chapter = $chapterSlug ? $this->
chapterRepo->getBySlug($chapterSlug, $book->id
) : null;
+ $book = $this->
entityRepo->getBySlug('book',
$bookSlug);
+ $chapter = $chapterSlug ? $this->
entityRepo->getBySlug('chapter', $chapterSlug, $bookSlug
) : null;
$parent = $chapter ? $chapter : $book;
$this->checkOwnablePermission('page-create', $parent);
@@
-102,15
+104,14
@@
class PageController extends Controller
*/
public function editDraft($bookSlug, $pageId)
{
- $book = $this->bookRepo->getBySlug($bookSlug);
- $draft = $this->pageRepo->getById($pageId, true);
- $this->checkOwnablePermission('page-create', $book);
+ $draft = $this->entityRepo->getById('page', $pageId, true);
+ $this->checkOwnablePermission('page-create', $draft->book);
$this->setPageTitle(trans('entities.pages_edit_draft'));
$draftsEnabled = $this->signedIn;
return view('pages/edit', [
'page' => $draft,
- 'book' => $book,
+ 'book' => $
draft->
book,
'isDraft' => true,
'draftsEnabled' => $draftsEnabled
]);
@@
-130,12
+131,12
@@
class PageController extends Controller
]);
$input = $request->all();
- $book = $this->
bookRepo->getBySlug(
$bookSlug);
+ $book = $this->
entityRepo->getBySlug('book',
$bookSlug);
- $draftPage = $this->
pageRepo->getById(
$pageId, true);
+ $draftPage = $this->
entityRepo->getById('page',
$pageId, true);
$chapterId = intval($draftPage->chapter_id);
- $parent = $chapterId !== 0 ? $this->
chapterRepo->getById(
$chapterId) : $book;
+ $parent = $chapterId !== 0 ? $this->
entityRepo->getById('chapter',
$chapterId) : $book;
$this->checkOwnablePermission('page-create', $parent);
if ($parent->isA('chapter')) {
@@
-152,18
+153,15
@@
class PageController extends Controller
/**
* Display the specified page.
- * If the page is not found via the slug the
- * revisions are searched for a match.
+ * If the page is not found via the slug the revisions are searched for a match.
* @param string $bookSlug
* @param string $pageSlug
* @return Response
*/
public function show($bookSlug, $pageSlug)
{
- $book = $this->bookRepo->getBySlug($bookSlug);
-
try {
- $page = $this->
pageRepo->getBySlug($pageSlug, $book->id
);
+ $page = $this->
entityRepo->getBySlug('page', $pageSlug, $bookSlug
);
} catch (NotFoundException $e) {
$page = $this->pageRepo->findPageUsingOldSlug($pageSlug, $bookSlug);
if ($page === null) abort(404);
@@
-172,12
+170,12
@@
class PageController extends Controller
$this->checkOwnablePermission('page-view', $page);
- $sidebarTree = $this->bookRepo->getChildren($book);
+ $sidebarTree = $this->bookRepo->getChildren($
page->
book);
$pageNav = $this->pageRepo->getPageNav($page);
Views::add($page);
$this->setPageTitle($page->getShortName());
- return view('pages/show', ['page' => $page, 'book' => $book,
+ return view('pages/show', ['page' => $page, 'book' => $
page->
book,
'current' => $page, 'sidebarTree' => $sidebarTree, 'pageNav' => $pageNav]);
}
@@
-188,7
+186,7
@@
class PageController extends Controller
*/
public function getPageAjax($pageId)
{
- $page = $this->
pageRepo->getById(
$pageId);
+ $page = $this->
entityRepo->getById('page',
$pageId);
return response()->json($page);
}
@@
-200,8
+198,7
@@
class PageController extends Controller
*/
public function edit($bookSlug, $pageSlug)
{
- $book = $this->bookRepo->getBySlug($bookSlug);
- $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
+ $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug);
$this->checkOwnablePermission('page-update', $page);
$this->setPageTitle(trans('entities.pages_editing_named', ['pageName'=>$page->getShortName()]));
$page->isDraft = false;
@@
-227,7
+224,7
@@
class PageController extends Controller
$draftsEnabled = $this->signedIn;
return view('pages/edit', [
'page' => $page,
- 'book' => $book,
+ 'book' => $
page->
book,
'current' => $page,
'draftsEnabled' => $draftsEnabled
]);
@@
-245,11
+242,10
@@
class PageController extends Controller
$this->validate($request, [
'name' => 'required|string|max:255'
]);
- $book = $this->bookRepo->getBySlug($bookSlug);
- $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
+ $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug);
$this->checkOwnablePermission('page-update', $page);
- $this->pageRepo->updatePage($page, $book->id, $request->all());
- Activity::add($page, 'page_update', $book->id);
+ $this->pageRepo->updatePage($page, $
page->
book->id, $request->all());
+ Activity::add($page, 'page_update', $
page->
book->id);
return redirect($page->getUrl());
}
@@
-261,7
+257,7
@@
class PageController extends Controller
*/
public function saveDraft(Request $request, $pageId)
{
- $page = $this->
pageRepo->getById(
$pageId, true);
+ $page = $this->
entityRepo->getById('page',
$pageId, true);
$this->checkOwnablePermission('page-update', $page);
if (!$this->signedIn) {
@@
-294,7
+290,7
@@
class PageController extends Controller
*/
public function redirectFromLink($pageId)
{
- $page = $this->
pageRepo->getById(
$pageId);
+ $page = $this->
entityRepo->getById('page',
$pageId);
return redirect($page->getUrl());
}
@@
-306,11
+302,10
@@
class PageController extends Controller
*/
public function showDelete($bookSlug, $pageSlug)
{
- $book = $this->bookRepo->getBySlug($bookSlug);
- $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
+ $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug);
$this->checkOwnablePermission('page-delete', $page);
$this->setPageTitle(trans('entities.pages_delete_named', ['pageName'=>$page->getShortName()]));
- return view('pages/delete', ['book' => $book, 'page' => $page, 'current' => $page]);
+ return view('pages/delete', ['book' => $
page->
book, 'page' => $page, 'current' => $page]);
}
@@
-323,11
+318,10
@@
class PageController extends Controller
*/
public function showDeleteDraft($bookSlug, $pageId)
{
- $book = $this->bookRepo->getBySlug($bookSlug);
- $page = $this->pageRepo->getById($pageId, true);
+ $page = $this->entityRepo->getById('page', $pageId, true);
$this->checkOwnablePermission('page-update', $page);
$this->setPageTitle(trans('entities.pages_delete_draft_named', ['pageName'=>$page->getShortName()]));
- return view('pages/delete', ['book' => $book, 'page' => $page, 'current' => $page]);
+ return view('pages/delete', ['book' => $
page->
book, 'page' => $page, 'current' => $page]);
}
/**
@@
-339,8
+333,8
@@
class PageController extends Controller
*/
public function destroy($bookSlug, $pageSlug)
{
- $
book = $this->bookRepo->getBySlug(
$bookSlug);
- $
page = $this->pageRepo->getBySlug($pageSlug, $book->id)
;
+ $
page = $this->entityRepo->getBySlug('page', $pageSlug,
$bookSlug);
+ $
book = $page->book
;
$this->checkOwnablePermission('page-delete', $page);
Activity::addMessage('page_delete', $book->id, $page->name);
session()->flash('success', trans('entities.pages_delete_success'));
@@
-357,8
+351,8
@@
class PageController extends Controller
*/
public function destroyDraft($bookSlug, $pageId)
{
- $
book = $this->bookRepo->getBySlug($bookSlug
);
- $
page = $this->pageRepo->getById($pageId, true)
;
+ $
page = $this->entityRepo->getById('page', $pageId, true
);
+ $
book = $page->book
;
$this->checkOwnablePermission('page-update', $page);
session()->flash('success', trans('entities.pages_delete_draft_success'));
$this->pageRepo->destroy($page);
@@
-373,10
+367,9
@@
class PageController extends Controller
*/
public function showRevisions($bookSlug, $pageSlug)
{
- $book = $this->bookRepo->getBySlug($bookSlug);
- $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
+ $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug);
$this->setPageTitle(trans('entities.pages_revisions_named', ['pageName'=>$page->getShortName()]));
- return view('pages/revisions', ['page' => $page, 'book' => $book, 'current' => $page]);
+ return view('pages/revisions', ['page' => $page, 'book' => $
page->
book, 'current' => $page]);
}
/**
@@
-388,8
+381,7
@@
class PageController extends Controller
*/
public function showRevision($bookSlug, $pageSlug, $revisionId)
{
- $book = $this->bookRepo->getBySlug($bookSlug);
- $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
+ $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug);
$revision = $this->pageRepo->getRevisionById($revisionId);
$page->fill($revision->toArray());
@@
-397,7
+389,7
@@
class PageController extends Controller
return view('pages/revision', [
'page' => $page,
- 'book' => $book,
+ 'book' => $
page->
book,
]);
}
@@
-410,8
+402,7
@@
class PageController extends Controller
*/
public function showRevisionChanges($bookSlug, $pageSlug, $revisionId)
{
- $book = $this->bookRepo->getBySlug($bookSlug);
- $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
+ $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug);
$revision = $this->pageRepo->getRevisionById($revisionId);
$prev = $revision->getPrevious();
@@
-423,7
+414,7
@@
class PageController extends Controller
return view('pages/revision', [
'page' => $page,
- 'book' => $book,
+ 'book' => $
page->
book,
'diff' => $diff,
]);
}
@@
-437,11
+428,10
@@
class PageController extends Controller
*/
public function restoreRevision($bookSlug, $pageSlug, $revisionId)
{
- $book = $this->bookRepo->getBySlug($bookSlug);
- $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
+ $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug);
$this->checkOwnablePermission('page-update', $page);
- $page = $this->pageRepo->restoreRevision($page, $book, $revisionId);
- Activity::add($page, 'page_restore', $book->id);
+ $page = $this->pageRepo->restoreRevision($page, $
page->
book, $revisionId);
+ Activity::add($page, 'page_restore', $
page->
book->id);
return redirect($page->getUrl());
}
@@
-454,8
+444,7
@@
class PageController extends Controller
*/
public function exportPdf($bookSlug, $pageSlug)
{
- $book = $this->bookRepo->getBySlug($bookSlug);
- $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
+ $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug);
$pdfContent = $this->exportService->pageToPdf($page);
return response()->make($pdfContent, 200, [
'Content-Type' => 'application/octet-stream',
@@
-471,8
+460,7
@@
class PageController extends Controller
*/
public function exportHtml($bookSlug, $pageSlug)
{
- $book = $this->bookRepo->getBySlug($bookSlug);
- $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
+ $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug);
$containedHtml = $this->exportService->pageToContainedHtml($page);
return response()->make($containedHtml, 200, [
'Content-Type' => 'application/octet-stream',
@@
-488,8
+476,7
@@
class PageController extends Controller
*/
public function exportPlainText($bookSlug, $pageSlug)
{
- $book = $this->bookRepo->getBySlug($bookSlug);
- $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
+ $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug);
$containedHtml = $this->exportService->pageToPlainText($page);
return response()->make($containedHtml, 200, [
'Content-Type' => 'application/octet-stream',
@@
-531,8
+518,7
@@
class PageController extends Controller
*/
public function showRestrict($bookSlug, $pageSlug)
{
- $book = $this->bookRepo->getBySlug($bookSlug);
- $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
+ $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug);
$this->checkOwnablePermission('restrictions-manage', $page);
$roles = $this->userRepo->getRestrictableRoles();
return view('pages/restrictions', [
@@
-550,11
+536,10
@@
class PageController extends Controller
*/
public function showMove($bookSlug, $pageSlug)
{
- $book = $this->bookRepo->getBySlug($bookSlug);
- $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
+ $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug);
$this->checkOwnablePermission('page-update', $page);
return view('pages/move', [
- 'book' => $book,
+ 'book' => $
page->
book,
'page' => $page
]);
}
@@
-569,8
+554,7
@@
class PageController extends Controller
*/
public function move($bookSlug, $pageSlug, Request $request)
{
- $book = $this->bookRepo->getBySlug($bookSlug);
- $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
+ $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug);
$this->checkOwnablePermission('page-update', $page);
$entitySelection = $request->get('entity_selection', null);
@@
-582,15
+566,10
@@
class PageController extends Controller
$entityType = $stringExploded[0];
$entityId = intval($stringExploded[1]);
- $parent = false;
-
- if ($entityType == 'chapter') {
- $parent = $this->chapterRepo->getById($entityId);
- } else if ($entityType == 'book') {
- $parent = $this->bookRepo->getById($entityId);
- }
- if ($parent === false || $parent === null) {
+ try {
+ $parent = $this->entityRepo->getById($entityType, $entityId);
+ } catch (\Exception $e) {
session()->flash(trans('entities.selected_book_chapter_not_found'));
return redirect()->back();
}
@@
-611,8
+590,7
@@
class PageController extends Controller
*/
public function restrict($bookSlug, $pageSlug, Request $request)
{
- $book = $this->bookRepo->getBySlug($bookSlug);
- $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
+ $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug);
$this->checkOwnablePermission('restrictions-manage', $page);
$this->pageRepo->updateEntityPermissionsFromRequest($request, $page);
session()->flash('success', trans('entities.pages_permissions_success'));
diff --git
a/app/Page.php
b/app/Page.php
index 3ee9e90f43d7d110699076b7ca0502822d00241d..38f95a3b1d8d703c110932ba147936bbdc1e8c33 100644
(file)
--- a/
app/Page.php
+++ b/
app/Page.php
@@
-7,6
+7,8
@@
class Page extends Entity
protected $simpleAttributes = ['name', 'id', 'slug'];
+ protected $with = ['book'];
+
/**
* Converts this page into a simplified array.
* @return mixed
diff --git
a/app/Repos/BookRepo.php
b/app/Repos/BookRepo.php
index b14cf0dabc205e24979e911b69df89fc9a000f88..ebfda3fa44dd0829455c34d66ab31cb60e2434f6 100644
(file)
--- a/
app/Repos/BookRepo.php
+++ b/
app/Repos/BookRepo.php
@@
-1,11
+1,6
@@
<?php namespace BookStack\Repos;
-use Alpha\B;
-use BookStack\Exceptions\NotFoundException;
-use Illuminate\Database\Eloquent\Collection;
-use Illuminate\Support\Str;
use BookStack\Book;
-use Views;
class BookRepo extends EntityRepo
{
@@
-24,105
+19,6
@@
class BookRepo extends EntityRepo
parent::__construct();
}
- /**
- * Base query for getting books.
- * Takes into account any restrictions.
- * @return mixed
- */
- private function bookQuery()
- {
- return $this->permissionService->enforceBookRestrictions($this->book, 'view');
- }
-
- /**
- * Get the book that has the given id.
- * @param $id
- * @return mixed
- */
- public function getById($id)
- {
- return $this->bookQuery()->findOrFail($id);
- }
-
- /**
- * Get all books, Limited by count.
- * @param int $count
- * @return mixed
- */
- public function getAll($count = 10)
- {
- $bookQuery = $this->bookQuery()->orderBy('name', 'asc');
- if (!$count) return $bookQuery->get();
- return $bookQuery->take($count)->get();
- }
-
- /**
- * Get all books paginated.
- * @param int $count
- * @return mixed
- */
- public function getAllPaginated($count = 10)
- {
- return $this->bookQuery()
- ->orderBy('name', 'asc')->paginate($count);
- }
-
-
- /**
- * Get the latest books.
- * @param int $count
- * @return mixed
- */
- public function getLatest($count = 10)
- {
- return $this->bookQuery()->orderBy('created_at', 'desc')->take($count)->get();
- }
-
- /**
- * Gets the most recently viewed for a user.
- * @param int $count
- * @param int $page
- * @return mixed
- */
- public function getRecentlyViewed($count = 10, $page = 0)
- {
- return Views::getUserRecentlyViewed($count, $page, $this->book);
- }
-
- /**
- * Gets the most viewed books.
- * @param int $count
- * @param int $page
- * @return mixed
- */
- public function getPopular($count = 10, $page = 0)
- {
- return Views::getPopular($count, $page, $this->book);
- }
-
- /**
- * Get a book by slug
- * @param $slug
- * @return mixed
- * @throws NotFoundException
- */
- public function getBySlug($slug)
- {
- $book = $this->bookQuery()->where('slug', '=', $slug)->first();
- if ($book === null) throw new NotFoundException(trans('errors.book_not_found'));
- return $book;
- }
-
- /**
- * Checks if a book exists.
- * @param $id
- * @return bool
- */
- public function exists($id)
- {
- return $this->bookQuery()->where('id', '=', $id)->exists();
- }
-
/**
* Get a new book instance from request input.
* @param array $input
diff --git
a/app/Repos/ChapterRepo.php
b/app/Repos/ChapterRepo.php
index 4106f93ee32e27ee7f3bfde0b759b11c02014a08..861bb72fcc6f6b50731177ebd2de09a326f6661a 100644
(file)
--- a/
app/Repos/ChapterRepo.php
+++ b/
app/Repos/ChapterRepo.php
@@
-21,58
+21,6
@@
class ChapterRepo extends EntityRepo
parent::__construct();
}
- /**
- * Base query for getting chapters, Takes permissions into account.
- * @return mixed
- */
- private function chapterQuery()
- {
- return $this->permissionService->enforceChapterRestrictions($this->chapter, 'view');
- }
-
- /**
- * Check if an id exists.
- * @param $id
- * @return bool
- */
- public function idExists($id)
- {
- return $this->chapterQuery()->where('id', '=', $id)->count() > 0;
- }
-
- /**
- * Get a chapter by a specific id.
- * @param $id
- * @return mixed
- */
- public function getById($id)
- {
- return $this->chapterQuery()->findOrFail($id);
- }
-
- /**
- * Get all chapters.
- * @return \Illuminate\Database\Eloquent\Collection|static[]
- */
- public function getAll()
- {
- return $this->chapterQuery()->all();
- }
-
- /**
- * Get a chapter that has the given slug within the given book.
- * @param $slug
- * @param $bookId
- * @return mixed
- * @throws NotFoundException
- */
- public function getBySlug($slug, $bookId)
- {
- $chapter = $this->chapterQuery()->where('slug', '=', $slug)->where('book_id', '=', $bookId)->first();
- if ($chapter === null) throw new NotFoundException(trans('errors.chapter_not_found'));
- return $chapter;
- }
-
/**
* Get the child items for a chapter
* @param Chapter $chapter
diff --git
a/app/Repos/EntityRepo.php
b/app/Repos/EntityRepo.php
index 7ecfb758c9e31364414987cc1121fa1df18f377d..19beebc77f829d85b2ea6f723f413e65298b50ea 100644
(file)
--- a/
app/Repos/EntityRepo.php
+++ b/
app/Repos/EntityRepo.php
@@
-3,11
+3,12
@@
use BookStack\Book;
use BookStack\Chapter;
use BookStack\Entity;
+use BookStack\Exceptions\NotFoundException;
use BookStack\Page;
use BookStack\Services\PermissionService;
-use BookStack\User;
+use BookStack\Services\ViewService;
+use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Collection;
-use Illuminate\Support\Facades\Log;
class EntityRepo
{
@@
-27,11
+28,22
@@
class EntityRepo
*/
public $page;
+ /**
+ * Base entity instances keyed by type
+ * @var []Entity
+ */
+ protected $entities;
+
/**
* @var PermissionService
*/
protected $permissionService;
+ /**
+ * @var ViewService
+ */
+ protected $viewService;
+
/**
* Acceptable operators to be used in a query
* @var array
@@
-43,69
+55,144
@@
class EntityRepo
*/
public function __construct()
{
+ // TODO - Redo this to come via injection
$this->book = app(Book::class);
$this->chapter = app(Chapter::class);
$this->page = app(Page::class);
+ $this->entities = [
+ 'page' => $this->page,
+ 'chapter' => $this->chapter,
+ 'book' => $this->book
+ ];
+ $this->viewService = app(ViewService::class);
$this->permissionService = app(PermissionService::class);
}
/**
- * Get the latest books added to the system.
- * @param int $count
- * @param int $page
- * @param bool $additionalQuery
- * @return
+ * Get an entity instance via type.
+ * @param $type
+ * @return Entity
*/
- p
ublic function getRecentlyCreatedBooks($count = 20, $page = 0, $additionalQuery = fals
e)
+ p
rotected function getEntity($typ
e)
{
- $query = $this->permissionService->enforceBookRestrictions($this->book)
- ->orderBy('created_at', 'desc');
- if ($additionalQuery !== false && is_callable($additionalQuery)) {
- $additionalQuery($query);
+ return $this->entities[strtolower($type)];
+ }
+
+ /**
+ * Base query for searching entities via permission system
+ * @param string $type
+ * @param bool $allowDrafts
+ * @return \Illuminate\Database\Query\Builder
+ */
+ protected function entityQuery($type, $allowDrafts = false)
+ {
+ $q = $this->permissionService->enforceEntityRestrictions($type, $this->getEntity($type), 'view');
+ if (strtolower($type) === 'page' && !$allowDrafts) {
+ $q = $q->where('draft', '=', false);
}
- return $q
uery->skip($page * $count)->take($count)->get()
;
+ return $q;
}
/**
- *
Get the most recently updated book
s.
- * @param $
count
- * @param
int $page
- * @return
mixed
+ *
Check if an entity with the given id exist
s.
+ * @param $
type
+ * @param
$id
+ * @return
bool
*/
- public function
getRecentlyUpdatedBooks($count = 20, $page = 0
)
+ public function
exists($type, $id
)
{
- return $this->permissionService->enforceBookRestrictions($this->book)
- ->orderBy('updated_at', 'desc')->skip($page * $count)->take($count)->get();
+ return $this->entityQuery($type)->where('id', '=', $id)->exists();
}
/**
- * Get the latest pages added to the system.
+ * Get an entity by ID
+ * @param string $type
+ * @param integer $id
+ * @param bool $allowDrafts
+ * @return Entity
+ */
+ public function getById($type, $id, $allowDrafts = false)
+ {
+ return $this->entityQuery($type, $allowDrafts)->findOrFail($id);
+ }
+
+ /**
+ * Get an entity by its url slug.
+ * @param string $type
+ * @param string $slug
+ * @param string|bool $bookSlug
+ * @return Entity
+ * @throws NotFoundException
+ */
+ public function getBySlug($type, $slug, $bookSlug = false)
+ {
+ $q = $this->entityQuery($type)->where('slug', '=', $slug);
+ if (strtolower($type) === 'chapter' || strtolower($type) === 'page') {
+ $q = $q->where('book_id', '=', function($query) use ($bookSlug) {
+ $query->select('id')
+ ->from($this->book->getTable())
+ ->where('slug', '=', $bookSlug)->limit(1);
+ });
+ }
+ $entity = $q->first();
+ if ($entity === null) throw new NotFoundException(trans('errors.' . strtolower($type) . '_not_found'));
+ return $entity;
+ }
+
+ /**
+ * Get all entities of a type limited by count unless count if false.
+ * @param string $type
+ * @param integer|bool $count
+ * @return Collection
+ */
+ public function getAll($type, $count = 20)
+ {
+ $q = $this->entityQuery($type)->orderBy('name', 'asc');
+ if ($count !== false) $q = $q->take($count);
+ return $q->get();
+ }
+
+ /**
+ * Get all entities in a paginated format
+ * @param $type
+ * @param int $count
+ * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator
+ */
+ public function getAllPaginated($type, $count = 10)
+ {
+ return $this->entityQuery($type)->orderBy('name', 'asc')->paginate($count);
+ }
+
+ /**
+ * Get the most recently created entities of the given type.
+ * @param string $type
* @param int $count
* @param int $page
- * @param bool $additionalQuery
- * @return
+ * @param bool|callable $additionalQuery
*/
- public function getRecentlyCreated
Pages(
$count = 20, $page = 0, $additionalQuery = false)
+ public function getRecentlyCreated
($type,
$count = 20, $page = 0, $additionalQuery = false)
{
- $query = $this->permissionService->enforcePageRestrictions($this->page)
- ->orderBy('created_at', 'desc')->where('draft', '=', false);
+ $query = $this->permissionService->enforceEntityRestrictions($type, $this->getEntity($type))
+ ->orderBy('created_at', 'desc');
+ if (strtolower($type) === 'page') $query = $query->where('draft', '=', false);
if ($additionalQuery !== false && is_callable($additionalQuery)) {
$additionalQuery($query);
}
- return $query->
with('book')->
skip($page * $count)->take($count)->get();
+ return $query->skip($page * $count)->take($count)->get();
}
/**
- * Get the latest chapters added to the system.
+ * Get the most recently updated entities of the given type.
+ * @param string $type
* @param int $count
* @param int $page
- * @param bool $additionalQuery
- * @return
+ * @param bool|callable $additionalQuery
*/
- public function getRecently
CreatedChapters(
$count = 20, $page = 0, $additionalQuery = false)
+ public function getRecently
Updated($type,
$count = 20, $page = 0, $additionalQuery = false)
{
- $query = $this->permissionService->enforceChapterRestrictions($this->chapter)
- ->orderBy('created_at', 'desc');
+ $query = $this->permissionService->enforceEntityRestrictions($type, $this->getEntity($type))
+ ->orderBy('updated_at', 'desc');
+ if (strtolower($type) === 'page') $query = $query->where('draft', '=', false);
if ($additionalQuery !== false && is_callable($additionalQuery)) {
$additionalQuery($query);
}
@@
-113,16
+200,29
@@
class EntityRepo
}
/**
- * Get the most recently updated pages.
- * @param $count
+ * Get the most recently viewed entities.
+ * @param string|bool $type
+ * @param int $count
+ * @param int $page
+ * @return mixed
+ */
+ public function getRecentlyViewed($type, $count = 10, $page = 0)
+ {
+ $filter = is_bool($type) ? false : $this->getEntity($type);
+ return $this->viewService->getUserRecentlyViewed($count, $page, $filter);
+ }
+
+ /**
+ * Get the most popular entities base on all views.
+ * @param string|bool $type
+ * @param int $count
* @param int $page
* @return mixed
*/
- public function get
RecentlyUpdatedPages($count = 2
0, $page = 0)
+ public function get
Popular($type, $count = 1
0, $page = 0)
{
- return $this->permissionService->enforcePageRestrictions($this->page)
- ->where('draft', '=', false)
- ->orderBy('updated_at', 'desc')->with('book')->skip($page * $count)->take($count)->get();
+ $filter = is_bool($type) ? false : $this->getEntity($type);
+ return $this->viewService->getPopular($count, $page, $filter);
}
/**
diff --git
a/app/Repos/PageRepo.php
b/app/Repos/PageRepo.php
index 14463c12d191c8473ac26e7938ee0420c605cc21..f16ea6b6d5ff69c67771ac93cd4c804f869c6b5a 100644
(file)
--- a/
app/Repos/PageRepo.php
+++ b/
app/Repos/PageRepo.php
@@
-45,31
+45,6
@@
class PageRepo extends EntityRepo
return $query;
}
- /**
- * Get a page via a specific ID.
- * @param $id
- * @param bool $allowDrafts
- * @return Page
- */
- public function getById($id, $allowDrafts = false)
- {
- return $this->pageQuery($allowDrafts)->findOrFail($id);
- }
-
- /**
- * Get a page identified by the given slug.
- * @param $slug
- * @param $bookId
- * @return Page
- * @throws NotFoundException
- */
- public function getBySlug($slug, $bookId)
- {
- $page = $this->pageQuery()->where('slug', '=', $slug)->where('book_id', '=', $bookId)->first();
- if ($page === null) throw new NotFoundException(trans('errors.page_not_found'));
- return $page;
- }
-
/**
* Search through page revisions and retrieve
* the last page in the current book that
diff --git
a/app/Repos/UserRepo.php
b/app/Repos/UserRepo.php
index 22c92f3cea1b8e16f18244eb417be8b040deeaf3..c3546a442cc27dc8fecfc54d04ec66f0b16ceac9 100644
(file)
--- a/
app/Repos/UserRepo.php
+++ b/
app/Repos/UserRepo.php
@@
-168,13
+168,13
@@
class UserRepo
public function getRecentlyCreated(User $user, $count = 20)
{
return [
- 'pages' => $this->entityRepo->getRecentlyCreated
Pages(
$count, 0, function ($query) use ($user) {
+ 'pages' => $this->entityRepo->getRecentlyCreated
('page',
$count, 0, function ($query) use ($user) {
$query->where('created_by', '=', $user->id);
}),
- 'chapters' => $this->entityRepo->getRecentlyCreated
Chapters(
$count, 0, function ($query) use ($user) {
+ 'chapters' => $this->entityRepo->getRecentlyCreated
('chapter',
$count, 0, function ($query) use ($user) {
$query->where('created_by', '=', $user->id);
}),
- 'books' => $this->entityRepo->getRecentlyCreated
Books(
$count, 0, function ($query) use ($user) {
+ 'books' => $this->entityRepo->getRecentlyCreated
('book',
$count, 0, function ($query) use ($user) {
$query->where('created_by', '=', $user->id);
})
];
diff --git
a/app/Services/PermissionService.php
b/app/Services/PermissionService.php
index bb78f0b0a2c7481cdd9be119d6d2436eb6e16c90..d5044c1bbdde580d3a65c3ae0e6d0b2f9dc27b0d 100644
(file)
--- a/
app/Services/PermissionService.php
+++ b/
app/Services/PermissionService.php
@@
-8,8
+8,8
@@
use BookStack\Ownable;
use BookStack\Page;
use BookStack\Role;
use BookStack\User;
+use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Collection;
-use Illuminate\Support\Facades\Log;
class PermissionService
{
@@
-469,17
+469,8
@@
class PermissionService
*/
public function enforcePageRestrictions($query, $action = 'view')
{
- // Prevent drafts being visible to others.
- $query = $query->where(function ($query) {
- $query->where('draft', '=', false);
- if ($this->currentUser()) {
- $query->orWhere(function ($query) {
- $query->where('draft', '=', true)->where('created_by', '=', $this->currentUser()->id);
- });
- }
- });
-
- return $this->enforceEntityRestrictions($query, $action);
+ // TODO - remove this
+ return $this->enforceEntityRestrictions('page', $query, $action);
}
/**
@@
-490,7
+481,8
@@
class PermissionService
*/
public function enforceChapterRestrictions($query, $action = 'view')
{
- return $this->enforceEntityRestrictions($query, $action);
+ // TODO - remove this
+ return $this->enforceEntityRestrictions('chapter', $query, $action);
}
/**
@@
-501,21
+493,36
@@
class PermissionService
*/
public function enforceBookRestrictions($query, $action = 'view')
{
- return $this->enforceEntityRestrictions($query, $action);
+ // TODO - remove this
+ return $this->enforceEntityRestrictions('book', $query, $action);
}
/**
* Add restrictions for a generic entity
- * @param $query
+ * @param string $entityType
+ * @param Builder|Entity $query
* @param string $action
* @return mixed
*/
- public function enforceEntityRestrictions($query, $action = 'view')
+ public function enforceEntityRestrictions($
entityType, $
query, $action = 'view')
{
+ if (strtolower($entityType) === 'page') {
+ // Prevent drafts being visible to others.
+ $query = $query->where(function ($query) {
+ $query->where('draft', '=', false);
+ if ($this->currentUser()) {
+ $query->orWhere(function ($query) {
+ $query->where('draft', '=', true)->where('created_by', '=', $this->currentUser()->id);
+ });
+ }
+ });
+ }
+
if ($this->isAdmin()) {
$this->clean();
return $query;
}
+
$this->currentAction = $action;
return $this->entityRestrictionQuery($query);
}
diff --git
a/tests/Permissions/RestrictionsTest.php
b/tests/Permissions/RestrictionsTest.php
index d3830cff773da95d36550fa927981e2679a62bfb..cddd3206a36921abe7b1bb4f9c7940c505d81d4e 100644
(file)
--- a/
tests/Permissions/RestrictionsTest.php
+++ b/
tests/Permissions/RestrictionsTest.php
@@
-65,9
+65,9
@@
class RestrictionsTest extends TestCase
$this->forceVisit($bookUrl)
->see('Book not found');
$this->forceVisit($bookPage->getUrl())
- ->see('
Book
not found');
+ ->see('
Page
not found');
$this->forceVisit($bookChapter->getUrl())
- ->see('
Book
not found');
+ ->see('
Chapter
not found');
$this->setEntityRestrictions($book, ['view']);
hide
Morty Proxy
This is a
proxified and sanitized
view of the page, visit
original site
.