77 lines
2.7 KiB
C#
77 lines
2.7 KiB
C#
using System.Collections.Generic;
|
|
using Jellyfin.Plugin.JRay.Models;
|
|
using Jellyfin.Plugin.JRay.Services.Interfaces;
|
|
using Microsoft.AspNetCore.Authorization;
|
|
using Microsoft.AspNetCore.Http;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
|
namespace Jellyfin.Plugin.JRay.Controllers;
|
|
|
|
/// <summary>
|
|
/// Manages the prioritise/ignore rules that shape the work-discovery API
|
|
/// (<c>GET /Plugins/JRay/Tasks/Pending</c>). Rules can target a genre, a
|
|
/// series, or a single item; setting a rule for a target that already has one
|
|
/// replaces it, so a target can never be both prioritised and ignored.
|
|
/// </summary>
|
|
[ApiController]
|
|
[Route("Plugins/JRay/Policy")]
|
|
[Authorize(Roles = "Administrator")]
|
|
public class PolicyController : ControllerBase
|
|
{
|
|
private readonly IMediaPolicyStore _policyStore;
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of the <see cref="PolicyController"/> class.
|
|
/// </summary>
|
|
/// <param name="policyStore">The media policy store.</param>
|
|
public PolicyController(IMediaPolicyStore policyStore)
|
|
{
|
|
_policyStore = policyStore;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets all configured prioritise/ignore rules.
|
|
/// </summary>
|
|
/// <returns>The current rules.</returns>
|
|
[HttpGet("Rules")]
|
|
[ProducesResponseType(StatusCodes.Status200OK)]
|
|
public ActionResult<IReadOnlyList<MediaPolicyRule>> GetRules()
|
|
{
|
|
return Ok(_policyStore.GetRules());
|
|
}
|
|
|
|
/// <summary>
|
|
/// Adds or replaces a rule. If a rule already exists for the same scope
|
|
/// and value, its action is updated.
|
|
/// </summary>
|
|
/// <param name="rule">The rule to set.</param>
|
|
/// <returns>204 on success, or 400 if the rule has no value.</returns>
|
|
[HttpPut("Rules")]
|
|
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
|
[ProducesResponseType(StatusCodes.Status400BadRequest)]
|
|
public IActionResult SetRule([FromBody] MediaPolicyRule rule)
|
|
{
|
|
if (rule is null || string.IsNullOrWhiteSpace(rule.Value))
|
|
{
|
|
return BadRequest("A rule must have a non-empty value.");
|
|
}
|
|
|
|
_policyStore.SetRule(rule);
|
|
return NoContent();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Removes the rule matching the given scope and value.
|
|
/// </summary>
|
|
/// <param name="scope">The scope of the rule to remove.</param>
|
|
/// <param name="value">The value of the rule to remove.</param>
|
|
/// <returns>204 whether or not a matching rule existed.</returns>
|
|
[HttpDelete("Rules")]
|
|
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
|
public IActionResult RemoveRule([FromQuery] PolicyScope scope, [FromQuery] string value)
|
|
{
|
|
_policyStore.RemoveRule(scope, value ?? string.Empty);
|
|
return NoContent();
|
|
}
|
|
}
|