Fixed: Prevent series from being added with an invalid Profile ID

Closes #977
pull/3113/head
Mark McDowall 9 years ago
parent dc176a83b3
commit d514699ab7

@ -10,11 +10,11 @@ using NzbDrone.Core.MediaFiles.Events;
using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Messaging.Events;
using NzbDrone.Core.SeriesStats; using NzbDrone.Core.SeriesStats;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Api.Validation;
using NzbDrone.Api.Mapping; using NzbDrone.Api.Mapping;
using NzbDrone.Core.Tv.Events; using NzbDrone.Core.Tv.Events;
using NzbDrone.Core.Validation.Paths; using NzbDrone.Core.Validation.Paths;
using NzbDrone.Core.DataAugmentation.Scene; using NzbDrone.Core.DataAugmentation.Scene;
using NzbDrone.Core.Validation;
using NzbDrone.SignalR; using NzbDrone.SignalR;
namespace NzbDrone.Api.Series namespace NzbDrone.Api.Series
@ -43,7 +43,8 @@ namespace NzbDrone.Api.Series
SeriesPathValidator seriesPathValidator, SeriesPathValidator seriesPathValidator,
SeriesExistsValidator seriesExistsValidator, SeriesExistsValidator seriesExistsValidator,
DroneFactoryValidator droneFactoryValidator, DroneFactoryValidator droneFactoryValidator,
SeriesAncestorValidator seriesAncestorValidator SeriesAncestorValidator seriesAncestorValidator,
ProfileExistsValidator profileExistsValidator
) )
: base(signalRBroadcaster) : base(signalRBroadcaster)
{ {
@ -59,7 +60,7 @@ namespace NzbDrone.Api.Series
UpdateResource = UpdateSeries; UpdateResource = UpdateSeries;
DeleteResource = DeleteSeries; DeleteResource = DeleteSeries;
SharedValidator.RuleFor(s => s.ProfileId).ValidId(); Validation.RuleBuilderExtensions.ValidId(SharedValidator.RuleFor(s => s.ProfileId));
SharedValidator.RuleFor(s => s.Path) SharedValidator.RuleFor(s => s.Path)
.Cascade(CascadeMode.StopOnFirstFailure) .Cascade(CascadeMode.StopOnFirstFailure)
@ -70,6 +71,8 @@ namespace NzbDrone.Api.Series
.SetValidator(seriesAncestorValidator) .SetValidator(seriesAncestorValidator)
.When(s => !s.Path.IsNullOrWhiteSpace()); .When(s => !s.Path.IsNullOrWhiteSpace());
SharedValidator.RuleFor(s => s.ProfileId).SetValidator(profileExistsValidator);
PostValidator.RuleFor(s => s.Path).IsValidPath().When(s => s.RootFolderPath.IsNullOrWhiteSpace()); PostValidator.RuleFor(s => s.Path).IsValidPath().When(s => s.RootFolderPath.IsNullOrWhiteSpace());
PostValidator.RuleFor(s => s.RootFolderPath).IsValidPath().When(s => s.Path.IsNullOrWhiteSpace()); PostValidator.RuleFor(s => s.RootFolderPath).IsValidPath().When(s => s.Path.IsNullOrWhiteSpace());
PostValidator.RuleFor(s => s.Title).NotEmpty(); PostValidator.RuleFor(s => s.Title).NotEmpty();

@ -1004,6 +1004,7 @@
<Compile Include="Validation\Paths\SeriesAncestorValidator.cs" /> <Compile Include="Validation\Paths\SeriesAncestorValidator.cs" />
<Compile Include="Validation\Paths\SeriesExistsValidator.cs" /> <Compile Include="Validation\Paths\SeriesExistsValidator.cs" />
<Compile Include="Validation\Paths\SeriesPathValidator.cs" /> <Compile Include="Validation\Paths\SeriesPathValidator.cs" />
<Compile Include="Validation\ProfileExistsValidator.cs" />
<Compile Include="Validation\RuleBuilderExtensions.cs" /> <Compile Include="Validation\RuleBuilderExtensions.cs" />
<Compile Include="Validation\UrlValidator.cs" /> <Compile Include="Validation\UrlValidator.cs" />
</ItemGroup> </ItemGroup>

@ -5,7 +5,7 @@ namespace NzbDrone.Core.Profiles
{ {
public interface IProfileRepository : IBasicRepository<Profile> public interface IProfileRepository : IBasicRepository<Profile>
{ {
bool Exists(int id);
} }
public class ProfileRepository : BasicRepository<Profile>, IProfileRepository public class ProfileRepository : BasicRepository<Profile>, IProfileRepository
@ -14,5 +14,10 @@ namespace NzbDrone.Core.Profiles
: base(database, eventAggregator) : base(database, eventAggregator)
{ {
} }
public bool Exists(int id)
{
return DataMapper.Query<Profile>().Where(p => p.Id == id).GetRowCount() == 1;
}
} }
} }

@ -16,6 +16,7 @@ namespace NzbDrone.Core.Profiles
void Delete(int id); void Delete(int id);
List<Profile> All(); List<Profile> All();
Profile Get(int id); Profile Get(int id);
bool Exists(int id);
} }
public class ProfileService : IProfileService, IHandle<ApplicationStartedEvent> public class ProfileService : IProfileService, IHandle<ApplicationStartedEvent>
@ -61,6 +62,11 @@ namespace NzbDrone.Core.Profiles
return _profileRepository.Get(id); return _profileRepository.Get(id);
} }
public bool Exists(int id)
{
return _profileRepository.Exists(id);
}
private Profile AddDefaultProfile(string name, Quality cutoff, params Quality[] allowed) private Profile AddDefaultProfile(string name, Quality cutoff, params Quality[] allowed)
{ {
var items = Quality.DefaultQualityDefinitions var items = Quality.DefaultQualityDefinitions

@ -0,0 +1,23 @@
using FluentValidation.Validators;
using NzbDrone.Core.Profiles;
namespace NzbDrone.Core.Validation
{
public class ProfileExistsValidator : PropertyValidator
{
private readonly IProfileService _profileService;
public ProfileExistsValidator(IProfileService profileService)
: base("Profile does not exist")
{
_profileService = profileService;
}
protected override bool IsValid(PropertyValidatorContext context)
{
if (context.PropertyValue == null) return true;
return _profileService.Exists((int)context.PropertyValue);
}
}
}
Loading…
Cancel
Save