From dea9ac8d73c5d34bf5a9ecc027877b8b57306ca8 Mon Sep 17 00:00:00 2001
From: Gautam Sheth <gautam.sheth@staffbase.com>
Date: Sun, 6 Oct 2024 22:47:54 +0300
Subject: [PATCH] Refactor RecycleBin cmdlets to use PnP Core SDK where
 possible

---
 .../Base/PipeBinds/RecycleBinItemPipeBind.cs  | 25 ++++++++++++++++---
 .../RecycleBin/ClearRecycleBinItem.cs         | 16 +++++-------
 src/Commands/RecycleBin/MoveRecycleBinItem.cs | 11 +++-----
 .../RecycleBin/RestoreRecycleBinItem.cs       | 12 +++------
 4 files changed, 35 insertions(+), 29 deletions(-)

diff --git a/src/Commands/Base/PipeBinds/RecycleBinItemPipeBind.cs b/src/Commands/Base/PipeBinds/RecycleBinItemPipeBind.cs
index 51bf5d955..cc3ca1673 100644
--- a/src/Commands/Base/PipeBinds/RecycleBinItemPipeBind.cs
+++ b/src/Commands/Base/PipeBinds/RecycleBinItemPipeBind.cs
@@ -1,19 +1,21 @@
-using System;
-using Microsoft.SharePoint.Client;
-
+using Microsoft.SharePoint.Client;
+using PnP.Core.Model.SharePoint;
 using PnP.PowerShell.Commands.Model.SharePoint;
+using System;
 
 namespace PnP.PowerShell.Commands.Base.PipeBinds
 {
     public sealed class RecycleBinItemPipeBind
     {
         private RecycleBinItem _item;
+        private IRecycleBinItem _recycleBinItem;
         private readonly Guid? _id;
 
         public RecycleBinItemPipeBind()
         {
             _item = null;
             _id = null;
+            _recycleBinItem = null;
         }
 
         public RecycleBinItemPipeBind(RecycleBinItem item)
@@ -26,6 +28,11 @@ public RecycleBinItemPipeBind(RecycleResult result)
             _id = result.RecycleBinItemId;
         }
 
+        public RecycleBinItemPipeBind(IRecycleBinItem result)
+        {
+            _recycleBinItem = result;
+        }
+
         public RecycleBinItemPipeBind(string id)
         {
             Guid guid;
@@ -42,6 +49,8 @@ public RecycleBinItemPipeBind(string id)
 
         public RecycleBinItem Item => _item;
 
+        public IRecycleBinItem RecycleBinItem => _recycleBinItem;
+
         public Guid? Id => _id;
 
         internal RecycleBinItem GetRecycleBinItem(Microsoft.SharePoint.Client.Site site)
@@ -54,5 +63,15 @@ internal RecycleBinItem GetRecycleBinItem(Microsoft.SharePoint.Client.Site site)
             site.Context.ExecuteQueryRetry();
             return Item;
         }
+
+        internal IRecycleBinItem GetRecycleBinItem(Core.Services.PnPContext context)
+        {
+            if (RecycleBinItem != null) return RecycleBinItem;
+            if (!_id.HasValue) return null;
+
+            _recycleBinItem = context.Site.RecycleBin.GetById(_id.Value, r => r.LeafName);
+
+            return RecycleBinItem;
+        }
     }
 }
diff --git a/src/Commands/RecycleBin/ClearRecycleBinItem.cs b/src/Commands/RecycleBin/ClearRecycleBinItem.cs
index d9d3171ea..37f5f09e2 100644
--- a/src/Commands/RecycleBin/ClearRecycleBinItem.cs
+++ b/src/Commands/RecycleBin/ClearRecycleBinItem.cs
@@ -1,8 +1,7 @@
-using System.Management.Automation;
-using Microsoft.SharePoint.Client;
-
+using Microsoft.SharePoint.Client;
 using PnP.PowerShell.Commands.Base.PipeBinds;
 using PnP.PowerShell.Commands.Utilities;
+using System.Management.Automation;
 using Resources = PnP.PowerShell.Commands.Properties.Resources;
 
 namespace PnP.PowerShell.Commands.RecycleBin
