using MediaBrowser.Common.Extensions; using MediaBrowser.Common.Net; using MediaBrowser.Common.ScheduledTasks; using MediaBrowser.Model.Serialization; using MediaBrowser.Model.Tasks; using ServiceStack.ServiceHost; using System; using System.Collections.Generic; using System.IO; using System.Linq; using ServiceStack.Text.Controller; namespace MediaBrowser.Api.ScheduledTasks { /// /// Class GetScheduledTask /// [Route("/ScheduledTasks/{Id}", "GET")] public class GetScheduledTask : IReturn { /// /// Gets or sets the id. /// /// The id. public Guid Id { get; set; } } /// /// Class GetScheduledTasks /// [Route("/ScheduledTasks", "GET")] public class GetScheduledTasks : IReturn> { } /// /// Class StartScheduledTask /// [Route("/ScheduledTasks/Running/{Id}", "POST")] public class StartScheduledTask : IReturnVoid { /// /// Gets or sets the id. /// /// The id. public Guid Id { get; set; } } /// /// Class StopScheduledTask /// [Route("/ScheduledTasks/Running/{Id}", "DELETE")] public class StopScheduledTask : IReturnVoid { /// /// Gets or sets the id. /// /// The id. public Guid Id { get; set; } } /// /// Class UpdateScheduledTaskTriggers /// [Route("/ScheduledTasks/{Id}/Triggers", "POST")] public class UpdateScheduledTaskTriggers : IRequiresRequestStream { /// /// Gets or sets the task id. /// /// The task id. public Guid Id { get; set; } /// /// The raw Http Request Input Stream /// /// The request stream. public Stream RequestStream { get; set; } } /// /// Class ScheduledTasksService /// public class ScheduledTaskService : BaseRestService { /// /// Gets or sets the task manager. /// /// The task manager. private ITaskManager TaskManager { get; set; } /// /// The _json serializer /// private readonly IJsonSerializer _jsonSerializer; /// /// Initializes a new instance of the class. /// /// The task manager. /// The json serializer. /// taskManager public ScheduledTaskService(ITaskManager taskManager, IJsonSerializer jsonSerializer) { if (taskManager == null) { throw new ArgumentNullException("taskManager"); } if (jsonSerializer == null) { throw new ArgumentNullException("jsonSerializer"); } TaskManager = taskManager; _jsonSerializer = jsonSerializer; } /// /// Gets the specified request. /// /// The request. /// IEnumerable{TaskInfo}. public object Get(GetScheduledTasks request) { var result = TaskManager.ScheduledTasks.OrderBy(i => i.Name) .Select(ScheduledTaskHelpers.GetTaskInfo).ToList(); return ToOptimizedResult(result); } /// /// Gets the specified request. /// /// The request. /// IEnumerable{TaskInfo}. /// Task not found public object Get(GetScheduledTask request) { var task = TaskManager.ScheduledTasks.FirstOrDefault(i => 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 => i.Id == request.Id); if (task == null) { throw new ResourceNotFoundException("Task not found"); } task.Execute(); } /// /// Posts the specified request. /// /// The request. /// Task not found public void Delete(StopScheduledTask request) { var task = TaskManager.ScheduledTasks.FirstOrDefault(i => i.Id == request.Id); if (task == null) { throw new ResourceNotFoundException("Task not found"); } task.Cancel(); } /// /// 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 pathInfo = PathInfo.Parse(Request.PathInfo); var id = new Guid(pathInfo.GetArgumentValue(1)); var task = TaskManager.ScheduledTasks.FirstOrDefault(i => i.Id == id); if (task == null) { throw new ResourceNotFoundException("Task not found"); } var triggerInfos = _jsonSerializer.DeserializeFromStream(request.RequestStream); task.Triggers = triggerInfos.Select(ScheduledTaskHelpers.GetTrigger); } } }