public async Task <List <Channel> > Channels(string teamId)
        {
            GraphServiceClient client = await graphTokenService.GetClientForUser(new[] { "profile" });

            ITeamChannelsCollectionPage page = await client
                                               .Teams[teamId]
                                               .Channels
                                               .Request()
                                               .GetAsync();
            var data = page.ToList();

            // AddToCache(data, ChannelKey);

            return(data);
        }
Beispiel #2
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);
        }