private void PublishedContentHandler(object sender, ContentEventArgs e)
        {
            if (Configuration.Configuration.AddAutomaticRedirects == false)
            {
                return;
            }

            var lastVersion = ContentVersionRepository
                              .Service
                              .List(e.ContentLink)
                              .Where(p => p.Status == VersionStatus.PreviouslyPublished)
                              .OrderByDescending(p => p.Saved)
                              .FirstOrDefault();

            if (lastVersion == null)
            {
                return;
            }

            var oldUrl = GetContentUrl(lastVersion.ContentLink, lastVersion.LanguageBranch);

            if (oldUrl == null)
            {
                return;
            }

            var newUrl = GetContentUrl(e.ContentLink, e.Content.LanguageBranch());

            if (oldUrl == newUrl)
            {
                return;
            }

            var lastVersionPageData = ContentRepository.Service.Get <IContentData>(lastVersion.ContentLink) as PageData;

            if (lastVersionPageData == null)
            {
                return;
            }

            SystemRedirectsActions.AddRedirects(lastVersionPageData, oldUrl, SystemRedirectsHelper.GetCultureInfo(e), SystemRedirectReason.PublishedContent);
        }
        private void MovedContentHandler(object sender, ContentEventArgs e)
        {
            if (Configuration.Configuration.AddAutomaticRedirects == false)
            {
                return;
            }

            if (!(e.Content is IChangeTrackable))
            {
                return;
            }

            var originalParent = (e as MoveContentEventArgs)?.OriginalParent;

            if (originalParent == ContentReference.WasteBasket)
            {
                // do not create when restoring, cause not need to do redirects from waste basket.
                // however, DO redirect when moving to waste basket, because restore may be to another place
                return;
            }

            foreach (var language in LanguageBranchRepository.Service.ListEnabled())
            {
                if (!(ContentRepository.Service.Get <IContentData>(e.ContentLink, language.Culture) is PageData pageData))
                {
                    continue;
                }

                var oldUrl = GetContentUrl(originalParent, language.Culture.Name, false);
                if (oldUrl == null)
                {
                    continue;
                }

                SystemRedirectsActions.AddRedirects(pageData, oldUrl + pageData.URLSegment, language.Culture, SystemRedirectReason.MovedContent);
            }
        }
        private void SavedContentHandler(object sender, ContentEventArgs e)
        {
            if (Configuration.Configuration.AddAutomaticRedirects == false)
            {
                return;
            }

            var oldUrl = e.Items[OldUrlKey]?.ToString();

            if (oldUrl == null)
            {
                return;
            }

            var newUrl = UrlResolver.Service.GetUrl(e.ContentLink, null);

            if (newUrl != oldUrl)
            {
                var pageData = ContentRepository.Service.Get <IContentData>(e.ContentLink) as PageData;
                SystemRedirectsActions.AddRedirects(pageData, oldUrl, SystemRedirectsHelper.GetCultureInfo(e), SystemRedirectReason.SavedContent);
            }

            e.Items.Remove(OldUrlKey);
        }
 private static void DeletedContentHandler(object sender, ContentEventArgs e)
 {
     SystemRedirectsActions.DeleteRedirects(e.ContentLink, ((DeleteContentEventArgs)e).DeletedDescendents);
 }