// 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")); }
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. } }