Organised activity types and moved most to repos

Repos are generally better since otherwise we end up duplicating
things between front-end and API.

Types moved to by CONST values within a class for better visibilty
of usage and listing of types.
This commit is contained in:
Dan Brown 2020-11-07 22:37:27 +00:00
parent 4824ef2760
commit c157dc3490
No known key found for this signature in database
GPG Key ID: 46D9F943C24A2EF9
19 changed files with 76 additions and 73 deletions

View File

@ -13,9 +13,6 @@ class ActivityService
protected $user; protected $user;
protected $permissionService; protected $permissionService;
/**
* ActivityService constructor.
*/
public function __construct(Activity $activity, PermissionService $permissionService) public function __construct(Activity $activity, PermissionService $permissionService)
{ {
$this->activity = $activity; $this->activity = $activity;
@ -26,23 +23,11 @@ class ActivityService
/** /**
* Add activity data to database. * Add activity data to database.
*/ */
public function add(Entity $entity, string $activityKey, ?int $bookId = null) public function add(Entity $entity, string $type, ?int $bookId = null)
{ {
$activity = $this->newActivityForUser($activityKey, $bookId); $activity = $this->newActivityForUser($type, $bookId);
$entity->activity()->save($activity); $entity->activity()->save($activity);
$this->setNotification($activityKey); $this->setNotification($type);
}
/**
* Adds a activity history with a message, without binding to a entity.
*/
public function addMessage(string $activityKey, string $message, ?int $bookId = null)
{
$this->newActivityForUser($activityKey, $bookId)->forceFill([
'extra' => $message
])->save();
$this->setNotification($activityKey);
} }
/** /**

View File

@ -0,0 +1,22 @@
<?php namespace BookStack\Actions;
class ActivityType
{
const PAGE_CREATE = 'page_create';
const PAGE_UPDATE = 'page_update';
const PAGE_DELETE = 'page_delete';
const PAGE_RESTORE = 'page_restore';
const PAGE_MOVE = 'page_move';
const COMMENTED_ON = 'commented_on';
const CHAPTER_CREATE = 'chapter_create';
const CHAPTER_UPDATE = 'chapter_update';
const CHAPTER_DELETE = 'chapter_delete';
const CHAPTER_MOVE = 'chapter_move';
const BOOK_CREATE = 'book_create';
const BOOK_UPDATE = 'book_update';
const BOOK_DELETE = 'book_delete';
const BOOK_SORT = 'book_sort';
const BOOKSHELF_CREATE = 'bookshelf_create';
const BOOKSHELF_UPDATE = 'bookshelf_update';
const BOOKSHELF_DELETE = 'bookshelf_delete';
}

View File

@ -44,6 +44,7 @@ class CommentRepo
$comment->parent_id = $parent_id; $comment->parent_id = $parent_id;
$entity->comments()->save($comment); $entity->comments()->save($comment);
Activity::add($entity, ActivityType::COMMENTED_ON, $entity->book->id);
return $comment; return $comment;
} }

View File

@ -1,11 +1,13 @@
<?php namespace BookStack\Entities\Repos; <?php namespace BookStack\Entities\Repos;
use BookStack\Actions\ActivityType;
use BookStack\Actions\TagRepo; use BookStack\Actions\TagRepo;
use BookStack\Entities\Book; use BookStack\Entities\Book;
use BookStack\Entities\Managers\TrashCan; use BookStack\Entities\Managers\TrashCan;
use BookStack\Exceptions\ImageUploadException; use BookStack\Exceptions\ImageUploadException;
use BookStack\Exceptions\NotFoundException; use BookStack\Exceptions\NotFoundException;
use BookStack\Exceptions\NotifyException; use BookStack\Exceptions\NotifyException;
use BookStack\Facades\Activity;
use BookStack\Uploads\ImageRepo; use BookStack\Uploads\ImageRepo;
use Exception; use Exception;
use Illuminate\Contracts\Container\BindingResolutionException; use Illuminate\Contracts\Container\BindingResolutionException;
@ -91,6 +93,7 @@ class BookRepo
{ {
$book = new Book(); $book = new Book();
$this->baseRepo->create($book, $input); $this->baseRepo->create($book, $input);
Activity::add($book, ActivityType::BOOK_CREATE, $book->id);
return $book; return $book;
} }
@ -100,6 +103,7 @@ class BookRepo
public function update(Book $book, array $input): Book public function update(Book $book, array $input): Book
{ {
$this->baseRepo->update($book, $input); $this->baseRepo->update($book, $input);
Activity::add($book, ActivityType::BOOK_UPDATE, $book->id);
return $book; return $book;
} }
@ -129,6 +133,8 @@ class BookRepo
{ {
$trashCan = new TrashCan(); $trashCan = new TrashCan();
$trashCan->softDestroyBook($book); $trashCan->softDestroyBook($book);
Activity::add($book, ActivityType::BOOK_DELETE, $book->id);
$trashCan->autoClearOld(); $trashCan->autoClearOld();
} }
} }

View File

@ -1,10 +1,12 @@
<?php namespace BookStack\Entities\Repos; <?php namespace BookStack\Entities\Repos;
use BookStack\Actions\ActivityType;
use BookStack\Entities\Book; use BookStack\Entities\Book;
use BookStack\Entities\Bookshelf; use BookStack\Entities\Bookshelf;
use BookStack\Entities\Managers\TrashCan; use BookStack\Entities\Managers\TrashCan;
use BookStack\Exceptions\ImageUploadException; use BookStack\Exceptions\ImageUploadException;
use BookStack\Exceptions\NotFoundException; use BookStack\Exceptions\NotFoundException;
use BookStack\Facades\Activity;
use Exception; use Exception;
use Illuminate\Contracts\Pagination\LengthAwarePaginator; use Illuminate\Contracts\Pagination\LengthAwarePaginator;
use Illuminate\Http\UploadedFile; use Illuminate\Http\UploadedFile;
@ -87,11 +89,12 @@ class BookshelfRepo
$shelf = new Bookshelf(); $shelf = new Bookshelf();
$this->baseRepo->create($shelf, $input); $this->baseRepo->create($shelf, $input);
$this->updateBooks($shelf, $bookIds); $this->updateBooks($shelf, $bookIds);
Activity::add($shelf, ActivityType::BOOKSHELF_CREATE);
return $shelf; return $shelf;
} }
/** /**
* Create a new shelf in the system. * Update an existing shelf in the system using the given input.
*/ */
public function update(Bookshelf $shelf, array $input, ?array $bookIds): Bookshelf public function update(Bookshelf $shelf, array $input, ?array $bookIds): Bookshelf
{ {
@ -101,6 +104,7 @@ class BookshelfRepo
$this->updateBooks($shelf, $bookIds); $this->updateBooks($shelf, $bookIds);
} }
Activity::add($shelf, ActivityType::BOOKSHELF_UPDATE);
return $shelf; return $shelf;
} }
@ -175,6 +179,7 @@ class BookshelfRepo
{ {
$trashCan = new TrashCan(); $trashCan = new TrashCan();
$trashCan->softDestroyShelf($shelf); $trashCan->softDestroyShelf($shelf);
Activity::add($shelf, ActivityType::BOOKSHELF_DELETE);
$trashCan->autoClearOld(); $trashCan->autoClearOld();
} }
} }

