using BMA.EHR.Recruit.Service.Core; using BMA.EHR.Recruit.Service.Data; using BMA.EHR.Recruit.Service.Models.Recruits; using BMA.EHR.Recruit.Service.Requests.Recruits; using BMA.EHR.Recruit.Service.Responses; using BMA.EHR.Recruit.Service.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Swashbuckle.AspNetCore.Annotations; using System.Net; using System.Text; namespace BMA.EHR.Recruit.Service.Controllers { [Route("api/v{version:apiVersion}/recruit")] [ApiVersion("1.0")] [ApiController] [Produces("application/json")] [Authorize] [SwaggerTag("จัดการข้อมูลการสอบแข่งขัน")] public class RecruitController : BaseController { #region " Fields " private readonly ApplicationDbContext _context; private readonly MinIOService _minioService; private readonly IWebHostEnvironment _webHostEnvironment; private readonly RecruitService _recruitService; #endregion #region " Constructor and Destructor " public RecruitController(ApplicationDbContext context, MinIOService minioService, IWebHostEnvironment webHostEnvironment, RecruitService recruitService) { _context = context; _minioService = minioService; _webHostEnvironment = webHostEnvironment; _recruitService = recruitService; } #endregion #region " Methods " #region " Private " private int GetColumnIndex(string[] columns, string name, bool partial = false) { try { if (partial) return Array.FindIndex(columns, x => x.Contains(name)) + 1; else return Array.FindIndex(columns, x => x == name) + 1; } catch { return 0; } } private string CalculateDiff(DateTime d1, DateTime d2) { if (d1 > d2) return "ข้อมูลไม่ถูกต้อง"; TimeSpan sp = d2.Subtract(d1); int yy = sp.Days / 365; int mm = (sp.Days - (yy * 365)) / 30; int dd = (sp.Days - (yy * 365) - (mm * 30)); var sb = new StringBuilder(); sb.Clear(); sb.Append(yy == 0 ? "" : $"{yy} ปี "); sb.Append(mm == 0 ? "" : $"{mm} เดือน "); //sb.Append(dd == 0 ? "" : $"{dd} วัน "); return sb.ToString(); } private async Task GetExamCount(Guid exam) { try { return await _context.RecruitPayments.AsQueryable() .Include(x => x.Recruit) .ThenInclude(x => x.RecruitImport) .Where(x => x.Recruit.RecruitImport.Id == exam) .CountAsync(); } catch { throw; } } private async Task GetPassExamCount(Guid exam) { try { return await _context.RecruitScores.AsQueryable() .Include(x => x.ScoreImport) .Where(x => x.ScoreImport.Id == exam) .Where(x => x.ExamStatus == "ผ่าน") .CountAsync(); } catch { throw; } } private async Task GetScoreCount(Guid exam) { try { return await _context.RecruitScores.AsQueryable() .Include(x => x.ScoreImport) .Where(x => x.ScoreImport.Id == exam) .CountAsync(); } catch { throw; } } #endregion #region " Ex. Upload, Download and Delete file " /// /// ตัวอย่างในการเขียน api เพื่อทำการ upload file /// /// /// เมื่อทำการอ่านข้อมูลจาก Relational Database สำเร็จ /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpPost("upload"), DisableRequestSizeLimit] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] [AllowAnonymous] public async Task> UploadFile() { try { if (Request.Form.Files == null || Request.Form.Files.Count == 0) { return Error(GlobalMessages.NoFileToUpload); } var file = Request.Form.Files[0]; var doc = await _minioService.UploadFileAsync(file); return Success(doc); } catch (Exception ex) { return Error(ex); } } [HttpGet("delete/{id:length(36)}")] [AllowAnonymous] public async Task> DeleteFile(Guid id) { try { await _minioService.DeleteFileAsync(id); return Success(); } catch(Exception ex) { return Error(ex); } } [HttpGet("download/{id:length(36)}")] [AllowAnonymous] public async Task> DownloadFile(Guid id) { try { var file_data = await _minioService.DownloadFileAsync(id); Response.Headers["Content-Disposition"] = $"inline; filename={file_data.FileName}"; var ret = new FileContentResult(file_data.FileContent, file_data.FileType) { FileDownloadName = file_data.FileName }; return ret; } catch (Exception ex) { return Error(ex); } } #endregion #region " จัดการรอบการสมัครสอบแข่งขัน " /// /// แสดงข้อมูลรอบการสอบแข่งขัน /// /// /// เมื่อทำการอ่านข้อมูลจาก Relational Database สำเร็จ /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpGet] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] public async Task> GetsAsync() { try { var data = await _context.RecruitImports.AsQueryable() .OrderByDescending(x => x.Year) .ThenByDescending(x => x.Order) .ToListAsync(); return Success(data); } catch (Exception ex) { return Error(ex); } } /// /// แสดงข้อมูลรอบการสอบแข่งขัน /// /// รหัสรอบการสอบแข่งขัน /// /// เมื่อทำการอ่านข้อมูลจาก Relational Database สำเร็จ /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpGet("{id:length(36)}")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] public async Task> GetByIdAsync(Guid id) { try { var data = await _context.RecruitImports.AsQueryable() .Include(x => x.ImportFile) .Include(x => x.Recruits) .ThenInclude(x => x.Addresses) .Include(x => x.Recruits) .ThenInclude(x => x.Occupations) .Include(x => x.Recruits) .ThenInclude(x => x.Certificates) .Include(x => x.Recruits) .ThenInclude(x => x.Educations) .Include(x => x.Recruits) .ThenInclude(x => x.Payments) .Include(x => x.Recruits) .ThenInclude(x => x.Documents) .ThenInclude(x => x.DocumentFile) .FirstOrDefaultAsync(x => x.Id == id); return Success(data); } catch (Exception ex) { return Error(ex); } } /// /// เพิ่มข้อมูลรอบการจัดสอบแข่งขัน /// /// Request parameters /// /// เมื่อทำการอ่านข้อมูลจาก Relational Database สำเร็จ /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง /// ไม่ได้ Login เข้าระบบ /// เมื่อเกิดข้อผิดพลาดในการทำงาน [HttpPost("period")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] public async Task> PostPeriodAsync([FromBody] PostRecruitImportRequest req) { try { if (req == null) return Error(GlobalMessages.InvalidRequestParam, (int)HttpStatusCode.BadRequest); await _context.RecruitImports.AddAsync(new RecruitImport { Year = req.Year, Name = req.Name, Order = req.Order, }); await _context.SaveChangesAsync(); return Success(); } catch (Exception ex) { return Error(ex); } } #endregion #endregion } }