- Introduced a new migration that creates the CheckInJobStatuses table. - The table includes fields for tracking job statuses, timestamps, user information, and error messages. - Supports various statuses such as PENDING, PROCESSING, COMPLETED, and FAILED.
135 lines
4.7 KiB
C#
135 lines
4.7 KiB
C#
using BMA.EHR.Application.Common.Interfaces;
|
|
using BMA.EHR.Domain.Models.Leave.TimeAttendants;
|
|
using Microsoft.AspNetCore.Http;
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants
|
|
{
|
|
public class CheckInJobStatusRepository : GenericLeaveRepository<Guid, CheckInJobStatus>
|
|
{
|
|
#region " Fields "
|
|
|
|
private readonly ILeaveDbContext _dbContext;
|
|
|
|
#endregion
|
|
|
|
#region " Constructor and Destructor "
|
|
|
|
public CheckInJobStatusRepository(ILeaveDbContext dbContext,
|
|
IHttpContextAccessor httpContextAccessor) : base(dbContext, httpContextAccessor)
|
|
{
|
|
_dbContext = dbContext;
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region " Methods "
|
|
|
|
/// <summary>
|
|
/// ดึงข้อมูล Job Status จาก TaskId
|
|
/// </summary>
|
|
public async Task<CheckInJobStatus?> GetByTaskIdAsync(Guid taskId)
|
|
{
|
|
var data = await _dbContext.Set<CheckInJobStatus>()
|
|
.Where(x => x.TaskId == taskId)
|
|
.FirstOrDefaultAsync();
|
|
|
|
return data;
|
|
}
|
|
|
|
/// <summary>
|
|
/// ดึงข้อมูล Job Status จาก UserId และสถานะ
|
|
/// </summary>
|
|
public async Task<List<CheckInJobStatus>> GetByUserIdAndStatusAsync(Guid userId, string status)
|
|
{
|
|
var data = await _dbContext.Set<CheckInJobStatus>()
|
|
.Where(x => x.KeycloakUserId == userId && x.Status == status)
|
|
.OrderByDescending(x => x.CreatedDate)
|
|
.ToListAsync();
|
|
|
|
return data;
|
|
}
|
|
|
|
/// <summary>
|
|
/// ดึงข้อมูล Job Status ที่ยัง pending หรือ processing
|
|
/// </summary>
|
|
public async Task<List<CheckInJobStatus>> GetPendingOrProcessingJobsAsync(Guid userId)
|
|
{
|
|
var data = await _dbContext.Set<CheckInJobStatus>()
|
|
.Where(x => x.KeycloakUserId == userId &&
|
|
(x.Status == "PENDING" || x.Status == "PROCESSING"))
|
|
//.OrderByDescending(x => x.CreatedDate)
|
|
.ToListAsync();
|
|
|
|
return data;
|
|
}
|
|
|
|
/// <summary>
|
|
/// อัปเดตสถานะเป็น Processing
|
|
/// </summary>
|
|
public async Task<CheckInJobStatus> UpdateToProcessingAsync(Guid taskId)
|
|
{
|
|
var job = await GetByTaskIdAsync(taskId);
|
|
if (job != null)
|
|
{
|
|
job.Status = "PROCESSING";
|
|
job.ProcessingDate = DateTime.Now;
|
|
await UpdateAsync(job);
|
|
}
|
|
return job!;
|
|
}
|
|
|
|
/// <summary>
|
|
/// อัปเดตสถานะเป็น Completed
|
|
/// </summary>
|
|
public async Task<CheckInJobStatus> UpdateToCompletedAsync(Guid taskId, string? additionalData = null)
|
|
{
|
|
var job = await GetByTaskIdAsync(taskId);
|
|
if (job != null)
|
|
{
|
|
job.Status = "COMPLETED";
|
|
job.CompletedDate = DateTime.Now;
|
|
if (!string.IsNullOrEmpty(additionalData))
|
|
{
|
|
job.AdditionalData = additionalData;
|
|
}
|
|
await UpdateAsync(job);
|
|
}
|
|
return job!;
|
|
}
|
|
|
|
/// <summary>
|
|
/// อัปเดตสถานะเป็น Failed
|
|
/// </summary>
|
|
public async Task<CheckInJobStatus> UpdateToFailedAsync(Guid taskId, string errorMessage)
|
|
{
|
|
var job = await GetByTaskIdAsync(taskId);
|
|
if (job != null)
|
|
{
|
|
job.Status = "FAILED";
|
|
job.CompletedDate = DateTime.Now;
|
|
job.ErrorMessage = errorMessage;
|
|
await UpdateAsync(job);
|
|
}
|
|
return job!;
|
|
}
|
|
|
|
/// <summary>
|
|
/// ล้างข้อมูล Job Status ที่เก่าเกิน X วัน
|
|
/// </summary>
|
|
public async Task<int> CleanupOldJobsAsync(int daysOld = 30)
|
|
{
|
|
var cutoffDate = DateTime.Now.AddDays(-daysOld);
|
|
var oldJobs = await _dbContext.Set<CheckInJobStatus>()
|
|
.Where(x => x.CreatedDate < cutoffDate)
|
|
.ToListAsync();
|
|
|
|
_dbContext.Set<CheckInJobStatus>().RemoveRange(oldJobs);
|
|
await _dbContext.SaveChangesAsync();
|
|
|
|
return oldJobs.Count;
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|