View File

@ -1,11 +1,13 @@
<?php namespace BookStack\Entities\Repos; <?php namespace BookStack\Entities\Repos;
use BookStack\Actions\ActivityType;
use BookStack\Entities\Book; use BookStack\Entities\Book;
use BookStack\Entities\Chapter; use BookStack\Entities\Chapter;
use BookStack\Entities\Managers\BookContents; use BookStack\Entities\Managers\BookContents;
use BookStack\Entities\Managers\TrashCan; use BookStack\Entities\Managers\TrashCan;
use BookStack\Exceptions\MoveOperationException; use BookStack\Exceptions\MoveOperationException;
use BookStack\Exceptions\NotFoundException; use BookStack\Exceptions\NotFoundException;
use BookStack\Facades\Activity;
use Exception; use Exception;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
@ -46,6 +48,7 @@ class ChapterRepo
$chapter->book_id = $parentBook->id; $chapter->book_id = $parentBook->id;
$chapter->priority = (new BookContents($parentBook))->getLastPriority() + 1; $chapter->priority = (new BookContents($parentBook))->getLastPriority() + 1;
$this->baseRepo->create($chapter, $input); $this->baseRepo->create($chapter, $input);
Activity::add($chapter, ActivityType::CHAPTER_CREATE, $parentBook->id);
return $chapter; return $chapter;
} }
@ -55,6 +58,7 @@ class ChapterRepo
public function update(Chapter $chapter, array $input): Chapter public function update(Chapter $chapter, array $input): Chapter
{ {
$this->baseRepo->update($chapter, $input); $this->baseRepo->update($chapter, $input);
Activity::add($chapter, ActivityType::CHAPTER_UPDATE, $chapter->book->id);
return $chapter; return $chapter;
} }
@ -74,6 +78,7 @@ class ChapterRepo
{ {
$trashCan = new TrashCan(); $trashCan = new TrashCan();
$trashCan->softDestroyChapter($chapter); $trashCan->softDestroyChapter($chapter);
Activity::add($chapter, ActivityType::CHAPTER_DELETE, $chapter->book->id);
$trashCan->autoClearOld(); $trashCan->autoClearOld();
} }
@ -93,6 +98,7 @@ class ChapterRepo
throw new MoveOperationException('Chapters can only be moved into books'); throw new MoveOperationException('Chapters can only be moved into books');
} }
/** @var Book $parent */
$parent = Book::visible()->where('id', '=', $entityId)->first(); $parent = Book::visible()->where('id', '=', $entityId)->first();
if ($parent === null) { if ($parent === null) {
throw new MoveOperationException('Book to move chapter into not found'); throw new MoveOperationException('Book to move chapter into not found');
@ -100,6 +106,8 @@ class ChapterRepo
$chapter->changeBook($parent->id); $chapter->changeBook($parent->id);
$chapter->rebuildPermissions(); $chapter->rebuildPermissions();
Activity::add($chapter, ActivityType::CHAPTER_MOVE, $parent->id);
return $parent; return $parent;
} }
} }

