can now read/write provider config to db.

pull/4/head
kay.one 11 years ago committed by kayone
parent 08e2d60f20
commit 4046d35604

@ -1,23 +1,31 @@
using NUnit.Framework; using FizzWare.NBuilder;
using NzbDrone.Core.Test.Datastore; using FluentAssertions;
using NUnit.Framework;
using NzbDrone.Core.Notifications;
using NzbDrone.Core.Notifications.Email;
using NzbDrone.Core.Test.Framework; using NzbDrone.Core.Test.Framework;
using NzbDrone.Core.ThingiProvider; using NzbDrone.Core.ThingiProvider;
namespace NzbDrone.Core.Test.ThingiProvider namespace NzbDrone.Core.Test.ThingiProvider
{ {
public class ProviderRepositoryFixture : DbTest<DownloadProviderRepository, DownloadProviderModel> public class ProviderRepositoryFixture : DbTest<NotificationProviderRepository, NotificationProviderModel>
{ {
[Test] [Test]
public void should_read_write_download_provider() public void should_read_write_download_provider()
{ {
var model = new DownloadProviderModel(); var model = Builder<NotificationProviderModel>.CreateNew().BuildNew();
var emailSettings = Builder<EmailSettings>.CreateNew().Build();
model.Settings = emailSettings;
Subject.Insert(model);
model.Config = new DownloadProviderConfig(); var storedProvider = Subject.Single();
storedProvider.Settings.Should().BeOfType<EmailSettings>();
//Subject.Insert(new ) var storedSetting = (EmailSettings) storedProvider.Settings;
storedSetting.ShouldHave().AllProperties().EqualTo(emailSettings);
} }
} }
} }

@ -1,7 +1,9 @@
using System; using System;
using System.Linq;
using Marr.Data.Converters; using Marr.Data.Converters;
using Marr.Data.Mapping; using Marr.Data.Mapping;
using NzbDrone.Common.Serializer; using NzbDrone.Common.Serializer;
using NzbDrone.Core.ThingiProvider;
namespace NzbDrone.Core.Datastore.Converters namespace NzbDrone.Core.Datastore.Converters
{ {
@ -26,7 +28,8 @@ namespace NzbDrone.Core.Datastore.Converters
var implementation = context.DataRecord.GetString(ordinal); var implementation = context.DataRecord.GetString(ordinal);
var impType = Type.GetType(implementation, true, true);
var impType = typeof(IProviderConfig).Assembly.GetTypes().Single(c => c.Name == implementation);
return Json.Deserialize(stringValue, impType); return Json.Deserialize(stringValue, impType);
} }

