-<?php
-
-
-namespace BookStack\Entities\Repos;
+<?php namespace BookStack\Entities\Repos;
+use BookStack\Actions\TagRepo;
use BookStack\Entities\Book;
+use BookStack\Entities\Managers\TrashCan;
+use BookStack\Exceptions\ImageUploadException;
use BookStack\Exceptions\NotFoundException;
use BookStack\Exceptions\NotifyException;
+use BookStack\Uploads\ImageRepo;
+use Exception;
+use Illuminate\Contracts\Container\BindingResolutionException;
+use Illuminate\Contracts\Pagination\LengthAwarePaginator;
+use Illuminate\Http\UploadedFile;
+use Illuminate\Support\Collection;
-class BookRepo extends EntityRepo
+class BookRepo
{
+ protected $baseRepo;
+ protected $tagRepo;
+ protected $imageRepo;
+
+ /**
+ * BookRepo constructor.
+ * @param $tagRepo
+ */
+ public function __construct(BaseRepo $baseRepo, TagRepo $tagRepo, ImageRepo $imageRepo)
+ {
+ $this->baseRepo = $baseRepo;
+ $this->tagRepo = $tagRepo;
+ $this->imageRepo = $imageRepo;
+ }
+
+ /**
+ * Get all books in a paginated format.
+ */
+ public function getAllPaginated(int $count = 20, string $sort = 'name', string $order = 'asc'): LengthAwarePaginator
+ {
+ return Book::visible()->orderBy($sort, $order)->paginate($count);
+ }
+
+ /**
+ * Get the books that were most recently viewed by this user.
+ */
+ public function getRecentlyViewed(int $count = 20): Collection
+ {
+ return Book::visible()->withLastView()
+ ->having('last_viewed_at', '>', 0)
+ ->orderBy('last_viewed_at', 'desc')
+ ->take($count)->get();
+ }
+
+ /**
+ * Get the most popular books in the system.
+ */
+ public function getPopular(int $count = 20): Collection
+ {
+ return Book::visible()->withViewCount()
+ ->having('view_count', '>', 0)
+ ->orderBy('view_count', 'desc')
+ ->take($count)->get();
+ }
+
+ /**
+ * Get the most recently created books from the system.
+ */
+ public function getRecentlyCreated(int $count = 20): Collection
+ {
+ return Book::visible()->orderBy('created_at', 'desc')
+ ->take($count)->get();
+ }
+
/**
- * Fetch a book by its slug.
- * @param string $slug
- * @return Book
- * @throws NotFoundException
+ * Get a book by its slug.
*/
public function getBySlug(string $slug): Book
{
- /** @var Book $book */
- $book = $this->getEntityBySlug('book', $slug);
+ $book = Book::visible()->where('slug', '=', $slug)->first();
+
+ if ($book === null) {
+ throw new NotFoundException(trans('errors.book_not_found'));
+ }
+
return $book;
}
/**
- * Destroy the provided book and all its child entities.
- * @param Book $book
- * @throws NotifyException
- * @throws \Throwable
+ * Create a new book in the system
*/
- public function destroyBook(Book $book)
+ public function create(array $input): Book
{
- foreach ($book->pages as $page) {
- $this->destroyPage($page);
- }
+ $book = new Book();
+ $this->baseRepo->create($book, $input);
+ return $book;
+ }
- foreach ($book->chapters as $chapter) {
- $this->destroyChapter($chapter);
- }
+ /**
+ * Update the given book.
+ */
+ public function update(Book $book, array $input): Book
+ {
+ $this->baseRepo->update($book, $input);
+ return $book;
+ }
- $this->destroyEntityCommonRelations($book);
- $book->delete();
+ /**
+ * Update the given book's cover image, or clear it.
+ * @throws ImageUploadException
+ * @throws Exception
+ */
+ public function updateCoverImage(Book $book, ?UploadedFile $coverImage, bool $removeImage = false)
+ {
+ $this->baseRepo->updateCoverImage($book, $coverImage, $removeImage);
}
-}
\ No newline at end of file
+ /**
+ * Update the permissions of a book.
+ */
+ public function updatePermissions(Book $book, bool $restricted, Collection $permissions = null)
+ {
+ $this->baseRepo->updatePermissions($book, $restricted, $permissions);
+ }
+
+ /**
+ * Remove a book from the system.
+ * @throws NotifyException
+ * @throws BindingResolutionException
+ */
+ public function destroy(Book $book)
+ {
+ $trashCan = new TrashCan();
+ $trashCan->destroyBook($book);
+ }
+}