do some cleanup and add doc

This commit is contained in:
julesdevops 2022-04-24 10:16:45 +02:00
parent f14e6e8f2d
commit 14bccae6bd
5 changed files with 88 additions and 30 deletions

View File

@ -2,14 +2,16 @@
namespace BookStack\Http\Controllers\Api; namespace BookStack\Http\Controllers\Api;
use BookStack\Entities\Models\Book;
use BookStack\Entities\Models\Chapter;
use BookStack\Entities\Models\Deletion; use BookStack\Entities\Models\Deletion;
use BookStack\Entities\Repos\DeletionRepo; use BookStack\Entities\Repos\DeletionRepo;
use Closure; use Closure;
class RecycleBinApiController extends ApiController class RecycleBinApiController extends ApiController
{ {
protected $fieldsToExpose = [
'id', 'deleted_by', 'created_at', 'updated_at', 'deletable_type', 'deletable_id',
];
public function __construct() public function __construct()
{ {
$this->middleware(function ($request, $next) { $this->middleware(function ($request, $next) {
@ -20,9 +22,13 @@ class RecycleBinApiController extends ApiController
}); });
} }
/**
* Get a top-level listing of the items in the recycle bin.
* Requires the permission to manage settings and restrictions.
*/
public function list() public function list()
{ {
return $this->apiListingResponse(Deletion::query(), [ return $this->apiListingResponse(Deletion::query()->with('deletable'), [
'id', 'id',
'deleted_by', 'deleted_by',
'created_at', 'created_at',
@ -32,6 +38,10 @@ class RecycleBinApiController extends ApiController
], [Closure::fromCallable([$this, 'listFormatter'])]); ], [Closure::fromCallable([$this, 'listFormatter'])]);
} }
/**
* Restore a single deletion from the recycle bin.
* You must provide the deletion id, not the id of the corresponding deleted item.
*/
public function restore(DeletionRepo $deletionRepo, string $id) public function restore(DeletionRepo $deletionRepo, string $id)
{ {
$restoreCount = $deletionRepo->restore((int) $id); $restoreCount = $deletionRepo->restore((int) $id);
@ -39,6 +49,11 @@ class RecycleBinApiController extends ApiController
return response()->json(['restore_count' => $restoreCount]); return response()->json(['restore_count' => $restoreCount]);
} }
/**
* 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.
*/
public function destroy(DeletionRepo $deletionRepo, string $id) public function destroy(DeletionRepo $deletionRepo, string $id)
{ {
$deleteCount = $deletionRepo->destroy((int) $id); $deleteCount = $deletionRepo->destroy((int) $id);
@ -48,23 +63,26 @@ class RecycleBinApiController extends ApiController
protected function listFormatter(Deletion $deletion) protected function listFormatter(Deletion $deletion)
{ {
$deletion->makeVisible($this->fieldsToExpose);
$deletion->makeHidden('deletable');
$deletable = $deletion->deletable; $deletable = $deletion->deletable;
$isBook = $deletable instanceof Book; $isBook = $deletion->deletable_type === "BookStack\Book";
$parent = null; $parent = null;
$children = null; $children = null;
if ($isBook) { if ($isBook) {
$chapterCount = $deletable->chapters()->withTrashed()->count(); $chapterCount = $deletable->chapters()->withTrashed()->count();
$children['Bookstack\Chapter'] = $chapterCount; $children['BookStack\Chapter'] = $chapterCount;
} }
if ($isBook || $deletion->deletable instanceof Chapter) { if ($isBook || $deletion->deletable_type === "BookStack\Chapter") {
$pageCount = $deletable->pages()->withTrashed()->count(); $pageCount = $deletable->pages()->withTrashed()->count();
$children['Bookstack\Page'] = $pageCount; $children['BookStack\Page'] = $pageCount;
} }
$parentEntity = $deletable->getParent(); $parentEntity = $deletable->getParent();
$parent = []; $parent = null;
if ($parentEntity) { if ($parentEntity) {
$parent['type'] = $parentEntity->getMorphClass(); $parent['type'] = $parentEntity->getMorphClass();

View File

@ -0,0 +1,3 @@
{
"delete_count": 2
}

View File

@ -0,0 +1,34 @@
{
"data": [
{
"id": 25,
"deleted_by": 1,
"created_at": "2022-04-24T07:59:34.000000Z",
"updated_at": "2022-04-24T07:59:34.000000Z",
"deletable_type": "BookStack\\Book",
"deletable_id": 4,
"parent": {
"type": "BookStack\\Book",
"id": 25
},
"children": {
"BookStack\\Chapter": 0,
"BookStack\\Page": 1
}
},
{
"id": 26,
"deleted_by": 1,
"created_at": "2022-04-24T07:59:35.000000Z",
"updated_at": "2022-04-24T07:59:35.000000Z",
"deletable_type": "BookStack\\Book",
"deletable_id": 3,
"parent": [],
"children": {
"BookStack\\Chapter": 1,
"BookStack\\Page": 1
}
}
],
"total": 2
}

View File

@ -0,0 +1,3 @@
{
"restore_count": 2
}

View File

@ -33,7 +33,7 @@ class RecycleBinApiTest extends TestCase
} }
} }
public function test_restrictions_manage_all_permission_neeed_for_all_endpoints() public function test_restrictions_manage_all_permission_needed_for_all_endpoints()
{ {
$editor = $this->getEditor(); $editor = $this->getEditor();
$this->giveUserPermissions($editor, ['restrictions-manage-all']); $this->giveUserPermissions($editor, ['restrictions-manage-all']);
@ -100,11 +100,11 @@ class RecycleBinApiTest extends TestCase
'deletable_type' => $book->getMorphClass(), 'deletable_type' => $book->getMorphClass(),
'deletable_id' => $book->getKey(), 'deletable_id' => $book->getKey(),
'children' => [ 'children' => [
'Bookstack\Page' => $book->pages_count, 'BookStack\Page' => $book->pages_count,
'Bookstack\Chapter' => $book->chapters_count, 'BookStack\Chapter' => $book->chapters_count,
], ],
'parent' => null, 'parent' => null,
] ],
]; ];
$resp->assertJson([ $resp->assertJson([
@ -136,15 +136,15 @@ class RecycleBinApiTest extends TestCase
'deletable_id' => $page->getKey(), 'deletable_id' => $page->getKey(),
'parent' => [ 'parent' => [
'type' => 'BookStack\Chapter', 'type' => 'BookStack\Chapter',
'id' => $page->chapter->getKey() 'id' => $page->chapter->getKey(),
], ],
'children' => null, 'children' => null,
] ],
]; ];
$resp->assertJson([ $resp->assertJson([
'data' => $expectedData, 'data' => $expectedData,
'total' => 1 'total' => 1,
]); ]);
} }