{
/**
* Send a shelf to the recycle bin.
+ * @throws NotifyException
*/
public function softDestroyShelf(Bookshelf $shelf)
{
+ $this->ensureDeletable($shelf);
Deletion::createForEntity($shelf);
$shelf->delete();
}
*/
public function softDestroyBook(Book $book)
{
+ $this->ensureDeletable($book);
Deletion::createForEntity($book);
foreach ($book->pages as $page) {
public function softDestroyChapter(Chapter $chapter, bool $recordDelete = true)
{
if ($recordDelete) {
+ $this->ensureDeletable($chapter);
Deletion::createForEntity($chapter);
}
public function softDestroyPage(Page $page, bool $recordDelete = true)
{
if ($recordDelete) {
+ $this->ensureDeletable($page);
Deletion::createForEntity($page);
}
- // Check if set as custom homepage & remove setting if not used or throw error if active
- $customHome = setting('app-homepage', '0:');
- if (intval($page->id) === intval(explode(':', $customHome)[0])) {
- if (setting('app-homepage-type') === 'page') {
- throw new NotifyException(trans('errors.page_custom_home_deletion'), $page->getUrl());
+ $page->delete();
+ }
+
+ /**
+ * Ensure the given entity is deletable.
+ * Is not for permissions, but logical conditions within the application.
+ * Will throw if not deletable.
+ *
+ * @throws NotifyException
+ */
+ protected function ensureDeletable(Entity $entity): void
+ {
+ $customHomeId = intval(explode(':', setting('app-homepage', '0:'))[0]);
+ $customHomeActive = setting('app-homepage-type') === 'page';
+ $removeCustomHome = false;
+
+ // Check custom homepage usage for pages
+ if ($entity instanceof Page && $entity->id === $customHomeId) {
+ if ($customHomeActive) {
+ throw new NotifyException(trans('errors.page_custom_home_deletion'), $entity->getUrl());
}
- setting()->remove('app-homepage');
+ $removeCustomHome = true;
}
- $page->delete();
+ // Check custom homepage usage within chapters or books
+ if ($entity instanceof Chapter || $entity instanceof Book) {
+ if ($entity->pages()->where('id', '=', $customHomeId)->exists()) {
+ if ($customHomeActive) {
+ throw new NotifyException(trans('errors.page_custom_home_deletion'), $entity->getUrl());
+ }
+ $removeCustomHome = true;
+ }
+ }
+
+ if ($removeCustomHome) {
+ setting()->remove('app-homepage');
+ }
}
/**
$pageDeleteReq->assertSessionMissing('error');
}
+ public function test_custom_homepage_cannot_be_deleted_from_parent_deletion()
+ {
+ /** @var Page $page */
+ $page = Page::query()->first();
+ $this->setSettings([
+ 'app-homepage' => $page->id,
+ 'app-homepage-type' => 'page',
+ ]);
+
+ $this->asEditor()->delete($page->book->getUrl());
+ $this->assertSessionError('Cannot delete a page while it is set as a homepage');
+ $this->assertDatabaseMissing('deletions', ['deletable_id' => $page->book->id]);
+
+ $page->refresh();
+ $this->assertNull($page->deleted_at);
+ $this->assertNull($page->book->deleted_at);
+ }
+
public function test_custom_homepage_renders_includes()
{
$this->asEditor();