allow multiple protocols in custom filter

This commit is contained in:
Stevie Robinson 2024-05-04 12:53:27 +02:00
parent 82a26a2fba
commit 2b7f63e76b
4 changed files with 24 additions and 15 deletions

View File

@ -97,7 +97,7 @@ export const defaultState = {
valueType: filterBuilderValueTypes.SERIES valueType: filterBuilderValueTypes.SERIES
}, },
{ {
name: 'protocol', name: 'protocols',
label: () => translate('Protocol'), label: () => translate('Protocol'),
type: filterBuilderTypes.EQUAL, type: filterBuilderTypes.EQUAL,
valueType: filterBuilderValueTypes.PROTOCOL valueType: filterBuilderValueTypes.PROTOCOL

View File

@ -12,7 +12,7 @@ namespace NzbDrone.Core.Blocklisting
List<Blocklist> BlocklistedByTorrentInfoHash(int seriesId, string torrentInfoHash); List<Blocklist> BlocklistedByTorrentInfoHash(int seriesId, string torrentInfoHash);
List<Blocklist> BlocklistedBySeries(int seriesId); List<Blocklist> BlocklistedBySeries(int seriesId);
void DeleteForSeriesIds(List<int> seriesIds); void DeleteForSeriesIds(List<int> seriesIds);
PagingSpec<Blocklist> GetPaged(PagingSpec<Blocklist> pagingSpec, DownloadProtocol? protocol); PagingSpec<Blocklist> GetPaged(PagingSpec<Blocklist> pagingSpec, DownloadProtocol[] protocols);
} }
public class BlocklistRepository : BasicRepository<Blocklist>, IBlocklistRepository public class BlocklistRepository : BasicRepository<Blocklist>, IBlocklistRepository
@ -42,24 +42,24 @@ namespace NzbDrone.Core.Blocklisting
Delete(x => seriesIds.Contains(x.SeriesId)); Delete(x => seriesIds.Contains(x.SeriesId));
} }
public PagingSpec<Blocklist> GetPaged(PagingSpec<Blocklist> pagingSpec, DownloadProtocol? protocol) public PagingSpec<Blocklist> GetPaged(PagingSpec<Blocklist> pagingSpec, DownloadProtocol[] protocols)
{ {
pagingSpec.Records = GetPagedRecords(PagedBuilder(protocol), pagingSpec, PagedQuery); pagingSpec.Records = GetPagedRecords(PagedBuilder(protocols), pagingSpec, PagedQuery);
var countTemplate = $"SELECT COUNT(*) FROM (SELECT /**select**/ FROM \"{TableMapping.Mapper.TableNameMapping(typeof(Blocklist))}\" /**join**/ /**innerjoin**/ /**leftjoin**/ /**where**/ /**groupby**/ /**having**/) AS \"Inner\""; var countTemplate = $"SELECT COUNT(*) FROM (SELECT /**select**/ FROM \"{TableMapping.Mapper.TableNameMapping(typeof(Blocklist))}\" /**join**/ /**innerjoin**/ /**leftjoin**/ /**where**/ /**groupby**/ /**having**/) AS \"Inner\"";
pagingSpec.TotalRecords = GetPagedRecordCount(PagedBuilder(protocol).Select(typeof(Blocklist)), pagingSpec, countTemplate); pagingSpec.TotalRecords = GetPagedRecordCount(PagedBuilder(protocols).Select(typeof(Blocklist)), pagingSpec, countTemplate);
return pagingSpec; return pagingSpec;
} }
private SqlBuilder PagedBuilder(DownloadProtocol? protocol) private SqlBuilder PagedBuilder(DownloadProtocol[] protocols)
{ {
var builder = Builder() var builder = Builder()
.Join<Blocklist, Series>((b, m) => b.SeriesId == m.Id); .Join<Blocklist, Series>((b, m) => b.SeriesId == m.Id);
if (protocol != null) if (protocols is { Length: > 0 })
{ {
builder.Where($"({BuildProtocolWhereClause(protocol)})"); builder.Where($"({BuildProtocolWhereClause(protocols)})");
} }
return builder; return builder;
@ -72,7 +72,16 @@ namespace NzbDrone.Core.Blocklisting
return blocklist; return blocklist;
}); });
private string BuildProtocolWhereClause(DownloadProtocol? protocol) => private string BuildProtocolWhereClause(DownloadProtocol[] protocols)
$"\"{TableMapping.Mapper.TableNameMapping(typeof(Blocklist))}\".\"Protocol\" = {(int)protocol}"; {
var clauses = new List<string>();
foreach (var protocol in protocols)
{
clauses.Add($"\"{TableMapping.Mapper.TableNameMapping(typeof(Blocklist))}\".\"Protocol\" = {(int)protocol}");
}
return $"({string.Join(" OR ", clauses)})";
}
} }
} }

