public async Task SaveTeam() { //Request all properties var request = _GraphClientService.GetGraphClient(_Logger).Teams[_TeamId].Request(); Team detail = null; for (int i = 1; i <= MgGraphRequester.MaxRetry; i++) { try { _Logger.LogTrace($"GraphURI({i}): {request.RequestUrl}"); detail = await request.GetAsync(); break; } catch (ServiceException mgsex) { if (!await MgGraphRequester.ShouldContinue(mgsex, i)) { throw; } } } var jsonFile = GetBackupTeamFile(_Options.Path, _TeamId); using System.IO.FileStream fs = System.IO.File.Create(jsonFile); _Logger.LogTrace($"File: {jsonFile}"); await JsonSerializer.SerializeAsync <Team>(fs, detail, _Options.JsonOptions); }
public async Task SaveChannel() { //Request all properties var detailRequest = _GraphClientService.GetGraphClient(_Logger).Teams[_TeamId].Channels[_ChannelId].Request(); Channel detail = null; for (int i = 1; i <= MgGraphRequester.MaxRetry; i++) { try { _Logger.LogTrace($"GraphURI({i}): {detailRequest.RequestUrl}"); detail = await detailRequest.GetAsync(); break; } catch (ServiceException mgsex) { if (!await MgGraphRequester.ShouldContinue(mgsex, i)) { throw; } } } _SaveMembers = detail.MembershipType == ChannelMembershipType.Private; var jsonFile = GetBackupChannelFile(_Options.Path, _TeamId, _ChannelId); using System.IO.FileStream fs = System.IO.File.Create(jsonFile); _Logger.LogTrace($"File: {jsonFile}"); await JsonSerializer.SerializeAsync <Channel>(fs, detail, _Options.JsonOptions); }
public async Task SaveMessageHostedContents(ChatMessage message) { if (message.DeletedDateTime != null) { return; } var detailRequestBuilder = message.ReplyToId == null ? _GraphClientService.GetGraphClient(_Logger).Teams[_TeamId].Channels[_ChannelId].Messages[message.Id].HostedContents : _GraphClientService.GetGraphClient(_Logger).Teams[_TeamId].Channels[_ChannelId].Messages[message.ReplyToId].Replies[message.Id].HostedContents; var detailRequest = detailRequestBuilder.Request(); IChatMessageHostedContentsCollectionPage list = new ChatMessageHostedContentsCollectionPage(); do { _Logger.LogTrace($"GraphURI: {detailRequest.RequestUrl}"); IChatMessageHostedContentsCollectionPage hostedContentPage = null; for (int i = 1; i <= MgGraphRequester.MaxRetry; i++) { try { _Logger.LogTrace($"GraphURI({i}): {detailRequest.RequestUrl}"); hostedContentPage = await detailRequest.GetAsync(); break; } catch (ServiceException mgsex) { if (!await MgGraphRequester.ShouldContinue(mgsex, i)) { _Logger.LogWarning(mgsex, $"Error getting HostedContent page: {detailRequest.RequestUrl}"); return; } } } foreach (var hostedContent in hostedContentPage) { _Logger.LogTrace($"HostedContent: {message.Id}|{hostedContent.Id}"); list.Add(hostedContent); await SaveHostedContentBlob(message, hostedContent, detailRequestBuilder); } detailRequest = hostedContentPage.NextPageRequest; }while (detailRequest != null); if (list.Count > 0) { await SaveHostedContentsCollection(message, list); } }
public async Task SaveMessageReplies() { //Request all properties var detailRequest = _GraphClientService.GetGraphClient(_Logger).Teams[_TeamId].Channels[_ChannelId].Messages[_MessageId].Replies.Request(); try { do { IChatMessageRepliesCollectionPage messageRepliesPage = null; for (int i = 1; i <= MgGraphRequester.MaxRetry; i++) { try { _Logger.LogTrace($"GraphURI({i}): {detailRequest.RequestUrl}"); messageRepliesPage = await detailRequest.GetAsync(); break; } catch (ServiceException mgsex) { if (!await MgGraphRequester.ShouldContinue(mgsex, i)) { throw; } } } foreach (var messageReply in messageRepliesPage) { _Logger.LogTrace($"MessageReply: {messageReply.Id}|{messageReply.ReplyToId}|{messageReply.CreatedDateTime}"); await SaveChatMessage(messageReply); await SaveMessageHostedContents(messageReply); } detailRequest = messageRepliesPage.NextPageRequest; }while (detailRequest != null); } catch (Microsoft.Graph.ServiceException messageEx) { if (messageEx.StatusCode == System.Net.HttpStatusCode.NotFound) { _Logger.LogWarning(messageEx, $"NotFound while processing reply messages: {detailRequest.RequestUrl}"); } else { _Logger.LogError(messageEx, $"Error while processing reply message: {detailRequest.RequestUrl}"); } } }
public async Task SaveMessage() { //Request all properties var detailRequest = _GraphClientService.GetGraphClient(_Logger).Teams[_TeamId].Channels[_ChannelId].Messages[_MessageId].Request(); _Logger.LogTrace($"GraphURI: {detailRequest.RequestUrl}"); try { ChatMessage detail = null; for (int i = 1; i <= MgGraphRequester.MaxRetry; i++) { try { _Logger.LogTrace($"GraphURI({i}): {detailRequest.RequestUrl}"); detail = await detailRequest.GetAsync(); _Logger.LogTrace($"Message: {detail.Id}|{detail.Subject}|{detail.CreatedDateTime}"); break; } catch (ServiceException mgsex) { if (!await MgGraphRequester.ShouldContinue(mgsex, i)) { throw; } } } await Save(detail); } catch (Microsoft.Graph.ServiceException messageEx) { if (messageEx.StatusCode == System.Net.HttpStatusCode.NotFound) { _Logger.LogWarning(messageEx, $"NotFound while processing root message: {detailRequest.RequestUrl}"); } else { _Logger.LogError(messageEx, $"Error while processing root message: {detailRequest.RequestUrl}"); } } }
public async Task SaveMembers() { var memberPageRequest = _GraphClientService.GetGraphClient(_Logger).Teams[_TeamId].Members.Request(); var listMember = new List <AadUserConversationMember>(); do { ITeamMembersCollectionPage memberPage = null; for (int i = 1; i <= MgGraphRequester.MaxRetry; i++) { try { _Logger.LogTrace($"MembersGraphURI({i}): {memberPageRequest.RequestUrl}"); memberPage = await memberPageRequest.GetAsync(); break; } catch (ServiceException mgsex) { if (!await MgGraphRequester.ShouldContinue(mgsex, i)) { throw; } } } foreach (AadUserConversationMember member in memberPage) { listMember.Add(member); _Logger.LogTrace($"Member: {member.UserId}|{member.Email}|{member.DisplayName}"); } memberPageRequest = memberPage.NextPageRequest; }while (memberPageRequest != null); var jsonFile = GetBackupTeamMembersFile(_Options.Path, _TeamId); using System.IO.FileStream fs = System.IO.File.Create(jsonFile); _Logger.LogTrace($"MemberFile: {jsonFile}"); await JsonSerializer.SerializeAsync <List <AadUserConversationMember> >(fs, listMember, _Options.JsonOptions); }
public async Task SaveHostedContentBlob(ChatMessage message, ChatMessageHostedContent hostedContent, IChatMessageHostedContentsCollectionRequestBuilder detailRequestBuilder) { var messageHostedcontentRequest = detailRequestBuilder[hostedContent.Id].Content.Request(); System.IO.Stream messageHostedcontentValue = null; for (int i = 1; i <= MgGraphRequester.MaxRetry; i++) { try { _Logger.LogTrace($"GraphURI({i}): {messageHostedcontentRequest.RequestUrl}"); messageHostedcontentValue = await messageHostedcontentRequest.GetAsync(); break; } catch (ServiceException mgsex) { if (mgsex.StatusCode == System.Net.HttpStatusCode.BadRequest)//Special case. hosted content will not return a 404 if not available :( { return; } else { if (!await MgGraphRequester.ShouldContinue(mgsex, i)) { return; } } } } var blobFile = GetBackupMessageHostedContentBlob(_Options.Path, _TeamId, _ChannelId, message, hostedContent); using System.IO.FileStream fs = System.IO.File.Create(blobFile); _Logger.LogTrace($"BlobFile: {blobFile}"); await messageHostedcontentValue.CopyToAsync(fs); }
public async Task Execute() { _Logger.LogInformation($"Version: {Core.Config.App.Version}"); if (_Options.ShouldZip) { _Logger.LogInformation($"Zip backup folder: {_Options.Path}"); } //Get teams var teamsPageRequestBase = string.IsNullOrEmpty(_Options.TeamId) ? _GraphClientService.GetGraphClient(_Logger).Me.JoinedTeams.Request() : _GraphClientService.GetGraphClient(_Logger).Me.JoinedTeams.Request().Filter($"Id eq '{_Options.TeamId}'"); var teamsPageRequest = teamsPageRequestBase .Select(g => new { g.Id, g.DisplayName }); do { _Logger.LogTrace($"GraphUri: {teamsPageRequest.RequestUrl}"); IUserJoinedTeamsCollectionWithReferencesPage teamsPage = null; for (int i = 1; i <= MgGraphRequester.MaxRetry; i++) { try { teamsPage = await teamsPageRequest.GetAsync(); break; } catch (ServiceException mgsex) { if (!await MgGraphRequester.ShouldContinue(mgsex, i)) { _Logger.LogError(mgsex, $"Team read page error: {teamsPageRequest.RequestUrl}"); throw; } } } //Process all selected teams foreach (var team in teamsPage) { _Logger.LogInformation($"Team: {team.Id} - {team.DisplayName}"); //Save team var mgteam = new Data.MgTeam(_LoggerMgTeam, _Options, _GraphClientService, team.Id); await mgteam.Save(); //Get all channels var channelPageRequest = _GraphClientService.GetGraphClient(_Logger).Teams[team.Id].Channels .Request() .Select(g => new { g.Id, g.DisplayName, g.MembershipType }); do { ITeamChannelsCollectionPage channelPage = null; for (int i = 1; i <= MgGraphRequester.MaxRetry; i++) { try { _Logger.LogTrace($"ChannelGraphUri({i}): {channelPageRequest.RequestUrl}"); channelPage = await channelPageRequest.GetAsync(); break; } catch (ServiceException mgsex) { if (!await MgGraphRequester.ShouldContinue(mgsex, i)) { _Logger.LogError(mgsex, $"Team channel read page error: {channelPageRequest.RequestUrl}"); throw; } } } //Process all channels foreach (var channel in channelPage) { _Logger.LogInformation($"Channel: {channel.Id} - {channel.DisplayName} - {channel.MembershipType}"); //Save channel var mgchannel = new Data.MgTeamChannel(_LoggerMgChannel, _Options, _GraphClientService, team.Id, channel.Id); await mgchannel.Save(); //Get all channel messages //if the current principal is not part of the private channel (only delegate permission) the get channel messages will fail if the user is not part of the channel! //for now I go with a try/catch try { var messagePageRequest = _GraphClientService.GetGraphClient(_Logger).Teams[team.Id].Channels[channel.Id].Messages.Request(); do { _Logger.LogTrace($"MessageGraphUri: {messagePageRequest.RequestUrl}"); IChannelMessagesCollectionPage messagePage = null; for (int i = 1; i <= MgGraphRequester.MaxRetry; i++) { try { messagePage = await messagePageRequest.GetAsync(); break; } catch (ServiceException mgsex) { if (!await MgGraphRequester.ShouldContinue(mgsex, i)) { _Logger.LogError(mgsex, $"Message read page error: {messagePageRequest.RequestUrl}"); throw; } } } foreach (var message in messagePage) { _Logger.LogDebug($"Message: {message.Id} - {message.Subject} - {message.Summary}"); var mgmessage = new Data.MgTeamChannelMessage(_LoggerMgChannel, _Options, _GraphClientService, team.Id, channel.Id, message.Id); if (message.DeletedDateTime != null) { await mgmessage.SaveChatMessage(message); } else { await mgmessage.Save(message); } } messagePageRequest = messagePage.NextPageRequest; }while (messagePageRequest != null); } catch (Microsoft.Graph.ServiceException messageEx) { if (channel.MembershipType == Microsoft.Graph.ChannelMembershipType.Private && messageEx.StatusCode == System.Net.HttpStatusCode.Forbidden) { _Logger.LogWarning($"Error while accessing messages in private channel: {channel.Id} - {channel.DisplayName} - {channel.MembershipType} - {messageEx.StatusCode}"); } else { _Logger.LogError(messageEx, $"Error while gettings messages from channel: {channel.Id} - {channel.DisplayName} - {channel.MembershipType} - {messageEx.StatusCode}"); } } } channelPageRequest = channelPage.NextPageRequest; }while (channelPageRequest != null); if (_Options.ShouldZip) { var zipfile = MgTeam.GetBackupTeamZipFile(_Options.Path, team.Id); try { _Logger.LogInformation($"Zip Team: {team.Id} - {team.DisplayName} - {zipfile}"); if (System.IO.File.Exists(zipfile)) { System.IO.File.Delete(zipfile); } System.IO.Compression.ZipFile.CreateFromDirectory(MgTeam.GetBackupPath(_Options.Path, team.Id), zipfile); } catch (Exception ex) { _Logger.LogError(ex, $"Team zip error: {zipfile}"); } } } teamsPageRequest = teamsPage.NextPageRequest; }while (teamsPageRequest != null); }