using System; using System.Diagnostics.Eventing.Reader; using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Oqtane.Repository; namespace Oqtane.Infrastructure { public class TaskJob : HostedServiceBase { public TaskJob(IServiceScopeFactory serviceScopeFactory) : base(serviceScopeFactory) { Name = "Task Job"; Frequency = "m"; // run every minute Interval = 1; IsEnabled = true; } // job is executed for each tenant in installation public override async Task ExecuteJobAsync(IServiceProvider provider) { var log = ""; var tenantManager = provider.GetRequiredService(); var tenant = tenantManager.GetTenant(); // iterate through sites for current tenant var siteRepository = provider.GetRequiredService(); var sites = siteRepository.GetSites().ToList(); foreach (var site in sites.Where(item => !item.IsDeleted)) { log += $"Processing Site: {site.Name}
"; // get incomplete tasks for site var jobTaskRepository = provider.GetRequiredService(); var tasks = jobTaskRepository.GetJobTasks(site.SiteId).ToList(); if (tasks != null && tasks.Any()) { foreach (var task in tasks) { log += $"Executing Task: {task.Name}
"; Type taskType = Type.GetType(task.Type); if (taskType != null && taskType.GetInterface(nameof(IJobTask)) != null) { try { tenantManager.SetAlias(tenant.TenantId, site.SiteId); var taskObject = ActivatorUtilities.CreateInstance(provider, taskType); var taskLog = ((IJobTask)taskObject).ExecuteTask(provider, site, task.Parameters); taskLog += await ((IJobTask)taskObject).ExecuteTaskAsync(provider, site, task.Parameters); task.Status = taskLog; } catch (Exception ex) { task.Status = "Error: " + ex.Message; } } else { task.Status = $"Error: Task {task.Name} Has An Invalid Type {task.Type}
"; } // update task task.IsCompleted = true; jobTaskRepository.UpdateJobTask(task); log += task.Status + "
"; } } else { log += "No Tasks To Execute
"; } } return log; } } }