private void GenerateErrorPages(IContentService sender, ContentPublishedEventArgs e)
        {
            // only when website settings or an error page is published do we want to generate the static version
            var validAliases = new[] { "websiteSettings", "errorPage" };

            if (e.PublishedEntities.All(x => !validAliases.Contains(x.ContentType.Alias)))
            {
                // website settings or error page wasn't published, nothing to update
                return;
            }

            using (var contextReference = _contextFactory.EnsureUmbracoContext())
            {
                var originalRequestUrl = contextReference.UmbracoContext.HttpContext.Request.Url;

                // generate static error pages in the background
                Task.Run(() =>
                {
                    using (var errorService = new ErrorPageService(_contextFactory, _domainService, _logger, originalRequestUrl))
                    {
                        errorService.GenerateStaticErrorPages();
                    }
                });
                e.Messages.Add(new EventMessage("Generating error page", "The error page(s) are being regenerated, so it might take up to a minute before you see the changes on the website.", EventMessageType.Info));
            }
        }
        private void CheckForDuplicates(IContentService sender, ContentSavingEventArgs e)
        {
            var statusCodeAlias = "statusCode";

            foreach (var content in e.SavedEntities)
            {
                if (content.ContentType.Alias != "errorPage")
                {
                    // not an error page
                    continue;
                }

                var statusCode = content.GetValue <string>(statusCodeAlias);
                statusCode = Regex.Match(statusCode, @"\d+").Value;
                var errorPageService = new ErrorPageService(_contextFactory, _domainService, _logger);

                if (errorPageService.HasDuplicateErrorPage(statusCode, content.Id, content.ParentId))
                {
                    _logger.Info(GetType(), $"Saving of this item ({content.Name}) has been blocked.");
                    e.Cancel = true;
                    e.Messages.Add(new EventMessage("Saving of this item has been blocked", $"There is already an error page for status code {statusCode}.<br /> Please choose a different status code or edit the existing page instead.", EventMessageType.Warning));
                }
            }
        }