Simplified activity facade interface
Also cleaned up any other bits along the way.
This commit is contained in:
parent
2a2cc858f0
commit
615b2de433
|
@ -3,13 +3,18 @@
|
||||||
namespace BookStack\Actions;
|
namespace BookStack\Actions;
|
||||||
|
|
||||||
use BookStack\Auth\User;
|
use BookStack\Auth\User;
|
||||||
|
use BookStack\Entities\Entity;
|
||||||
use BookStack\Model;
|
use BookStack\Model;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @property string key
|
* @property string $key
|
||||||
* @property \User user
|
* @property User $user
|
||||||
* @property \Entity entity
|
* @property Entity $entity
|
||||||
* @property string extra
|
* @property string $extra
|
||||||
|
* @property string $entity_type
|
||||||
|
* @property int $entity_id
|
||||||
|
* @property int $user_id
|
||||||
|
* @property int $book_id
|
||||||
*/
|
*/
|
||||||
class Activity extends Model
|
class Activity extends Model
|
||||||
{
|
{
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
|
|
||||||
use BookStack\Auth\Permissions\PermissionService;
|
use BookStack\Auth\Permissions\PermissionService;
|
||||||
use BookStack\Entities\Entity;
|
use BookStack\Entities\Entity;
|
||||||
use Session;
|
|
||||||
|
|
||||||
class ActivityService
|
class ActivityService
|
||||||
{
|
{
|
||||||
|
@ -12,7 +11,7 @@ class ActivityService
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ActivityService constructor.
|
* ActivityService constructor.
|
||||||
* @param \BookStack\Actions\Activity $activity
|
* @param Activity $activity
|
||||||
* @param PermissionService $permissionService
|
* @param PermissionService $permissionService
|
||||||
*/
|
*/
|
||||||
public function __construct(Activity $activity, PermissionService $permissionService)
|
public function __construct(Activity $activity, PermissionService $permissionService)
|
||||||
|
@ -24,42 +23,46 @@ class ActivityService
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add activity data to database.
|
* Add activity data to database.
|
||||||
* @param Entity $entity
|
* @param \BookStack\Entities\Entity $entity
|
||||||
* @param $activityKey
|
* @param string $activityKey
|
||||||
* @param int $bookId
|
* @param int $bookId
|
||||||
* @param bool $extra
|
|
||||||
*/
|
*/
|
||||||
public function add(Entity $entity, $activityKey, $bookId = 0, $extra = false)
|
public function add(Entity $entity, string $activityKey, int $bookId = null)
|
||||||
{
|
{
|
||||||
$activity = $this->activity->newInstance();
|
$activity = $this->newActivityForUser($activityKey, $bookId);
|
||||||
$activity->user_id = $this->user->id;
|
|
||||||
$activity->book_id = $bookId;
|
|
||||||
$activity->key = strtolower($activityKey);
|
|
||||||
if ($extra !== false) {
|
|
||||||
$activity->extra = $extra;
|
|
||||||
}
|
|
||||||
$entity->activity()->save($activity);
|
$entity->activity()->save($activity);
|
||||||
$this->setNotification($activityKey);
|
$this->setNotification($activityKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds a activity history with a message & without binding to a entity.
|
* Adds a activity history with a message, without binding to a entity.
|
||||||
* @param $activityKey
|
* @param string $activityKey
|
||||||
|
* @param string $message
|
||||||
* @param int $bookId
|
* @param int $bookId
|
||||||
* @param bool|false $extra
|
|
||||||
*/
|
*/
|
||||||
public function addMessage($activityKey, $bookId = 0, $extra = false)
|
public function addMessage(string $activityKey, string $message, int $bookId = null)
|
||||||
{
|
{
|
||||||
$this->activity->user_id = $this->user->id;
|
$this->newActivityForUser($activityKey, $bookId)->forceFill([
|
||||||
$this->activity->book_id = $bookId;
|
'extra' => $message
|
||||||
$this->activity->key = strtolower($activityKey);
|
])->save();
|
||||||
if ($extra !== false) {
|
|
||||||
$this->activity->extra = $extra;
|
|
||||||
}
|
|
||||||
$this->activity->save();
|
|
||||||
$this->setNotification($activityKey);
|
$this->setNotification($activityKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a new activity instance for the current user.
|
||||||
|
* @param string $key
|
||||||
|
* @param int|null $bookId
|
||||||
|
* @return Activity
|
||||||
|
*/
|
||||||
|
protected function newActivityForUser(string $key, int $bookId = null)
|
||||||
|
{
|
||||||
|
return $this->activity->newInstance()->forceFill([
|
||||||
|
'key' => strtolower($key),
|
||||||
|
'user_id' => $this->user->id,
|
||||||
|
'book_id' => $bookId ?? 0,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes the entity attachment from each of its activities
|
* Removes the entity attachment from each of its activities
|
||||||
|
@ -90,7 +93,11 @@ class ActivityService
|
||||||
{
|
{
|
||||||
$activityList = $this->permissionService
|
$activityList = $this->permissionService
|
||||||
->filterRestrictedEntityRelations($this->activity, 'activities', 'entity_id', 'entity_type')
|
->filterRestrictedEntityRelations($this->activity, 'activities', 'entity_id', 'entity_type')
|
||||||
->orderBy('created_at', 'desc')->with('user', 'entity')->skip($count * $page)->take($count)->get();
|
->orderBy('created_at', 'desc')
|
||||||
|
->with('user', 'entity')
|
||||||
|
->skip($count * $page)
|
||||||
|
->take($count)
|
||||||
|
->get();
|
||||||
|
|
||||||
return $this->filterSimilar($activityList);
|
return $this->filterSimilar($activityList);
|
||||||
}
|
}
|
||||||
|
@ -171,7 +178,7 @@ class ActivityService
|
||||||
$notificationTextKey = 'activities.' . $activityKey . '_notification';
|
$notificationTextKey = 'activities.' . $activityKey . '_notification';
|
||||||
if (trans()->has($notificationTextKey)) {
|
if (trans()->has($notificationTextKey)) {
|
||||||
$message = trans($notificationTextKey);
|
$message = trans($notificationTextKey);
|
||||||
Session::flash('success', $message);
|
session()->flash('success', $message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
use BookStack\Auth\Permissions\PermissionService;
|
use BookStack\Auth\Permissions\PermissionService;
|
||||||
use BookStack\Entities\Entity;
|
use BookStack\Entities\Entity;
|
||||||
use BookStack\Entities\EntityProvider;
|
use BookStack\Entities\EntityProvider;
|
||||||
|
use DB;
|
||||||
use Illuminate\Support\Collection;
|
use Illuminate\Support\Collection;
|
||||||
|
|
||||||
class ViewService
|
class ViewService
|
||||||
|
@ -13,8 +14,8 @@ class ViewService
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ViewService constructor.
|
* ViewService constructor.
|
||||||
* @param \BookStack\Actions\View $view
|
* @param View $view
|
||||||
* @param \BookStack\Auth\Permissions\PermissionService $permissionService
|
* @param PermissionService $permissionService
|
||||||
* @param EntityProvider $entityProvider
|
* @param EntityProvider $entityProvider
|
||||||
*/
|
*/
|
||||||
public function __construct(View $view, PermissionService $permissionService, EntityProvider $entityProvider)
|
public function __construct(View $view, PermissionService $permissionService, EntityProvider $entityProvider)
|
||||||
|
@ -26,7 +27,7 @@ class ViewService
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a view to the given entity.
|
* Add a view to the given entity.
|
||||||
* @param Entity $entity
|
* @param \BookStack\Entities\Entity $entity
|
||||||
* @return int
|
* @return int
|
||||||
*/
|
*/
|
||||||
public function add(Entity $entity)
|
public function add(Entity $entity)
|
||||||
|
@ -64,7 +65,7 @@ class ViewService
|
||||||
$skipCount = $count * $page;
|
$skipCount = $count * $page;
|
||||||
$query = $this->permissionService
|
$query = $this->permissionService
|
||||||
->filterRestrictedEntityRelations($this->view, 'views', 'viewable_id', 'viewable_type', $action)
|
->filterRestrictedEntityRelations($this->view, 'views', 'viewable_id', 'viewable_type', $action)
|
||||||
->select('*', 'viewable_id', 'viewable_type', \DB::raw('SUM(views) as view_count'))
|
->select('*', 'viewable_id', 'viewable_type', DB::raw('SUM(views) as view_count'))
|
||||||
->groupBy('viewable_id', 'viewable_type')
|
->groupBy('viewable_id', 'viewable_type')
|
||||||
->orderBy('view_count', 'desc');
|
->orderBy('view_count', 'desc');
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,13 @@
|
||||||
|
|
||||||
use BookStack\Uploads\Image;
|
use BookStack\Uploads\Image;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class Book
|
||||||
|
* @property string $description
|
||||||
|
* @property int $image_id
|
||||||
|
* @property Image|null $cover
|
||||||
|
* @package BookStack\Entities
|
||||||
|
*/
|
||||||
class Book extends Entity
|
class Book extends Entity
|
||||||
{
|
{
|
||||||
public $searchFactor = 2;
|
public $searchFactor = 2;
|
||||||
|
|
|
@ -15,7 +15,7 @@ use Illuminate\Database\Eloquent\Relations\MorphMany;
|
||||||
* The base class for book-like items such as pages, chapters & books.
|
* The base class for book-like items such as pages, chapters & books.
|
||||||
* This is not a database model in itself but extended.
|
* This is not a database model in itself but extended.
|
||||||
*
|
*
|
||||||
* @property integer $id
|
* @property int $id
|
||||||
* @property string $name
|
* @property string $name
|
||||||
* @property string $slug
|
* @property string $slug
|
||||||
* @property Carbon $created_at
|
* @property Carbon $created_at
|
||||||
|
|
|
@ -58,11 +58,6 @@ class BookController extends Controller
|
||||||
$view = setting()->getUser($this->currentUser, 'books_view_type', config('app.views.books'));
|
$view = setting()->getUser($this->currentUser, 'books_view_type', config('app.views.books'));
|
||||||
$sort = setting()->getUser($this->currentUser, 'books_sort', 'name');
|
$sort = setting()->getUser($this->currentUser, 'books_sort', 'name');
|
||||||
$order = setting()->getUser($this->currentUser, 'books_sort_order', 'asc');
|
$order = setting()->getUser($this->currentUser, 'books_sort_order', 'asc');
|
||||||
$sortOptions = [
|
|
||||||
'name' => trans('common.sort_name'),
|
|
||||||
'created_at' => trans('common.sort_created_at'),
|
|
||||||
'updated_at' => trans('common.sort_updated_at'),
|
|
||||||
];
|
|
||||||
|
|
||||||
$books = $this->bookRepo->getAllPaginated('book', 18, $sort, $order);
|
$books = $this->bookRepo->getAllPaginated('book', 18, $sort, $order);
|
||||||
$recents = $this->signedIn ? $this->bookRepo->getRecentlyViewed('book', 4, 0) : false;
|
$recents = $this->signedIn ? $this->bookRepo->getRecentlyViewed('book', 4, 0) : false;
|
||||||
|
@ -80,7 +75,6 @@ class BookController extends Controller
|
||||||
'view' => $view,
|
'view' => $view,
|
||||||
'sort' => $sort,
|
'sort' => $sort,
|
||||||
'order' => $order,
|
'order' => $order,
|
||||||
'sortOptions' => $sortOptions,
|
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,6 +108,7 @@ class BookController extends Controller
|
||||||
* @throws NotFoundException
|
* @throws NotFoundException
|
||||||
* @throws ImageUploadException
|
* @throws ImageUploadException
|
||||||
* @throws ValidationException
|
* @throws ValidationException
|
||||||
|
* @throws Throwable
|
||||||
*/
|
*/
|
||||||
public function store(Request $request, string $shelfSlug = null)
|
public function store(Request $request, string $shelfSlug = null)
|
||||||
{
|
{
|
||||||
|
@ -192,6 +187,7 @@ class BookController extends Controller
|
||||||
* @throws ImageUploadException
|
* @throws ImageUploadException
|
||||||
* @throws NotFoundException
|
* @throws NotFoundException
|
||||||
* @throws ValidationException
|
* @throws ValidationException
|
||||||
|
* @throws Throwable
|
||||||
*/
|
*/
|
||||||
public function update(Request $request, string $slug)
|
public function update(Request $request, string $slug)
|
||||||
{
|
{
|
||||||
|
@ -340,7 +336,7 @@ class BookController extends Controller
|
||||||
{
|
{
|
||||||
$book = $this->bookRepo->getBySlug($bookSlug);
|
$book = $this->bookRepo->getBySlug($bookSlug);
|
||||||
$this->checkOwnablePermission('book-delete', $book);
|
$this->checkOwnablePermission('book-delete', $book);
|
||||||
Activity::addMessage('book_delete', 0, $book->name);
|
Activity::addMessage('book_delete', $book->name);
|
||||||
|
|
||||||
if ($book->cover) {
|
if ($book->cover) {
|
||||||
$this->imageRepo->destroyImage($book->cover);
|
$this->imageRepo->destroyImage($book->cover);
|
||||||
|
|
|
@ -212,7 +212,7 @@ class BookshelfController extends Controller
|
||||||
{
|
{
|
||||||
$shelf = $this->entityRepo->getEntityBySlug('bookshelf', $slug); /** @var $shelf Bookshelf */
|
$shelf = $this->entityRepo->getEntityBySlug('bookshelf', $slug); /** @var $shelf Bookshelf */
|
||||||
$this->checkOwnablePermission('bookshelf-delete', $shelf);
|
$this->checkOwnablePermission('bookshelf-delete', $shelf);
|
||||||
Activity::addMessage('bookshelf_delete', 0, $shelf->name);
|
Activity::addMessage('bookshelf_delete', $shelf->name);
|
||||||
|
|
||||||
if ($shelf->cover) {
|
if ($shelf->cover) {
|
||||||
$this->imageRepo->destroyImage($shelf->cover);
|
$this->imageRepo->destroyImage($shelf->cover);
|
||||||
|
|
|
@ -143,7 +143,7 @@ class ChapterController extends Controller
|
||||||
$chapter = $this->entityRepo->getEntityBySlug('chapter', $chapterSlug, $bookSlug);
|
$chapter = $this->entityRepo->getEntityBySlug('chapter', $chapterSlug, $bookSlug);
|
||||||
$book = $chapter->book;
|
$book = $chapter->book;
|
||||||
$this->checkOwnablePermission('chapter-delete', $chapter);
|
$this->checkOwnablePermission('chapter-delete', $chapter);
|
||||||
Activity::addMessage('chapter_delete', $book->id, $chapter->name);
|
Activity::addMessage('chapter_delete', $chapter->name, $book->id);
|
||||||
$this->entityRepo->destroyChapter($chapter);
|
$this->entityRepo->destroyChapter($chapter);
|
||||||
return redirect($book->getUrl());
|
return redirect($book->getUrl());
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,8 @@
|
||||||
namespace BookStack\Http\Controllers;
|
namespace BookStack\Http\Controllers;
|
||||||
|
|
||||||
use BookStack\Auth\User;
|
use BookStack\Auth\User;
|
||||||
|
use BookStack\Entities\Entity;
|
||||||
|
use BookStack\Facades\Activity;
|
||||||
use BookStack\Ownable;
|
use BookStack\Ownable;
|
||||||
use Illuminate\Foundation\Bus\DispatchesJobs;
|
use Illuminate\Foundation\Bus\DispatchesJobs;
|
||||||
use Illuminate\Foundation\Validation\ValidatesRequests;
|
use Illuminate\Foundation\Validation\ValidatesRequests;
|
||||||
|
|
|
@ -358,7 +358,7 @@ class PageController extends Controller
|
||||||
$this->checkOwnablePermission('page-delete', $page);
|
$this->checkOwnablePermission('page-delete', $page);
|
||||||
$this->pageRepo->destroyPage($page);
|
$this->pageRepo->destroyPage($page);
|
||||||
|
|
||||||
Activity::addMessage('page_delete', $book->id, $page->name);
|
Activity::addMessage('page_delete', $page->name, $book->id);
|
||||||
$this->showSuccessNotification( trans('entities.pages_delete_success'));
|
$this->showSuccessNotification( trans('entities.pages_delete_success'));
|
||||||
return redirect($book->getUrl());
|
return redirect($book->getUrl());
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,11 @@
|
||||||
<h1 class="list-heading">{{ trans('entities.books') }}</h1>
|
<h1 class="list-heading">{{ trans('entities.books') }}</h1>
|
||||||
<div class="text-m-right my-m">
|
<div class="text-m-right my-m">
|
||||||
|
|
||||||
@include('partials.sort', ['options' => $sortOptions, 'order' => $order, 'sort' => $sort, 'type' => 'books'])
|
@include('partials.sort', ['options' => [
|
||||||
|
'name' => trans('common.sort_name'),
|
||||||
|
'created_at' => trans('common.sort_created_at'),
|
||||||
|
'updated_at' => trans('common.sort_updated_at'),
|
||||||
|
], 'order' => $order, 'sort' => $sort, 'type' => 'books'])
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Reference in New Issue