hrms-api-exam/Services/CMSCandidateService.cs

540 lines
25 KiB
C#

using System.Security.Claims;
using System.Text.Json;
using BMA.EHR.Recurit.Exam.Service.Core;
using BMA.EHR.Recurit.Exam.Service.Data;
using BMA.EHR.Recurit.Exam.Service.Models;
using BMA.EHR.Recurit.Exam.Service.Models.Documents;
using BMA.EHR.Recurit.Exam.Service.Request;
using BMA.EHR.Recurit.Exam.Service.Response;
using BMA.EHR.Recurit.Exam.Service.Responses.Document;
using Microsoft.EntityFrameworkCore;
using Newtonsoft.Json.Linq;
using OfficeOpenXml;
namespace BMA.EHR.Recurit.Exam.Service.Services
{
public class CMSCandidateService
{
#region " Fields "
private readonly ApplicationDbContext _context;
private readonly MetadataDbContext _contextMetadata;
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly MinIOService _minioService;
#endregion
#region " Constructor and Destructor "
public CMSCandidateService(ApplicationDbContext context,
MetadataDbContext contextMetadata,
IHttpContextAccessor httpContextAccessor,
MinIOService minioService)
{
_context = context;
_contextMetadata = contextMetadata;
_httpContextAccessor = httpContextAccessor;
_minioService = minioService;
}
public static IConfigurationRoot Configuration
{
get
{
return new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
}
}
#endregion
#region " Properties "
private string? UserId => _httpContextAccessor?.HttpContext?.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value;
private string? FullName => _httpContextAccessor?.HttpContext?.User?.FindFirst("name")?.Value;
#endregion
#region " Methods "
static public string GetNameCategory(string? category)
{
if (category == null)
return "-";
switch (category)
{
case "hygiene":
return "สำนักอนามัย";
case "physician":
return "สำนักการแพทย์";
case "city":
return "สำนักผังเมือง";
case "culture":
return "สำนักวัฒนธรรม กีฬา และการท่องเที่ยว";
default:
return "-";
}
}
public async Task<CMSCandidate> GetsAsync()
{
var cms = await createCMS();
if (cms.LogoImg != null)
cms.LogoImg.Detail = _minioService.ImagesPath(cms.LogoImg.Id).Result;
if (cms.BannerImg != null)
cms.BannerImg.Detail = _minioService.ImagesPath(cms.BannerImg.Id).Result;
return cms;
}
public async Task<CMSCandidate> createCMS()
{
var cmsCandidates = await _context.CMSCandidates.AsQueryable()
.Include(x => x.BannerImg)
.Include(x => x.LogoImg)
.Include(x => x.CMSAgencys)
.Include(x => x.CMSGovernments)
.FirstOrDefaultAsync();
if (cmsCandidates == null)
{
cmsCandidates = new CMSCandidate
{
CreatedAt = DateTime.Now,
CreatedUserId = UserId ?? "",
LastUpdatedAt = DateTime.Now,
LastUpdateUserId = UserId ?? "",
CreatedFullName = FullName ?? "",
LastUpdateFullName = FullName ?? "",
};
await _context.CMSCandidates.AddAsync(cmsCandidates);
}
return cmsCandidates;
}
public async Task UpdateDetailAsync(RequestCMSAbout updated)
{
var cms = await createCMS();
cms.NameTh = updated.NameTh;
cms.ShortName = updated.ShortName;
cms.NameEn = updated.NameEn;
cms.Description = updated.Description;
cms.LastUpdatedAt = DateTime.Now;
cms.LastUpdateUserId = UserId ?? "";
cms.LastUpdateFullName = FullName ?? "";
await _context.SaveChangesAsync();
}
public async Task UpdateAboutAsync(RequestCMSAbout updated)
{
var cms = await createCMS();
if (updated.ProvinceId != null)
{
var province = await _contextMetadata.Provinces.AsQueryable()
.FirstOrDefaultAsync(x => x.Id == Guid.Parse(updated.ProvinceId));
if (province == null)
throw new Exception(GlobalMessages.ProvinceNotFound);
cms.ProvinceId = province.Id;
cms.ProvinceName = province.Name;
}
if (updated.DistrictId != null)
{
var pistrict = await _contextMetadata.Districts.AsQueryable()
.FirstOrDefaultAsync(x => x.Id == Guid.Parse(updated.DistrictId));
if (pistrict == null)
throw new Exception(GlobalMessages.DistrictNotFound);
cms.DistrictId = pistrict.Id;
cms.DistrictName = pistrict.Name;
}
if (updated.SubDistrictId != null)
{
var subDistrict = await _contextMetadata.SubDistricts.AsQueryable()
.FirstOrDefaultAsync(x => x.Id == Guid.Parse(updated.SubDistrictId));
if (subDistrict == null)
throw new Exception(GlobalMessages.SubDistrictNotFound);
cms.SubDistrictId = subDistrict.Id;
cms.SubDistrictName = subDistrict.Name;
cms.ZipCode = subDistrict.ZipCode;
}
cms.About = updated.About;
cms.Address = updated.Address;
cms.Telephone = updated.Telephone;
cms.LastUpdatedAt = DateTime.Now;
cms.LastUpdateUserId = UserId ?? "";
cms.LastUpdateFullName = FullName ?? "";
await _context.SaveChangesAsync();
}
public async Task UpdateLogoAsync(IFormFile file)
{
var cms = await createCMS();
if (cms.LogoImg != null)
{
await DeleteAsyncDocument(cms.LogoImg.Id.ToString());
}
var doc = await _minioService.UploadFileAsync(file);
var document = await _context.Documents.AsQueryable()
.FirstOrDefaultAsync(x => x.Id == doc.Id);
cms.LogoImg = document;
await _context.SaveChangesAsync();
}
public async Task UpdateBannerAsync(IFormFile file)
{
var cms = await createCMS();
if (cms.BannerImg != null)
{
await DeleteAsyncDocument(cms.BannerImg.Id.ToString());
}
var doc = await _minioService.UploadFileAsync(file);
var document = await _context.Documents.AsQueryable()
.FirstOrDefaultAsync(x => x.Id == doc.Id);
cms.BannerImg = document;
await _context.SaveChangesAsync();
}
public async Task DeleteAsyncDocument(string documentId)
{
await _minioService.DeleteFileAsync(Guid.Parse(documentId));
}
public async Task UpdateAgencyAsync(List<RequestCMSAgency> updated)
{
var cms = await createCMS();
_context.CMSAgencys.RemoveRange(cms.CMSAgencys);
foreach (var agencyData in updated)
{
var agency = new CMSAgency
{
CMSCandidate = cms,
Name = agencyData.Name,
Link = agencyData.Link,
CreatedAt = DateTime.Now,
CreatedUserId = UserId ?? "",
LastUpdatedAt = DateTime.Now,
LastUpdateUserId = UserId ?? "",
CreatedFullName = FullName ?? "",
LastUpdateFullName = FullName ?? "",
};
await _context.AddAsync(agency);
}
await _context.SaveChangesAsync();
}
public async Task UpdateGovernmentAsync(List<RequestCMSGovernment> updated)
{
var cms = await createCMS();
_context.CMSGovernments.RemoveRange(cms.CMSGovernments);
foreach (var governmentData in updated)
{
var government = new CMSGovernment
{
CMSCandidate = cms,
Name = governmentData.Name,
Link = governmentData.Link,
CreatedAt = DateTime.Now,
CreatedUserId = UserId ?? "",
LastUpdatedAt = DateTime.Now,
LastUpdateUserId = UserId ?? "",
CreatedFullName = FullName ?? "",
LastUpdateFullName = FullName ?? "",
};
await _context.AddAsync(government);
}
await _context.SaveChangesAsync();
}
public async Task<HomePageResponseItem> GetHomePageAsync()
{
var cms = await createCMS();
var cmsCandidates = await _context.CMSCandidates.AsQueryable()
.Select(x => new HomePageResponseItem
{
Logo_url = x.LogoImg == null ? "" : x.LogoImg.Id.ToString(),
Title = x.NameTh,
Subtitle = x.NameEn,
Supervised = x.ShortName,
Telephone = x.Telephone,
Address = x.Address + " " + (x.SubDistrictName == null ? "" : "แขวง" + x.SubDistrictName + " ") + (x.DistrictName == null ? "" : "เขต" + x.DistrictName) + " " + (x.ProvinceName == null ? "" : x.ProvinceName) + " " + (x.ZipCode == null ? "" : x.ZipCode),
Divisions = x.CMSAgencys.OrderBy(x => x.CreatedAt).Select(s => new HomePageLinkResponseItem
{
Title = s.Name,
Url = s.Link,
}).ToList(),
Institutes = x.CMSGovernments.OrderBy(x => x.CreatedAt).Select(s => new HomePageLinkResponseItem
{
Title = s.Name,
Url = s.Link,
}).ToList(),
})
.FirstOrDefaultAsync();
if (cmsCandidates == null)
throw new Exception(GlobalMessages.CMSNotFound);
if (cmsCandidates.Logo_url != null && cmsCandidates.Logo_url != "")
cmsCandidates.Logo_url = _minioService.ImagesPath(Guid.Parse(cmsCandidates.Logo_url)).Result;
return cmsCandidates;
}
public async Task<HomePageContentResponseItem> GetHomePageContentAsync()
{
var cms = await createCMS();
var cmsCandidates = await _context.CMSCandidates.AsQueryable()
.Select(x => new HomePageContentResponseItem
{
Content = x.Description,
Image = x.BannerImg == null ? "" : x.BannerImg.Id.ToString(),
})
.FirstOrDefaultAsync();
if (cmsCandidates == null)
throw new Exception(GlobalMessages.CMSNotFound);
if (cmsCandidates.Image != null && cmsCandidates.Image != "")
cmsCandidates.Image = _minioService.ImagesPath(Guid.Parse(cmsCandidates.Image)).Result;
return cmsCandidates;
}
public async Task<AboutPageContentResponseItem> GetAboutPageContentAsync()
{
var cms = await createCMS();
var cmsCandidates = await _context.CMSCandidates.AsQueryable()
.Select(x => new AboutPageContentResponseItem
{
Content = x.About,
})
.FirstOrDefaultAsync();
if (cmsCandidates == null)
throw new Exception(GlobalMessages.CMSNotFound);
return cmsCandidates;
}
public async Task<IEnumerable<CMSExamResponseItem?>> GetsCMSExamsAsync(int limit)
{
var cms = await createCMS();
var periodExams = await _context.PeriodExams.AsQueryable()
.Where(x => x.AnnouncementStartDate.Date <= DateTime.Now.Date)
.Where(x => x.AnnouncementEndDate.Date >= DateTime.Now.Date)
.Include(x => x.PeriodExamImages)
.OrderByDescending(x => x.AnnouncementStartDate)
.Select(x => new CMSExamResponseItem
{
Id = x.Id.ToString(),
Category = GetNameCategory(x.Category),
CategoryId = x.Category,
Start = x.ExamDate == null ? null : x.ExamDate.Value.ToString("yyyy-MM-dd"),
End = x.ExamDate == null ? null : x.ExamDate.Value.ToString("yyyy-MM-dd"),
ExamDate = x.ExamDate == null ? null : x.ExamDate.Value.ToString("yyyy-MM-dd"),
Announcement_date = x.AnnouncementDate == null ? null : x.AnnouncementDate.Value.ToString("yyyy-MM-dd"),
Announcement_startDate = x.AnnouncementStartDate.ToString("yyyy-MM-dd"),
Announcement_endDate = x.AnnouncementEndDate.ToString("yyyy-MM-dd"),
AnnouncementExam = x.AnnouncementExam,
Register_startDate = x.RegisterStartDate == null ? null : x.RegisterStartDate.Value.ToString("yyyy-MM-dd"),
Register_endDate = x.RegisterEndDate == null ? null : x.RegisterEndDate.Value.ToString("yyyy-MM-dd"),
Payment_startDate = x.PaymentStartDate == null ? null : x.PaymentStartDate.Value.ToString("yyyy-MM-dd"),
Payment_endDate = x.PaymentEndDate == null ? null : x.PaymentEndDate.Value.ToString("yyyy-MM-dd"),
Title = x.Name,
Image = x.PeriodExamImages.OrderBy(o => o.CreatedAt).FirstOrDefault() == null ?
"" :
x.PeriodExamImages.OrderBy(o => o.CreatedAt).FirstOrDefault().Document.Id.ToString(),
})
.ToListAsync();
if (limit > 0)
periodExams = periodExams.Take(limit).ToList();
var i = 0;
foreach (var item in periodExams)
{
if (periodExams[i].Image != null && periodExams[i].Image != "")
periodExams[i].Image = _minioService.ImagesPath(Guid.Parse(periodExams[i].Image)).Result;
i++;
}
return periodExams;
}
public async Task<IEnumerable<CMSExamResponseItem?>> GetsCMSPostsAsync(int limit)
{
var cms = await createCMS();
var periodExams = await _context.PeriodExams.AsQueryable()
.Where(x => x.AnnouncementStartDate.Date <= DateTime.Now.Date)
.Where(x => x.AnnouncementEndDate.Date >= DateTime.Now.Date)
.OrderByDescending(x => x.AnnouncementStartDate)
.Include(x => x.PeriodExamImages)
.Select(x => new CMSExamResponseItem
{
Id = x.Id.ToString(),
Category = GetNameCategory(x.Category),
CategoryId = x.Category,
Start = x.ExamDate == null ? null : x.ExamDate.Value.ToString("yyyy-MM-dd"),
End = x.ExamDate == null ? null : x.ExamDate.Value.ToString("yyyy-MM-dd"),
ExamDate = x.ExamDate == null ? null : x.ExamDate.Value.ToString("yyyy-MM-dd"),
Announcement_date = x.AnnouncementDate == null ? null : x.AnnouncementDate.Value.ToString("yyyy-MM-dd"),
Announcement_startDate = x.AnnouncementStartDate.ToString("yyyy-MM-dd"),
Announcement_endDate = x.AnnouncementEndDate.ToString("yyyy-MM-dd"),
AnnouncementExam = x.AnnouncementExam,
Register_startDate = x.RegisterStartDate == null ? null : x.RegisterStartDate.Value.ToString("yyyy-MM-dd"),
Register_endDate = x.RegisterEndDate == null ? null : x.RegisterEndDate.Value.ToString("yyyy-MM-dd"),
Payment_startDate = x.PaymentStartDate == null ? null : x.PaymentStartDate.Value.ToString("yyyy-MM-dd"),
Payment_endDate = x.PaymentEndDate == null ? null : x.PaymentEndDate.Value.ToString("yyyy-MM-dd"),
Title = x.Name,
Image = x.PeriodExamImages.OrderBy(o => o.CreatedAt).FirstOrDefault() == null ?
"" :
x.PeriodExamImages.OrderBy(o => o.CreatedAt).FirstOrDefault().Document.Id.ToString(),
})
.ToListAsync();
if (limit > 0)
periodExams = periodExams.Take(limit).ToList();
var i = 0;
foreach (var item in periodExams)
{
if (periodExams[i].Image != null && periodExams[i].Image != "")
periodExams[i].Image = _minioService.ImagesPath(Guid.Parse(periodExams[i].Image)).Result;
i++;
}
return periodExams;
}
public async Task<CMSExamResponseItem> GetCMSExamsAsync(string examId)
{
var cms = await createCMS();
var periodExam = await _context.PeriodExams.AsQueryable()
.Where(x => x.Id == Guid.Parse(examId))
.Include(x => x.PeriodExamImages)
.Include(x => x.PeriodExamDocuments)
.Include(x => x.PositionExam)
.Select(x => new CMSExamResponseItem
{
Id = x.Id.ToString(),
Category = GetNameCategory(x.Category),
CategoryId = x.Category,
Start = x.AnnouncementStartDate.ToString("yyyy-MM-dd"),
End = x.AnnouncementEndDate.ToString("yyyy-MM-dd"),
ExamDate = x.ExamDate == null ? null : x.ExamDate.Value.ToString("yyyy-MM-dd"),
Announcement_date = x.AnnouncementDate == null ? null : x.AnnouncementDate.Value.ToString("yyyy-MM-dd"),
Announcement_startDate = x.AnnouncementStartDate.ToString("yyyy-MM-dd"),
Announcement_endDate = x.AnnouncementEndDate.ToString("yyyy-MM-dd"),
AnnouncementExam = x.AnnouncementExam,
Register_startDate = x.RegisterStartDate == null ? null : x.RegisterStartDate.Value.ToString("yyyy-MM-dd"),
Register_endDate = x.RegisterEndDate == null || x.RegisterEndDate == x.RegisterStartDate ? null : x.RegisterEndDate.Value.ToString("yyyy-MM-dd"),
Payment_startDate = x.PaymentStartDate == null ? null : x.PaymentStartDate.Value.ToString("yyyy-MM-dd"),
Payment_endDate = x.PaymentEndDate == null || x.PaymentEndDate == x.PaymentStartDate ? null : x.PaymentEndDate.Value.ToString("yyyy-MM-dd"),
Title = x.Name,
Detail = x.Detail,
EditorCondition = x.EditorCondition,
EditorConfirm = x.EditorConfirm,
Images = x.PeriodExamImages.OrderBy(x => x.CreatedAt).Select(s => new HomePageLinkResponseItem
{
Title = s.Document.FileName,
Url = s.Document.Id.ToString(),
}).ToList(),
Files = x.PeriodExamDocuments.OrderBy(x => x.CreatedAt).Select(s => new HomePageLinkResponseItem
{
Title = s.Document.FileName,
Url = s.Document.Id.ToString(),
}).ToList(),
Positions = x.PositionExam.OrderBy(x => x.CreatedAt).Select(s => new HomePageLinkResponseItem
{
Id = s.Id.ToString(),
Title = s.PositionName == null ? x.Name : s.PositionName,
Level = s.PositionLevelName == null ? "-" : s.PositionLevelName,
HighDegree = s.HighDegree == true ? "ปริญญาบัตรขึ้นไป" : "ต่ำกว่าปริญญาบัตร",
Path = $"{x.Id}/{s.Id}",
})
.ToList(),
PositionsTrue = x.PositionExam.OrderBy(x => x.CreatedAt).Where(x => x.HighDegree == true).Select(s => new HomePageLinkResponseItem
{
Id = s.Id.ToString(),
Title = s.PositionName == null ? x.Name : s.PositionName,
Level = s.PositionLevelName == null ? "-" : s.PositionLevelName,
HighDegree = s.HighDegree == true ? "ปริญญาบัตรขึ้นไป" : "ต่ำกว่าปริญญาบัตร",
Path = $"{x.Id}/{s.Id}",
})
.ToList(),
PositionsFalse = x.PositionExam.OrderBy(x => x.CreatedAt).Where(x => x.HighDegree == false).Select(s => new HomePageLinkResponseItem
{
Id = s.Id.ToString(),
Title = s.PositionName == null ? x.Name : s.PositionName,
Level = s.PositionLevelName == null ? "-" : s.PositionLevelName,
HighDegree = s.HighDegree == true ? "ปริญญาบัตรขึ้นไป" : "ต่ำกว่าปริญญาบัตร",
Path = $"{x.Id}/{s.Id}",
})
.ToList(),
})
.FirstOrDefaultAsync();
if (periodExam == null)
throw new Exception(GlobalMessages.ExamNotFound);
if (periodExam.Positions.Count() <= 0)
{
periodExam.Positions.Add(new HomePageLinkResponseItem
{
Title = "สมัครสอบ",
Path = $"{periodExam.Id}/00000000-0000-0000-0000-000000000000",
});
}
var i = 0;
foreach (var item in periodExam.Images)
{
if (periodExam.Images[i].Url != null && periodExam.Images[i].Url != "")
periodExam.Images[i].Url = _minioService.ImagesPath(Guid.Parse(periodExam.Images[i].Url)).Result;
i++;
}
i = 0;
foreach (var item in periodExam.Files)
{
if (periodExam.Files[i].Url != null && periodExam.Files[i].Url != "")
periodExam.Files[i].Url = _minioService.ImagesPath(Guid.Parse(periodExam.Files[i].Url)).Result;
i++;
}
return periodExam;
}
#endregion
}
}