Esempio n. 1
0
        private async Task GetSubscriptions()
        {
            try
            {
                IGraphServiceSubscriptionsCollectionPage subscriptionCollectionPage = await this.Client.Subscriptions.Request().GetAsync().ConfigureAwait(false);

                IGraphServiceSubscriptionsCollectionRequest subscriptionsNextpageRequest = subscriptionCollectionPage.NextPageRequest;

                foreach (Subscription subscription in subscriptionCollectionPage.CurrentPage)
                {
                    this.TeamsSubscriptions.TryAdd(subscription.Id, subscription);
                }

                while (subscriptionsNextpageRequest != null)
                {
                    IGraphServiceSubscriptionsCollectionPage subscriptionsNextPage = await subscriptionsNextpageRequest.GetAsync().ConfigureAwait(false);

                    subscriptionsNextpageRequest = subscriptionsNextPage.NextPageRequest;

                    foreach (Subscription subscription in subscriptionsNextPage.CurrentPage)
                    {
                        this.TeamsSubscriptions.TryAdd(subscription.Id, subscription);
                    }
                }

                await this.RenewSubscriptions().ConfigureAwait(false);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Exception while getting exisiting subscriptions: {ex}");
            }
        }
Esempio n. 2
0
        private static string GetSubscriptionToUpdate(string notificationUrl, IGraphServiceSubscriptionsCollectionPage subscriptions)
        {
            foreach (var subscription in subscriptions)
            {
                if (subscription.NotificationUrl == notificationUrl)
                {
                    return(subscription.Id);
                }
            }

            return(null);
        }
        public async Task <ActionResult> GetSubscriptions()
        {
            try
            {
                var startDateTime = DateTime.Now;
                var token         = string.Empty;

                if (Request.Headers.ContainsKey("Authorization"))
                {
                    token = Request.Headers["Authorization"].ToString()?.Split(" ")?[1];
                }

                _graphService = _graphServiceProvider.GetService(token);

                IGraphServiceSubscriptionsCollectionPage subscriptions = await _graphService.GetListSubscriptionsAsync();

                var sdkQueryBuilder  = new StringBuilder();
                var restQueryBuilder = new StringBuilder();

                sdkQueryBuilder.Append("graphClient.Subscriptions.Request().GetAsync()");

                restQueryBuilder.Append($"<a href=\"https://developer.microsoft.com/en-us/graph/graph-explorer?request=subscriptions&&method=GET&version={_graphService.GraphUrlVersion}&GraphUrl=https://graph.microsoft.com\" target=\"_blank\">https://graph.microsoft.com/{_graphService.GraphUrlVersion}/subscriptions</a>");

                var subscriptionResultModels = subscriptions?.ToList()?.Select(sa => new SubscriptionResultModel
                {
                    Id                 = sa.Id,
                    Resource           = sa.Resource,
                    ExpirationDateTime = sa.ExpirationDateTime,
                    ClientState        = sa.ClientState,
                    NotificationUrl    = sa.NotificationUrl
                }) ?? Enumerable.Empty <SubscriptionResultModel>();

                // Save queries to session
                var resultQueries = new ResultQueriesViewModel(sdkQueryBuilder.ToString(), restQueryBuilder.ToString());

                SubscriptionResponse subscriptionResponse = new SubscriptionResponse(subscriptionResultModels, resultQueries);

                Debug.WriteLine($"SubscriptionController GetSubscriptions execution time: {DateTime.Now - startDateTime}");
                return(Ok(subscriptionResponse));
            }
            catch (Exception exception)
            {
                return(BadRequest(exception.Message));
            }
        }