View File

@ -16,7 +16,7 @@ namespace NzbDrone.Core.Blocklisting
{ {
bool Blocklisted(int seriesId, ReleaseInfo release); bool Blocklisted(int seriesId, ReleaseInfo release);
bool BlocklistedTorrentHash(int seriesId, string hash); bool BlocklistedTorrentHash(int seriesId, string hash);
PagingSpec<Blocklist> Paged(PagingSpec<Blocklist> pagingSpec, DownloadProtocol? protocol); PagingSpec<Blocklist> Paged(PagingSpec<Blocklist> pagingSpec, DownloadProtocol[] protocols);
void Block(RemoteEpisode remoteEpisode, string message); void Block(RemoteEpisode remoteEpisode, string message);
void Delete(int id); void Delete(int id);
void Delete(List<int> ids); void Delete(List<int> ids);
@ -66,9 +66,9 @@ namespace NzbDrone.Core.Blocklisting
b.TorrentInfoHash.Equals(hash, StringComparison.InvariantCultureIgnoreCase)); b.TorrentInfoHash.Equals(hash, StringComparison.InvariantCultureIgnoreCase));
} }
public PagingSpec<Blocklist> Paged(PagingSpec<Blocklist> pagingSpec, DownloadProtocol? protocol) public PagingSpec<Blocklist> Paged(PagingSpec<Blocklist> pagingSpec, DownloadProtocol[] protocols)
{ {
return _blocklistRepository.GetPaged(pagingSpec, protocol); return _blocklistRepository.GetPaged(pagingSpec, protocols);
} }
public void Block(RemoteEpisode remoteEpisode, string message) public void Block(RemoteEpisode remoteEpisode, string message)

View File

@ -25,7 +25,7 @@ namespace Sonarr.Api.V3.Blocklist
[HttpGet] [HttpGet]
[Produces("application/json")] [Produces("application/json")]
public PagingResource<BlocklistResource> GetBlocklist([FromQuery] PagingRequestResource paging, [FromQuery] int[] seriesIds = null, [FromQuery] DownloadProtocol? protocol = null) public PagingResource<BlocklistResource> GetBlocklist([FromQuery] PagingRequestResource paging, [FromQuery] int[] seriesIds = null, [FromQuery] DownloadProtocol[] protocols = null)
{ {
var pagingResource = new PagingResource<BlocklistResource>(paging); var pagingResource = new PagingResource<BlocklistResource>(paging);
var pagingSpec = pagingResource.MapToPagingSpec<BlocklistResource, NzbDrone.Core.Blocklisting.Blocklist>("date", SortDirection.Descending); var pagingSpec = pagingResource.MapToPagingSpec<BlocklistResource, NzbDrone.Core.Blocklisting.Blocklist>("date", SortDirection.Descending);
@ -35,7 +35,7 @@ namespace Sonarr.Api.V3.Blocklist
pagingSpec.FilterExpressions.Add(b => seriesIds.Contains(b.SeriesId)); pagingSpec.FilterExpressions.Add(b => seriesIds.Contains(b.SeriesId));
} }
return pagingSpec.ApplyToPage(b => _blocklistService.Paged(pagingSpec, protocol), b => BlocklistResourceMapper.MapToResource(b, _formatCalculator)); return pagingSpec.ApplyToPage(b => _blocklistService.Paged(pagingSpec, protocols), b => BlocklistResourceMapper.MapToResource(b, _formatCalculator));
} }
[RestDeleteById] [RestDeleteById]