Files
monorepo/LCU.API.Internal.Dispatcher/LCU.Api.Internal.DispatcherLib/Repositories/JobRepository.cs
T
2026-04-22 16:17:12 +00:00

161 lines
7.4 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using LCU.Library.Internal.DispatcherModels.Models;
using LCU.Library.Internal.DispatcherModels.Entities;
using LCU.Api.Internal.DispatcherLib.Persistence;
using LCU.Api.Internal.DispatcherLib.Extensions.Queryables;
using LCU.Api.Internal.DispatcherLib.Extensions.Enumerables;
using LCU.Library.Internal.DispatcherModels.Models.Results;
using LCU.Library.Internal.DispatcherModels.Enums;
namespace LCU.Api.Internal.DispatcherLib.Repositories;
public class JobRepository : BaseRepository, IJobRepository
{
public JobRepository(AppDbContext context) : base(context) { }
public async Task<PagedResult<Job>> FilteredListAsync(Filter filter,
int numberOfWorkItemExecutions,
int numberOfExecutionMessages)
{
var results = new PagedResult<Job>();
var skip = (filter.Page - 1) * filter.Limit;
results.Total = await _context.Jobs.Where(job => job.SoftDeleteDate == null)
.IncludeAll(numberOfWorkItemExecutions, numberOfExecutionMessages)
.FilterJobName(filter)
.FilterJobDescription(filter)
.FilterNextRunTimeGreaterThanDate(filter)
.FilterOnTagId(filter)
.FilterByStatusType(filter)
.AsNoTracking()
.CountAsync();
//Queryable
var jobs = await _context.Jobs.Where(job => job.SoftDeleteDate == null)
.IncludeAll(numberOfWorkItemExecutions, numberOfExecutionMessages)
.FilterJobName(filter)
.FilterJobDescription(filter)
.FilterNextRunTimeGreaterThanDate(filter)
.FilterOnTagId(filter)
.FilterByStatusType(filter)
.OrderBySortableFields(filter)
.AsNoTracking()
.ToListAsync();
results.Items = jobs.Skip(skip).Take(filter.Limit);
return results;
}
public async Task<IEnumerable<Job>> ListAsync(int numberOfWorkItemExecutions, int numberOfExecutionMessages)
{
return await _context.Jobs.IncludeAll(numberOfWorkItemExecutions, numberOfExecutionMessages)
.AsNoTracking()
.ToListAsync();
}
public async Task<IEnumerable<Job>> ListInactiveAsync(int numberOfWorkItemExecutions, int numberOfExecutionMessages)
{
return await _context.Jobs.Where(job => string.IsNullOrWhiteSpace(job.CronSchedule) && job.NextRunTime == null)
.IncludeAll(numberOfWorkItemExecutions, numberOfExecutionMessages)
.AsNoTracking()
.ToListAsync();
}
public async Task<IEnumerable<Job>> ListInactiveExcludeSoftDeletedTrackedAsync(int numberOfWorkItemExecutions, int numberOfExecutionMessages)
{
return await _context.Jobs.Where(job => string.IsNullOrWhiteSpace(job.CronSchedule) && job.NextRunTime == null && job.SoftDeleteDate == null)
.IncludeAll(numberOfWorkItemExecutions, numberOfExecutionMessages)
.ToListAsync();
}
public async Task<IEnumerable<Job>> ListSoftDeletedTrackedAsync(int numberOfWorkItemExecutions, int numberOfExecutionMessages, DateTime cutOffDate)
{
return await _context.Jobs.Where(job => job.SoftDeleteDate != null && cutOffDate > job.SoftDeleteDate)
.IncludeAll(numberOfWorkItemExecutions, numberOfExecutionMessages)
.ToListAsync();
}
public async Task<Job> FindByIdAsync(int id, int numberOfWorkItemExecutions, int numberOfExecutionMessages)
{
return await _context.Jobs.Where(job => job.JobId == id)
.IncludeAll(numberOfWorkItemExecutions, numberOfExecutionMessages)
.AsNoTracking()
.FirstOrDefaultAsync();
}
public async Task<Job> FindByIdExcludingWorkItemsAsync(int id)
{
return await _context.Jobs.Where(job => job.JobId == id)
.AsNoTracking()
.FirstOrDefaultAsync();
}
public async Task<Job> FindByWorkItemIdAsync(int workItemId, int numberOfWorkItemExecutions, int numberOfExecutionMessages)
{
return await _context.Jobs.Where(job => job.WorkItems.Any(workItem => workItem.WorkItemId == workItemId))
.IncludeAll(numberOfWorkItemExecutions, numberOfExecutionMessages)
.AsNoTracking()
.FirstOrDefaultAsync();
}
public async Task<Job> FindByWorkItemIdExcludingWorkItemsAsync(int workItemId)
{
return await _context.Jobs.Where(job => job.WorkItems.Any(workItem => workItem.WorkItemId == workItemId))
.AsNoTracking()
.FirstOrDefaultAsync();
}
public async Task<Job> FindByWorkItemIdExcludingWorkItemsIncludeErrorRecipientsAsync(int workItemId)
{
return await _context.Jobs.Where(job => job.WorkItems.Any(workItem => workItem.WorkItemId == workItemId))
.IncludeErrorRecipients()
.AsNoTracking()
.FirstOrDefaultAsync();
}
public async Task<IEnumerable<Job>> FindJobsPastDateByStatuses(DateTime date,
int numberOfWorkItemExecutions,
int numberOfExecutionMessages,
List<JobStatus> jobStatuses)
{
return await _context.Jobs.Where(job => date > job.NextRunTime && (jobStatuses.Contains(job.JobStatus) || job.JobStatus == JobStatus.Failed))
.IncludeAll(numberOfWorkItemExecutions, numberOfExecutionMessages)
.AsNoTracking()
.ToListAsync();
}
public async Task<IEnumerable<Job>> FindJobsReadyToBeScheduled(DateTime date)
{
var jobs = await _context.Jobs.Where(job => (job.JobStatus == JobStatus.ReadyToSchedule && job.NextRunTime < date))
.AsNoTracking()
.ToListAsync();
return jobs;
}
public async Task<Job> AddAsync(Job job)
{
var result = await _context.Jobs.AddAsync(job);
return result.Entity;
}
public async Task<Job> Update(Job job)
{
var trackedJob = await _context.Jobs
.IncludeErrorRecipients()
.FirstAsync(j => j.JobId == job.JobId);
_context.Entry(trackedJob).CurrentValues.SetValues(job);
return trackedJob;
}
public void Remove(Job job)
{
_context.Jobs.Remove(job);
}
}