Refactor GenericRepository and GenericLeaveRepository to expose PostExternalAPIAsync method and enhance LeaveProcessJobStatusRepository with API integration for processing employee records
This commit is contained in:
parent
2cd7798dd9
commit
82c31a0f57
3 changed files with 71 additions and 20 deletions
|
|
@ -115,7 +115,7 @@ namespace BMA.EHR.Application.Repositories
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
protected async Task<string> PostExternalAPIAsync(string apiPath, string accessToken, object? body, string apiKey, CancellationToken cancellationToken = default)
|
public async Task<string> PostExternalAPIAsync(string apiPath, string accessToken, object? body, string apiKey, CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,11 @@
|
||||||
using BMA.EHR.Domain.Models.Base;
|
using BMA.EHR.Domain.Models.Base;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using System.IO.Pipes;
|
using System.IO.Pipes;
|
||||||
|
using System.Net.Http.Headers;
|
||||||
using System.Security.Claims;
|
using System.Security.Claims;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
namespace BMA.EHR.Application.Repositories.Leaves
|
namespace BMA.EHR.Application.Repositories.Leaves
|
||||||
{
|
{
|
||||||
|
|
@ -43,6 +46,38 @@ namespace BMA.EHR.Application.Repositories.Leaves
|
||||||
|
|
||||||
#region " Methods "
|
#region " Methods "
|
||||||
|
|
||||||
|
public async Task<string> PostExternalAPIAsync(string apiPath, string accessToken, object? body, string apiKey, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// กำหนด timeout เป็น 30 นาที
|
||||||
|
using var timeoutCts = new CancellationTokenSource(TimeSpan.FromMinutes(30));
|
||||||
|
using var combinedCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, timeoutCts.Token);
|
||||||
|
var json = JsonConvert.SerializeObject(body);
|
||||||
|
var stringContent = new StringContent(json, Encoding.UTF8, "application/json");
|
||||||
|
//stringContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
|
||||||
|
|
||||||
|
using (var client = new HttpClient())
|
||||||
|
{
|
||||||
|
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.Replace("Bearer ", ""));
|
||||||
|
client.DefaultRequestHeaders.Add("api-key", apiKey);
|
||||||
|
var _res = await client.PostAsync(apiPath, stringContent, combinedCts.Token);
|
||||||
|
if (_res.IsSuccessStatusCode)
|
||||||
|
{
|
||||||
|
var _result = await _res.Content.ReadAsStringAsync();
|
||||||
|
|
||||||
|
return _result;
|
||||||
|
}
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public virtual async Task<IReadOnlyList<T>> GetAllAsync()
|
public virtual async Task<IReadOnlyList<T>> GetAllAsync()
|
||||||
{
|
{
|
||||||
return await _dbSet.ToListAsync();
|
return await _dbSet.ToListAsync();
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ using BMA.EHR.Domain.Extensions;
|
||||||
using BMA.EHR.Domain.Models.Leave.TimeAttendants;
|
using BMA.EHR.Domain.Models.Leave.TimeAttendants;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Microsoft.Extensions.Configuration;
|
||||||
|
|
||||||
namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants
|
namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants
|
||||||
{
|
{
|
||||||
|
|
@ -27,6 +28,7 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants
|
||||||
private readonly UserDutyTimeRepository _userDutyTimeRepository;
|
private readonly UserDutyTimeRepository _userDutyTimeRepository;
|
||||||
private readonly ProcessUserTimeStampRepository _processUserTimeStampRepository;
|
private readonly ProcessUserTimeStampRepository _processUserTimeStampRepository;
|
||||||
private readonly LeaveRequestRepository _leaveRequestRepository;
|
private readonly LeaveRequestRepository _leaveRequestRepository;
|
||||||
|
private readonly IConfiguration _configuration;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
@ -39,12 +41,14 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants
|
||||||
DutyTimeRepository dutyTimeRepository,
|
DutyTimeRepository dutyTimeRepository,
|
||||||
UserDutyTimeRepository userDutyTimeRepository,
|
UserDutyTimeRepository userDutyTimeRepository,
|
||||||
ProcessUserTimeStampRepository processUserTimeStampRepository,
|
ProcessUserTimeStampRepository processUserTimeStampRepository,
|
||||||
LeaveRequestRepository leaveRequestRepository) : base(dbContext, httpContextAccessor)
|
LeaveRequestRepository leaveRequestRepository,
|
||||||
|
IConfiguration configuration) : base(dbContext, httpContextAccessor)
|
||||||
{
|
{
|
||||||
_dbContext = dbContext;
|
_dbContext = dbContext;
|
||||||
_httpContextAccessor = httpContextAccessor;
|
_httpContextAccessor = httpContextAccessor;
|
||||||
_userProfileRepository = userProfileRepository;
|
_userProfileRepository = userProfileRepository;
|
||||||
_holidayRepository = holidayRepository;
|
_holidayRepository = holidayRepository;
|
||||||
|
_configuration = configuration;
|
||||||
_leaveRequestRepository = leaveRequestRepository;
|
_leaveRequestRepository = leaveRequestRepository;
|
||||||
_dutyTimeRepository = dutyTimeRepository;
|
_dutyTimeRepository = dutyTimeRepository;
|
||||||
_userDutyTimeRepository = userDutyTimeRepository;
|
_userDutyTimeRepository = userDutyTimeRepository;
|
||||||
|
|
@ -364,38 +368,50 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants
|
||||||
stampAmount = stampAmount,
|
stampAmount = stampAmount,
|
||||||
remark = remarkStr,
|
remark = remarkStr,
|
||||||
status = status
|
status = status
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
employees.Add(emp);
|
employees.Add(emp);
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write employees to JSON file
|
// // Write employees to JSON file
|
||||||
var fileName = $"employees_{DateTime.Now:yyyyMMdd_HHmmss}.txt";
|
// var fileName = $"employees_{DateTime.Now:yyyyMMdd_HHmmss}.txt";
|
||||||
var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Exports", fileName);
|
// var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Exports", fileName);
|
||||||
|
|
||||||
// Ensure directory exists
|
// // Ensure directory exists
|
||||||
var directory = Path.GetDirectoryName(filePath);
|
// var directory = Path.GetDirectoryName(filePath);
|
||||||
if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory))
|
// if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory))
|
||||||
{
|
// {
|
||||||
Directory.CreateDirectory(directory);
|
// Directory.CreateDirectory(directory);
|
||||||
}
|
// }
|
||||||
|
|
||||||
var jsonOptions = new JsonSerializerOptions
|
// var jsonOptions = new JsonSerializerOptions
|
||||||
{
|
// {
|
||||||
WriteIndented = true,
|
// WriteIndented = true,
|
||||||
Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping
|
// Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping
|
||||||
};
|
// };
|
||||||
|
|
||||||
var jsonContent = JsonSerializer.Serialize(employees, jsonOptions);
|
// var jsonContent = JsonSerializer.Serialize(employees, jsonOptions);
|
||||||
await File.WriteAllTextAsync(filePath, jsonContent);
|
// await File.WriteAllTextAsync(filePath, jsonContent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//call api
|
||||||
|
var apiPath = $"{_configuration["API"]}/org/profile/absent-late/batch";
|
||||||
|
var apiKey = _configuration["API_KEY"];
|
||||||
|
var body = new
|
||||||
|
{
|
||||||
|
records = employees
|
||||||
|
};
|
||||||
|
|
||||||
|
var apiResult = await PostExternalAPIAsync(apiPath, AccessToken ?? "", body, apiKey);
|
||||||
|
if(apiResult == "")
|
||||||
|
{
|
||||||
|
throw new Exception($"เรียก API {apiPath} ไม่สำเร็จ");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task ProcessPendingJobsAsync()
|
public async Task ProcessPendingJobsAsync()
|
||||||
{
|
{
|
||||||
|
|
||||||
var pendingJobs = await GetPendingJobsAsync();
|
var pendingJobs = await GetPendingJobsAsync();
|
||||||
Console.WriteLine($"พบงานที่ค้างอยู่ในสถานะ PENDING จำนวน {pendingJobs.Count} งาน");
|
Console.WriteLine($"พบงานที่ค้างอยู่ในสถานะ PENDING จำนวน {pendingJobs.Count} งาน");
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue