using MediaBrowser.Common.Extensions; using MediaBrowser.Common.ScheduledTasks; using MediaBrowser.Controller.Net; using MediaBrowser.Model.Tasks; using ServiceStack; using System; using System.Collections.Generic; using System.Linq; using MediaBrowser.Controller.Configuration; 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 { /// /// Gets or sets the task manager. /// /// The task manager. private ITaskManager TaskManager { get; set; } private readonly IServerConfigurationManager _config; /// /// Initializes a new instance of the class. /// /// The task manager. /// taskManager public ScheduledTaskService(ITaskManager taskManager, IServerConfigurationManager config) { if (taskManager == null) { throw new ArgumentNullException("taskManager"); } TaskManager = taskManager; _config = config; } /// /// 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; var configurableTask = i.ScheduledTask as IConfigurableScheduledTask; if (configurableTask != null) { isHidden = configurableTask.IsHidden; } return isHidden == val; }); } if (request.IsEnabled.HasValue) { var val = request.IsEnabled.Value; result = result.Where(i => { var isEnabled = true; var configurableTask = i.ScheduledTask as IConfigurableScheduledTask; if (configurableTask != null) { isEnabled = configurableTask.IsEnabled; } return isEnabled == val; }); } var infos = result .Select(ScheduledTaskHelpers.GetTaskInfo) .ToList(); 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"); } if (string.Equals(task.ScheduledTask.Key, "SystemUpdateTask", StringComparison.OrdinalIgnoreCase)) { // This is a hack for now just to get the update application function to work when auto-update is disabled if (!_config.Configuration.EnableAutoUpdate) { _config.Configuration.EnableAutoUpdate = true; _config.SaveConfiguration(); } } TaskManager.Execute(task); } /// /// 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); var task = TaskManager.ScheduledTasks.FirstOrDefault(i => string.Equals(i.Id, id)); if (task == null) { throw new ResourceNotFoundException("Task not found"); } var triggerInfos = request; task.Triggers = triggerInfos.ToArray(); } } }