using System; using System.Collections.Generic; using System.Linq; using MediaBrowser.Common.Extensions; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Net; using MediaBrowser.Model.Services; using MediaBrowser.Model.Tasks; using Microsoft.Extensions.Logging; namespace MediaBrowser.Api.ScheduledTasks { /// /// Class GetScheduledTask. /// [Route("/ScheduledTasks/{Id}", "GET", Summary = "Gets a scheduled task, by Id")] public class GetScheduledTask : IReturn { /// /// Gets or sets the id. /// /// The id. [ApiMember(Name = "Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] public string Id { get; set; } } /// /// Class GetScheduledTasks. /// [Route("/ScheduledTasks", "GET", Summary = "Gets scheduled tasks")] public class GetScheduledTasks : IReturn { [ApiMember(Name = "IsHidden", Description = "Optional filter tasks that are hidden, or not.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")] public bool? IsHidden { get; set; } [ApiMember(Name = "IsEnabled", Description = "Optional filter tasks that are enabled, or not.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")] public bool? IsEnabled { get; set; } } /// /// Class StartScheduledTask. /// [Route("/ScheduledTasks/Running/{Id}", "POST", Summary = "Starts a scheduled task")] public class StartScheduledTask : IReturnVoid { /// /// Gets or sets the id. /// /// The id. [ApiMember(Name = "Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")] public string Id { get; set; } } /// /// Class StopScheduledTask. /// [Route("/ScheduledTasks/Running/{Id}", "DELETE", Summary = "Stops a scheduled task")] public class StopScheduledTask : IReturnVoid { /// /// Gets or sets the id. /// /// The id. [ApiMember(Name = "Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")] public string Id { get; set; } } /// /// Class UpdateScheduledTaskTriggers. /// [Route("/ScheduledTasks/{Id}/Triggers", "POST", Summary = "Updates the triggers for a scheduled task")] public class UpdateScheduledTaskTriggers : List, IReturnVoid { /// /// Gets or sets the task id. /// /// The task id. [ApiMember(Name = "Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")] public string Id { get; set; } } /// /// Class ScheduledTasksService. /// [Authenticated(Roles = "Admin")] public class ScheduledTaskService : BaseApiService { /// /// The task manager. /// private readonly ITaskManager _taskManager; /// /// Initializes a new instance of the class. /// /// The task manager. /// taskManager public ScheduledTaskService( ILogger logger, IServerConfigurationManager serverConfigurationManager, IHttpResultFactory httpResultFactory, ITaskManager taskManager) : base(logger, serverConfigurationManager, httpResultFactory) { _taskManager = taskManager; } /// /// Gets the specified request. /// /// The request. /// IEnumerable{TaskInfo}. public object Get(GetScheduledTasks request) { IEnumerable result = _taskManager.ScheduledTasks .OrderBy(i => i.Name); if (request.IsHidden.HasValue) { var val = request.IsHidden.Value; result = result.Where(i => { var isHidden = false; if (i.ScheduledTask is IConfigurableScheduledTask configurableTask) { isHidden = configurableTask.IsHidden; } return isHidden == val; }); } if (request.IsEnabled.HasValue) { var val = request.IsEnabled.Value; result = result.Where(i => { var isEnabled = true; if (i.ScheduledTask is IConfigurableScheduledTask configurableTask) { isEnabled = configurableTask.IsEnabled; } return isEnabled == val; }); } var infos = result .Select(ScheduledTaskHelpers.GetTaskInfo) .ToArray(); return ToOptimizedResult(infos); } /// /// Gets the specified request. /// /// The request. /// IEnumerable{TaskInfo}. /// Task not found public object Get(GetScheduledTask request) { var task = _taskManager.ScheduledTasks.FirstOrDefault(i => string.Equals(i.Id, request.Id)); if (task == null) { throw new ResourceNotFoundException("Task not found"); } var result = ScheduledTaskHelpers.GetTaskInfo(task); return ToOptimizedResult(result); } /// /// Posts the specified request. /// /// The request. /// Task not found public void Post(StartScheduledTask request) { var task = _taskManager.ScheduledTasks.FirstOrDefault(i => string.Equals(i.Id, request.Id)); if (task == null) { throw new ResourceNotFoundException("Task not found"); } _taskManager.Execute(task, new TaskOptions()); } /// /// Posts the specified request. /// /// The request. /// Task not found public void Delete(StopScheduledTask request) { var task = _taskManager.ScheduledTasks.FirstOrDefault(i => string.Equals(i.Id, request.Id)); if (task == null) { throw new ResourceNotFoundException("Task not found"); } _taskManager.Cancel(task); } /// /// Posts the specified request. /// /// The request. /// Task not found public void Post(UpdateScheduledTaskTriggers request) { // We need to parse this manually because we told service stack not to with IRequiresRequestStream // https://code.google.com/p/servicestack/source/browse/trunk/Common/ServiceStack.Text/ServiceStack.Text/Controller/PathInfo.cs var id = GetPathValue(1).ToString(); var task = _taskManager.ScheduledTasks.FirstOrDefault(i => string.Equals(i.Id, id, StringComparison.Ordinal)); if (task == null) { throw new ResourceNotFoundException("Task not found"); } task.Triggers = request.ToArray(); } } }