Radarr/src/NzbDrone.Core/Datastore/Migration/170_fix_trakt_list_config.cs

265 lines
10 KiB
C#

using System;
using System.Collections.Generic;
using System.Data;
using System.Text.Json;
using System.Text.Json.Serialization;
using Dapper;
using FluentMigrator;
using NzbDrone.Common.Extensions;
using NzbDrone.Common.Serializer;
using NzbDrone.Core.Datastore.Migration.Framework;
namespace NzbDrone.Core.Datastore.Migration
{
[Migration(170)]
public class fix_trakt_list_config : NzbDroneMigrationBase
{
private readonly JsonSerializerOptions _serializerSettings;
public fix_trakt_list_config()
{
_serializerSettings = new JsonSerializerOptions
{
AllowTrailingCommas = true,
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault,
PropertyNameCaseInsensitive = true,
DictionaryKeyPolicy = JsonNamingPolicy.CamelCase,
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
WriteIndented = true
};
}
protected override void MainDbUpgrade()
{
Execute.WithConnection(FixTraktConfig);
Execute.WithConnection(RenameRadarrListType);
Execute.Sql("DELETE FROM Config WHERE[KEY] IN ('TraktAuthToken', 'TraktRefreshToken', 'TraktTokenExpiry', 'NewTraktAuthToken', 'NewTraktRefreshToken', 'NewTraktTokenExpiry')");
}
private void RenameRadarrListType(IDbConnection conn, IDbTransaction tran)
{
var rows = conn.Query<ProviderDefinition169>($"SELECT Id, Implementation, ConfigContract, Settings FROM NetImport WHERE Implementation = 'RadarrLists'");
var corrected = new List<ProviderDefinition169>();
foreach (var row in rows)
{
corrected.Add(new ProviderDefinition169
{
Id = row.Id,
Implementation = "RadarrListImport",
ConfigContract = "RadarrListSettings"
});
}
var updateSql = "UPDATE NetImport SET Implementation = @Implementation, ConfigContract = @ConfigContract WHERE Id = @Id";
conn.Execute(updateSql, corrected, transaction: tran);
}
private void FixTraktConfig(IDbConnection conn, IDbTransaction tran)
{
var rows = conn.Query<ProviderDefinition169>($"SELECT Id, Implementation, ConfigContract, Settings FROM NetImport WHERE Implementation = 'TraktImport'");
var corrected = new List<ProviderDefinition169>();
foreach (var row in rows)
{
var settings = JsonSerializer.Deserialize<TraktSettings169>(row.Settings, _serializerSettings);
if (settings.TraktListType == (int)TraktListType169.UserCustomList)
{
var newSettings = new TraktListSettings170
{
Listname = settings.Listname,
Username = settings.Username,
AuthUser = settings.Username,
Scope = settings.Scope,
AccessToken = settings.AccessToken.IsNotNullOrWhiteSpace() ? settings.AccessToken : "",
RefreshToken = settings.RefreshToken.IsNotNullOrWhiteSpace() ? settings.RefreshToken : "",
Expires = settings.Expires > DateTime.UtcNow ? settings.Expires : DateTime.UtcNow,
Link = settings.Link,
Rating = settings.Rating,
Certification = settings.Certification,
Genres = settings.Genres,
Years = settings.Years,
Limit = settings.Limit,
TraktAdditionalParameters = settings.TraktAdditionalParameters,
SignIn = settings.SignIn
};
corrected.Add(new ProviderDefinition169
{
Id = row.Id,
Implementation = "TraktListImport",
ConfigContract = "TraktListSettings",
Settings = JsonSerializer.Serialize(newSettings, _serializerSettings)
});
}
else if (settings.TraktListType == (int)TraktListType169.UserWatchedList || settings.TraktListType == (int)TraktListType169.UserWatchList)
{
var newSettings = new TraktUserSettings170
{
TraktListType = settings.TraktListType,
AuthUser = settings.Username,
Scope = settings.Scope,
AccessToken = settings.AccessToken.IsNotNullOrWhiteSpace() ? settings.AccessToken : "",
RefreshToken = settings.RefreshToken.IsNotNullOrWhiteSpace() ? settings.RefreshToken : "",
Expires = settings.Expires > DateTime.UtcNow ? settings.Expires : DateTime.UtcNow,
Link = settings.Link,
Rating = settings.Rating,
Certification = settings.Certification,
Genres = settings.Genres,
Years = settings.Years,
Limit = settings.Limit,
TraktAdditionalParameters = settings.TraktAdditionalParameters,
SignIn = settings.SignIn
};
corrected.Add(new ProviderDefinition169
{
Id = row.Id,
Implementation = "TraktUserImport",
ConfigContract = "TraktUserSettings",
Settings = JsonSerializer.Serialize(newSettings, _serializerSettings)
});
}
else
{
var newSettings = new TraktPopularSettings170
{
TraktListType = (int)Enum.Parse(typeof(TraktPopularListType170), Enum.GetName(typeof(TraktListType169), settings.TraktListType)),
AuthUser = settings.Username,
Scope = settings.Scope,
AccessToken = settings.AccessToken.IsNotNullOrWhiteSpace() ? settings.AccessToken : "",
RefreshToken = settings.RefreshToken.IsNotNullOrWhiteSpace() ? settings.RefreshToken : "",
Expires = settings.Expires > DateTime.UtcNow ? settings.Expires : DateTime.UtcNow,
Link = settings.Link,
Rating = settings.Rating,
Certification = settings.Certification,
Genres = settings.Genres,
Years = settings.Years,
Limit = settings.Limit,
TraktAdditionalParameters = settings.TraktAdditionalParameters,
SignIn = settings.SignIn
};
corrected.Add(new ProviderDefinition169
{
Id = row.Id,
Implementation = "TraktPopularImport",
ConfigContract = "TraktPopularSettings",
Settings = JsonSerializer.Serialize(newSettings, _serializerSettings)
});
}
}
Console.WriteLine(corrected.ToJson());
var updateSql = "UPDATE NetImport SET Implementation = @Implementation, ConfigContract = @ConfigContract, Settings = @Settings WHERE Id = @Id";
conn.Execute(updateSql, corrected, transaction: tran);
}
}
public class ProviderDefinition169 : ModelBase
{
public string Implementation { get; set; }
public string ConfigContract { get; set; }
public string Settings { get; set; }
}
public class TraktBaseSettings170
{
public string Scope { get; set; }
public string AuthUser { get; set; }
public string AccessToken { get; set; }
public string RefreshToken { get; set; }
public DateTime Expires { get; set; }
public string Link { get; set; }
public string Rating { get; set; }
public string Certification { get; set; }
public string Genres { get; set; }
public string Years { get; set; }
public int Limit { get; set; }
public string TraktAdditionalParameters { get; set; }
public string SignIn { get; set; }
}
public class TraktListSettings170 : TraktBaseSettings170
{
public string Username { get; set; }
public string Listname { get; set; }
}
public class TraktPopularSettings170 : TraktBaseSettings170
{
public int TraktListType { get; set; }
}
public class TraktUserSettings170 : TraktBaseSettings170
{
public int TraktListType { get; set; }
}
public class TraktSettings169
{
public string OAuthUrl { get; set; }
public string RenewUri { get; set; }
public string ClientId { get; set; }
public virtual string Scope { get; set; }
public string AccessToken { get; set; }
public string RefreshToken { get; set; }
public DateTime Expires { get; set; }
public string Link { get; set; }
public int TraktListType { get; set; }
public string Username { get; set; }
public string Listname { get; set; }
public string Rating { get; set; }
public string Certification { get; set; }
public string Genres { get; set; }
public string Years { get; set; }
public int Limit { get; set; }
public string TraktAdditionalParameters { get; set; }
public string SignIn { get; set; }
}
public enum TraktListType169
{
UserWatchList = 0,
UserWatchedList = 1,
UserCustomList = 2,
Trending = 3,
Popular = 4,
Anticipated = 5,
BoxOffice = 6,
TopWatchedByWeek = 7,
TopWatchedByMonth = 8,
TopWatchedByYear = 9,
TopWatchedByAllTime = 10
}
public enum TraktUserListType170
{
UserWatchList = 0,
UserWatchedList = 1,
UserCollectionList = 2,
}
public enum TraktPopularListType170
{
Trending = 0,
Popular = 1,
Anticipated = 2,
BoxOffice = 3,
TopWatchedByWeek = 4,
TopWatchedByMonth = 5,
TopWatchedByYear = 6,
TopWatchedByAllTime = 7
}
}