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
},
{
name: 'protocol',
name: 'protocols',
label: () => translate('Protocol'),
type: filterBuilderTypes.EQUAL,
valueType: filterBuilderValueTypes.PROTOCOL

View File

@ -12,7 +12,7 @@ namespace NzbDrone.Core.Blocklisting
List<Blocklist> BlocklistedByTorrentInfoHash(int seriesId, string torrentInfoHash);
List<Blocklist> BlocklistedBySeries(int seriesId);
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
@ -42,24 +42,24 @@ namespace NzbDrone.Core.Blocklisting
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\"";
pagingSpec.TotalRecords = GetPagedRecordCount(PagedBuilder(protocol).Select(typeof(Blocklist)), pagingSpec, countTemplate);
pagingSpec.TotalRecords = GetPagedRecordCount(PagedBuilder(protocols).Select(typeof(Blocklist)), pagingSpec, countTemplate);
return pagingSpec;
}
private SqlBuilder PagedBuilder(DownloadProtocol? protocol)
private SqlBuilder PagedBuilder(DownloadProtocol[] protocols)
{
var builder = Builder()
.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;
@ -72,7 +72,16 @@ namespace NzbDrone.Core.Blocklisting
return blocklist;
});
private string BuildProtocolWhereClause(DownloadProtocol? protocol) =>
$"\"{TableMapping.Mapper.TableNameMapping(typeof(Blocklist))}\".\"Protocol\" = {(int)protocol}";
private string BuildProtocolWhereClause(DownloadProtocol[] protocols)
{
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 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 Delete(int id);
void Delete(List<int> ids);
@ -66,9 +66,9 @@ namespace NzbDrone.Core.Blocklisting
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)

View File

@ -25,7 +25,7 @@ namespace Sonarr.Api.V3.Blocklist
[HttpGet]
[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 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));
}
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]