2022-04-07 04:57:18 +08:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace BookStack\Http\Controllers\Api;
|
|
|
|
|
|
|
|
use BookStack\Entities\Models\Deletion;
|
|
|
|
use BookStack\Entities\Repos\DeletionRepo;
|
2022-04-21 04:58:16 +08:00
|
|
|
use Closure;
|
2022-04-07 04:57:18 +08:00
|
|
|
|
|
|
|
class RecycleBinApiController extends ApiController
|
|
|
|
{
|
2022-04-24 16:16:45 +08:00
|
|
|
protected $fieldsToExpose = [
|
|
|
|
'id', 'deleted_by', 'created_at', 'updated_at', 'deletable_type', 'deletable_id',
|
|
|
|
];
|
|
|
|
|
2022-04-07 04:57:18 +08:00
|
|
|
public function __construct()
|
|
|
|
{
|
|
|
|
$this->middleware(function ($request, $next) {
|
|
|
|
$this->checkPermission('settings-manage');
|
|
|
|
$this->checkPermission('restrictions-manage-all');
|
|
|
|
|
|
|
|
return $next($request);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2022-04-24 16:16:45 +08:00
|
|
|
/**
|
|
|
|
* Get a top-level listing of the items in the recycle bin.
|
|
|
|
* Requires the permission to manage settings and restrictions.
|
|
|
|
*/
|
2022-04-07 04:57:18 +08:00
|
|
|
public function list()
|
|
|
|
{
|
2022-04-24 16:16:45 +08:00
|
|
|
return $this->apiListingResponse(Deletion::query()->with('deletable'), [
|
2022-04-21 04:58:16 +08:00
|
|
|
'id',
|
|
|
|
'deleted_by',
|
2022-04-07 04:57:18 +08:00
|
|
|
'created_at',
|
|
|
|
'updated_at',
|
|
|
|
'deletable_type',
|
2022-04-21 04:58:16 +08:00
|
|
|
'deletable_id',
|
|
|
|
], [Closure::fromCallable([$this, 'listFormatter'])]);
|
2022-04-07 04:57:18 +08:00
|
|
|
}
|
|
|
|
|
2022-04-24 16:16:45 +08:00
|
|
|
/**
|
|
|
|
* Restore a single deletion from the recycle bin.
|
|
|
|
* You must provide the deletion id, not the id of the corresponding deleted item.
|
|
|
|
*/
|
2022-04-07 04:57:18 +08:00
|
|
|
public function restore(DeletionRepo $deletionRepo, string $id)
|
|
|
|
{
|
|
|
|
$restoreCount = $deletionRepo->restore((int) $id);
|
2022-04-21 04:58:16 +08:00
|
|
|
|
2022-04-07 04:57:18 +08:00
|
|
|
return response()->json(['restore_count' => $restoreCount]);
|
|
|
|
}
|
|
|
|
|
2022-04-24 16:16:45 +08:00
|
|
|
/**
|
|
|
|
* Remove a single deletion from the recycle bin.
|
|
|
|
* Use this endpoint carefully as it will entirely remove the underlying deleted items from the system.
|
|
|
|
* You must provide the deletion id, not the id of the corresponding deleted item.
|
|
|
|
*/
|
2022-04-07 04:57:18 +08:00
|
|
|
public function destroy(DeletionRepo $deletionRepo, string $id)
|
|
|
|
{
|
|
|
|
$deleteCount = $deletionRepo->destroy((int) $id);
|
2022-04-21 04:58:16 +08:00
|
|
|
|
2022-04-07 04:57:18 +08:00
|
|
|
return response()->json(['delete_count' => $deleteCount]);
|
|
|
|
}
|
2022-04-21 04:58:16 +08:00
|
|
|
|
|
|
|
protected function listFormatter(Deletion $deletion)
|
|
|
|
{
|
2022-04-24 16:16:45 +08:00
|
|
|
$deletion->makeVisible($this->fieldsToExpose);
|
|
|
|
$deletion->makeHidden('deletable');
|
|
|
|
|
2022-04-21 04:58:16 +08:00
|
|
|
$deletable = $deletion->deletable;
|
2022-04-24 16:16:45 +08:00
|
|
|
$isBook = $deletion->deletable_type === "BookStack\Book";
|
2022-04-21 04:58:16 +08:00
|
|
|
$parent = null;
|
|
|
|
$children = null;
|
|
|
|
|
|
|
|
if ($isBook) {
|
2022-04-24 16:16:45 +08:00
|
|
|
$chapterCount = $deletable->chapters()->withTrashed()->count();
|
|
|
|
$children['BookStack\Chapter'] = $chapterCount;
|
2022-04-21 04:58:16 +08:00
|
|
|
}
|
|
|
|
|
2022-04-24 16:16:45 +08:00
|
|
|
if ($isBook || $deletion->deletable_type === "BookStack\Chapter") {
|
|
|
|
$pageCount = $deletable->pages()->withTrashed()->count();
|
|
|
|
$children['BookStack\Page'] = $pageCount;
|
2022-04-21 04:58:16 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
$parentEntity = $deletable->getParent();
|
2022-04-24 16:16:45 +08:00
|
|
|
$parent = null;
|
2022-04-21 04:58:16 +08:00
|
|
|
|
|
|
|
if ($parentEntity) {
|
|
|
|
$parent['type'] = $parentEntity->getMorphClass();
|
|
|
|
$parent['id'] = $parentEntity->getKey();
|
|
|
|
}
|
|
|
|
|
|
|
|
$deletion->setAttribute('parent', $parent);
|
|
|
|
$deletion->setAttribute('children', $children);
|
|
|
|
}
|
|
|
|
}
|