From 060eaa7aff5e9c0889b587df1bd417b96520f59f Mon Sep 17 00:00:00 2001 From: sbwalker Date: Thu, 19 Feb 2026 10:47:30 -0500 Subject: [PATCH] change JobTask to SiteTask --- .../OqtaneServiceCollectionExtensions.cs | 2 +- .../Modules/Admin/GlobalReplace/Index.razor | 6 +- Oqtane.Client/Modules/Admin/Users/Users.razor | 6 +- Oqtane.Client/Services/JobTaskService.cs | 46 ----------- Oqtane.Client/Services/SiteTaskService.cs | 46 +++++++++++ ...askController.cs => SiteTaskController.cs} | 32 ++++---- .../OqtaneServiceCollectionExtensions.cs | 4 +- .../Infrastructure/Interfaces/IJobTask.cs | 2 +- Oqtane.Server/Infrastructure/Jobs/PurgeJob.cs | 13 +++ .../Jobs/{TaskJob.cs => SiteTaskJob.cs} | 18 ++-- .../{Tasks => SiteTasks}/GlobalReplaceTask.cs | 2 +- .../{Tasks => SiteTasks}/ImportUsersTask.cs | 2 +- .../SiteTaskBase.cs} | 2 +- ...ityBuilder.cs => SiteTaskEntityBuilder.cs} | 16 ++-- ...ddJobTasks.cs => 10010004_AddSiteTasks.cs} | 8 +- .../Repository/Context/TenantDBContext.cs | 2 +- Oqtane.Server/Repository/JobTaskRepository.cs | 56 ------------- .../Repository/SiteTaskRepository.cs | 82 +++++++++++++++++++ .../Models/{JobTask.cs => SiteTask.cs} | 12 ++- 19 files changed, 197 insertions(+), 160 deletions(-) delete mode 100644 Oqtane.Client/Services/JobTaskService.cs create mode 100644 Oqtane.Client/Services/SiteTaskService.cs rename Oqtane.Server/Controllers/{JobTaskController.cs => SiteTaskController.cs} (58%) rename Oqtane.Server/Infrastructure/Jobs/{TaskJob.cs => SiteTaskJob.cs} (78%) rename Oqtane.Server/Infrastructure/{Tasks => SiteTasks}/GlobalReplaceTask.cs (99%) rename Oqtane.Server/Infrastructure/{Tasks => SiteTasks}/ImportUsersTask.cs (97%) rename Oqtane.Server/Infrastructure/{Tasks/JobTaskBase.cs => SiteTasks/SiteTaskBase.cs} (91%) rename Oqtane.Server/Migrations/EntityBuilders/{JobTaskEntityBuilder.cs => SiteTaskEntityBuilder.cs} (65%) rename Oqtane.Server/Migrations/Tenant/{10010004_AddJobTasks.cs => 10010004_AddSiteTasks.cs} (68%) delete mode 100644 Oqtane.Server/Repository/JobTaskRepository.cs create mode 100644 Oqtane.Server/Repository/SiteTaskRepository.cs rename Oqtane.Shared/Models/{JobTask.cs => SiteTask.cs} (80%) diff --git a/Oqtane.Client/Extensions/OqtaneServiceCollectionExtensions.cs b/Oqtane.Client/Extensions/OqtaneServiceCollectionExtensions.cs index f699d7fe..dca72f70 100644 --- a/Oqtane.Client/Extensions/OqtaneServiceCollectionExtensions.cs +++ b/Oqtane.Client/Extensions/OqtaneServiceCollectionExtensions.cs @@ -41,7 +41,6 @@ namespace Microsoft.Extensions.DependencyInjection services.AddScoped(); services.AddScoped(); services.AddScoped(); - services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); @@ -60,6 +59,7 @@ namespace Microsoft.Extensions.DependencyInjection services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); services.AddScoped(); // providers diff --git a/Oqtane.Client/Modules/Admin/GlobalReplace/Index.razor b/Oqtane.Client/Modules/Admin/GlobalReplace/Index.razor index 7ac71a70..dff7e341 100644 --- a/Oqtane.Client/Modules/Admin/GlobalReplace/Index.razor +++ b/Oqtane.Client/Modules/Admin/GlobalReplace/Index.razor @@ -1,7 +1,7 @@ @namespace Oqtane.Modules.Admin.GlobalReplace @using System.Text.Json @inherits ModuleBase -@inject IJobTaskService JobTaskService +@inject ISiteTaskService SiteTaskService @inject IStringLocalizer Localizer @inject IStringLocalizer SharedLocalizer @@ -97,8 +97,8 @@ Content = bool.Parse(_content) }; - var jobTask = new JobTask(PageState.Site.SiteId, "Global Replace", "Oqtane.Infrastructure.GlobalReplaceTask, Oqtane.Server", JsonSerializer.Serialize(replace)); - await JobTaskService.AddJobTaskAsync(jobTask); + var siteTask = new SiteTask(PageState.Site.SiteId, "Global Replace", "Oqtane.Infrastructure.GlobalReplaceTask, Oqtane.Server", JsonSerializer.Serialize(replace)); + await SiteTaskService.AddSiteTaskAsync(siteTask); AddModuleMessage(Localizer["Success.Save"], MessageType.Success); } diff --git a/Oqtane.Client/Modules/Admin/Users/Users.razor b/Oqtane.Client/Modules/Admin/Users/Users.razor index 0a357a57..41e0912f 100644 --- a/Oqtane.Client/Modules/Admin/Users/Users.razor +++ b/Oqtane.Client/Modules/Admin/Users/Users.razor @@ -1,7 +1,7 @@ @namespace Oqtane.Modules.Admin.Users @inherits ModuleBase @inject NavigationManager NavigationManager -@inject IJobTaskService JobTaskService +@inject ISiteTaskService SiteTaskService @inject IStringLocalizer Localizer @inject IStringLocalizer SharedLocalizer @@ -43,8 +43,8 @@ var fileid = _filemanager.GetFileId(); if (fileid != -1) { - var jobTask = new JobTask(PageState.Site.SiteId, "Import Users", "Oqtane.Infrastructure.ImportUsersTask, Oqtane.Server", $"{fileid}:{_notify}"); - await JobTaskService.AddJobTaskAsync(jobTask); + var siteTask = new SiteTask(PageState.Site.SiteId, "Import Users", "Oqtane.Infrastructure.ImportUsersTask, Oqtane.Server", $"{fileid}:{_notify}"); + await SiteTaskService.AddSiteTaskAsync(siteTask); AddModuleMessage(Localizer["Message.Import.Success"], MessageType.Success); } else diff --git a/Oqtane.Client/Services/JobTaskService.cs b/Oqtane.Client/Services/JobTaskService.cs deleted file mode 100644 index 4e596a52..00000000 --- a/Oqtane.Client/Services/JobTaskService.cs +++ /dev/null @@ -1,46 +0,0 @@ -using Oqtane.Models; -using System.Threading.Tasks; -using System.Net.Http; -using Oqtane.Documentation; -using Oqtane.Shared; - -namespace Oqtane.Services -{ - /// - /// Service to manage tasks () - /// - public interface IJobTaskService - { - /// - /// Return a specific task - /// - /// - /// - Task GetJobTaskAsync(int jobTaskId); - - /// - /// Adds a new task - /// - /// - /// - Task AddJobTaskAsync(JobTask jobTask); - } - - [PrivateApi("Don't show in the documentation, as everything should use the Interface")] - public class JobTaskService : ServiceBase, IJobTaskService - { - public JobTaskService(HttpClient http, SiteState siteState) : base(http, siteState) { } - - private string Apiurl => CreateApiUrl("JobTask"); - - public async Task GetJobTaskAsync(int jobTaskId) - { - return await GetJsonAsync($"{Apiurl}/{jobTaskId}"); - } - - public async Task AddJobTaskAsync(JobTask jobTask) - { - return await PostJsonAsync(Apiurl, jobTask); - } - } -} diff --git a/Oqtane.Client/Services/SiteTaskService.cs b/Oqtane.Client/Services/SiteTaskService.cs new file mode 100644 index 00000000..b0c68859 --- /dev/null +++ b/Oqtane.Client/Services/SiteTaskService.cs @@ -0,0 +1,46 @@ +using Oqtane.Models; +using System.Threading.Tasks; +using System.Net.Http; +using Oqtane.Documentation; +using Oqtane.Shared; + +namespace Oqtane.Services +{ + /// + /// Service to manage tasks () + /// + public interface ISiteTaskService + { + /// + /// Return a specific task + /// + /// + /// + Task GetSiteTaskAsync(int siteTaskId); + + /// + /// Adds a new task + /// + /// + /// + Task AddSiteTaskAsync(SiteTask siteTask); + } + + [PrivateApi("Don't show in the documentation, as everything should use the Interface")] + public class SiteTaskService : ServiceBase, ISiteTaskService + { + public SiteTaskService(HttpClient http, SiteState siteState) : base(http, siteState) { } + + private string Apiurl => CreateApiUrl("SiteTask"); + + public async Task GetSiteTaskAsync(int siteTaskId) + { + return await GetJsonAsync($"{Apiurl}/{siteTaskId}"); + } + + public async Task AddSiteTaskAsync(SiteTask siteTask) + { + return await PostJsonAsync(Apiurl, siteTask); + } + } +} diff --git a/Oqtane.Server/Controllers/JobTaskController.cs b/Oqtane.Server/Controllers/SiteTaskController.cs similarity index 58% rename from Oqtane.Server/Controllers/JobTaskController.cs rename to Oqtane.Server/Controllers/SiteTaskController.cs index 5e02f229..61842f84 100644 --- a/Oqtane.Server/Controllers/JobTaskController.cs +++ b/Oqtane.Server/Controllers/SiteTaskController.cs @@ -10,15 +10,15 @@ using Oqtane.Shared; namespace Oqtane.Controllers { [Route(ControllerRoutes.ApiRoute)] - public class JobTaskController : Controller + public class SiteTaskController : Controller { - private readonly IJobTaskRepository _jobTasks; + private readonly ISiteTaskRepository _siteTasks; private readonly ILogManager _logger; private readonly Alias _alias; - public JobTaskController(IJobTaskRepository jobTasks, ILogManager logger, ITenantManager tenantManager) + public SiteTaskController(ISiteTaskRepository siteTasks, ILogManager logger, ITenantManager tenantManager) { - _jobTasks = jobTasks; + _siteTasks = siteTasks; _logger = logger; _alias = tenantManager.GetAlias(); } @@ -26,12 +26,12 @@ namespace Oqtane.Controllers // GET api//5 [HttpGet("{id}")] [Authorize(Roles = RoleNames.Admin)] - public JobTask Get(int id) + public SiteTask Get(int id) { - var jobTask = _jobTasks.GetJobTask(id); - if (jobTask.SiteId == _alias.SiteId) + var siteTask = _siteTasks.GetSiteTask(id); + if (siteTask.SiteId == _alias.SiteId) { - return jobTask; + return siteTask; } else { @@ -43,21 +43,21 @@ namespace Oqtane.Controllers // POST api/ [HttpPost] [Authorize(Roles = RoleNames.Admin)] - public JobTask Post([FromBody] JobTask jobTask) + public SiteTask Post([FromBody] SiteTask siteTask) { - if (ModelState.IsValid && jobTask.SiteId == _alias.SiteId) + if (ModelState.IsValid && siteTask.SiteId == _alias.SiteId) { - jobTask.IsCompleted = false; - jobTask = _jobTasks.AddJobTask(jobTask); - _logger.Log(LogLevel.Information, this, LogFunction.Create, "Job Task Added {JobTask}", jobTask); + siteTask.IsCompleted = false; + siteTask = _siteTasks.AddSiteTask(siteTask); + _logger.Log(LogLevel.Information, this, LogFunction.Create, "Site Task Added {SiteTask}", siteTask); } else { - _logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized Job Task Post Attempt {JobTask}", jobTask); + _logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized Site Task Post Attempt {SiteTask}", siteTask); HttpContext.Response.StatusCode = (int)HttpStatusCode.Forbidden; - jobTask = null; + siteTask = null; } - return jobTask; + return siteTask; } } } diff --git a/Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs b/Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs index a26768ee..fceb8f8f 100644 --- a/Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs +++ b/Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs @@ -214,7 +214,6 @@ namespace Microsoft.Extensions.DependencyInjection services.AddScoped(); services.AddScoped(); services.AddScoped(); - services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); @@ -236,6 +235,7 @@ namespace Microsoft.Extensions.DependencyInjection services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); // providers services.AddScoped(); @@ -275,7 +275,6 @@ namespace Microsoft.Extensions.DependencyInjection services.AddTransient(); services.AddTransient(); services.AddTransient(); - services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); @@ -288,6 +287,7 @@ namespace Microsoft.Extensions.DependencyInjection services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); // managers services.AddTransient(); diff --git a/Oqtane.Server/Infrastructure/Interfaces/IJobTask.cs b/Oqtane.Server/Infrastructure/Interfaces/IJobTask.cs index c2941553..ab26d820 100644 --- a/Oqtane.Server/Infrastructure/Interfaces/IJobTask.cs +++ b/Oqtane.Server/Infrastructure/Interfaces/IJobTask.cs @@ -4,7 +4,7 @@ using Oqtane.Models; namespace Oqtane.Infrastructure { - public interface IJobTask + public interface ISiteTask { string ExecuteTask(IServiceProvider provider, Site site, string parameters); diff --git a/Oqtane.Server/Infrastructure/Jobs/PurgeJob.cs b/Oqtane.Server/Infrastructure/Jobs/PurgeJob.cs index 06c88ab5..0b9d3288 100644 --- a/Oqtane.Server/Infrastructure/Jobs/PurgeJob.cs +++ b/Oqtane.Server/Infrastructure/Jobs/PurgeJob.cs @@ -33,6 +33,7 @@ namespace Oqtane.Infrastructure var visitorRepository = provider.GetRequiredService(); var notificationRepository = provider.GetRequiredService(); var urlMappingRepository = provider.GetRequiredService(); + var siteTaskRepository = provider.GetRequiredService(); // iterate through sites for current tenant List sites = siteRepository.GetSites().ToList(); @@ -94,6 +95,18 @@ namespace Oqtane.Infrastructure { log += $"Error Purging Broken Urls - {ex.Message}
"; } + + // purge completed site tasks + retention = 30; // 30 day default + try + { + count = siteTaskRepository.DeleteSiteTasks(site.SiteId, retention); + log += count.ToString() + " Completed Tasks Purged
"; + } + catch (Exception ex) + { + log += $"Error Purging Completed Site Tasks - {ex.Message}
"; + } } return log; diff --git a/Oqtane.Server/Infrastructure/Jobs/TaskJob.cs b/Oqtane.Server/Infrastructure/Jobs/SiteTaskJob.cs similarity index 78% rename from Oqtane.Server/Infrastructure/Jobs/TaskJob.cs rename to Oqtane.Server/Infrastructure/Jobs/SiteTaskJob.cs index bcbf7125..93cfc96a 100644 --- a/Oqtane.Server/Infrastructure/Jobs/TaskJob.cs +++ b/Oqtane.Server/Infrastructure/Jobs/SiteTaskJob.cs @@ -7,11 +7,11 @@ using Oqtane.Repository; namespace Oqtane.Infrastructure { - public class TaskJob : HostedServiceBase + public class SiteTaskJob : HostedServiceBase { - public TaskJob(IServiceScopeFactory serviceScopeFactory) : base(serviceScopeFactory) + public SiteTaskJob(IServiceScopeFactory serviceScopeFactory) : base(serviceScopeFactory) { - Name = "Task Job"; + Name = "Site Task Job"; Frequency = "m"; // run every minute Interval = 1; IsEnabled = true; @@ -33,8 +33,8 @@ namespace Oqtane.Infrastructure log += $"Processing Site: {site.Name}
"; // get incomplete tasks for site - var jobTaskRepository = provider.GetRequiredService(); - var tasks = jobTaskRepository.GetJobTasks(site.SiteId).ToList(); + var siteTaskRepository = provider.GetRequiredService(); + var tasks = siteTaskRepository.GetSiteTasks(site.SiteId).ToList(); if (tasks != null && tasks.Any()) { foreach (var task in tasks) @@ -42,15 +42,15 @@ namespace Oqtane.Infrastructure log += $"Executing Task: {task.Name}
"; Type taskType = Type.GetType(task.Type); - if (taskType != null && taskType.GetInterface(nameof(IJobTask)) != null) + if (taskType != null && taskType.GetInterface(nameof(ISiteTask)) != 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); + var taskLog = ((ISiteTask)taskObject).ExecuteTask(provider, site, task.Parameters); + taskLog += await ((ISiteTask)taskObject).ExecuteTaskAsync(provider, site, task.Parameters); task.Status = taskLog; } @@ -66,7 +66,7 @@ namespace Oqtane.Infrastructure // update task task.IsCompleted = true; - jobTaskRepository.UpdateJobTask(task); + siteTaskRepository.UpdateSiteTask(task); log += task.Status + "
"; } diff --git a/Oqtane.Server/Infrastructure/Tasks/GlobalReplaceTask.cs b/Oqtane.Server/Infrastructure/SiteTasks/GlobalReplaceTask.cs similarity index 99% rename from Oqtane.Server/Infrastructure/Tasks/GlobalReplaceTask.cs rename to Oqtane.Server/Infrastructure/SiteTasks/GlobalReplaceTask.cs index 6f8ae05b..008fd9a8 100644 --- a/Oqtane.Server/Infrastructure/Tasks/GlobalReplaceTask.cs +++ b/Oqtane.Server/Infrastructure/SiteTasks/GlobalReplaceTask.cs @@ -8,7 +8,7 @@ using Oqtane.Repository; namespace Oqtane.Infrastructure { - public class GlobalReplaceTask : JobTaskBase + public class GlobalReplaceTask : SiteTaskBase { public override string ExecuteTask(IServiceProvider provider, Site site, string parameters) { diff --git a/Oqtane.Server/Infrastructure/Tasks/ImportUsersTask.cs b/Oqtane.Server/Infrastructure/SiteTasks/ImportUsersTask.cs similarity index 97% rename from Oqtane.Server/Infrastructure/Tasks/ImportUsersTask.cs rename to Oqtane.Server/Infrastructure/SiteTasks/ImportUsersTask.cs index 28dd843d..8da990c9 100644 --- a/Oqtane.Server/Infrastructure/Tasks/ImportUsersTask.cs +++ b/Oqtane.Server/Infrastructure/SiteTasks/ImportUsersTask.cs @@ -7,7 +7,7 @@ using Oqtane.Repository; namespace Oqtane.Infrastructure { - public class ImportUsersTask : JobTaskBase + public class ImportUsersTask : SiteTaskBase { public override async Task ExecuteTaskAsync(IServiceProvider provider, Site site, string parameters) { diff --git a/Oqtane.Server/Infrastructure/Tasks/JobTaskBase.cs b/Oqtane.Server/Infrastructure/SiteTasks/SiteTaskBase.cs similarity index 91% rename from Oqtane.Server/Infrastructure/Tasks/JobTaskBase.cs rename to Oqtane.Server/Infrastructure/SiteTasks/SiteTaskBase.cs index af359c7a..81cdc80d 100644 --- a/Oqtane.Server/Infrastructure/Tasks/JobTaskBase.cs +++ b/Oqtane.Server/Infrastructure/SiteTasks/SiteTaskBase.cs @@ -4,7 +4,7 @@ using Oqtane.Models; namespace Oqtane.Infrastructure { - public class JobTaskBase : IJobTask + public class SiteTaskBase : ISiteTask { public virtual string ExecuteTask(IServiceProvider provider, Site site, string parameters) { diff --git a/Oqtane.Server/Migrations/EntityBuilders/JobTaskEntityBuilder.cs b/Oqtane.Server/Migrations/EntityBuilders/SiteTaskEntityBuilder.cs similarity index 65% rename from Oqtane.Server/Migrations/EntityBuilders/JobTaskEntityBuilder.cs rename to Oqtane.Server/Migrations/EntityBuilders/SiteTaskEntityBuilder.cs index 393e6df9..5872d67f 100644 --- a/Oqtane.Server/Migrations/EntityBuilders/JobTaskEntityBuilder.cs +++ b/Oqtane.Server/Migrations/EntityBuilders/SiteTaskEntityBuilder.cs @@ -9,22 +9,22 @@ using Oqtane.Interfaces; namespace Oqtane.Migrations.EntityBuilders { - public class JobTaskEntityBuilder : AuditableBaseEntityBuilder + public class SiteTaskEntityBuilder : AuditableBaseEntityBuilder { - private const string _entityTableName = "JobTask"; - private readonly PrimaryKey _primaryKey = new("PK_JobTask", x => x.JobTaskId); - private readonly ForeignKey _siteForeignKey = new("FK_JobTask_Site", x => x.SiteId, "Site", "SiteId", ReferentialAction.Cascade); + private const string _entityTableName = "SiteTask"; + private readonly PrimaryKey _primaryKey = new("PK_SiteTask", x => x.SiteTaskId); + private readonly ForeignKey _siteForeignKey = new("FK_SiteTask_Site", x => x.SiteId, "Site", "SiteId", ReferentialAction.Cascade); - public JobTaskEntityBuilder(MigrationBuilder migrationBuilder, IDatabase database) : base(migrationBuilder, database) + public SiteTaskEntityBuilder(MigrationBuilder migrationBuilder, IDatabase database) : base(migrationBuilder, database) { EntityTableName = _entityTableName; PrimaryKey = _primaryKey; ForeignKeys.Add(_siteForeignKey); } - protected override JobTaskEntityBuilder BuildTable(ColumnsBuilder table) + protected override SiteTaskEntityBuilder BuildTable(ColumnsBuilder table) { - JobTaskId = AddAutoIncrementColumn(table,"JobTaskId"); + SiteTaskId = AddAutoIncrementColumn(table,"SiteTaskId"); SiteId = AddIntegerColumn(table,"SiteId"); Name = AddStringColumn(table, "Name", 200); Type = AddStringColumn(table, "Type", 200); @@ -37,7 +37,7 @@ namespace Oqtane.Migrations.EntityBuilders return this; } - public OperationBuilder JobTaskId { get; private set; } + public OperationBuilder SiteTaskId { get; private set; } public OperationBuilder SiteId { get; private set; } diff --git a/Oqtane.Server/Migrations/Tenant/10010004_AddJobTasks.cs b/Oqtane.Server/Migrations/Tenant/10010004_AddSiteTasks.cs similarity index 68% rename from Oqtane.Server/Migrations/Tenant/10010004_AddJobTasks.cs rename to Oqtane.Server/Migrations/Tenant/10010004_AddSiteTasks.cs index ef0ab492..ece41554 100644 --- a/Oqtane.Server/Migrations/Tenant/10010004_AddJobTasks.cs +++ b/Oqtane.Server/Migrations/Tenant/10010004_AddSiteTasks.cs @@ -8,16 +8,16 @@ namespace Oqtane.Migrations.Tenant { [DbContext(typeof(TenantDBContext))] [Migration("Tenant.10.01.00.04")] - public class AddJobTasks : MultiDatabaseMigration + public class AddSiteTasks : MultiDatabaseMigration { - public AddJobTasks(IDatabase database) : base(database) + public AddSiteTasks(IDatabase database) : base(database) { } protected override void Up(MigrationBuilder migrationBuilder) { - var jobTaskEntityBuilder = new JobTaskEntityBuilder(migrationBuilder, ActiveDatabase); - jobTaskEntityBuilder.Create(); + var siteTaskEntityBuilder = new SiteTaskEntityBuilder(migrationBuilder, ActiveDatabase); + siteTaskEntityBuilder.Create(); } protected override void Down(MigrationBuilder migrationBuilder) diff --git a/Oqtane.Server/Repository/Context/TenantDBContext.cs b/Oqtane.Server/Repository/Context/TenantDBContext.cs index 57fffa14..8a5a7751 100644 --- a/Oqtane.Server/Repository/Context/TenantDBContext.cs +++ b/Oqtane.Server/Repository/Context/TenantDBContext.cs @@ -136,6 +136,6 @@ namespace Oqtane.Repository public virtual DbSet MigrationHistory { get; set; } public virtual DbSet SiteGroup { get; set; } public virtual DbSet SiteGroupMember { get; set; } - public virtual DbSet JobTask { get; set; } + public virtual DbSet SiteTask { get; set; } } } diff --git a/Oqtane.Server/Repository/JobTaskRepository.cs b/Oqtane.Server/Repository/JobTaskRepository.cs deleted file mode 100644 index 125afa03..00000000 --- a/Oqtane.Server/Repository/JobTaskRepository.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using Microsoft.EntityFrameworkCore; -using Oqtane.Models; - -namespace Oqtane.Repository -{ - public interface IJobTaskRepository - { - IEnumerable GetJobTasks(int siteId); - JobTask GetJobTask(int jobTaskId); - JobTask AddJobTask(JobTask jobTask); - JobTask UpdateJobTask(JobTask jobTask); - void DeleteJobTask(int jobTaskId); - } - - public class JobTaskRepository : IJobTaskRepository - { - private TenantDBContext _db; - - public JobTaskRepository(TenantDBContext context) - { - _db = context; - } - - public IEnumerable GetJobTasks(int siteId) - { - return _db.JobTask.Where(item => item.SiteId == siteId && !item.IsCompleted).OrderBy(item => item.CreatedOn); - } - - public JobTask GetJobTask(int jobTaskId) - { - return _db.JobTask.SingleOrDefault(item => item.JobTaskId == jobTaskId); - } - - public JobTask AddJobTask(JobTask jobTask) - { - _db.JobTask.Add(jobTask); - _db.SaveChanges(); - return jobTask; - } - public JobTask UpdateJobTask(JobTask jobTask) - { - _db.Entry(jobTask).State = EntityState.Modified; - _db.SaveChanges(); - return jobTask; - } - - public void DeleteJobTask(int jobTaskId) - { - JobTask jobTask = _db.JobTask.Find(jobTaskId); - _db.JobTask.Remove(jobTask); - _db.SaveChanges(); - } - } -} diff --git a/Oqtane.Server/Repository/SiteTaskRepository.cs b/Oqtane.Server/Repository/SiteTaskRepository.cs new file mode 100644 index 00000000..4d927c32 --- /dev/null +++ b/Oqtane.Server/Repository/SiteTaskRepository.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.EntityFrameworkCore; +using Oqtane.Models; + +namespace Oqtane.Repository +{ + public interface ISiteTaskRepository + { + IEnumerable GetSiteTasks(int siteId); + SiteTask GetSiteTask(int siteTaskId); + SiteTask AddSiteTask(SiteTask siteTask); + SiteTask UpdateSiteTask(SiteTask siteTask); + void DeleteSiteTask(int siteTaskId); + int DeleteSiteTasks(int siteId, int age); + } + + public class SiteTaskRepository : ISiteTaskRepository + { + private readonly IDbContextFactory _dbContextFactory; + + public SiteTaskRepository(IDbContextFactory dbContextFactory) + { + _dbContextFactory = dbContextFactory; + } + + public IEnumerable GetSiteTasks(int siteId) + { + using var db = _dbContextFactory.CreateDbContext(); + return db.SiteTask.Where(item => item.SiteId == siteId && !item.IsCompleted).OrderBy(item => item.CreatedOn); + } + + public SiteTask GetSiteTask(int siteTaskId) + { + using var db = _dbContextFactory.CreateDbContext(); + return db.SiteTask.SingleOrDefault(item => item.SiteTaskId == siteTaskId); + } + + public SiteTask AddSiteTask(SiteTask siteTask) + { + using var db = _dbContextFactory.CreateDbContext(); + db.SiteTask.Add(siteTask); + db.SaveChanges(); + return siteTask; + } + public SiteTask UpdateSiteTask(SiteTask siteTask) + { + using var db = _dbContextFactory.CreateDbContext(); + db.Entry(siteTask).State = EntityState.Modified; + db.SaveChanges(); + return siteTask; + } + + public void DeleteSiteTask(int siteTaskId) + { + using var db = _dbContextFactory.CreateDbContext(); + SiteTask siteTask = db.SiteTask.Find(siteTaskId); + db.SiteTask.Remove(siteTask); + db.SaveChanges(); + } + + public int DeleteSiteTasks(int siteId, int age) + { + using var db = _dbContextFactory.CreateDbContext(); + // delete completed tasks in batches of 100 records + var count = 0; + var purgedate = DateTime.UtcNow.AddDays(-age); + var tasks = db.SiteTask.Where(item => item.SiteId == siteId && item.IsCompleted && item.CreatedOn < purgedate) + .OrderBy(item => item.CreatedOn).Take(100).ToList(); + while (tasks.Count > 0) + { + count += tasks.Count; + db.SiteTask.RemoveRange(tasks); + db.SaveChanges(); + tasks = db.SiteTask.Where(item => item.SiteId == siteId && item.IsCompleted && item.CreatedOn < purgedate) + .OrderBy(item => item.CreatedOn).Take(100).ToList(); + } + return count; + } + } +} diff --git a/Oqtane.Shared/Models/JobTask.cs b/Oqtane.Shared/Models/SiteTask.cs similarity index 80% rename from Oqtane.Shared/Models/JobTask.cs rename to Oqtane.Shared/Models/SiteTask.cs index abca61b0..63b6d973 100644 --- a/Oqtane.Shared/Models/JobTask.cs +++ b/Oqtane.Shared/Models/SiteTask.cs @@ -1,16 +1,14 @@ -using System; - namespace Oqtane.Models { /// - /// An instance of a Task which is executed by the TaskJob + /// An instance of a SiteTask which is executed by the SiteTaskJob /// - public class JobTask : ModelBase + public class SiteTask : ModelBase { /// /// Internal ID /// - public int JobTaskId { get; set; } + public int SiteTaskId { get; set; } /// /// Site where the Task should execute @@ -43,9 +41,9 @@ namespace Oqtane.Models public string Status { get; set; } // constructors - public JobTask() { } + public SiteTask() { } - public JobTask(int siteId, string name, string type, string parameters) + public SiteTask(int siteId, string name, string type, string parameters) { SiteId = siteId; Name = name;