skttl
8/2/2017 - 11:39 AM

Migrate from 301 Url Tracker to Skybrud.Umbraco.Redirects

Migrate from 301 Url Tracker to Skybrud.Umbraco.Redirects

This is a script that can help you migrate your redirects from 301 Url Tracker to Skybrud.Umbraco.Redirects.

The script is dependent on two pull requests I made (enabling regex'es and forwarding of query strings).

using InfoCaster.Umbraco.UrlTracker.Models;
using Skybrud.Umbraco.Redirects.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using umbraco.BusinessLogic;
using umbraco.DataLayer;
using Umbraco.Web.WebApi;

public class MigrateUrlTrackerToRedirectsController : UmbracoApiController
{
	[HttpGet]
	public List<RedirectItemRow> Migrate()
	{
		List<UrlTrackerModel> urlTrackerEntries = new List<UrlTrackerModel>();
		
		List<IParameter> parameters = new List<IParameter>();
		string query = "SELECT * FROM icUrlTracker WHERE Is404 = 0"; // remove where clause, if you want to add 404 records too.
		
		using (IRecordsReader reader = Application.SqlHelper.ExecuteReader(query, parameters.ToArray()))
		{
			while (reader.Read())
			{
				urlTrackerEntries.Add(new UrlTrackerModel(reader.GetInt("Id"), reader.GetString("OldUrl"), reader.GetString("OldUrlQueryString"), reader.GetString("OldRegex"), reader.GetInt("RedirectRootNodeId"), reader.Get<int?>("RedirectNodeId"), reader.GetString("RedirectUrl"), reader.GetInt("RedirectHttpCode"), reader.GetBoolean("RedirectPassThroughQueryString"), reader.GetBoolean("ForceRedirect"), reader.GetString("Notes"), reader.GetBoolean("Is404"), reader.GetString("Referrer"), reader.GetDateTime("Inserted")));
			}
		}

		urlTrackerEntries = urlTrackerEntries.Where(x => x.RedirectNodeIsPublished).ToList();
		

		//var entries = UrlTrackerRepository.GetUrlTrackerEntries(showAutoEntries: false);
		var rows = new List<RedirectItemRow>();

		foreach (var entry in urlTrackerEntries)
		{
			var row = new RedirectItemRow();

			row.Created = entry.Inserted.Ticks;
			row.ForwardQueryString = entry.RedirectPassThroughQueryString;
			row.IsPermanent = entry.RedirectHttpCode == 301 || entry.RedirectHttpCode == 401;
			
			if (entry.RedirectNodeId != null)
			{
				var redirectNode = Umbraco.TypedContent(entry.RedirectNodeId);
				if (redirectNode != null)
				{
					row.LinkId = redirectNode.Id;
					row.LinkName = redirectNode.Name;
					row.LinkUrl = redirectNode.Url;
				}
				else
				{
					row.LinkId = (int)entry.RedirectNodeId;
				}
			}
			else
			{
				row.LinkName = entry.Notes ?? entry.RedirectUrl;
				row.LinkUrl = entry.RedirectUrl;
			}

			var linkmode = entry.RedirectNodeId != null ? RedirectLinkMode.Content : RedirectLinkMode.Url;

			row.QueryString = entry.OldUrlQueryString;
			row.RootNodeId = Math.Max(0, entry.RedirectRootNodeId);
			row.Updated = DateTime.Now.Ticks;
			row.IsRegex = !string.IsNullOrEmpty(entry.OldRegex);
			row.Url = entry.OldRegex ?? (entry.OldUrl.StartsWith("/") ? "" : "/") + entry.OldUrl;
			

			rows.Add(row);
			try
			{

				RedirectsRepository.Current.AddRedirect(row.RootNodeId, row.Url, new RedirectLinkItem(row.LinkId, row.LinkName, row.LinkUrl, linkmode), row.IsRegex, row.ForwardQueryString);
			}
			catch(Exception e)
			{
				// just catch it, in case there a duplicate entries in UrlTracker.
			}
		}
		return rows;

	}
}