created ProviderModuleBase

This commit is contained in:
kayone 2013-09-24 16:42:55 -07:00
parent 4f9b745e70
commit eaed756655
11 changed files with 173 additions and 114 deletions

View File

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using NzbDrone.Api.ClientSchema;
using NzbDrone.Api.REST;
namespace NzbDrone.Api
{
public class ProviderResource : RestResource
{
public Boolean Enable { get; set; }
public String Name { get; set; }
public List<Field> Fields { get; set; }
public String Implementation { get; set; }
public String ConfigContract { get; set; }
}
}

View File

@ -1,104 +1,12 @@
using System.Collections.Generic; using NzbDrone.Core.Indexers;
using NzbDrone.Api.ClientSchema;
using NzbDrone.Common.Reflection;
using NzbDrone.Core.Indexers;
using NzbDrone.Core.ThingiProvider;
using Omu.ValueInjecter;
using FluentValidation;
using NzbDrone.Api.Mapping;
namespace NzbDrone.Api.Indexers namespace NzbDrone.Api.Indexers
{ {
public class IndexerModule : NzbDroneRestModule<IndexerResource> public class IndexerModule : ProviderModuleBase<ProviderResource, IIndexer, IndexerDefinition>
{ {
private readonly IIndexerService _indexerService; public IndexerModule(IndexerFactory indexerFactory)
: base(indexerFactory)
public IndexerModule(IIndexerService indexerService)
{ {
_indexerService = indexerService;
GetResourceAll = GetAll;
GetResourceById = GetIndexer;
CreateResource = CreateIndexer;
UpdateResource = UpdateIndexer;
DeleteResource = DeleteIndexer;
SharedValidator.RuleFor(c => c.Name).NotEmpty();
SharedValidator.RuleFor(c => c.Implementation).NotEmpty();
PostValidator.RuleFor(c => c.Fields).NotEmpty();
}
private IndexerResource GetIndexer(int id)
{
return _indexerService.Get(id).InjectTo<IndexerResource>();
}
private List<IndexerResource> GetAll()
{
var indexerDefinitions = _indexerService.All();
var result = new List<IndexerResource>(indexerDefinitions.Count);
foreach (var definition in indexerDefinitions)
{
var indexerResource = new IndexerResource();
indexerResource.InjectFrom(definition);
indexerResource.Fields = SchemaBuilder.ToSchema(definition.Settings);
result.Add(indexerResource);
}
return result;
}
private int CreateIndexer(IndexerResource indexerResource)
{
var indexer = GetDefinition(indexerResource);
indexer = _indexerService.Create(indexer);
return indexer.Id;
}
private void UpdateIndexer(IndexerResource indexerResource)
{
var indexer = GetDefinition(indexerResource);
ValidateIndexer(indexer);
_indexerService.Update(indexer);
}
private static void ValidateIndexer(ProviderDefinition definition)
{
if (!definition.Enable) return;
var validationResult = definition.Settings.Validate();
if (!validationResult.IsValid)
{
throw new ValidationException(validationResult.Errors);
}
}
private IndexerDefinition GetDefinition(IndexerResource indexerResource)
{
var definition = new IndexerDefinition();
definition.InjectFrom(indexerResource);
var configContract = ReflectionExtensions.CoreAssembly.FindTypeByName(definition.ConfigContract);
definition.Settings = (IProviderConfig)SchemaBuilder.ReadFormSchema(indexerResource.Fields, configContract);
ValidateIndexer(definition);
return definition;
}
private void DeleteIndexer(int id)
{
_indexerService.Delete(id);
} }
} }
} }

View File

