private static async Task WatchTeamSiteAsync(KeyValuePair <string, DeltaLinks> pair) { try { //var authProvider = new DeviceCodeAuthProvider(); //var graphClient = new GraphServiceClient(authProvider); IDriveItemDeltaCollectionPage deltaCollection; var deltaLinks = new DeltaLinks { }; if (pair.Value == null) { //var item = await graphClient.Groups[pair.Key] // .Drive // .Request() // .Select("SharepointIds,WebUrl") // .GetAsync(); //List<QueryOption> queryOptions = new List<QueryOption> // { // new QueryOption("$filter", $@"WebUrl eq 'https://mmoustafa.sharepoint.com/sites/Public991/Shared Documents/'") // }; //deltaCollection = await graphClient.Sites[item.SharePointIds.SiteId].Drive.Root // .Delta() // .Request(queryOptions) // .Select("CreatedDateTime,Deleted,File,Folder,LastModifiedDateTime,Root,SharepointIds,Size,WebUrl") // .GetAsync(); deltaCollection = await graphClient.Groups[pair.Key].Drive.Root .Delta() .Request() .Select("CreatedDateTime,Deleted,File,Folder,LastModifiedDateTime,Root,SharepointIds,Size,WebUrl") .GetAsync(); deltaLinks.DeltaCollection = deltaCollection; deltaLinks.LastSyncDate = DateTime.UtcNow.Ticks / 100000000; libraryDeltaCalls++; } else { deltaLinks.LastSyncDate = pair.Value.LastSyncDate; deltaCollection = pair.Value.DeltaCollection; deltaCollection.InitializeNextPageRequest(graphClient, pair.Value.DeltaLink); deltaCollection = await deltaCollection.NextPageRequest .GetAsync(); libraryDeltaCalls++; } if (deltaCollection.CurrentPage.Count > 0) { deltaLinks.NoChanges = false; if (!firstCall) { foreach (var drive in deltaCollection.CurrentPage) { await ProcessChangesAsync(drive, deltaLinks.LastSyncDate); } } //else // foreach (var item in deltaCollection.CurrentPage) // Console.WriteLine($"{item.WebUrl}"); } else { deltaLinks.NoChanges = true; } if (deltaCollection.AdditionalData.ContainsKey("@odata.nextLink") && deltaCollection.AdditionalData["@odata.nextLink"] != null) { deltaLinks.DeltaLink = deltaCollection.AdditionalData["@odata.nextLink"].ToString(); deltaLinks.DeltaCollection = deltaCollection; pair = new KeyValuePair <string, DeltaLinks>(pair.Key, deltaLinks); await WatchTeamSiteAsync(pair); } else if (deltaCollection.AdditionalData["@odata.deltaLink"] != null) { deltaLinks.DeltaLink = deltaCollection.AdditionalData["@odata.deltaLink"].ToString(); } deltaLinks.DeltaCollection = deltaCollection; deltaLinks.LastSyncDate = DateTime.UtcNow.Ticks / 100000000; teamSitesDeltaLinks[pair.Key] = deltaLinks; } catch (Exception exception) { if (exception.Message.Contains("Resource provisioning is in progress. Please try again.") || exception.Message.Contains("Resource is not found.")) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine($"Error WatchTeamSiteAsync site {pair.Key}: {exception.Message}"); Console.ResetColor(); //await Task.Delay(2 * 1000); //await WatchTeamSiteAsync(pair); } else { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine($"Error WatchTeamSiteAsync site {pair.Key}: {exception.InnerException.Message}"); //Console.WriteLine($"{exception.InnerException}"); Console.ResetColor(); await Task.Delay(1000); await WatchTeamSiteAsync(pair); } } }
private static async Task WatchTeamSiteAsync(KeyValuePair <string, DeltaLinks> pair) { try { IDriveItemDeltaCollectionPage deltaCollection; var deltaLinks = new DeltaLinks { }; if (pair.Value == null) { deltaCollection = await graphClient.Groups[pair.Key].Drive.Root .Delta() .Request() .Select("CreatedDateTime,Deleted,File,Folder,LastModifiedDateTime,Root,SharepointIds,Size,WebUrl") .GetAsync(); deltaLinks.DeltaCollection = deltaCollection; deltaLinks.LastSyncDate = DateTime.UtcNow.Ticks / 100000000; libraryDeltaCalls++; } else { deltaLinks.LastSyncDate = pair.Value.LastSyncDate; deltaCollection = pair.Value.DeltaCollection; deltaCollection.InitializeNextPageRequest(graphClient, pair.Value.DeltaLink); deltaCollection = await deltaCollection.NextPageRequest .GetAsync(); libraryDeltaCalls++; } if (deltaCollection.CurrentPage.Count > 0) { if (!firstCall) { foreach (var drive in deltaCollection.CurrentPage) { await ProcessChangesAsync(drive, deltaLinks.LastSyncDate); } } //else // foreach (var item in deltaCollection.CurrentPage) // Console.WriteLine($"{item.WebUrl}"); } if (deltaCollection.AdditionalData.ContainsKey("@odata.nextLink") && deltaCollection.AdditionalData["@odata.nextLink"] != null) { deltaLinks.DeltaLink = deltaCollection.AdditionalData["@odata.nextLink"].ToString(); deltaLinks.DeltaCollection = deltaCollection; pair = new KeyValuePair <string, DeltaLinks>(pair.Key, deltaLinks); await WatchTeamSiteAsync(pair); } else if (deltaCollection.AdditionalData["@odata.deltaLink"] != null) { deltaLinks.DeltaLink = deltaCollection.AdditionalData["@odata.deltaLink"].ToString(); } deltaLinks.DeltaCollection = deltaCollection; deltaLinks.LastSyncDate = DateTime.UtcNow.Ticks / 100000000; teamSitesDeltaLinks[pair.Key] = deltaLinks; } catch (Exception exception) { if (exception.Message.Contains("Resource provisioning is in progress. Please try again.") || exception.Message.Contains("Resource is not found.")) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine($"Error WatchTeamSiteAsync site {pair.Key}: {exception.Message}"); Console.ResetColor(); //await Task.Delay(2 * 1000); //await WatchTeamSiteAsync(pair); } else { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine($"Error WatchTeamSiteAsync site {pair.Key}: {exception.Message}"); Console.ResetColor(); } } }
public async static Task WatchTeamSite(IList <string> keys) { try { //var watch = new System.Diagnostics.Stopwatch(); //watch.Start(); var batchRequestContent = new BatchRequestContent(); // 1. construct a Batch request foreach (var key in keys) { if (teamSitesDeltaLinks[key] == null) { teamSitesDeltaLinks[key] = new DeltaLinks() { LastSyncDate = DateTime.UtcNow.Ticks / 100000000, DeltaLink = graphClient.Groups[key].Drive.Root .Delta() .Request() .RequestUrl + "?$select=CreatedDateTime,Deleted,File,Folder,LastModifiedDateTime,Root,SharepointIds,Size,WebUrl" } } ; var request = new HttpRequestMessage(HttpMethod.Get, teamSitesDeltaLinks[key].DeltaLink); var requestStep = new BatchRequestStep($"{key}", request, null); batchRequestContent.AddBatchRequestStep(requestStep); } //3. Submit request var batchRequest = new HttpRequestMessage(HttpMethod.Post, "https://graph.microsoft.com/v1.0/$batch"); batchRequest.Content = batchRequestContent; await graphClient.AuthenticationProvider.AuthenticateRequestAsync(batchRequest); var httpClient = new HttpClient(); var batchResponse = await httpClient.SendAsync(batchRequest); // 3. Process response var batchResponseContent = new BatchResponseContent(batchResponse); var responses = await batchResponseContent.GetResponsesAsync(); foreach (var response in responses) { if (!response.Value.IsSuccessStatusCode) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine($"Issue on response {response.Value}"); Console.ResetColor(); continue; } //Console.WriteLine(response.Key); var deltaResponse = JsonConvert.DeserializeObject <DeltaResponse> (await response.Value.Content.ReadAsStringAsync()); teamSitesDeltaLinks[response.Key].DeltaLink = deltaResponse.DeltaLink; if (!firstCall) { foreach (var drive in deltaResponse.DriveItems) { await ProcessChangesAsync(drive, teamSitesDeltaLinks[response.Key].LastSyncDate); } } } //watch.Stop(); //Console.WriteLine($"Checking Teams completed on {watch.ElapsedMilliseconds / 1000} seconds"); libraryDeltaCalls++; } catch (Exception exc) { AddException(exc, "WatchTeamSite"); if (exc.InnerException.Message.Contains("Authentication failed")) { Console.WriteLine($"retry again due {exc.InnerException.Message}"); await Task.Delay(500); await WatchTeamSite(keys); } else { Console.WriteLine(exc.Message); Console.WriteLine(exc.InnerException.Message); Console.WriteLine(exc.StackTrace); } } }