@ -0,0 +1,68 @@
using System;
using System.Collections.Generic;
using System.Data;
using FluentMigrator;
using NzbDrone.Common.Serializer;
using NzbDrone.Core.Datastore.Migration.Framework;
namespace NzbDrone.Core.Datastore.Migration
{
[Migration(22)]
public class move_notification_to_generic_provider : NzbDroneMigrationBase
{
protected override void MainDbUpgrade()
{
Alter.Table("Notifications").AddColumn("ConfigContract").AsString().Nullable();
//Execute.WithConnection(ConvertSeasons);
}
private void ConvertSeasons(IDbConnection conn, IDbTransaction tran)
{
using (IDbCommand allSeriesCmd = conn.CreateCommand())
{
allSeriesCmd.Transaction = tran;
allSeriesCmd.CommandText = @"SELECT Id FROM Series";
using (IDataReader allSeriesReader = allSeriesCmd.ExecuteReader())
{
while (allSeriesReader.Read())
{
int seriesId = allSeriesReader.GetInt32(0);
var seasons = new List<dynamic>();
using (IDbCommand seasonsCmd = conn.CreateCommand())
{
seasonsCmd.Transaction = tran;
seasonsCmd.CommandText = String.Format(@"SELECT SeasonNumber, Monitored FROM Seasons WHERE SeriesId = {0}", seriesId);
using (IDataReader seasonReader = seasonsCmd.ExecuteReader())
{
while (seasonReader.Read())
{
int seasonNumber = seasonReader.GetInt32(0);
bool monitored = seasonReader.GetBoolean(1);
if (seasonNumber == 0)
{
monitored = false;
}
seasons.Add(new { seasonNumber, monitored });
}
}
}
using (IDbCommand updateCmd = conn.CreateCommand())
{
var text = String.Format("UPDATE Series SET Seasons = '{0}' WHERE Id = {1}", seasons.ToJson() , seriesId);
updateCmd.Transaction = tran;
updateCmd.CommandText = text;
updateCmd.ExecuteNonQuery();
}
}
}
}
}
}
}

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using Marr.Data; using Marr.Data;
using Marr.Data.Mapping; using Marr.Data.Mapping;
using NzbDrone.Common.Reflection;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.DataAugmentation.Scene; using NzbDrone.Core.DataAugmentation.Scene;
using NzbDrone.Core.Datastore.Converters; using NzbDrone.Core.Datastore.Converters;
@ -15,6 +16,7 @@ using NzbDrone.Core.Organizer;
using NzbDrone.Core.Qualities; using NzbDrone.Core.Qualities;
using NzbDrone.Core.RootFolders; using NzbDrone.Core.RootFolders;
using NzbDrone.Core.SeriesStats; using NzbDrone.Core.SeriesStats;
using NzbDrone.Core.ThingiProvider;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
namespace NzbDrone.Core.Datastore namespace NzbDrone.Core.Datastore
@ -34,6 +36,7 @@ namespace NzbDrone.Core.Datastore
Mapper.Entity<IndexerDefinition>().RegisterModel("Indexers"); Mapper.Entity<IndexerDefinition>().RegisterModel("Indexers");
Mapper.Entity<ScheduledTask>().RegisterModel("ScheduledTasks"); Mapper.Entity<ScheduledTask>().RegisterModel("ScheduledTasks");
Mapper.Entity<NotificationDefinition>().RegisterModel("Notifications"); Mapper.Entity<NotificationDefinition>().RegisterModel("Notifications");
Mapper.Entity<NotificationProviderModel>().RegisterModel("Notifications");
Mapper.Entity<SceneMapping>().RegisterModel("SceneMappings"); Mapper.Entity<SceneMapping>().RegisterModel("SceneMappings");
@ -69,6 +72,7 @@ namespace NzbDrone.Core.Datastore
private static void RegisterMappers() private static void RegisterMappers()
{ {
RegisterEmbeddedConverter(); RegisterEmbeddedConverter();
RegisterProviderSettingConverter();
MapRepository.Instance.RegisterTypeConverter(typeof(Int32), new Int32Converter()); MapRepository.Instance.RegisterTypeConverter(typeof(Int32), new Int32Converter());
MapRepository.Instance.RegisterTypeConverter(typeof(DateTime), new UtcConverter()); MapRepository.Instance.RegisterTypeConverter(typeof(DateTime), new UtcConverter());
@ -78,10 +82,20 @@ namespace NzbDrone.Core.Datastore
MapRepository.Instance.RegisterTypeConverter(typeof(Dictionary<string, string>), new EmbeddedDocumentConverter()); MapRepository.Instance.RegisterTypeConverter(typeof(Dictionary<string, string>), new EmbeddedDocumentConverter());
} }
private static void RegisterProviderSettingConverter()
{
var settingTypes = typeof(IProviderConfig).Assembly.ImplementationsOf<IProviderConfig>();
var providerSettingConverter = new ProviderSettingConverter();
foreach (var embeddedType in settingTypes)
{
MapRepository.Instance.RegisterTypeConverter(embeddedType, providerSettingConverter);
}
}
private static void RegisterEmbeddedConverter() private static void RegisterEmbeddedConverter()
{ {
var embeddedTypes = typeof(IEmbeddedDocument).Assembly.GetTypes() var embeddedTypes = typeof(IEmbeddedDocument).Assembly.ImplementationsOf<IEmbeddedDocument>();
.Where(c => c.GetInterfaces().Any(i => i == typeof(IEmbeddedDocument)));
var embeddedConvertor = new EmbeddedDocumentConverter(); var embeddedConvertor = new EmbeddedDocumentConverter();

@ -1,9 +1,10 @@
using System; using System;
using NzbDrone.Core.Annotations; using NzbDrone.Core.Annotations;
using NzbDrone.Core.ThingiProvider;
namespace NzbDrone.Core.Notifications.Email namespace NzbDrone.Core.Notifications.Email
{ {
public class EmailSettings : INotifcationSettings public class EmailSettings : IProviderConfig
{ {
public EmailSettings() public EmailSettings()
{ {

@ -1,9 +1,10 @@
using System; using System;
using NzbDrone.Core.Annotations; using NzbDrone.Core.Annotations;
using NzbDrone.Core.ThingiProvider;
namespace NzbDrone.Core.Notifications.Growl namespace NzbDrone.Core.Notifications.Growl
{ {
public class GrowlSettings : INotifcationSettings public class GrowlSettings : IProviderConfig
{ {
public GrowlSettings() public GrowlSettings()
{ {

@ -1,7 +0,0 @@
namespace NzbDrone.Core.Notifications
{
public interface INotifcationSettings
{
bool IsValid { get; }
}
}

@ -1,4 +1,6 @@
namespace NzbDrone.Core.Notifications using NzbDrone.Core.ThingiProvider;
namespace NzbDrone.Core.Notifications
{ {
public class Notification public class Notification
{ {
@ -8,7 +10,7 @@
public string Link { get; set; } public string Link { get; set; }
public bool OnGrab { get; set; } public bool OnGrab { get; set; }
public bool OnDownload { get; set; } public bool OnDownload { get; set; }
public INotifcationSettings Settings { get; set; } public IProviderConfig Settings { get; set; }
public INotification Instance { get; set; } public INotification Instance { get; set; }
public string Implementation { get; set; } public string Implementation { get; set; }
} }

@ -1,9 +1,10 @@
using NzbDrone.Common.Serializer; using NzbDrone.Common.Serializer;
using NzbDrone.Core.ThingiProvider;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
namespace NzbDrone.Core.Notifications namespace NzbDrone.Core.Notifications
{ {
public abstract class NotificationBase<TSetting> : INotification where TSetting : class, INotifcationSettings, new() public abstract class NotificationBase<TSetting> : INotification where TSetting : class, IProviderConfig, new()
{ {
public abstract string Name { get; } public abstract string Name { get; }
public abstract string ImplementationName { get; } public abstract string ImplementationName { get; }

@ -1,5 +1,6 @@
using System; using System;
using NzbDrone.Core.Datastore; using NzbDrone.Core.Datastore;
using NzbDrone.Core.ThingiProvider;
namespace NzbDrone.Core.Notifications namespace NzbDrone.Core.Notifications
{ {
@ -11,4 +12,11 @@ namespace NzbDrone.Core.Notifications
public String Settings { get; set; } public String Settings { get; set; }
public String Implementation { get; set; } public String Implementation { get; set; }
} }
public class NotificationProviderModel : Provider
{
public Boolean OnGrab { get; set; }
public Boolean OnDownload { get; set; }
}
} }

@ -7,6 +7,7 @@ using NzbDrone.Common.Serializer;
using NzbDrone.Core.Download; using NzbDrone.Core.Download;
using NzbDrone.Core.MediaFiles.Events; using NzbDrone.Core.MediaFiles.Events;
using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Messaging.Events;
using NzbDrone.Core.ThingiProvider;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using Omu.ValueInjecter; using Omu.ValueInjecter;
@ -71,7 +72,7 @@ namespace NzbDrone.Core.Notifications
var instanceType = newNotification.Instance.GetType(); var instanceType = newNotification.Instance.GetType();
var baseGenArgs = instanceType.BaseType.GetGenericArguments(); var baseGenArgs = instanceType.BaseType.GetGenericArguments();
newNotification.Settings = (INotifcationSettings)Activator.CreateInstance(baseGenArgs[0]); newNotification.Settings = (IProviderConfig)Activator.CreateInstance(baseGenArgs[0]);
newNotification.Implementation = type.Name; newNotification.Implementation = type.Name;
notifications.Add(newNotification); notifications.Add(newNotification);

@ -1,10 +1,11 @@
using NzbDrone.Common.Serializer; using NzbDrone.Common.Serializer;
using NzbDrone.Core.ThingiProvider;
namespace NzbDrone.Core.Notifications namespace NzbDrone.Core.Notifications
{ {
public interface INotificationSettingsProvider public interface INotificationSettingsProvider
{ {
TSetting Get<TSetting>(INotification indexer) where TSetting : INotifcationSettings, new(); TSetting Get<TSetting>(INotification indexer) where TSetting : IProviderConfig, new();
} }
public class NotificationSettingsProvider : INotificationSettingsProvider public class NotificationSettingsProvider : INotificationSettingsProvider
@ -16,7 +17,7 @@ namespace NzbDrone.Core.Notifications
_notificationRepository = notificationRepository; _notificationRepository = notificationRepository;
} }
public TSetting Get<TSetting>(INotification indexer) where TSetting : INotifcationSettings, new() public TSetting Get<TSetting>(INotification indexer) where TSetting : IProviderConfig, new()
{ {
var indexerDef = _notificationRepository.Find(indexer.Name); var indexerDef = _notificationRepository.Find(indexer.Name);

@ -1,9 +1,10 @@
using System; using System;
using NzbDrone.Core.Annotations; using NzbDrone.Core.Annotations;
using NzbDrone.Core.ThingiProvider;
namespace NzbDrone.Core.Notifications.NotifyMyAndroid namespace NzbDrone.Core.Notifications.NotifyMyAndroid
{ {
public class NotifyMyAndroidSettings : INotifcationSettings public class NotifyMyAndroidSettings : IProviderConfig
{ {
[FieldDefinition(0, Label = "API Key", HelpLink = "http://www.notifymyandroid.com/")] [FieldDefinition(0, Label = "API Key", HelpLink = "http://www.notifymyandroid.com/")]
public String ApiKey { get; set; } public String ApiKey { get; set; }

@ -1,9 +1,10 @@
using System; using System;
using NzbDrone.Core.Annotations; using NzbDrone.Core.Annotations;
using NzbDrone.Core.ThingiProvider;
namespace NzbDrone.Core.Notifications.Plex namespace NzbDrone.Core.Notifications.Plex
{ {
public class PlexClientSettings : INotifcationSettings public class PlexClientSettings : IProviderConfig
{ {
public PlexClientSettings() public PlexClientSettings()
{ {

@ -1,9 +1,10 @@
using System; using System;
using NzbDrone.Core.Annotations; using NzbDrone.Core.Annotations;
using NzbDrone.Core.ThingiProvider;
namespace NzbDrone.Core.Notifications.Plex namespace NzbDrone.Core.Notifications.Plex
{ {
public class PlexServerSettings : INotifcationSettings public class PlexServerSettings : IProviderConfig
{ {
public PlexServerSettings() public PlexServerSettings()
{ {

@ -1,9 +1,10 @@
using System; using System;
using NzbDrone.Core.Annotations; using NzbDrone.Core.Annotations;
using NzbDrone.Core.ThingiProvider;
namespace NzbDrone.Core.Notifications.Prowl namespace NzbDrone.Core.Notifications.Prowl
{ {
public class ProwlSettings : INotifcationSettings public class ProwlSettings : IProviderConfig
{ {
[FieldDefinition(0, Label = "API Key", HelpLink = "https://www.prowlapp.com/api_settings.php")] [FieldDefinition(0, Label = "API Key", HelpLink = "https://www.prowlapp.com/api_settings.php")]
public String ApiKey { get; set; } public String ApiKey { get; set; }

@ -1,9 +1,10 @@
using System; using System;
using NzbDrone.Core.Annotations; using NzbDrone.Core.Annotations;
using NzbDrone.Core.ThingiProvider;
namespace NzbDrone.Core.Notifications.PushBullet namespace NzbDrone.Core.Notifications.PushBullet
{ {
public class PushBulletSettings : INotifcationSettings public class PushBulletSettings : IProviderConfig
{ {
[FieldDefinition(0, Label = "API Key", HelpLink = "https://www.pushbullet.com/")] [FieldDefinition(0, Label = "API Key", HelpLink = "https://www.pushbullet.com/")]
public String ApiKey { get; set; } public String ApiKey { get; set; }

@ -1,9 +1,10 @@
using System; using System;
using NzbDrone.Core.Annotations; using NzbDrone.Core.Annotations;
using NzbDrone.Core.ThingiProvider;
namespace NzbDrone.Core.Notifications.Pushover namespace NzbDrone.Core.Notifications.Pushover
{ {
public class PushoverSettings : INotifcationSettings public class PushoverSettings : IProviderConfig
{ {
[FieldDefinition(0, Label = "User Key", HelpLink = "https://pushover.net/")] [FieldDefinition(0, Label = "User Key", HelpLink = "https://pushover.net/")]
public String UserKey { get; set; } public String UserKey { get; set; }

@ -2,10 +2,11 @@
using System.ComponentModel; using System.ComponentModel;
using Newtonsoft.Json; using Newtonsoft.Json;
using NzbDrone.Core.Annotations; using NzbDrone.Core.Annotations;
using NzbDrone.Core.ThingiProvider;
namespace NzbDrone.Core.Notifications.Xbmc namespace NzbDrone.Core.Notifications.Xbmc
{ {
public class XbmcSettings : INotifcationSettings public class XbmcSettings : IProviderConfig
{ {
public XbmcSettings() public XbmcSettings()
{ {

@ -171,6 +171,7 @@
<Compile Include="Datastore\Migration\019_restore_unique_constraints.cs" /> <Compile Include="Datastore\Migration\019_restore_unique_constraints.cs" />
<Compile Include="Datastore\Migration\020_add_year_and_seasons_to_series.cs" /> <Compile Include="Datastore\Migration\020_add_year_and_seasons_to_series.cs" />
<Compile Include="Datastore\Migration\021_drop_seasons_table.cs" /> <Compile Include="Datastore\Migration\021_drop_seasons_table.cs" />
<Compile Include="Datastore\Migration\022_move_notification_to_generic_provider.cs" />
<Compile Include="Datastore\Migration\Framework\MigrationContext.cs" /> <Compile Include="Datastore\Migration\Framework\MigrationContext.cs" />
<Compile Include="Datastore\Migration\Framework\MigrationController.cs" /> <Compile Include="Datastore\Migration\Framework\MigrationController.cs" />
<Compile Include="Datastore\Migration\Framework\MigrationExtension.cs" /> <Compile Include="Datastore\Migration\Framework\MigrationExtension.cs" />
@ -370,7 +371,6 @@
<Compile Include="MetadataSource\Trakt\Images.cs" /> <Compile Include="MetadataSource\Trakt\Images.cs" />
<Compile Include="MetadataSource\Trakt\Season.cs" /> <Compile Include="MetadataSource\Trakt\Season.cs" />
<Compile Include="MetadataSource\Trakt\FullShow.cs" /> <Compile Include="MetadataSource\Trakt\FullShow.cs" />
<Compile Include="Notifications\INotifcationSettings.cs" />
<Compile Include="Notifications\Plex\TestPlexServerCommand.cs" /> <Compile Include="Notifications\Plex\TestPlexServerCommand.cs" />
<Compile Include="Notifications\Plex\PlexServer.cs" /> <Compile Include="Notifications\Plex\PlexServer.cs" />
<Compile Include="Notifications\Plex\PlexClientSettings.cs" /> <Compile Include="Notifications\Plex\PlexClientSettings.cs" />

@ -1,6 +1,7 @@
 
using NzbDrone.Core.Datastore; using NzbDrone.Core.Datastore;
using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Messaging.Events;
using NzbDrone.Core.Notifications;
namespace NzbDrone.Core.ThingiProvider namespace NzbDrone.Core.ThingiProvider
{ {
@ -14,36 +15,44 @@ namespace NzbDrone.Core.ThingiProvider
} }
} }
public class DownloadProviderModel : Provider<DownloadProviderConfig>
{
public class NotificationProviderRepository : BasicRepository<NotificationProviderModel>
{
public NotificationProviderRepository(IDatabase database, IEventAggregator eventAggregator)
: base(database, eventAggregator)
{
}
} }
public class DownloadProviderConfig : ProviderSetting public class DownloadProviderModel : Provider
{ {
} }
public abstract class Provider<TSettings> : ModelBase public abstract class Provider : ModelBase
where TSettings : ProviderSetting
{ {
public string Name { get; set; }
public string Implementation { get; set; } public string Implementation { get; set; }
public TSettings Config { get; set; }
}
public abstract class ProviderSetting : IEmbeddedDocument public string ConfigContract
{ {
get
{
if (Settings == null) return null;
return Settings.GetType().Name;
}
set
{
}
}
public IProviderConfig Settings { get; set; }
} }
public abstract class ProviderBase<TSettings> where TSettings : ProviderSetting public interface IProviderConfig
{ {
public TSettings Settings { get; private set; } bool IsValid { get; }
public void LoadSettings(TSettings setting)
{
Settings = setting;
}
} }
} }
Loading…
Cancel
Save