mirror of
https://github.com/Sonarr/Sonarr.git
synced 2026-04-17 21:26:13 -04:00
Add v5 Import List Exclusion endpoints
This commit is contained in:
@@ -0,0 +1,6 @@
|
||||
namespace Sonarr.Api.V5.ImportLists;
|
||||
|
||||
public class ImportListExclusionBulkResource
|
||||
{
|
||||
public required HashSet<int> Ids { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
using FluentValidation;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using NzbDrone.Core.Datastore;
|
||||
using NzbDrone.Core.ImportLists.Exclusions;
|
||||
using Sonarr.Http;
|
||||
using Sonarr.Http.Extensions;
|
||||
using Sonarr.Http.REST;
|
||||
using Sonarr.Http.REST.Attributes;
|
||||
|
||||
namespace Sonarr.Api.V5.ImportLists;
|
||||
|
||||
[V5ApiController]
|
||||
public class ImportListExclusionController : RestController<ImportListExclusionResource>
|
||||
{
|
||||
private readonly IImportListExclusionService _importListExclusionService;
|
||||
|
||||
public ImportListExclusionController(IImportListExclusionService importListExclusionService,
|
||||
ImportListExclusionExistsValidator importListExclusionExistsValidator)
|
||||
{
|
||||
_importListExclusionService = importListExclusionService;
|
||||
|
||||
SharedValidator.RuleFor(c => c.TvdbId).Cascade(CascadeMode.Stop)
|
||||
.NotEmpty()
|
||||
.SetValidator(importListExclusionExistsValidator);
|
||||
|
||||
SharedValidator.RuleFor(c => c.Title).NotEmpty();
|
||||
}
|
||||
|
||||
protected override ImportListExclusionResource GetResourceById(int id)
|
||||
{
|
||||
return _importListExclusionService.Get(id).ToResource();
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[Produces("application/json")]
|
||||
public PagingResource<ImportListExclusionResource> GetImportListExclusions([FromQuery] PagingRequestResource paging)
|
||||
{
|
||||
var pagingResource = new PagingResource<ImportListExclusionResource>(paging);
|
||||
var pageSpec = pagingResource.MapToPagingSpec<ImportListExclusionResource, ImportListExclusion>(
|
||||
new HashSet<string>(StringComparer.OrdinalIgnoreCase)
|
||||
{
|
||||
"id",
|
||||
"title",
|
||||
"tvdbId"
|
||||
},
|
||||
"id",
|
||||
SortDirection.Descending);
|
||||
|
||||
return pageSpec.ApplyToPage(_importListExclusionService.Paged, ImportListExclusionResourceMapper.ToResource);
|
||||
}
|
||||
|
||||
[RestPostById]
|
||||
[Consumes("application/json")]
|
||||
public ActionResult<ImportListExclusionResource> AddImportListExclusion([FromBody] ImportListExclusionResource resource)
|
||||
{
|
||||
var importListExclusion = _importListExclusionService.Add(resource.ToModel());
|
||||
|
||||
return Created(importListExclusion.Id);
|
||||
}
|
||||
|
||||
[RestPutById]
|
||||
[Consumes("application/json")]
|
||||
public ActionResult<ImportListExclusionResource> UpdateImportListExclusion([FromBody] ImportListExclusionResource resource)
|
||||
{
|
||||
_importListExclusionService.Update(resource.ToModel());
|
||||
|
||||
return Accepted(resource.Id);
|
||||
}
|
||||
|
||||
[RestDeleteById]
|
||||
public ActionResult DeleteImportListExclusion(int id)
|
||||
{
|
||||
_importListExclusionService.Delete(id);
|
||||
|
||||
return NoContent();
|
||||
}
|
||||
|
||||
[HttpDelete("bulk")]
|
||||
[Consumes("application/json")]
|
||||
public ActionResult DeleteImportListExclusions([FromBody] ImportListExclusionBulkResource resource)
|
||||
{
|
||||
_importListExclusionService.Delete(resource.Ids.ToList());
|
||||
|
||||
return NoContent();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
using FluentValidation.Validators;
|
||||
using NzbDrone.Core.ImportLists.Exclusions;
|
||||
|
||||
namespace Sonarr.Api.V5.ImportLists;
|
||||
|
||||
public class ImportListExclusionExistsValidator : PropertyValidator
|
||||
{
|
||||
private readonly IImportListExclusionService _importListExclusionService;
|
||||
|
||||
public ImportListExclusionExistsValidator(IImportListExclusionService importListExclusionService)
|
||||
{
|
||||
_importListExclusionService = importListExclusionService;
|
||||
}
|
||||
|
||||
protected override string GetDefaultMessageTemplate() => "This exclusion has already been added.";
|
||||
|
||||
protected override bool IsValid(PropertyValidatorContext context)
|
||||
{
|
||||
if (context.PropertyValue == null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (context.InstanceToValidate is not ImportListExclusionResource listExclusionResource)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return !_importListExclusionService.All().Exists(v => v.TvdbId == (int)context.PropertyValue && v.Id != listExclusionResource.Id);
|
||||
}
|
||||
}
|
||||
38
src/Sonarr.Api.V5/ImportLists/ImportListExclusionResource.cs
Normal file
38
src/Sonarr.Api.V5/ImportLists/ImportListExclusionResource.cs
Normal file
@@ -0,0 +1,38 @@
|
||||
using NzbDrone.Core.ImportLists.Exclusions;
|
||||
using Sonarr.Http.REST;
|
||||
|
||||
namespace Sonarr.Api.V5.ImportLists;
|
||||
|
||||
public class ImportListExclusionResource : RestResource
|
||||
{
|
||||
public int TvdbId { get; set; }
|
||||
public string? Title { get; set; }
|
||||
}
|
||||
|
||||
public static class ImportListExclusionResourceMapper
|
||||
{
|
||||
public static ImportListExclusionResource ToResource(this ImportListExclusion model)
|
||||
{
|
||||
return new ImportListExclusionResource
|
||||
{
|
||||
Id = model.Id,
|
||||
TvdbId = model.TvdbId,
|
||||
Title = model.Title,
|
||||
};
|
||||
}
|
||||
|
||||
public static ImportListExclusion ToModel(this ImportListExclusionResource resource)
|
||||
{
|
||||
return new ImportListExclusion
|
||||
{
|
||||
Id = resource.Id,
|
||||
TvdbId = resource.TvdbId,
|
||||
Title = resource.Title
|
||||
};
|
||||
}
|
||||
|
||||
public static List<ImportListExclusionResource> ToResource(this IEnumerable<ImportListExclusion> models)
|
||||
{
|
||||
return models.Select(ToResource).ToList();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user