@ -8,19 +8,19 @@ namespace NzbDrone.Api.Indexers
{ {
public class IndexerSchemaModule : NzbDroneRestModule<IndexerResource> public class IndexerSchemaModule : NzbDroneRestModule<IndexerResource>
{ {
private readonly IIndexerService _indexerService; private readonly IIndexerFactory _indexerFactory;
public IndexerSchemaModule(IIndexerService indexerService) public IndexerSchemaModule(IIndexerFactory indexerFactory)
: base("indexer/schema") : base("indexer/schema")
{ {
_indexerService = indexerService; _indexerFactory = indexerFactory;
GetResourceAll = GetSchema; GetResourceAll = GetSchema;
} }
private List<IndexerResource> GetSchema() private List<IndexerResource> GetSchema()
{ {
var indexers = _indexerService.Templates().Where(c => c.Implementation =="Newznab"); var indexers = _indexerFactory.Templates().Where(c => c.Implementation =="Newznab");
var result = new List<IndexerResource>(indexers.Count()); var result = new List<IndexerResource>(indexers.Count());

View File

@ -109,6 +109,8 @@
<Compile Include="Frontend\StaticResourceModule.cs" /> <Compile Include="Frontend\StaticResourceModule.cs" />
<Compile Include="History\HistoryResource.cs" /> <Compile Include="History\HistoryResource.cs" />
<Compile Include="History\HistoryModule.cs" /> <Compile Include="History\HistoryModule.cs" />
<Compile Include="IndexerResource.cs" />
<Compile Include="ProviderModuleBase.cs" />
<Compile Include="Indexers\IndexerSchemaModule.cs" /> <Compile Include="Indexers\IndexerSchemaModule.cs" />
<Compile Include="Indexers\IndexerModule.cs" /> <Compile Include="Indexers\IndexerModule.cs" />
<Compile Include="Indexers\IndexerResource.cs" /> <Compile Include="Indexers\IndexerResource.cs" />

View File

@ -0,0 +1,133 @@
using System.Collections.Generic;
using System.Linq;
using FluentValidation;
using Nancy;
using NzbDrone.Api.ClientSchema;
using NzbDrone.Api.Extensions;
using NzbDrone.Api.Indexers;
using NzbDrone.Api.Mapping;
using NzbDrone.Common.Reflection;
using NzbDrone.Core.ThingiProvider;
using Omu.ValueInjecter;
namespace NzbDrone.Api
{
public abstract class ProviderModuleBase<TProviderResource, TProvider, TProviderDefinition> : NzbDroneRestModule<TProviderResource>
where TProviderDefinition : ProviderDefinition, new()
where TProvider : IProvider
where TProviderResource : ProviderResource, new()
{
private readonly IProviderFactory<TProvider, TProviderDefinition> _providerFactory;
protected ProviderModuleBase(IProviderFactory<TProvider, TProviderDefinition> providerFactory)
{
_providerFactory = providerFactory;
Get["templates"] = x => GetTemplates();
GetResourceAll = GetAll;
GetResourceById = GetProviderById;
CreateResource = CreateProvider;
UpdateResource = UpdateProvider;
DeleteResource = DeleteProvider;
SharedValidator.RuleFor(c => c.Name).NotEmpty();
SharedValidator.RuleFor(c => c.Implementation).NotEmpty();
SharedValidator.RuleFor(c => c.ConfigContract).NotEmpty();
PostValidator.RuleFor(c => c.Fields).NotEmpty();
}
private TProviderResource GetProviderById(int id)
{
return _providerFactory.Get(id).InjectTo<TProviderResource>();
}
private List<TProviderResource> GetAll()
{
var indexerDefinitions = _providerFactory.All();
var result = new List<TProviderResource>(indexerDefinitions.Count);
foreach (var definition in indexerDefinitions)
{
var indexerResource = new TProviderResource();
indexerResource.InjectFrom(definition);
indexerResource.Fields = SchemaBuilder.ToSchema(definition.Settings);
result.Add(indexerResource);
}
return result;
}
private int CreateProvider(TProviderResource indexerResource)
{
var indexer = GetDefinition(indexerResource);
indexer = _providerFactory.Create(indexer);
return indexer.Id;
}
private void UpdateProvider(TProviderResource indexerResource)
{
var indexer = GetDefinition(indexerResource);
ValidateIndexer(indexer);
_providerFactory.Update(indexer);
}
private static void ValidateIndexer(ProviderDefinition definition)
{
if (!definition.Enable) return;
var validationResult = definition.Settings.Validate();
if (!validationResult.IsValid)
{
throw new ValidationException(validationResult.Errors);
}
}
private TProviderDefinition GetDefinition(TProviderResource indexerResource)
{
var definition = new TProviderDefinition();
definition.InjectFrom(indexerResource);
var configContract = ReflectionExtensions.CoreAssembly.FindTypeByName(definition.ConfigContract);
definition.Settings = (IProviderConfig)SchemaBuilder.ReadFormSchema(indexerResource.Fields, configContract);
ValidateIndexer(definition);
return definition;
}
private void DeleteProvider(int id)
{
_providerFactory.Delete(id);
}
private Response GetTemplates()
{
var indexers = _providerFactory.Templates();
var result = new List<IndexerResource>(indexers.Count());
foreach (var indexer in indexers)
{
var indexerResource = new IndexerResource();
indexerResource.InjectFrom(indexer);
indexerResource.Fields = SchemaBuilder.ToSchema(indexer.Settings);
result.Add(indexerResource);
}
return result.AsResponse();
}
}
}

View File

@ -37,7 +37,7 @@ namespace NzbDrone.App.Test
{ {
var factory = MainAppContainerBuilder.BuildContainer(args).Resolve<IServiceFactory>(); var factory = MainAppContainerBuilder.BuildContainer(args).Resolve<IServiceFactory>();
factory.Build<IIndexerService>().Should().NotBeNull(); factory.Build<IIndexerFactory>().Should().NotBeNull();
} }
[Test] [Test]

View File

@ -13,7 +13,7 @@ using NzbDrone.Core.Test.Framework;
namespace NzbDrone.Core.Test.IndexerTests namespace NzbDrone.Core.Test.IndexerTests
{ {
public class IndexerServiceFixture : DbTest<IndexerService, IndexerDefinition> public class IndexerServiceFixture : DbTest<IndexerFactory, IndexerDefinition>
{ {
private List<IIndexer> _indexers; private List<IIndexer> _indexers;

View File

@ -24,7 +24,7 @@ namespace NzbDrone.Core.IndexerSearch
public class NzbSearchService : ISearchForNzb public class NzbSearchService : ISearchForNzb
{ {
private readonly IIndexerService _indexerService; private readonly IIndexerFactory _indexerFactory;
private readonly IFetchFeedFromIndexers _feedFetcher; private readonly IFetchFeedFromIndexers _feedFetcher;
private readonly ISceneMappingService _sceneMapping; private readonly ISceneMappingService _sceneMapping;
private readonly ISeriesService _seriesService; private readonly ISeriesService _seriesService;
@ -32,7 +32,7 @@ namespace NzbDrone.Core.IndexerSearch
private readonly IMakeDownloadDecision _makeDownloadDecision; private readonly IMakeDownloadDecision _makeDownloadDecision;
private readonly Logger _logger; private readonly Logger _logger;
public NzbSearchService(IIndexerService indexerService, public NzbSearchService(IIndexerFactory indexerFactory,
IFetchFeedFromIndexers feedFetcher, IFetchFeedFromIndexers feedFetcher,
ISceneMappingService sceneMapping, ISceneMappingService sceneMapping,
ISeriesService seriesService, ISeriesService seriesService,
@ -40,7 +40,7 @@ namespace NzbDrone.Core.IndexerSearch
IMakeDownloadDecision makeDownloadDecision, IMakeDownloadDecision makeDownloadDecision,
Logger logger) Logger logger)
{ {
_indexerService = indexerService; _indexerFactory = indexerFactory;
_feedFetcher = feedFetcher; _feedFetcher = feedFetcher;
_sceneMapping = sceneMapping; _sceneMapping = sceneMapping;
_seriesService = seriesService; _seriesService = seriesService;
@ -132,7 +132,7 @@ namespace NzbDrone.Core.IndexerSearch
private List<DownloadDecision> Dispatch(Func<IIndexer, IEnumerable<ReleaseInfo>> searchAction, SearchCriteriaBase criteriaBase) private List<DownloadDecision> Dispatch(Func<IIndexer, IEnumerable<ReleaseInfo>> searchAction, SearchCriteriaBase criteriaBase)
{ {
var indexers = _indexerService.GetAvailableProviders().ToList(); var indexers = _indexerFactory.GetAvailableProviders().ToList();
var reports = new List<ReleaseInfo>(); var reports = new List<ReleaseInfo>();
_logger.ProgressInfo("Searching {0} indexers for {1}", indexers.Count, criteriaBase); _logger.ProgressInfo("Searching {0} indexers for {1}", indexers.Count, criteriaBase);

View File

@ -14,13 +14,13 @@ namespace NzbDrone.Core.Indexers
public class FetchAndParseRssService : IFetchAndParseRss public class FetchAndParseRssService : IFetchAndParseRss
{ {
private readonly IIndexerService _indexerService; private readonly IIndexerFactory _indexerFactory;
private readonly IFetchFeedFromIndexers _feedFetcher; private readonly IFetchFeedFromIndexers _feedFetcher;
private readonly Logger _logger; private readonly Logger _logger;
public FetchAndParseRssService(IIndexerService indexerService, IFetchFeedFromIndexers feedFetcher, Logger logger) public FetchAndParseRssService(IIndexerFactory indexerFactory, IFetchFeedFromIndexers feedFetcher, Logger logger)
{ {
_indexerService = indexerService; _indexerFactory = indexerFactory;
_feedFetcher = feedFetcher; _feedFetcher = feedFetcher;
_logger = logger; _logger = logger;
} }
@ -29,7 +29,7 @@ namespace NzbDrone.Core.Indexers
{ {
var result = new List<ReleaseInfo>(); var result = new List<ReleaseInfo>();
var indexers = _indexerService.GetAvailableProviders().ToList(); var indexers = _indexerFactory.GetAvailableProviders().ToList();
if (!indexers.Any()) if (!indexers.Any())
{ {

View File

@ -5,17 +5,17 @@ using NzbDrone.Core.ThingiProvider;
namespace NzbDrone.Core.Indexers namespace NzbDrone.Core.Indexers
{ {
public interface IIndexerService : IProviderFactory<IIndexer, IndexerDefinition> public interface IIndexerFactory : IProviderFactory<IIndexer, IndexerDefinition>
{ {
} }
public class IndexerService : ProviderFactory<IIndexer, IndexerDefinition>, IIndexerService public class IndexerFactory : ProviderFactory<IIndexer, IndexerDefinition>, IIndexerFactory
{ {
private readonly IIndexerRepository _providerRepository; private readonly IIndexerRepository _providerRepository;
private readonly IEnumerable<IIndexer> _providers; private readonly IEnumerable<IIndexer> _providers;
public IndexerService(IIndexerRepository providerRepository, IEnumerable<IIndexer> providers, Logger logger) public IndexerFactory(IIndexerRepository providerRepository, IEnumerable<IIndexer> providers, Logger logger)
: base(providerRepository, providers, logger) : base(providerRepository, providers, logger)
{ {
_providerRepository = providerRepository; _providerRepository = providerRepository;

View File

@ -500,7 +500,7 @@
<Compile Include="History\HistoryService.cs"> <Compile Include="History\HistoryService.cs">
<SubType>Code</SubType> <SubType>Code</SubType>
</Compile> </Compile>
<Compile Include="Indexers\IndexerService.cs"> <Compile Include="Indexers\IndexerFactory.cs">
<SubType>Code</SubType> <SubType>Code</SubType>
</Compile> </Compile>
<Compile Include="Indexers\IndexerFetchService.cs"> <Compile Include="Indexers\IndexerFetchService.cs">