View File

@ -1,5 +1,6 @@
<?php namespace BookStack\Entities\Repos; <?php namespace BookStack\Entities\Repos;
use BookStack\Actions\ActivityType;
use BookStack\Entities\Book; use BookStack\Entities\Book;
use BookStack\Entities\Chapter; use BookStack\Entities\Chapter;
use BookStack\Entities\Entity; use BookStack\Entities\Entity;
@ -12,6 +13,7 @@ use BookStack\Exceptions\MoveOperationException;
use BookStack\Exceptions\NotFoundException; use BookStack\Exceptions\NotFoundException;
use BookStack\Exceptions\NotifyException; use BookStack\Exceptions\NotifyException;
use BookStack\Exceptions\PermissionsException; use BookStack\Exceptions\PermissionsException;
use BookStack\Facades\Activity;
use Exception; use Exception;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Pagination\LengthAwarePaginator;
@ -165,7 +167,10 @@ class PageRepo
$this->savePageRevision($draft, trans('entities.pages_initial_revision')); $this->savePageRevision($draft, trans('entities.pages_initial_revision'));
$draft->indexForSearch(); $draft->indexForSearch();
return $draft->refresh(); $draft->refresh();
Activity::add($draft, ActivityType::PAGE_CREATE, $draft->book->id);
return $draft;
} }
/** /**
@ -203,6 +208,7 @@ class PageRepo
$this->savePageRevision($page, $summary); $this->savePageRevision($page, $summary);
} }
Activity::add($page, ActivityType::PAGE_UPDATE, $page->book->id);
return $page; return $page;
} }
@ -266,6 +272,7 @@ class PageRepo
{ {
$trashCan = new TrashCan(); $trashCan = new TrashCan();
$trashCan->softDestroyPage($page); $trashCan->softDestroyPage($page);
Activity::add($page, ActivityType::PAGE_DELETE, $page->book_id);
$trashCan->autoClearOld(); $trashCan->autoClearOld();
} }
@ -286,6 +293,7 @@ class PageRepo
$page->save(); $page->save();
$page->indexForSearch(); $page->indexForSearch();
Activity::add($page, ActivityType::PAGE_RESTORE, $page->book->id);
return $page; return $page;
} }
@ -296,7 +304,7 @@ class PageRepo
* @throws MoveOperationException * @throws MoveOperationException
* @throws PermissionsException * @throws PermissionsException
*/ */
public function move(Page $page, string $parentIdentifier): Book public function move(Page $page, string $parentIdentifier): Entity
{ {
$parent = $this->findParentByIdentifier($parentIdentifier); $parent = $this->findParentByIdentifier($parentIdentifier);
if ($parent === null) { if ($parent === null) {
@ -311,7 +319,8 @@ class PageRepo
$page->changeBook($parent instanceof Book ? $parent->id : $parent->book->id); $page->changeBook($parent instanceof Book ? $parent->id : $parent->book->id);
$page->rebuildPermissions(); $page->rebuildPermissions();
return ($parent instanceof Book ? $parent : $parent->book); Activity::add($page, ActivityType::PAGE_MOVE, $page->book->id);
return $parent;
} }
/** /**

View File

@ -1,5 +1,6 @@
<?php namespace BookStack\Http\Controllers\Api; <?php namespace BookStack\Http\Controllers\Api;
use BookStack\Actions\ActivityType;
use BookStack\Entities\Book; use BookStack\Entities\Book;
use BookStack\Entities\Repos\BookRepo; use BookStack\Entities\Repos\BookRepo;
use BookStack\Exceptions\NotifyException; use BookStack\Exceptions\NotifyException;
@ -55,8 +56,6 @@ class BookApiController extends ApiController
$requestData = $this->validate($request, $this->rules['create']); $requestData = $this->validate($request, $this->rules['create']);
$book = $this->bookRepo->create($requestData); $book = $this->bookRepo->create($requestData);
Activity::add($book, 'book_create', $book->id);
return response()->json($book); return response()->json($book);
} }
@ -80,7 +79,6 @@ class BookApiController extends ApiController
$requestData = $this->validate($request, $this->rules['update']); $requestData = $this->validate($request, $this->rules['update']);
$book = $this->bookRepo->update($book, $requestData); $book = $this->bookRepo->update($book, $requestData);
Activity::add($book, 'book_update', $book->id);
return response()->json($book); return response()->json($book);
} }
@ -96,8 +94,6 @@ class BookApiController extends ApiController
$this->checkOwnablePermission('book-delete', $book); $this->checkOwnablePermission('book-delete', $book);
$this->bookRepo->destroy($book); $this->bookRepo->destroy($book);
Activity::addMessage('book_delete', $book->name);
return response('', 204); return response('', 204);
} }
} }

View File

@ -1,5 +1,6 @@
<?php namespace BookStack\Http\Controllers\Api; <?php namespace BookStack\Http\Controllers\Api;
use BookStack\Actions\ActivityType;
use BookStack\Facades\Activity; use BookStack\Facades\Activity;
use BookStack\Entities\Repos\BookshelfRepo; use BookStack\Entities\Repos\BookshelfRepo;
use BookStack\Entities\Bookshelf; use BookStack\Entities\Bookshelf;
@ -63,7 +64,6 @@ class BookshelfApiController extends ApiController
$bookIds = $request->get('books', []); $bookIds = $request->get('books', []);
$shelf = $this->bookshelfRepo->create($requestData, $bookIds); $shelf = $this->bookshelfRepo->create($requestData, $bookIds);
Activity::add($shelf, 'bookshelf_create', $shelf->id);
return response()->json($shelf); return response()->json($shelf);
} }
@ -94,12 +94,9 @@ class BookshelfApiController extends ApiController
$this->checkOwnablePermission('bookshelf-update', $shelf); $this->checkOwnablePermission('bookshelf-update', $shelf);
$requestData = $this->validate($request, $this->rules['update']); $requestData = $this->validate($request, $this->rules['update']);
$bookIds = $request->get('books', null); $bookIds = $request->get('books', null);
$shelf = $this->bookshelfRepo->update($shelf, $requestData, $bookIds); $shelf = $this->bookshelfRepo->update($shelf, $requestData, $bookIds);
Activity::add($shelf, 'bookshelf_update', $shelf->id);
return response()->json($shelf); return response()->json($shelf);
} }
@ -115,8 +112,6 @@ class BookshelfApiController extends ApiController
$this->checkOwnablePermission('bookshelf-delete', $shelf); $this->checkOwnablePermission('bookshelf-delete', $shelf);
$this->bookshelfRepo->destroy($shelf); $this->bookshelfRepo->destroy($shelf);
Activity::addMessage('bookshelf_delete', $shelf->name);
return response('', 204); return response('', 204);
} }
} }

View File

@ -1,5 +1,6 @@
<?php namespace BookStack\Http\Controllers\Api; <?php namespace BookStack\Http\Controllers\Api;
use BookStack\Actions\ActivityType;
use BookStack\Entities\Book; use BookStack\Entities\Book;
use BookStack\Entities\Chapter; use BookStack\Entities\Chapter;
use BookStack\Entities\Repos\ChapterRepo; use BookStack\Entities\Repos\ChapterRepo;
@ -58,8 +59,6 @@ class ChapterApiController extends ApiController
$this->checkOwnablePermission('chapter-create', $book); $this->checkOwnablePermission('chapter-create', $book);
$chapter = $this->chapterRepo->create($request->all(), $book); $chapter = $this->chapterRepo->create($request->all(), $book);
Activity::add($chapter, 'chapter_create', $book->id);
return response()->json($chapter->load(['tags'])); return response()->json($chapter->load(['tags']));
} }
@ -83,8 +82,6 @@ class ChapterApiController extends ApiController
$this->checkOwnablePermission('chapter-update', $chapter); $this->checkOwnablePermission('chapter-update', $chapter);
$updatedChapter = $this->chapterRepo->update($chapter, $request->all()); $updatedChapter = $this->chapterRepo->update($chapter, $request->all());
Activity::add($chapter, 'chapter_update', $chapter->book->id);
return response()->json($updatedChapter->load(['tags'])); return response()->json($updatedChapter->load(['tags']));
} }
@ -97,8 +94,6 @@ class ChapterApiController extends ApiController
$this->checkOwnablePermission('chapter-delete', $chapter); $this->checkOwnablePermission('chapter-delete', $chapter);
$this->chapterRepo->destroy($chapter); $this->chapterRepo->destroy($chapter);
Activity::addMessage('chapter_delete', $chapter->name, $chapter->book->id);
return response('', 204); return response('', 204);
} }
} }

View File

@ -1,12 +1,12 @@
<?php namespace BookStack\Http\Controllers; <?php namespace BookStack\Http\Controllers;
use Activity; use Activity;
use BookStack\Actions\ActivityType;
use BookStack\Entities\Managers\BookContents; use BookStack\Entities\Managers\BookContents;
use BookStack\Entities\Bookshelf; use BookStack\Entities\Bookshelf;
use BookStack\Entities\Managers\EntityContext; use BookStack\Entities\Managers\EntityContext;
use BookStack\Entities\Repos\BookRepo; use BookStack\Entities\Repos\BookRepo;
use BookStack\Exceptions\ImageUploadException; use BookStack\Exceptions\ImageUploadException;
use BookStack\Exceptions\NotifyException;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Validation\ValidationException; use Illuminate\Validation\ValidationException;
use Throwable; use Throwable;
@ -18,9 +18,6 @@ class BookController extends Controller
protected $bookRepo; protected $bookRepo;
protected $entityContextManager; protected $entityContextManager;
/**
* BookController constructor.
*/
public function __construct(EntityContext $entityContextManager, BookRepo $bookRepo) public function __construct(EntityContext $entityContextManager, BookRepo $bookRepo)
{ {
$this->bookRepo = $bookRepo; $this->bookRepo = $bookRepo;
@ -97,11 +94,10 @@ class BookController extends Controller
$book = $this->bookRepo->create($request->all()); $book = $this->bookRepo->create($request->all());
$this->bookRepo->updateCoverImage($book, $request->file('image', null)); $this->bookRepo->updateCoverImage($book, $request->file('image', null));
Activity::add($book, 'book_create', $book->id);
if ($bookshelf) { if ($bookshelf) {
$bookshelf->appendBook($book); $bookshelf->appendBook($book);
Activity::add($bookshelf, 'bookshelf_update'); Activity::add($bookshelf, ActivityType::BOOKSHELF_UPDATE);
} }
return redirect($book->getUrl()); return redirect($book->getUrl());
@ -162,8 +158,6 @@ class BookController extends Controller
$resetCover = $request->has('image_reset'); $resetCover = $request->has('image_reset');
$this->bookRepo->updateCoverImage($book, $request->file('image', null), $resetCover); $this->bookRepo->updateCoverImage($book, $request->file('image', null), $resetCover);
Activity::add($book, 'book_update', $book->id);
return redirect($book->getUrl()); return redirect($book->getUrl());
} }
@ -187,7 +181,6 @@ 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::add($book, 'book_delete', $book->id);
$this->bookRepo->destroy($book); $this->bookRepo->destroy($book);
return redirect('/books'); return redirect('/books');

View File

@ -2,6 +2,7 @@
namespace BookStack\Http\Controllers; namespace BookStack\Http\Controllers;
use BookStack\Actions\ActivityType;
use BookStack\Entities\Book; use BookStack\Entities\Book;
use BookStack\Entities\Managers\BookContents; use BookStack\Entities\Managers\BookContents;
use BookStack\Entities\Repos\BookRepo; use BookStack\Entities\Repos\BookRepo;
@ -74,7 +75,7 @@ class BookSortController extends Controller
// Rebuild permissions and add activity for involved books. // Rebuild permissions and add activity for involved books.
$booksInvolved->each(function (Book $book) { $booksInvolved->each(function (Book $book) {
Activity::add($book, 'book_sort', $book->id); Activity::add($book, ActivityType::BOOK_SORT, $book->id);
}); });
return redirect($book->getUrl()); return redirect($book->getUrl());

View File

@ -92,7 +92,6 @@ class BookshelfController extends Controller
$shelf = $this->bookshelfRepo->create($request->all(), $bookIds); $shelf = $this->bookshelfRepo->create($request->all(), $bookIds);
$this->bookshelfRepo->updateCoverImage($shelf, $request->file('image', null)); $this->bookshelfRepo->updateCoverImage($shelf, $request->file('image', null));
Activity::add($shelf, 'bookshelf_create');
return redirect($shelf->getUrl()); return redirect($shelf->getUrl());
} }
@ -156,7 +155,6 @@ class BookshelfController extends Controller
$shelf = $this->bookshelfRepo->update($shelf, $request->all(), $bookIds); $shelf = $this->bookshelfRepo->update($shelf, $request->all(), $bookIds);
$resetCover = $request->has('image_reset'); $resetCover = $request->has('image_reset');
$this->bookshelfRepo->updateCoverImage($shelf, $request->file('image', null), $resetCover); $this->bookshelfRepo->updateCoverImage($shelf, $request->file('image', null), $resetCover);
Activity::add($shelf, 'bookshelf_update');
return redirect($shelf->getUrl()); return redirect($shelf->getUrl());
} }
@ -182,7 +180,6 @@ class BookshelfController extends Controller
$shelf = $this->bookshelfRepo->getBySlug($slug); $shelf = $this->bookshelfRepo->getBySlug($slug);
$this->checkOwnablePermission('bookshelf-delete', $shelf); $this->checkOwnablePermission('bookshelf-delete', $shelf);
Activity::add($shelf, 'bookshelf_delete');
$this->bookshelfRepo->destroy($shelf); $this->bookshelfRepo->destroy($shelf);
return redirect('/shelves'); return redirect('/shelves');

