/// <summary>
        /// Controller servicing data for the add-in's home page
        /// </summary>
        /// <returns></returns>
        public async Task <ActionResult> Index()
        {
            using (var cc = ContextProvider.GetWebApplicationClientContext(Settings.SiteCollection))
            {
                if (cc != null)
                {
                    // Usage tracking
                    SampleUsageTracking(cc);

                    // Hookup event to capture access token
                    cc.ExecutingWebRequest += Cc_ExecutingWebRequest;

                    var lists = cc.Web.Lists;
                    cc.Load(cc.Web, w => w.Url);
                    cc.Load(lists, l => l.Include(p => p.Title, p => p.Id, p => p.Hidden));
                    cc.ExecuteQueryRetry();

                    WebHookManager webHookManager = new WebHookManager();

                    // Grab the current lists
                    List <SharePointList>    modelLists = new List <SharePointList>();
                    List <SubscriptionModel> webHooks   = new List <SubscriptionModel>();

                    foreach (var list in lists)
                    {
                        // Let's only take the hidden lists
                        if (!list.Hidden)
                        {
                            modelLists.Add(new SharePointList()
                            {
                                Title = list.Title, Id = list.Id
                            });

                            // Grab the currently applied web hooks
                            var existingWebHooks = await webHookManager.GetListWebHooksAsync(cc.Web.Url, list.Id.ToString(), this.accessToken);

                            if (existingWebHooks.Value.Count > 0)
                            {
                                foreach (var existingWebHook in existingWebHooks.Value)
                                {
                                    webHooks.Add(existingWebHook);
                                }
                            }
                        }
                    }

                    // Prepare the data model
                    SharePointSiteModel sharePointSiteModel = new SharePointSiteModel();
                    sharePointSiteModel.SharePointSite         = Settings.SiteCollection;
                    sharePointSiteModel.Lists                  = modelLists;
                    sharePointSiteModel.WebHooks               = webHooks;
                    sharePointSiteModel.SelectedSharePointList = modelLists[0].Id;

                    return(View(sharePointSiteModel));
                }
                else
                {
                    throw new Exception("Issue with obtaining a valid client context object, should not happen");
                }
            }
        }
        private async Task ExecuteWebHooksLogic()
        {
            using (var cc = spContext.CreateAppOnlyClientContextForSPAppWeb())
            {
                cc.ExecutingWebRequest += Cc_ExecutingWebRequest;

                var lists = cc.Web.Lists;
                cc.Load(cc.Web, w => w.Url);
                cc.Load(lists, l => l.Include(p => p.Title, p => p.Id, p => p.Hidden));
                cc.ExecuteQueryRetry();

                WebHookManager webHookManager = new WebHookManager();

                // Grab the current lists
                List <SharePointList>    modelLists = new List <SharePointList>();
                List <SubscriptionModel> webHooks   = new List <SubscriptionModel>();

                foreach (var list in lists)
                {
                    if (!list.Hidden)
                    {
                        modelLists.Add(new SharePointList()
                        {
                            Title = list.Title, Id = list.Id
                        });
                        var existingWebHooks = await webHookManager.GetListWebHooksAsync(cc.Web.Url, list.Id.ToString(), this.accessToken);

                        if (existingWebHooks.Value.Count > 0)
                        {
                            foreach (var existingWebHook in existingWebHooks.Value)
                            {
                                webHooks.Add(existingWebHook);
                            }
                        }
                    }
                }

                SharePointSiteModel sharePointSiteModel = new SharePointSiteModel();
                sharePointSiteModel.Lists    = modelLists;
                sharePointSiteModel.WebHooks = webHooks;
                sharePointSiteModel.SelectedSharePointList = modelLists[0].Id;


                phWebHookTable.Controls.Clear();
                if (sharePointSiteModel.WebHooks.Count() == 0)
                {
                    phWebHookTable.Controls.Add(new Literal()
                    {
                        Text = "No web hooks..."
                    });
                }
                else
                {
                    StringBuilder sb = new StringBuilder();
                    sb.Append("<table><tr><th>Actions</th><th>ID</th><th>List name</th><th>Notification URL</th><th>Expiration time</th></tr>");
                    foreach (var webHook in sharePointSiteModel.WebHooks)
                    {
                        var    list     = sharePointSiteModel.Lists.Where(f => f.Id == new Guid(webHook.Resource)).FirstOrDefault();
                        string listName = "";
                        if (list != null)
                        {
                            listName = String.Format("{0} - {1}", list.Title, webHook.Resource);
                        }
                        sb.Append($"<tr>");
                        sb.Append($"<td><a href='javascript:__doPostBack(\"deletewebhook\",\"{webHook.Id}||{list.Id.ToString("D")}\");'>Delete</a></td>");
                        sb.Append($"<td>{webHook.Id}</td>");
                        sb.Append($"<td>{listName}</td>");
                        sb.Append($"<td>{webHook.NotificationUrl}</td>");
                        sb.Append($"<td>{webHook.ExpirationDateTime}</td>");
                        sb.Append($"</tr>");
                    }
                    sb.Append("</table>");
                    phWebHookTable.Controls.Add(new Literal()
                    {
                        Text = sb.ToString()
                    });
                }

                ListDropDown.DataSource = from l in sharePointSiteModel.Lists
                                          select new System.Web.UI.WebControls.ListItem()
                {
                    Value = l.Id.ToString("D"), Text = l.Title + "||" + l.Id.ToString("D")
                };
                ListDropDown.DataBind();
            }
        }