You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Ombi/src/Ombi/Controllers/V2/RequestsController.cs

240 lines
12 KiB

using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
using Ombi.Core.Engine;
using Ombi.Core.Engine.Interfaces;
using Ombi.Core.Models.Requests;
using Ombi.Core.Models.UI;
using Ombi.Store.Entities.Requests;
using System;
using Ombi.Store.Entities;
using System.Linq;
using Microsoft.Extensions.Logging;
using Ombi.Attributes;
using Ombi.Helpers;
namespace Ombi.Controllers.V2
{
public class RequestsController : V2Controller
{
private readonly IMovieRequestEngine _movieRequestEngine;
private readonly ITvRequestEngine _tvRequestEngine;
private readonly IMusicRequestEngine _musicRequestEngine;
private readonly IVoteEngine _voteEngine;
private readonly ILogger<RequestsController> _logger;
public RequestsController(IMovieRequestEngine movieRequestEngine, ITvRequestEngine tvRequestEngine, IMusicRequestEngine musicRequestEngine,
IVoteEngine voteEngine, ILogger<RequestsController> logger)
{
_movieRequestEngine = movieRequestEngine;
_tvRequestEngine = tvRequestEngine;
_musicRequestEngine = musicRequestEngine;
_voteEngine = voteEngine;
_logger = logger;
}
/// <summary>
/// Gets movie requests.
/// </summary>
/// <param name="count">The count of items you want to return. e.g. 30</param>
/// <param name="position">The position. e.g. position 60 for a 2nd page (since we have already got the first 30 items)</param>
/// <param name="sort">The item to sort on e.g. "requestDate"</param>
/// <param name="sortOrder">asc or desc</param>
[HttpGet("movie/{count:int}/{position:int}/{sort}/{sortOrder}")]
public async Task<RequestsViewModel<MovieRequests>> GetRequests(int count, int position, string sort, string sortOrder)
{
return await _movieRequestEngine.GetRequests(count, position, sort, sortOrder);
}
[HttpGet("movie/availble/{count:int}/{position:int}/{sort}/{sortOrder}")]
[HttpGet("movie/available/{count:int}/{position:int}/{sort}/{sortOrder}")]
public async Task<RequestsViewModel<MovieRequests>> GetAvailableRequests(int count, int position, string sort, string sortOrder)
{
return await _movieRequestEngine.GetRequestsByStatus(count, position, sort, sortOrder, RequestStatus.Available);
}
[HttpGet("movie/processing/{count:int}/{position:int}/{sort}/{sortOrder}")]
public async Task<RequestsViewModel<MovieRequests>> GetProcessingRequests(int count, int position, string sort, string sortOrder)
{
return await _movieRequestEngine.GetRequestsByStatus(count, position, sort, sortOrder, RequestStatus.ProcessingRequest);
}
[HttpGet("movie/pending/{count:int}/{position:int}/{sort}/{sortOrder}")]
public async Task<RequestsViewModel<MovieRequests>> GetPendingRequests(int count, int position, string sort, string sortOrder)
{
return await _movieRequestEngine.GetRequestsByStatus(count, position, sort, sortOrder, RequestStatus.PendingApproval);
}
[HttpGet("movie/denied/{count:int}/{position:int}/{sort}/{sortOrder}")]
public async Task<RequestsViewModel<MovieRequests>> GetDeniedRequests(int count, int position, string sort, string sortOrder)
{
return await _movieRequestEngine.GetRequestsByStatus(count, position, sort, sortOrder, RequestStatus.Denied);
}
/// <summary>
/// Gets the unavailable movie requests.
/// </summary>
/// <param name="count">The count of items you want to return. e.g. 30</param>
/// <param name="position">The position. e.g. position 60 for a 2nd page (since we have already got the first 30 items)</param>
/// <param name="sort">The item to sort on e.g. "requestDate"</param>
/// <param name="sortOrder">asc or desc</param>
[HttpGet("movie/unavailable/{count:int}/{position:int}/{sort}/{sortOrder}")]
public async Task<RequestsViewModel<MovieRequests>> GetNotAvailableRequests(int count, int position, string sort, string sortOrder)
{
return await _movieRequestEngine.GetUnavailableRequests(count, position, sort, sortOrder);
}
/// <summary>
/// Gets Tv requests.
/// </summary>
/// <param name="count">The count of items you want to return. e.g. 30</param>
/// <param name="position">The position. e.g. position 60 for a 2nd page (since we have already got the first 30 items)</param>
/// <param name="sort">The item to sort on e.g. "requestDate"</param>
/// <param name="sortOrder">asc or desc</param>
[HttpGet("tv/{count:int}/{position:int}/{sort}/{sortOrder}")]
public async Task<RequestsViewModel<ChildRequests>> GetTvRequests(int count, int position, string sort, string sortOrder)
{
return await _tvRequestEngine.GetRequests(count, position, sort, sortOrder);
}
[HttpGet("tv/pending/{count:int}/{position:int}/{sort}/{sortOrder}")]
public async Task<RequestsViewModel<ChildRequests>> GetPendingTvRequests(int count, int position, string sort, string sortOrder)
{
return await _tvRequestEngine.GetRequests(count, position, sort, sortOrder, RequestStatus.PendingApproval);
}
[HttpGet("tv/processing/{count:int}/{position:int}/{sort}/{sortOrder}")]
public async Task<RequestsViewModel<ChildRequests>> GetProcessingTvRequests(int count, int position, string sort, string sortOrder)
{
return await _tvRequestEngine.GetRequests(count, position, sort, sortOrder, RequestStatus.ProcessingRequest);
}
[HttpGet("tv/available/{count:int}/{position:int}/{sort}/{sortOrder}")]
public async Task<RequestsViewModel<ChildRequests>> GetAvailableTvRequests(int count, int position, string sort, string sortOrder)
{
return await _tvRequestEngine.GetRequests(count, position, sort, sortOrder, RequestStatus.Available);
}
[HttpGet("tv/denied/{count:int}/{position:int}/{sort}/{sortOrder}")]
public async Task<RequestsViewModel<ChildRequests>> GetDeniedTvRequests(int count, int position, string sort, string sortOrder)
{
return await _tvRequestEngine.GetRequests(count, position, sort, sortOrder, RequestStatus.Denied);
}
/// <summary>
/// Gets unavailable Tv requests.
/// </summary>
/// <param name="count">The count of items you want to return. e.g. 30</param>
/// <param name="position">The position. e.g. position 60 for a 2nd page (since we have already got the first 30 items)</param>
/// <param name="sort">The item to sort on e.g. "requestDate"</param>
/// <param name="sortOrder">asc or desc</param>
[HttpGet("tv/unavailable/{count:int}/{position:int}/{sort}/{sortOrder}")]
public async Task<RequestsViewModel<ChildRequests>> GetNotAvailableTvRequests(int count, int position, string sort, string sortOrder)
{
return await _tvRequestEngine.GetUnavailableRequests(count, position, sort, sortOrder);
}
[PowerUser]
[HttpPost("movie/advancedoptions")]
public async Task<RequestEngineResult> UpdateAdvancedOptions([FromBody] MediaAdvancedOptions options)
{
return await _movieRequestEngine.UpdateAdvancedOptions(options);
}
[PowerUser]
[HttpPost("tv/advancedoptions")]
public async Task<RequestEngineResult> UpdateTvAdvancedOptions([FromBody] MediaAdvancedOptions options)
{
return await _tvRequestEngine.UpdateAdvancedOptions(options);
}
[HttpGet("album/available/{count:int}/{position:int}/{sort}/{sortOrder}")]
public async Task<RequestsViewModel<AlbumRequest>> GetAvailableAlbumRequests(int count, int position, string sort, string sortOrder)
{
return await _musicRequestEngine.GetRequestsByStatus(count, position, sort, sortOrder, RequestStatus.Available);
}
[HttpGet("album/processing/{count:int}/{position:int}/{sort}/{sortOrder}")]
public async Task<RequestsViewModel<AlbumRequest>> GetProcessingAlbumRequests(int count, int position, string sort, string sortOrder)
{
return await _musicRequestEngine.GetRequestsByStatus(count, position, sort, sortOrder, RequestStatus.ProcessingRequest);
}
[HttpGet("album/pending/{count:int}/{position:int}/{sort}/{sortOrder}")]
public async Task<RequestsViewModel<AlbumRequest>> GetPendingAlbumRequests(int count, int position, string sort, string sortOrder)
{
return await _musicRequestEngine.GetRequestsByStatus(count, position, sort, sortOrder, RequestStatus.PendingApproval);
}
[HttpGet("album/denied/{count:int}/{position:int}/{sort}/{sortOrder}")]
public async Task<RequestsViewModel<AlbumRequest>> GetDeniedAlbumRequests(int count, int position, string sort, string sortOrder)
{
return await _musicRequestEngine.GetRequestsByStatus(count, position, sort, sortOrder, RequestStatus.Denied);
}
[HttpGet("album/{count:int}/{position:int}/{sort}/{sortOrder}")]
public async Task<RequestsViewModel<AlbumRequest>> GetAlbumRequests(int count, int position, string sort, string sortOrder)
{
return await _musicRequestEngine.GetRequests(count, position, sort, sortOrder);
}
/// <summary>
/// Requests a tv show/episode/season.
/// </summary>
/// <param name="tv">The tv.</param>
/// <returns></returns>
[HttpPost("tv")]
public async Task<RequestEngineResult> RequestTv([FromBody] TvRequestViewModelV2 tv)
{
tv.RequestedByAlias = GetApiAlias();
var result = await _tvRequestEngine.RequestTvShow(tv);
if (result.Result)
{
var voteResult = await _voteEngine.UpVote(result.RequestId, RequestType.TvShow);
if (voteResult.IsError)
{
_logger.LogError("Couldn't automatically add the vote for the tv {0} because {1}", tv.TheMovieDbId, voteResult.ErrorMessage);
}
}
return result;
}
[PowerUser]
[HttpPost("reprocess/{type}/{requestId}")]
public async Task<IActionResult> ReProcessRequest(RequestType type, int requestId)
{
switch (type)
{
case RequestType.TvShow:
return Ok(await _tvRequestEngine.ReProcessRequest(requestId, HttpContext.RequestAborted));
case RequestType.Movie:
return Ok(await _movieRequestEngine.ReProcessRequest(requestId, HttpContext.RequestAborted));
}
return BadRequest();
}
[HttpPost("movie/collection/{collectionId}")]
public async Task<RequestEngineResult> RequestCollection(int collectionId)
{
return await _movieRequestEngine.RequestCollection(collectionId, HttpContext.RequestAborted);
}
private string GetApiAlias()
{
// Make sure this only applies when using the API KEY
if (HttpContext.Request.Headers.Keys.Contains("ApiKey", StringComparer.InvariantCultureIgnoreCase))
{
if (HttpContext.Request.Headers.TryGetValue("ApiAlias", out var apiAlias))
{
return apiAlias;
}
}
return null;
}
}
}