View File

@ -1,6 +1,5 @@
<?php namespace BookStack\Http\Controllers; <?php namespace BookStack\Http\Controllers;
use Activity;
use BookStack\Entities\Book; use BookStack\Entities\Book;
use BookStack\Entities\Managers\BookContents; use BookStack\Entities\Managers\BookContents;
use BookStack\Entities\Repos\ChapterRepo; use BookStack\Entities\Repos\ChapterRepo;
@ -51,7 +50,6 @@ class ChapterController extends Controller
$this->checkOwnablePermission('chapter-create', $book); $this->checkOwnablePermission('chapter-create', $book);
$chapter = $this->chapterRepo->create($request->all(), $book); $chapter = $this->chapterRepo->create($request->all(), $book);
Activity::add($chapter, 'chapter_create', $book->id);
return redirect($chapter->getUrl()); return redirect($chapter->getUrl());
} }
@ -100,7 +98,6 @@ class ChapterController extends Controller
$this->checkOwnablePermission('chapter-update', $chapter); $this->checkOwnablePermission('chapter-update', $chapter);
$this->chapterRepo->update($chapter, $request->all()); $this->chapterRepo->update($chapter, $request->all());
Activity::add($chapter, 'chapter_update', $chapter->book->id);
return redirect($chapter->getUrl()); return redirect($chapter->getUrl());
} }
@ -128,7 +125,6 @@ class ChapterController extends Controller
$chapter = $this->chapterRepo->getBySlug($bookSlug, $chapterSlug); $chapter = $this->chapterRepo->getBySlug($bookSlug, $chapterSlug);
$this->checkOwnablePermission('chapter-delete', $chapter); $this->checkOwnablePermission('chapter-delete', $chapter);
Activity::add($chapter, 'chapter_delete', $chapter->book->id);
$this->chapterRepo->destroy($chapter); $this->chapterRepo->destroy($chapter);
return redirect($chapter->book->getUrl()); return redirect($chapter->book->getUrl());
@ -173,8 +169,6 @@ class ChapterController extends Controller
return redirect()->back(); return redirect()->back();
} }
Activity::add($chapter, 'chapter_move', $newBook->id);
$this->showSuccessNotification(trans('entities.chapter_move_success', ['bookName' => $newBook->name])); $this->showSuccessNotification(trans('entities.chapter_move_success', ['bookName' => $newBook->name]));
return redirect($chapter->getUrl()); return redirect($chapter->getUrl());
} }

