X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/55e52e45fb11f5b733eacb010bd23aa9716466fa..refs/pull/3693/head:/app/Http/Controllers/Api/RecycleBinApiController.php diff --git a/app/Http/Controllers/Api/RecycleBinApiController.php b/app/Http/Controllers/Api/RecycleBinApiController.php index 162b27adb..f327bae93 100644 --- a/app/Http/Controllers/Api/RecycleBinApiController.php +++ b/app/Http/Controllers/Api/RecycleBinApiController.php @@ -2,10 +2,13 @@ namespace BookStack\Http\Controllers\Api; -use BookStack\Actions\ActivityType; +use BookStack\Entities\Models\Book; +use BookStack\Entities\Models\BookChild; +use BookStack\Entities\Models\Chapter; use BookStack\Entities\Models\Deletion; use BookStack\Entities\Repos\DeletionRepo; -use BookStack\Entities\Tools\TrashCan; +use Closure; +use Illuminate\Database\Eloquent\Builder; class RecycleBinApiController extends ApiController { @@ -19,27 +22,69 @@ class RecycleBinApiController extends ApiController }); } + /** + * Get a top-level listing of the items in the recycle bin. + * The "deletable" property will reflect the main item deleted. + * For books and chapters, counts of child pages/chapters will + * be loaded within this "deletable" data. + * For chapters & pages, the parent item will be loaded within this "deletable" data. + * Requires permission to manage both system settings and permissions. + */ public function list() { - return $this->apiListingResponse(Deletion::query(), [ - 'id', - 'deleted_by', + return $this->apiListingResponse(Deletion::query()->with('deletable'), [ + 'id', + 'deleted_by', 'created_at', 'updated_at', 'deletable_type', - 'deletable_id' - ]); + 'deletable_id', + ], [Closure::fromCallable([$this, 'listFormatter'])]); } - public function restore(DeletionRepo $deletionRepo, string $id) + /** + * Restore a single deletion from the recycle bin. + * Requires permission to manage both system settings and permissions. + */ + public function restore(DeletionRepo $deletionRepo, string $deletionId) { - $restoreCount = $deletionRepo->restore((int) $id); + $restoreCount = $deletionRepo->restore(intval($deletionId)); + return response()->json(['restore_count' => $restoreCount]); } - public function destroy(DeletionRepo $deletionRepo, string $id) + /** + * Remove a single deletion from the recycle bin. + * Use this endpoint carefully as it will entirely remove the underlying deleted items from the system. + * Requires permission to manage both system settings and permissions. + */ + public function destroy(DeletionRepo $deletionRepo, string $deletionId) { - $deleteCount = $deletionRepo->destroy((int) $id); + $deleteCount = $deletionRepo->destroy(intval($deletionId)); + return response()->json(['delete_count' => $deleteCount]); } -} \ No newline at end of file + + /** + * Load some related details for the deletion listing. + */ + protected function listFormatter(Deletion $deletion) + { + $deletable = $deletion->deletable; + $withTrashedQuery = fn (Builder $query) => $query->withTrashed(); + + if ($deletable instanceof BookChild) { + $parent = $deletable->getParent(); + $parent->setAttribute('type', $parent->getType()); + $deletable->setRelation('parent', $parent); + } + + if ($deletable instanceof Book || $deletable instanceof Chapter) { + $countsToLoad = ['pages' => $withTrashedQuery]; + if ($deletable instanceof Book) { + $countsToLoad['chapters'] = $withTrashedQuery; + } + $deletable->loadCount($countsToLoad); + } + } +}