/// <summary>
        /// Adds a new redirect matching the specified inbound <paramref name="url"/>. A request to
        /// <paramref name="url"/> will automatically be redirected to the URL of the specified
        /// <paramref name="destionation"/> link.
        /// </summary>
        /// <param name="rootNodeId">THe ID of the root/side node. Use <c>0</c> for a global redirect.</param>
        /// <param name="url">The inbound URL to match.</param>
        /// <param name="destionation">An instance of <see cref="RedirectDestination"/> representing the destination link.</param>
        /// <param name="permanent">Whether the redirect should be permanent (301) or temporary (302).</param>
        /// <param name="isRegex">Whether regex should be enabled for the redirect.</param>
        /// <param name="forwardQueryString">Whether the redirect should forward the original query string.</param>
        /// <returns>An instance of <see cref="RedirectItem"/> representing the created redirect.</returns>
        public RedirectItem AddRedirect(int rootNodeId, string url, RedirectDestination destionation, bool permanent, bool isRegex, bool forwardQueryString)
        {
            var query = "";

            if (!isRegex)
            {
                string[] urlParts = url.Split('?');
                url   = urlParts[0].TrimEnd('/');
                query = urlParts.Length == 2 ? urlParts[1] : "";
            }

            if (GetRedirectByUrl(rootNodeId, url, query) != null)
            {
                throw new RedirectsException("A redirect with the specified URL already exists.");
            }

            // Initialize the new redirect and populate the properties
            RedirectItem item = new RedirectItem {
                RootId             = rootNodeId,
                LinkId             = destionation.Id,
                LinkUrl            = destionation.Url,
                LinkMode           = destionation.Type,
                Url                = url,
                QueryString        = query,
                Created            = DateTime.Now,
                Updated            = DateTime.Now,
                IsPermanent        = permanent,
                IsRegex            = isRegex,
                ForwardQueryString = forwardQueryString
            };

            using (var scope = _scopeProvider.CreateScope()) {
                var database = scope.Database;

                try {
                    // Attempt to add the redirect to the database
                    database.Insert(item.Dto);
                } catch (Exception ex) {
                    _logger.Error <RedirectsService>("Unable to insert redirect into the database", ex);
                    throw new Exception("Unable to insert redirect into the database");
                }
                scope.Complete();
            }

            // Make the call to the database
            return(GetRedirectById(item.Id));
        }
 /// <summary>
 /// Adds a new permanent redirect matching the specified inbound <paramref name="url"/>. A request to
 /// <paramref name="url"/> will automatically be redirected to the URL of the specified
 /// <paramref name="destionation"/> link.
 /// </summary>
 /// <param name="rootNodeId">THe ID of the root/side node. Use <c>0</c> for a global redirect.</param>
 /// <param name="url">The inbound URL to match.</param>
 /// <param name="destionation">An instance of <see cref="RedirectDestination"/> representing the destination link.</param>
 /// <returns>An instance of <see cref="RedirectItem"/> representing the created redirect.</returns>
 public RedirectItem AddRedirect(int rootNodeId, string url, RedirectDestination destionation)
 {
     return(AddRedirect(rootNodeId, url, destionation, true, false, false));
 }