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 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 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 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 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 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 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 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> 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> 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 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 } }