Esempio n. 4
0
        private async Task <Subscription> CreateSubscriptionWithResource(string resource)
        {
            if (string.IsNullOrEmpty(resource))
            {
                return(null);
            }
            var graphServiceClient = GetGraphClient();

            if (Subscriptions.Any(s => s.Value.Resource == resource))
            {
                return(null);
            }
            IGraphServiceSubscriptionsCollectionPage existingSubscriptions = null;

            try
            {
                existingSubscriptions = await graphServiceClient
                                        .Subscriptions
                                        .Request().
                                        GetAsync();
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, $"CreateNewSubscription-ExistingSubscriptions-Failed: {resource}");
                return(null);
            }
            var notificationUrl      = _config["BaseUrl"] + "/api/notifications";
            var existingSubscription = existingSubscriptions.FirstOrDefault(s => s.Resource == resource);

            if (existingSubscription != null && existingSubscription.NotificationUrl != notificationUrl)
            {
                _logger.LogWarning($"CreateNewSubscription-ExistingSubscriptionFound: {resource}");
                DeleteSubscription(existingSubscription);
                existingSubscription = null;
            }
            if (existingSubscription == null)
            {
                var sub = new Subscription
                {
                    Resource                 = resource,
                    ChangeType               = "created",
                    NotificationUrl          = notificationUrl,
                    ClientState              = Guid.NewGuid().ToString(),
                    ExpirationDateTime       = DateTime.UtcNow + new TimeSpan(days: 0, hours: 0, minutes: 10, seconds: 0),
                    IncludeProperties        = false,
                    LifecycleNotificationUrl = _config["BaseUrl"] + "/api/webhookLifecyle",
                    AdditionalData           = new Dictionary <string, object>()
                    {
                        ["includeResourceData"]     = true,
                        ["encryptionCertificate"]   = _config["SelfSignedCert"],
                        ["encryptionCertificateId"] = "readchannelmessage",
                    }
                };
                try
                {
                    existingSubscription = await graphServiceClient
                                           .Subscriptions
                                           .Request()
                                           .AddAsync(sub);
                }
                catch (Exception ex)
                {
                    _logger.LogError(ex, $"CreateNewSubscription-Failed: {resource}");
                    return(null);
                }
            }
            Subscriptions[existingSubscription.Id] = existingSubscription;
            _logger.LogWarning($"Subscription Created for TeamId: {resource}");
            return(existingSubscription);
        }
        private async Task <Subscription> CreateSubscriptionWithResource(string resource)
        {
            if (string.IsNullOrEmpty(resource))
            {
                return(null);
            }

            var graphServiceClient = GetGraphClient();

            if (Subscriptions.Any(s => s.Value.Resource == resource && s.Value.ExpirationDateTime < DateTime.UtcNow))
            {
                return(null);
            }

            IGraphServiceSubscriptionsCollectionPage existingSubscriptions = null;

            try
            {
                existingSubscriptions = await graphServiceClient
                                        .Subscriptions
                                        .Request().
                                        GetAsync();
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, $"CreateNewSubscription-ExistingSubscriptions-Failed: {resource}");
                return(null);
            }

            var notificationUrl = _config["BaseUrl"] + "/api/notifications";

            var existingSubscription = existingSubscriptions.FirstOrDefault(s => s.Resource == resource);

            if (existingSubscription != null && existingSubscription.NotificationUrl != notificationUrl)
            {
                _logger.LogWarning($"CreateNewSubscription-ExistingSubscriptionFound: {resource}");
                await DeleteSubscription(existingSubscription);

                existingSubscription = null;
            }
            if (existingSubscription == null)
            {
                var sub = new Subscription
                {
                    Resource                  = resource,
                    ChangeType                = "updated",
                    NotificationUrl           = notificationUrl,
                    ClientState               = "ClientState",
                    ExpirationDateTime        = DateTime.UtcNow + new TimeSpan(days: 0, hours: 0, minutes: SubscriptionExpirationTimeInMinutes, seconds: 0),
                    LatestSupportedTlsVersion = "v1_2",
                };

                try
                {
                    existingSubscription = await graphServiceClient
                                           .Subscriptions
                                           .Request()
                                           .AddAsync(sub);
                }
                catch (Exception ex)
                {
                    _logger.LogError(ex, $"CreateNewSubscription-Failed: {resource}");
                    return(null);
                }
            }

            Subscriptions[existingSubscription.Id] = existingSubscription;

            _logger.LogWarning($"Subscription Created for TeamId: {resource}");

            return(existingSubscription);
        }