Restored backward compat of Release Profile POST api
This commit is contained in:
parent
6378e7afef
commit
272f8e6136
|
@ -9,6 +9,7 @@
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\NzbDrone.Core\Sonarr.Core.csproj" />
|
<ProjectReference Include="..\NzbDrone.Core\Sonarr.Core.csproj" />
|
||||||
<ProjectReference Include="..\NzbDrone.Test.Common\Sonarr.Test.Common.csproj" />
|
<ProjectReference Include="..\NzbDrone.Test.Common\Sonarr.Test.Common.csproj" />
|
||||||
|
<ProjectReference Include="..\Sonarr.Api.V3\Sonarr.Api.V3.csproj" />
|
||||||
<ProjectReference Include="..\Sonarr.Http\Sonarr.Http.csproj" />
|
<ProjectReference Include="..\Sonarr.Http\Sonarr.Http.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
@ -0,0 +1,58 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using FluentAssertions;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using NzbDrone.Common.Serializer;
|
||||||
|
using Sonarr.Api.V3.Profiles.Release;
|
||||||
|
using Sonarr.Http.REST;
|
||||||
|
|
||||||
|
namespace NzbDrone.Api.Test.v3.ReleaseProfiles
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class ReleaseProfilesFixture
|
||||||
|
{
|
||||||
|
[Test]
|
||||||
|
public void should_deserialize_releaseprofile_v3_ignored_null()
|
||||||
|
{
|
||||||
|
var resource = Json.Deserialize<ReleaseProfileResource>("{ \"ignored\": null, \"required\": null }");
|
||||||
|
|
||||||
|
var model = resource.ToModel();
|
||||||
|
|
||||||
|
model.Ignored.Should().BeEquivalentTo();
|
||||||
|
model.Required.Should().BeEquivalentTo();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_deserialize_releaseprofile_v3_ignored_string()
|
||||||
|
{
|
||||||
|
var resource = Json.Deserialize<ReleaseProfileResource>("{ \"ignored\": \"testa,testb\", \"required\": \"testc,testd\" }");
|
||||||
|
|
||||||
|
var model = resource.ToModel();
|
||||||
|
|
||||||
|
model.Ignored.Should().BeEquivalentTo("testa", "testb");
|
||||||
|
model.Required.Should().BeEquivalentTo("testc", "testd");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_deserialize_releaseprofile_v3_ignored_string_array()
|
||||||
|
{
|
||||||
|
var resource = Json.Deserialize<ReleaseProfileResource>("{ \"ignored\": [ \"testa\", \"testb\" ], \"required\": [ \"testc\", \"testd\" ] }");
|
||||||
|
|
||||||
|
var model = resource.ToModel();
|
||||||
|
|
||||||
|
model.Ignored.Should().BeEquivalentTo("testa", "testb");
|
||||||
|
model.Required.Should().BeEquivalentTo("testc", "testd");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_throw_with_bad_releaseprofile_v3_ignored_type()
|
||||||
|
{
|
||||||
|
var resource = Json.Deserialize<ReleaseProfileResource>("{ \"ignored\": {} }");
|
||||||
|
|
||||||
|
Assert.Throws<BadRequestException>(() => resource.ToModel());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -27,7 +27,7 @@ namespace Sonarr.Api.V3.Profiles.Release
|
||||||
|
|
||||||
SharedValidator.RuleFor(d => d).Custom((restriction, context) =>
|
SharedValidator.RuleFor(d => d).Custom((restriction, context) =>
|
||||||
{
|
{
|
||||||
if (restriction.Ignored.Empty() && restriction.Required.Empty() && restriction.Preferred.Empty())
|
if (restriction.MapIgnored().Empty() && restriction.MapRequired().Empty() && restriction.Preferred.Empty())
|
||||||
{
|
{
|
||||||
context.AddFailure("'Must contain', 'Must not contain' or 'Preferred' is required");
|
context.AddFailure("'Must contain', 'Must not contain' or 'Preferred' is required");
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
using NzbDrone.Core.Profiles.Releases;
|
using NzbDrone.Core.Profiles.Releases;
|
||||||
using Sonarr.Http.REST;
|
using Sonarr.Http.REST;
|
||||||
|
|
||||||
|
@ -9,8 +12,9 @@ namespace Sonarr.Api.V3.Profiles.Release
|
||||||
{
|
{
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
public bool Enabled { get; set; }
|
public bool Enabled { get; set; }
|
||||||
public List<string> Required { get; set; }
|
// Is List<string>, string or JArray, we accept 'string' with POST for backward compatibility
|
||||||
public List<string> Ignored { get; set; }
|
public object Required { get; set; }
|
||||||
|
public object Ignored { get; set; }
|
||||||
public List<KeyValuePair<string, int>> Preferred { get; set; }
|
public List<KeyValuePair<string, int>> Preferred { get; set; }
|
||||||
public bool IncludePreferredWhenRenaming { get; set; }
|
public bool IncludePreferredWhenRenaming { get; set; }
|
||||||
public int IndexerId { get; set; }
|
public int IndexerId { get; set; }
|
||||||
|
@ -18,8 +22,6 @@ namespace Sonarr.Api.V3.Profiles.Release
|
||||||
|
|
||||||
public ReleaseProfileResource()
|
public ReleaseProfileResource()
|
||||||
{
|
{
|
||||||
Required = new List<string>();
|
|
||||||
Ignored = new List<string>();
|
|
||||||
Preferred = new List<KeyValuePair<string, int>>();
|
Preferred = new List<KeyValuePair<string, int>>();
|
||||||
Tags = new HashSet<int>();
|
Tags = new HashSet<int>();
|
||||||
}
|
}
|
||||||
|
@ -36,8 +38,8 @@ namespace Sonarr.Api.V3.Profiles.Release
|
||||||
Id = model.Id,
|
Id = model.Id,
|
||||||
Name = model.Name,
|
Name = model.Name,
|
||||||
Enabled = model.Enabled,
|
Enabled = model.Enabled,
|
||||||
Required = model.Required,
|
Required = model.Required ?? new List<string>(),
|
||||||
Ignored = model.Ignored,
|
Ignored = model.Ignored ?? new List<string>(),
|
||||||
Preferred = model.Preferred,
|
Preferred = model.Preferred,
|
||||||
IncludePreferredWhenRenaming = model.IncludePreferredWhenRenaming,
|
IncludePreferredWhenRenaming = model.IncludePreferredWhenRenaming,
|
||||||
IndexerId = model.IndexerId,
|
IndexerId = model.IndexerId,
|
||||||
|
@ -54,8 +56,8 @@ namespace Sonarr.Api.V3.Profiles.Release
|
||||||
Id = resource.Id,
|
Id = resource.Id,
|
||||||
Name = resource.Name,
|
Name = resource.Name,
|
||||||
Enabled = resource.Enabled,
|
Enabled = resource.Enabled,
|
||||||
Required = resource.Required,
|
Required = resource.MapRequired(),
|
||||||
Ignored = resource.Ignored,
|
Ignored = resource.MapIgnored(),
|
||||||
Preferred = resource.Preferred,
|
Preferred = resource.Preferred,
|
||||||
IncludePreferredWhenRenaming = resource.IncludePreferredWhenRenaming,
|
IncludePreferredWhenRenaming = resource.IncludePreferredWhenRenaming,
|
||||||
IndexerId = resource.IndexerId,
|
IndexerId = resource.IndexerId,
|
||||||
|
@ -67,5 +69,33 @@ namespace Sonarr.Api.V3.Profiles.Release
|
||||||
{
|
{
|
||||||
return models.Select(ToResource).ToList();
|
return models.Select(ToResource).ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static List<string> MapRequired(this ReleaseProfileResource profile) => ParseArray(profile.Required, "required");
|
||||||
|
public static List<string> MapIgnored(this ReleaseProfileResource profile) => ParseArray(profile.Ignored, "ignored");
|
||||||
|
|
||||||
|
private static List<string> ParseArray(object resource, string title)
|
||||||
|
{
|
||||||
|
if (resource == null)
|
||||||
|
{
|
||||||
|
return new List<string>();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (resource is List<string> list)
|
||||||
|
{
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (resource is JArray jarray)
|
||||||
|
{
|
||||||
|
return jarray.ToObject<List<string>>();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (resource is string str)
|
||||||
|
{
|
||||||
|
return str.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new BadRequestException($"Invalid field {title}, should be string or string array");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue