Example #1
0
        // Create webhook subscription
        public async Task <ActionResult> CreateSubscription()
        {
            #region Create OneDriveClient for current user
            OneDriveUser user = OneDriveUser.UserForRequest(this.Request);
            if (null == user)
            {
                return(Redirect(Url.Action("Index", "Home")));
            }
            var client = await GetOneDriveClientAsync(user);

            #endregion

            // Ensure the app folder is created first
            var appFolder = await client.Drive.Special["approot"].Request().GetAsync();

            // Create a subscription on the drive
            var notificationUrl = ConfigurationManager.AppSettings["ida:NotificationUrl"];

            Models.OneDriveSubscription subscription = new OneDriveSubscription
            {
                NotificationUrl = notificationUrl,
                ClientState     = "my client state"
            };
            FixPPESubscriptionBug(user, subscription);

            // Because the OneDrive SDK does not support OneDrive subscriptions natively yet,
            // we use BaseRequest to generate a request the SDK can understand. You could also use HttpClient
            var request = new BaseRequest(client.BaseUrl + "/drive/root/subscriptions", client)
            {
                Method      = "POST",
                ContentType = "application/json"
            };

            try
            {
                var subscriptionResponse = await request.SendAsync <Models.OneDriveSubscription>(subscription);

                if (null != subscriptionResponse)
                {
                    // Store the subscription ID so we can keep track of which subscriptions are tied to which users
                    user.SubscriptionId = subscriptionResponse.SubscriptionId;

                    Models.SubscriptionViewModel viewModel = new Models.SubscriptionViewModel {
                        Subscription = subscriptionResponse
                    };
                    return(View("Subscription", viewModel));
                }
            }
            catch (Exception ex)
            {
                ViewBag.Message = ex.Message;
            }

            return(View("Error"));
        }
Example #2
0
 private static void FixPPESubscriptionBug(OneDriveUser user, OneDriveSubscription subscription)
 {
     if (user.ClientType == ClientType.Business)
     {
         subscription.Scenarios = null;
     }
     else
     {
         subscription.SubscriptionExpirationDateTime = DateTime.Now.AddDays(3);
         subscription.ClientState = null;
     }
 }
        /// <summary>
        /// Create a new notification subscription with the service.
        /// </summary>
        /// <param name="account"></param>
        /// <param name="client"></param>
        /// <param name="log"></param>
        /// <returns></returns>
        private static async Task CreateNewSubscriptionAsync(Account account, IOneDriveClient client, WebJobLogger log)
        {
            log.WriteLog("Creating subscription for account");

            // Make a request to create a new subscription
            OneDriveSubscription postSub = CreateSubscription(account);

            try
            {
                var result = await client.SendRequestAsync <OneDriveSubscription>("POST", "/special/cameraroll/subscriptions", postSub);

                account.SubscriptionIdentifier = result.Id;
                log.WriteLog("Subscription created. ID: {0}. Expiration: {1}", result.Id, result.ExpirationDateTime);
            }
            catch (Exception ex)
            {
                log.WriteLog("Error creating subscription: {0}", ex);
                // TODO: Handle errors when creating subscriptions
            }
        }
        /// <summary>
        /// PATCH an existing subscription on the service to extend the expiration time.
        /// </summary>
        /// <param name="account"></param>
        /// <param name="client"></param>
        /// <param name="log"></param>
        /// <returns></returns>
        private static async Task UpdateExistingSubscriptionAsync(Account account, IOneDriveClient client, WebJobLogger log)
        {
            log.WriteLog("Updating existing subscription");

            // Make a request to create a new subscription
            string queryUrl = "/special/cameraroll/subscriptions/" + account.SubscriptionIdentifier;
            OneDriveSubscription postSub = CreateSubscription(account);

            try
            {
                var result = await client.SendRequestAsync <OneDriveSubscription>("PATCH", queryUrl, postSub);

                account.SubscriptionIdentifier = result.Id;
                log.WriteLog("Subscription updated. ID: {0}. Expiration: {1}", result.Id, result.ExpirationDateTime);
            }
            catch (Exception ex)
            {
                log.WriteLog("Error updating subscription: {0}", ex);
                // TODO: Handle the case where the existing subscription actually doesn't exist any more.
            }
        }