using System; using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Oqtane.Repository; namespace Oqtane.Infrastructure { public class SiteTaskJob : HostedServiceBase { public SiteTaskJob(IServiceScopeFactory serviceScopeFactory) : base(serviceScopeFactory) { Name = "Site 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 siteTaskRepository = provider.GetRequiredService(); var tasks = siteTaskRepository.GetSiteTasks(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(ISiteTask)) != null) { try { tenantManager.SetAlias(tenant.TenantId, site.SiteId); var taskObject = ActivatorUtilities.CreateInstance(provider, taskType); var taskLog = ((ISiteTask)taskObject).ExecuteTask(provider, site, task.Parameters); taskLog += await ((ISiteTask)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; siteTaskRepository.UpdateSiteTask(task); log += task.Status + "
"; } } else { log += "No Tasks To Execute
"; } } return log; } } }