using MediaBrowser.Common.Extensions; using MediaBrowser.Common.Net; using MediaBrowser.Common.ScheduledTasks; using MediaBrowser.Common.Serialization; using MediaBrowser.Model.Tasks; using ServiceStack.ServiceHost; using System; using System.Collections.Generic; using System.ComponentModel.Composition; 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 /// [Export(typeof(IRestfulService))] public class ScheduledTaskService : BaseRestService { /// /// Gets the specified request. /// /// The request. /// IEnumerable{TaskInfo}. public object Get(GetScheduledTasks request) { var result = Kernel.ScheduledTasks.OrderBy(i => i.Name) .Select(ScheduledTaskHelpers.GetTaskInfo).ToList(); return ToOptimizedResult(result); } /// /// Gets the specified request. /// /// The request. /// IEnumerable{TaskInfo}. public object Get(GetScheduledTask request) { var task = Kernel.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. public void Post(StartScheduledTask request) { var task = Kernel.ScheduledTasks.FirstOrDefault(i => i.Id == request.Id); if (task == null) { throw new ResourceNotFoundException("Task not found"); } task.Execute(); } /// /// Posts the specified request. /// /// The request. public void Delete(StopScheduledTask request) { var task = Kernel.ScheduledTasks.FirstOrDefault(i => i.Id == request.Id); if (task == null) { throw new ResourceNotFoundException("Task not found"); } task.Cancel(); } /// /// Posts the specified request. /// /// The request. 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 = Kernel.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(t => ScheduledTaskHelpers.GetTrigger(t, Kernel)); } } }