Example #1
0
        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}");
                }
            }
        }
Example #6
0
        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);
        }
Example #8
0
        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);
        }