@@ -34,12 +33,11 @@ protected override void ExecuteCmdlet()
             switch (ParameterSetName)
             {
                 case PARAMETERSET_IDENTITY:
-                    var recycleBinItem = Identity.GetRecycleBinItem(ClientContext.Site);
+                    var recycleBinItem = Identity.GetRecycleBinItem(Connection.PnPContext);
 
                     if (Force || ShouldContinue(string.Format(Resources.ClearRecycleBinItem, recycleBinItem.LeafName), Resources.Confirm))
                     {
-                        recycleBinItem.DeleteObject();
-                        ClientContext.ExecuteQueryRetry();
+                        recycleBinItem.Delete();
                     }
                     break;
                 case PARAMETERSET_ALL:
@@ -64,16 +62,14 @@ protected override void ExecuteCmdlet()
                         {
                             if (Force || ShouldContinue(Resources.ClearSecondStageRecycleBin, Resources.Confirm))
                             {
-                                ClientContext.Site.RecycleBin.DeleteAllSecondStageItems();
-                                ClientContext.ExecuteQueryRetry();
+                                Connection.PnPContext.Site.RecycleBin.DeleteAllSecondStageItems();
                             }
                         }
                         else
                         {
                             if (Force || ShouldContinue(Resources.ClearBothRecycleBins, Resources.Confirm))
                             {
-                                ClientContext.Site.RecycleBin.DeleteAll();
-                                ClientContext.ExecuteQueryRetry();
+                                Connection.PnPContext.Site.RecycleBin.DeleteAll();
                             }
                         }
                     }
diff --git a/src/Commands/RecycleBin/MoveRecycleBinItem.cs b/src/Commands/RecycleBin/MoveRecycleBinItem.cs
index dcec2692c..711e51f71 100644
--- a/src/Commands/RecycleBin/MoveRecycleBinItem.cs
+++ b/src/Commands/RecycleBin/MoveRecycleBinItem.cs
@@ -1,8 +1,5 @@
-using System;
+using PnP.PowerShell.Commands.Base.PipeBinds;
 using System.Management.Automation;
-using Microsoft.SharePoint.Client;
-
-using PnP.PowerShell.Commands.Base.PipeBinds;
 using Resources = PnP.PowerShell.Commands.Properties.Resources;
 
 namespace PnP.PowerShell.Commands.RecycleBin
@@ -20,19 +17,17 @@ protected override void ExecuteCmdlet()
         {
             if (ParameterSpecified(nameof(Identity)))
             {
-                var item = Identity.GetRecycleBinItem(ClientContext.Site);
+                var item = Identity.GetRecycleBinItem(Connection.PnPContext);
                 if (Force || ShouldContinue(string.Format(Resources.MoveRecycleBinItemWithLeaf0ToSecondStage, item.LeafName), Resources.Confirm))
                 {
                     item.MoveToSecondStage();
-                    ClientContext.ExecuteQueryRetry();
                 }
             }
             else
             {
                 if (Force || ShouldContinue(Resources.MoveFirstStageRecycleBinItemsToSecondStage, Resources.Confirm))
                 {
-                    ClientContext.Site.RecycleBin.MoveAllToSecondStage();
-                    ClientContext.ExecuteQueryRetry();
+                    Connection.PnPContext.Site.RecycleBin.MoveAllToSecondStage();
                 }
             }
         }
diff --git a/src/Commands/RecycleBin/RestoreRecycleBinItem.cs b/src/Commands/RecycleBin/RestoreRecycleBinItem.cs
index e51637575..18ec0ce80 100644
--- a/src/Commands/RecycleBin/RestoreRecycleBinItem.cs
+++ b/src/Commands/RecycleBin/RestoreRecycleBinItem.cs
@@ -1,9 +1,7 @@
-using System;
-using System.Management.Automation;
-using Microsoft.SharePoint.Client;
-
+using Microsoft.SharePoint.Client;
 using PnP.PowerShell.Commands.Base.PipeBinds;
 using PnP.PowerShell.Commands.Utilities;
+using System.Management.Automation;
 using Resources = PnP.PowerShell.Commands.Properties.Resources;
 
 namespace PnP.PowerShell.Commands.RecycleBin
@@ -25,12 +23,11 @@ protected override void ExecuteCmdlet()
         {
             if (ParameterSpecified(nameof(Identity)))
             {
-                var recycleBinItem = Identity.GetRecycleBinItem(ClientContext.Site);
+                var recycleBinItem = Identity.GetRecycleBinItem(Connection.PnPContext);
 
                 if (Force || ShouldContinue(string.Format(Resources.RestoreRecycleBinItem, recycleBinItem.LeafName), Resources.Confirm))
                 {
                     recycleBinItem.Restore();
-                    ClientContext.ExecuteQueryRetry();
                 }
             }
             else
@@ -52,8 +49,7 @@ protected override void ExecuteCmdlet()
                 {
                     if (Force || ShouldContinue(Resources.RestoreRecycleBinItems, Resources.Confirm))
                     {
-                        ClientContext.Site.RecycleBin.RestoreAll();
-                        ClientContext.ExecuteQueryRetry();
+                        Connection.PnPContext.Site.RecycleBin.RestoreAll();
                     }
                 }
             }