]> BookStack Code Mirror - bookstack/blobdiff - app/Http/Controllers/Api/RecycleBinApiController.php
Fix timestamp in API docs example response
[bookstack] / app / Http / Controllers / Api / RecycleBinApiController.php
index 162b27adbc6abf9a82ce6446a3d578c1d35a33c1..f327bae93f4918749a4163132e9320f9e636ad9c 100644 (file)
@@ -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);
+        }
+    }
+}