View File

@ -1,6 +1,7 @@
<?php namespace BookStack\Http\Controllers; <?php namespace BookStack\Http\Controllers;
use Activity; use Activity;
use BookStack\Actions\ActivityType;
use BookStack\Actions\CommentRepo; use BookStack\Actions\CommentRepo;
use BookStack\Entities\Page; use BookStack\Entities\Page;
use Illuminate\Http\Request; use Illuminate\Http\Request;
@ -40,7 +41,6 @@ class CommentController extends Controller
// Create a new comment. // Create a new comment.
$this->checkPermission('comment-create-all'); $this->checkPermission('comment-create-all');
$comment = $this->commentRepo->create($page, $request->get('text'), $request->get('parent_id')); $comment = $this->commentRepo->create($page, $request->get('text'), $request->get('parent_id'));
Activity::add($page, 'commented_on', $page->book->id);
return view('comments.comment', ['comment' => $comment]); return view('comments.comment', ['comment' => $comment]);
} }

View File

@ -1,6 +1,7 @@
<?php namespace BookStack\Http\Controllers; <?php namespace BookStack\Http\Controllers;
use Activity; use Activity;
use BookStack\Actions\ActivityType;
use BookStack\Entities\Managers\BookContents; use BookStack\Entities\Managers\BookContents;
use BookStack\Entities\Managers\PageContent; use BookStack\Entities\Managers\PageContent;
use BookStack\Entities\Managers\PageEditActivity; use BookStack\Entities\Managers\PageEditActivity;
@ -107,7 +108,6 @@ class PageController extends Controller
$this->checkOwnablePermission('page-create', $draftPage->getParent()); $this->checkOwnablePermission('page-create', $draftPage->getParent());
$page = $this->pageRepo->publishDraft($draftPage, $request->all()); $page = $this->pageRepo->publishDraft($draftPage, $request->all());
Activity::add($page, 'page_create', $draftPage->book->id);
return redirect($page->getUrl()); return redirect($page->getUrl());
} }
@ -224,7 +224,6 @@ class PageController extends Controller
$this->checkOwnablePermission('page-update', $page); $this->checkOwnablePermission('page-update', $page);
$this->pageRepo->update($page, $request->all()); $this->pageRepo->update($page, $request->all());
Activity::add($page, 'page_update', $page->book->id);
return redirect($page->getUrl()); return redirect($page->getUrl());
} }
@ -304,11 +303,9 @@ class PageController extends Controller
{ {
$page = $this->pageRepo->getBySlug($bookSlug, $pageSlug); $page = $this->pageRepo->getBySlug($bookSlug, $pageSlug);
$this->checkOwnablePermission('page-delete', $page); $this->checkOwnablePermission('page-delete', $page);
$parent = $page->getParent();
$book = $page->book;
$parent = $page->chapter ?? $book;
$this->pageRepo->destroy($page); $this->pageRepo->destroy($page);
Activity::add($page, 'page_delete', $page->book_id);
return redirect($parent->getUrl()); return redirect($parent->getUrl());
} }
@ -393,7 +390,6 @@ class PageController extends Controller
return redirect()->back(); return redirect()->back();
} }
Activity::add($page, 'page_move', $page->book->id);
$this->showSuccessNotification(trans('entities.pages_move_success', ['parentName' => $parent->name])); $this->showSuccessNotification(trans('entities.pages_move_success', ['parentName' => $parent->name]));
return redirect($page->getUrl()); return redirect($page->getUrl());
} }
@ -438,8 +434,6 @@ class PageController extends Controller
return redirect()->back(); return redirect()->back();
} }
Activity::add($pageCopy, 'page_create', $pageCopy->book->id);
$this->showSuccessNotification(trans('entities.pages_copy_success')); $this->showSuccessNotification(trans('entities.pages_copy_success'));
return redirect($pageCopy->getUrl()); return redirect($pageCopy->getUrl());
} }

