]> BookStack Code Mirror - bookstack/blobdiff - app/Http/Controllers/Api/RecycleBinApiController.php
do some cleanup and add doc
[bookstack] / app / Http / Controllers / Api / RecycleBinApiController.php
index 162b27adbc6abf9a82ce6446a3d578c1d35a33c1..a2176a2c8a34af3c0211dfba077f4f3b4e246717 100644 (file)
@@ -2,13 +2,16 @@
 
 namespace BookStack\Http\Controllers\Api;
 
-use BookStack\Actions\ActivityType;
 use BookStack\Entities\Models\Deletion;
 use BookStack\Entities\Repos\DeletionRepo;
-use BookStack\Entities\Tools\TrashCan;
+use Closure;
 
 class RecycleBinApiController extends ApiController
 {
+    protected $fieldsToExpose = [
+        'id', 'deleted_by', 'created_at', 'updated_at', 'deletable_type', 'deletable_id',
+    ];
+
     public function __construct()
     {
         $this->middleware(function ($request, $next) {
@@ -19,27 +22,74 @@ 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()
     {
-        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'])]);
     }
 
+    /**
+     * 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)
     {
         $restoreCount = $deletionRepo->restore((int) $id);
+
         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)
     {
         $deleteCount = $deletionRepo->destroy((int) $id);
+
         return response()->json(['delete_count' => $deleteCount]);
     }
-}
\ No newline at end of file
+
+    protected function listFormatter(Deletion $deletion)
+    {
+        $deletion->makeVisible($this->fieldsToExpose);
+        $deletion->makeHidden('deletable');
+
+        $deletable = $deletion->deletable;
+        $isBook = $deletion->deletable_type === "BookStack\Book";
+        $parent = null;
+        $children = null;
+
+        if ($isBook) {
+            $chapterCount = $deletable->chapters()->withTrashed()->count();
+            $children['BookStack\Chapter'] = $chapterCount;
+        }
+
+        if ($isBook || $deletion->deletable_type === "BookStack\Chapter") {
+            $pageCount = $deletable->pages()->withTrashed()->count();
+            $children['BookStack\Page'] = $pageCount;
+        }
+
+        $parentEntity = $deletable->getParent();
+        $parent = null;
+
+        if ($parentEntity) {
+            $parent['type'] = $parentEntity->getMorphClass();
+            $parent['id'] = $parentEntity->getKey();
+        }
+
+        $deletion->setAttribute('parent', $parent);
+        $deletion->setAttribute('children', $children);
+    }
+}