New: Migrate Discord from Slack to Discord notifications

pull/6853/head
Robin Dadswell 2 years ago
parent 41dd678dfd
commit 5ed034320e

@ -0,0 +1,71 @@
using System.Linq;
using System.Text.Json;
using System.Text.Json.Serialization;
using FluentAssertions;
using NUnit.Framework;
using NzbDrone.Common.Serializer;
using NzbDrone.Core.Datastore.Migration;
using NzbDrone.Core.Test.Framework;
namespace NzbDrone.Core.Test.Datastore.Migration
{
[TestFixture]
public class migrate_discord_from_slackFixture : MigrationTest<migrate_discord_from_slack>
{
private readonly JsonSerializerOptions _serializerSettings;
public migrate_discord_from_slackFixture()
{
_serializerSettings = new JsonSerializerOptions
{
AllowTrailingCommas = true,
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault,
PropertyNameCaseInsensitive = true,
DictionaryKeyPolicy = JsonNamingPolicy.CamelCase,
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
WriteIndented = true
};
_serializerSettings.Converters.Add(new JsonStringEnumConverter(JsonNamingPolicy.CamelCase, true));
}
[Test]
public void should_replace_old_url()
{
var webhookUrl = "https://discord.com/api/webhooks/922499153416847361/f9CAcD5i_E_-0AoPfMVa8igVK8h271HpJDbd6euUrPh9KonWlMCziLOSMmD-2SQ4CHmX/slack";
var db = WithMigrationTestDb(c =>
{
c.Insert.IntoTable("Notifications").Row(new
{
Name = "SlackDiscord",
Implementation = "Slack",
Settings = new SlackNotificationSettings201
{
Icon = "TestURL",
Username = "TestUsername",
WebHookUrl = webhookUrl
}.ToJson(),
ConfigContract = "SlackSettings",
OnGrab = true,
OnDownload = true,
OnUpgrade = true,
OnRename = true,
OnHealthIssue = true,
OnMovieDelete = true,
OnMovieFileDelete = true,
OnMovieFileDeleteForUpgrade = true,
IncludeHealthWarnings = true
});
});
var items = db.Query<NotificationEntity201>("SELECT Id,ConfigContract,Implementation,Name,Settings FROM Notifications");
items.Should().HaveCount(1);
items.First().ConfigContract.Should().Be("DiscordSettings");
var settings = JsonSerializer.Deserialize<DiscordNotificationSettings201>(items.First().Settings, _serializerSettings);
settings.Avatar.Should().Be("TestURL");
settings.Username.Should().Be("TestUsername");
settings.WebHookUrl.Should().Be(webhookUrl.Replace("/slack", ""));
}
}
}

@ -0,0 +1,101 @@
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text.Json;
using System.Text.Json.Serialization;
using Dapper;
using FluentMigrator;
using NzbDrone.Core.Datastore.Migration.Framework;
namespace NzbDrone.Core.Datastore.Migration
{
[Migration(201)]
public class migrate_discord_from_slack : NzbDroneMigrationBase
{
private readonly JsonSerializerOptions _serializerSettings;
public migrate_discord_from_slack()
{
_serializerSettings = new JsonSerializerOptions
{
AllowTrailingCommas = true,
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault,
PropertyNameCaseInsensitive = true,
DictionaryKeyPolicy = JsonNamingPolicy.CamelCase,
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
WriteIndented = true
};
_serializerSettings.Converters.Add(new JsonStringEnumConverter(JsonNamingPolicy.CamelCase, true));
}
protected override void MainDbUpgrade()
{
Execute.WithConnection(MigrateDiscordFromSlack);
}
private void MigrateDiscordFromSlack(IDbConnection conn, IDbTransaction tran)
{
var notificationRows = conn.Query<NotificationEntity201>($"SELECT Id,ConfigContract,Implementation,Name,Settings FROM Notifications WHERE Implementation = 'Slack'");
var discordSlackNotifications = notificationRows.Where(n => JsonSerializer.Deserialize<SlackNotificationSettings201>(n.Settings, _serializerSettings).WebHookUrl.Contains("discord"));
if (!discordSlackNotifications.Any())
{
return;
}
foreach (NotificationEntity201 notification in discordSlackNotifications)
{
SlackNotificationSettings201 settings = JsonSerializer.Deserialize<SlackNotificationSettings201>(notification.Settings, _serializerSettings);
DiscordNotificationSettings201 discordSettings = new DiscordNotificationSettings201
{
Avatar = settings.Icon,
GrabFields = new List<int> { 0, 1, 2, 3, 5, 6, 7, 8, 9 },
ImportFields = new List<int> { 0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12 },
Username = settings.Username,
WebHookUrl = settings.WebHookUrl.Replace("/slack", "")
};
notification.ConfigContract = "DiscordSettings";
notification.Implementation = "Discord";
notification.Name = $"{notification.Name}-Slack_Migrated";
notification.Settings = JsonSerializer.Serialize(discordSettings, _serializerSettings);
}
var updateSql = "UPDATE Notifications SET ConfigContract = @ConfigContract, " +
"Implementation = @Implementation, " +
"Name = @Name, " +
"Settings = @Settings " +
"WHERE Id = @Id";
conn.Execute(updateSql, discordSlackNotifications, transaction: tran);
}
}
public class NotificationEntity201
{
public int Id { get; set; }
public string ConfigContract { get; set; }
public string Implementation { get; set; }
public string Name { get; set; }
public string Settings { get; set; }
}
public class SlackNotificationSettings201
{
public string Channel { get; set; }
public string Icon { get; set; }
public string Username { get; set; }
public string WebHookUrl { get; set; }
}
public class DiscordNotificationSettings201
{
public string Avatar { get; set; }
public string Username { get; set; }
public string WebHookUrl { get; set; }
public IEnumerable<int> GrabFields { get; set; }
public IEnumerable<int> ImportFields { get; set; }
}
}
Loading…
Cancel
Save