View File

@ -1,5 +1,6 @@
<?php namespace BookStack\Http\Controllers; <?php namespace BookStack\Http\Controllers;
use BookStack\Actions\ActivityType;
use BookStack\Entities\Managers\PageContent; use BookStack\Entities\Managers\PageContent;
use BookStack\Entities\Repos\PageRepo; use BookStack\Entities\Repos\PageRepo;
use BookStack\Exceptions\NotFoundException; use BookStack\Exceptions\NotFoundException;
@ -101,7 +102,6 @@ class PageRevisionController extends Controller
$page = $this->pageRepo->restoreRevision($page, $revisionId); $page = $this->pageRepo->restoreRevision($page, $revisionId);
Activity::add($page, 'page_restore', $page->book->id);
return redirect($page->getUrl()); return redirect($page->getUrl());
} }

View File

@ -1,5 +1,6 @@
<?php namespace Tests; <?php namespace Tests;
use BookStack\Actions\ActivityType;
use BookStack\Actions\Comment; use BookStack\Actions\Comment;
use BookStack\Actions\CommentRepo; use BookStack\Actions\CommentRepo;
use BookStack\Auth\Permissions\JointPermission; use BookStack\Auth\Permissions\JointPermission;
@ -37,7 +38,7 @@ class CommandsTest extends TestCase
{ {
$this->asEditor(); $this->asEditor();
$page = Page::first(); $page = Page::first();
\Activity::add($page, 'page_update', $page->book->id); \Activity::add($page, ActivityType::PAGE_UPDATE, $page->book->id);
$this->assertDatabaseHas('activities', [ $this->assertDatabaseHas('activities', [
'key' => 'page_update', 'key' => 'page_update',

View File

@ -1,6 +1,7 @@
<?php namespace Tests\User; <?php namespace Tests\User;
use Activity; use Activity;
use BookStack\Actions\ActivityType;
use BookStack\Auth\User; use BookStack\Auth\User;
use BookStack\Entities\Bookshelf; use BookStack\Entities\Bookshelf;
use Tests\BrowserKitTest; use Tests\BrowserKitTest;
@ -60,8 +61,8 @@ class UserProfileTest extends BrowserKitTest
$newUser = $this->getNewBlankUser(); $newUser = $this->getNewBlankUser();
$this->actingAs($newUser); $this->actingAs($newUser);
$entities = $this->createEntityChainBelongingToUser($newUser, $newUser); $entities = $this->createEntityChainBelongingToUser($newUser, $newUser);
Activity::add($entities['book'], 'book_update', $entities['book']->id); Activity::add($entities['book'], ActivityType::BOOK_UPDATE, $entities['book']->id);
Activity::add($entities['page'], 'page_create', $entities['book']->id); Activity::add($entities['page'], ActivityType::PAGE_CREATE, $entities['book']->id);
$this->asAdmin()->visit('/user/' . $newUser->id) $this->asAdmin()->visit('/user/' . $newUser->id)
->seeInElement('#recent-user-activity', 'updated book') ->seeInElement('#recent-user-activity', 'updated book')
@ -74,8 +75,8 @@ class UserProfileTest extends BrowserKitTest
$newUser = $this->getNewBlankUser(); $newUser = $this->getNewBlankUser();
$this->actingAs($newUser); $this->actingAs($newUser);
$entities = $this->createEntityChainBelongingToUser($newUser, $newUser); $entities = $this->createEntityChainBelongingToUser($newUser, $newUser);
Activity::add($entities['book'], 'book_update', $entities['book']->id); Activity::add($entities['book'], ActivityType::BOOK_UPDATE, $entities['book']->id);
Activity::add($entities['page'], 'page_create', $entities['book']->id); Activity::add($entities['page'], ActivityType::PAGE_CREATE, $entities['book']->id);
$this->asAdmin()->visit('/')->clickInElement('#recent-activity', $newUser->name) $this->asAdmin()->visit('/')->clickInElement('#recent-activity', $newUser->name)
->seePageIs('/user/' . $newUser->id) ->seePageIs('/user/' . $newUser->id)