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 { #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 " /// /// ดึงข้อมูล Job Status จาก TaskId /// public async Task GetByTaskIdAsync(Guid taskId) { var data = await _dbContext.Set() .Where(x => x.TaskId == taskId) .FirstOrDefaultAsync(); return data; } /// /// ดึงข้อมูล Job Status จาก UserId และสถานะ /// public async Task> GetByUserIdAndStatusAsync(Guid userId, string status) { var data = await _dbContext.Set() .Where(x => x.KeycloakUserId == userId && x.Status == status) .OrderByDescending(x => x.CreatedDate) .ToListAsync(); return data; } /// /// ดึงข้อมูล Job Status ที่ยัง pending หรือ processing /// public async Task> GetPendingOrProcessingJobsAsync(Guid userId) { var data = await _dbContext.Set() .Where(x => x.KeycloakUserId == userId && (x.Status == "PENDING" || x.Status == "PROCESSING")) //.OrderByDescending(x => x.CreatedDate) .ToListAsync(); return data; } /// /// อัปเดตสถานะเป็น Processing /// public async Task UpdateToProcessingAsync(Guid taskId) { var job = await GetByTaskIdAsync(taskId); if (job != null) { job.Status = "PROCESSING"; job.ProcessingDate = DateTime.Now; await UpdateAsync(job); } return job!; } /// /// อัปเดตสถานะเป็น Completed /// public async Task 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!; } /// /// อัปเดตสถานะเป็น Failed /// public async Task 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!; } /// /// ล้างข้อมูล Job Status ที่เก่าเกิน X วัน /// public async Task CleanupOldJobsAsync(int daysOld = 30) { var cutoffDate = DateTime.Now.AddDays(-daysOld); var oldJobs = await _dbContext.Set() .Where(x => x.CreatedDate < cutoffDate) .ToListAsync(); _dbContext.Set().RemoveRange(oldJobs); await _dbContext.SaveChangesAsync(); return oldJobs.Count; } #endregion } }