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 : NzbDroneRestModule where TProviderDefinition : ProviderDefinition, new() where TProvider : IProvider where TProviderResource : ProviderResource, new() { private readonly IProviderFactory _providerFactory; protected ProviderModuleBase(IProviderFactory 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(); } private List GetAll() { var indexerDefinitions = _providerFactory.All(); var result = new List(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(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(); } } }