public void IdIsRemovedFromTheUrl()
        {
            var url       = new Uri("https://www.example.org");
            var converter = new FakeSearchQueryConverter();
            var encoder   = new JobAlertIdEncoder(converter);
            var id        = encoder.GenerateId(new JobAlert()
            {
                Email = "*****@*****.**", Query = new JobSearchQuery()
                {
                    Keywords = "test"
                }
            });
            var urlWithId = encoder.AddIdToUrl(url, id);

            var urlWithoutId = encoder.RemoveIdFromUrl(urlWithId);

            Assert.AreEqual(url, urlWithoutId);
        }
        public async Task <ActionResult> ReplaceAlert(JobSearchQuery searchQuery)
        {
            if (ModelState.IsValid)
            {
                var converter = new JobSearchQueryConverter(ConfigurationManager.AppSettings["TranslateObsoleteJobTypes"]?.ToUpperInvariant() == "TRUE");
                var encoder   = new JobAlertIdEncoder(converter);
                var alertId   = encoder.ParseIdFromUrl(new Uri(Request.Url, Request.RawUrl));
                var repo      = new AzureTableStorageAlertsRepository(converter, ConfigurationManager.ConnectionStrings["Escc.EastSussexGovUK.Umbraco.AzureStorage"].ConnectionString);
                var oldAlert  = repo.GetAlertById(alertId);

                var newAlert = new JobAlert()
                {
                    Query     = searchQuery,
                    Email     = oldAlert.Email,
                    Frequency = searchQuery.Frequency,
                    JobsSet   = searchQuery.JobsSet
                };
                newAlert.AlertId = encoder.GenerateId(newAlert);

                if (oldAlert.AlertId == newAlert.AlertId)
                {
                    // The alert id didn't change but the frequency may have, so update the existing alert
                    await repo.SaveAlert(newAlert);
                }
                else
                {
                    // The alert id, and therefore the criteria, changed, so save the new alert and delete the old one
                    await repo.SaveAlert(newAlert);

                    await repo.CancelAlert(oldAlert.AlertId);
                }

                var urlWithoutQueryString = new Uri(Request.Url, new Uri(Request.Url, Request.RawUrl).AbsolutePath);
                var urlWithoutAlertId     = encoder.RemoveIdFromUrl(urlWithoutQueryString);
                var urlWithAlertId        = encoder.AddIdToUrl(urlWithoutAlertId, newAlert.AlertId);

                return(new RedirectResult(urlWithAlertId + "?updated=1"));
            }
            else
            {
                return(new RedirectResult(Request.RawUrl));
            }
        }
        public bool TryFindContent(PublishedContentRequest contentRequest)
        {
            try
            {
                if (contentRequest == null)
                {
                    throw new ArgumentNullException(nameof(contentRequest));
                }

                var converter = new JobSearchQueryConverter(ConfigurationManager.AppSettings["TranslateObsoleteJobTypes"]?.ToUpperInvariant() == "TRUE");
                var encoder   = new JobAlertIdEncoder(converter);
                var alertId   = encoder.ParseIdFromUrl(contentRequest.Uri);
                if (String.IsNullOrEmpty(alertId))
                {
                    return(false); // not found
                }

                // if we remove the suffix, does that match a Job Alerts node?
                var contentCache = UmbracoContext.Current.ContentCache;
                var content      = contentCache.GetByRoute(encoder.RemoveIdFromUrl(contentRequest.Uri).AbsolutePath);
                if (content == null)
                {
                    return(false);                 // not found
                }
                if (content.ContentType.Alias != "JobAlerts")
                {
                    return(false);                                          // not found
                }
                // render that node
                contentRequest.PublishedContent = content;
                return(true);
            }
            catch (Exception e)
            {
                e.ToExceptionless().Submit();
                return(false);
            }
        }