using System; using System.ComponentModel.DataAnnotations; using System.Threading; using System.Threading.Tasks; using RecruitmentDAL.DTO.JobProfile; using GB5Shared.DaprCache; using GB5Shared.DTO.Framework.AutoNumber; using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.EntityHandler; using GB5Shared.GenerateAutoNumber; using GB5Shared.Resource.Response; using GB5Shared.Telemetry; using GB5Shared.Validation; using Microsoft.Extensions.Logging; using RecruitmentDAL.CustomeCode.JobProfile; using static GB5Shared.GB5Constant.Constant; namespace RecruitmentBLL.JobProfile { public class JobProfileBLL : IJobProfileBLL { private readonly IJobProfileDAL _JobProfileDAL; private readonly AutoNumber _AutoNumber; private readonly IValidation _Validation; private readonly KeyInvalidate _KeyInvalidate; private readonly BaseEntityAppService _BaseEntityAppService; private readonly BaseEntityAppService _BaseEntityAppServiceDetail; private readonly ILogger _Logger; public JobProfileBLL( IJobProfileDAL jobProfileDAL, AutoNumber autoNumber, IValidation validation, KeyInvalidate keyInvalidate, BaseEntityAppService baseEntityAppService, BaseEntityAppService baseEntityAppServiceDetail, ILogger logger) { _JobProfileDAL = jobProfileDAL; _AutoNumber = autoNumber; _Validation = validation; _KeyInvalidate = keyInvalidate; _BaseEntityAppService = baseEntityAppService; _BaseEntityAppServiceDetail = baseEntityAppServiceDetail; _Logger = logger; } #region Get public async Task GetJobProfile(int JobProfileId, LoginDTO LoginDTO, CancellationToken ct) { try { return await _JobProfileDAL.GetJobProfile(JobProfileId, LoginDTO, ct) .ConfigureAwait(false); } catch (Exception ex) { GB5Trace.MarkFailed("get-jobprofile-failed", ex); _Logger.LogError(ex, "GetJobProfile failed for JobProfileId {JobProfileId}", JobProfileId); throw; } } #endregion #region Save public async Task SaveJobProfile(JobProfileDTO JobProfileDTO, LoginDTO LoginDTO, CancellationToken ct) { if (JobProfileDTO == null) throw new ArgumentNullException(nameof(JobProfileDTO)); AutoNumberDTO? autoNumberDTO = null; try { GB5Trace.Step("validate-jobprofile", new { JobProfileDTO.JobProfileId }); await _Validation.NotEmpty( JobProfileDTO.JobProfileName, nameof(JobProfileDTO.JobProfileName)).ConfigureAwait(false); bool isNew = JobProfileDTO.JobProfileId == 0; JobProfileDTO.JobProfileModifiedById = LoginDTO.UserId; JobProfileDTO.JobProfileModifiedOn = DateTime.UtcNow; if (isNew) { autoNumberDTO = await _AutoNumber.GetNumberAsync( 1, "JOBPROFILE", LoginDTO).ConfigureAwait(false); JobProfileDTO.JobProfileId = autoNumberDTO.StartNumber; JobProfileDTO.JobProfileCreatedById = LoginDTO.UserId; JobProfileDTO.JobProfileCreatedOn = DateTime.UtcNow; } GB5Trace.Step("save-jobprofile", new { JobProfileDTO.JobProfileId, isNew }); await _BaseEntityAppService.ExecuteSaveAsync( EntityConstant.OBJECTRECRUITMENTJOBPROFILE, isNew ? EventTypeConstant.SAVERECRUITMENTJOBPROFILEEVENTTYPEID : EventTypeConstant.UPDATERECRUITMENTJOBPROFILEEVENTTYPEID, JobProfileDTO, LoginDTO, async tx => { _ = isNew ? await _JobProfileDAL.SaveJobProfile(JobProfileDTO, LoginDTO, tx, ct).ConfigureAwait(false) : await _JobProfileDAL.UpdateJobProfile(JobProfileDTO, LoginDTO, tx, ct).ConfigureAwait(false); return JobProfileDTO.JobProfileId; }, null, -1, -1, null, isNew).ConfigureAwait(false); GB5Trace.Step("event-publish", new { EventTypeId = isNew ? EventTypeConstant.SAVERECRUITMENTJOBPROFILEEVENTTYPEID : EventTypeConstant.UPDATERECRUITMENTJOBPROFILEEVENTTYPEID }); var cacheKey = new CacheKeyGeneration().KeyGeneration( JobProfileDTO.JobProfileId, EntityConstant.OBJECTRECRUITMENTJOBPROFILE, CacheKeyLevel.CLIENT_LEVEL, LoginDTO); await _KeyInvalidate.AllInvalidateCache(cacheKey).ConfigureAwait(false); _Logger.LogInformation( "JobProfile {JobProfileId} {Action} by user {UserId}", JobProfileDTO.JobProfileId, isNew ? "saved" : "updated", LoginDTO.UserId); return isNew ? $"{SuccessResponse.SaveSuccessMessage} {JobProfileDTO.JobProfileId}" : $"{SuccessResponse.UpdateSuccessMessage} {JobProfileDTO.JobProfileId}"; } catch (ValidationException vex) { GB5Trace.MarkFailed("save-jobprofile-failed", vex); if (autoNumberDTO != null && JobProfileDTO.JobProfileId > 0) await _AutoNumber.RollbackAutoNumber("JOBPROFILE", JobProfileDTO.JobProfileId, LoginDTO).ConfigureAwait(false); throw new Exception(vex.Message); } catch (Exception ex) { GB5Trace.MarkFailed("save-jobprofile-failed", ex); _Logger.LogError(ex, "SaveJobProfile failed for JobProfileId {JobProfileId}", JobProfileDTO.JobProfileId); if (autoNumberDTO != null && JobProfileDTO.JobProfileId > 0) { await _AutoNumber.RollbackAutoNumber( "JOBPROFILE", JobProfileDTO.JobProfileId, LoginDTO).ConfigureAwait(false); } throw; } } #endregion #region Select List public async Task GetSelectListJobProfile(CriteriaDTO criteriaDTO, LoginDTO LoginDTO, CancellationToken ct) { try { return await _JobProfileDAL.GetSelectListJobProfile(criteriaDTO, LoginDTO, ct) .ConfigureAwait(false); } catch (Exception ex) { GB5Trace.MarkFailed("get-selectlist-jobprofile-failed", ex); _Logger.LogError(ex, "GetSelectListJobProfile failed"); throw; } } #endregion #region Delete public async Task DeleteJobProfile(int JobProfileId, LoginDTO LoginDTO, CancellationToken ct) { try { GB5Trace.Step("delete-jobprofile", new { JobProfileId }); var result = await _JobProfileDAL.DeleteJobProfile(JobProfileId, LoginDTO, ct) .ConfigureAwait(false); var cacheKey = new CacheKeyGeneration().KeyGeneration( JobProfileId, EntityConstant.OBJECTRECRUITMENTJOBPROFILE, CacheKeyLevel.CLIENT_LEVEL, LoginDTO); await _KeyInvalidate.AllInvalidateCache(cacheKey).ConfigureAwait(false); _Logger.LogInformation("JobProfile {JobProfileId} deleted by user {UserId}", JobProfileId, LoginDTO.UserId); return result; } catch (Exception ex) { GB5Trace.MarkFailed("delete-jobprofile-failed", ex); _Logger.LogError(ex, "DeleteJobProfile failed for JobProfileId {JobProfileId}", JobProfileId); throw; } } #endregion #region Get public async Task GetJobProfileDetail(int JobProfileDetailId, LoginDTO LoginDTO, CancellationToken ct) { try { return await _JobProfileDAL.GetJobProfileDetail(JobProfileDetailId, LoginDTO, ct) .ConfigureAwait(false); } catch (Exception ex) { GB5Trace.MarkFailed("get-jobprofiledetail-failed", ex); _Logger.LogError(ex, "GetJobProfileDetail failed for JobProfileDetailId {JobProfileDetailId}", JobProfileDetailId); throw; } } #endregion #region Save public async Task SaveJobProfileDetail(JobProfileDetailDTO JobProfileDetailDTO, LoginDTO LoginDTO, CancellationToken ct) { if (JobProfileDetailDTO == null) throw new ArgumentNullException(nameof(JobProfileDetailDTO)); AutoNumberDTO? autoNumberDetailDTO = null; try { GB5Trace.Step("validate-jobprofiledetail", new { JobProfileDetailDTO.JobProfileDetailId }); bool isNew = JobProfileDetailDTO.JobProfileDetailId == 0; if (isNew) { autoNumberDetailDTO = await _AutoNumber.GetNumberAsync( 1, "JOBPROFILEDETAIL", LoginDTO).ConfigureAwait(false); JobProfileDetailDTO.JobProfileDetailId = autoNumberDetailDTO.StartNumber; } GB5Trace.Step("save-jobprofiledetail", new { JobProfileDetailDTO.JobProfileDetailId, isNew }); await _BaseEntityAppServiceDetail.ExecuteSaveAsync( EntityConstant.OBJECTRECRUITMENTJOBPROFILEDETAIL, isNew ? EventTypeConstant.SAVERECRUITMENTJOBPROFILEDETAILEVENTTYPEID : EventTypeConstant.UPDATERECRUITMENTJOBPROFILEDETAILEVENTTYPEID, JobProfileDetailDTO, LoginDTO, async tx => { _ = isNew ? await _JobProfileDAL.SaveJobProfileDetail(JobProfileDetailDTO, LoginDTO, tx, ct).ConfigureAwait(false) : await _JobProfileDAL.UpdateJobProfileDetail(JobProfileDetailDTO, LoginDTO, tx, ct).ConfigureAwait(false); return JobProfileDetailDTO.JobProfileDetailId; }, null, -1, -1, null, isNew).ConfigureAwait(false); GB5Trace.Step("event-publish", new { EventTypeId = isNew ? EventTypeConstant.SAVERECRUITMENTJOBPROFILEDETAILEVENTTYPEID : EventTypeConstant.UPDATERECRUITMENTJOBPROFILEDETAILEVENTTYPEID }); var cacheKey = new CacheKeyGeneration().KeyGeneration( JobProfileDetailDTO.JobProfileDetailId, EntityConstant.OBJECTRECRUITMENTJOBPROFILEDETAIL, CacheKeyLevel.CLIENT_LEVEL, LoginDTO); await _KeyInvalidate.AllInvalidateCache(cacheKey).ConfigureAwait(false); _Logger.LogInformation( "JobProfileDetail {JobProfileDetailId} {Action} by user {UserId}", JobProfileDetailDTO.JobProfileDetailId, isNew ? "saved" : "updated", LoginDTO.UserId); return isNew ? $"{SuccessResponse.SaveSuccessMessage} {JobProfileDetailDTO.JobProfileDetailId}" : $"{SuccessResponse.UpdateSuccessMessage} {JobProfileDetailDTO.JobProfileDetailId}"; } catch (ValidationException vex) { GB5Trace.MarkFailed("save-jobprofiledetail-failed", vex); if (autoNumberDetailDTO != null && JobProfileDetailDTO.JobProfileDetailId > 0) await _AutoNumber.RollbackAutoNumber("JOBPROFILEDETAIL", JobProfileDetailDTO.JobProfileDetailId, LoginDTO).ConfigureAwait(false); throw new Exception(vex.Message); } catch (Exception ex) { GB5Trace.MarkFailed("save-jobprofiledetail-failed", ex); _Logger.LogError(ex, "SaveJobProfileDetail failed for JobProfileDetailId {JobProfileDetailId}", JobProfileDetailDTO.JobProfileDetailId); if (autoNumberDetailDTO != null && JobProfileDetailDTO.JobProfileDetailId > 0) { await _AutoNumber.RollbackAutoNumber( "JOBPROFILEDETAIL", JobProfileDetailDTO.JobProfileDetailId, LoginDTO).ConfigureAwait(false); } throw; } } #endregion #region Select List public async Task GetSelectListJobProfileDetail(CriteriaDTO criteriaDTO, LoginDTO LoginDTO, CancellationToken ct) { try { return await _JobProfileDAL.GetSelectListJobProfileDetail(criteriaDTO, LoginDTO, ct) .ConfigureAwait(false); } catch (Exception ex) { GB5Trace.MarkFailed("get-selectlist-jobprofiledetail-failed", ex); _Logger.LogError(ex, "GetSelectListJobProfileDetail failed"); throw; } } #endregion #region Delete public async Task DeleteJobProfileDetail(int JobProfileDetailId, LoginDTO LoginDTO, CancellationToken ct) { try { GB5Trace.Step("delete-jobprofiledetail", new { JobProfileDetailId }); var result = await _JobProfileDAL.DeleteJobProfileDetail(JobProfileDetailId, LoginDTO, ct) .ConfigureAwait(false); var cacheKey = new CacheKeyGeneration().KeyGeneration( JobProfileDetailId, EntityConstant.OBJECTRECRUITMENTJOBPROFILEDETAIL, CacheKeyLevel.CLIENT_LEVEL, LoginDTO); await _KeyInvalidate.AllInvalidateCache(cacheKey).ConfigureAwait(false); _Logger.LogInformation("JobProfileDetail {JobProfileDetailId} deleted by user {UserId}", JobProfileDetailId, LoginDTO.UserId); return result; } catch (Exception ex) { GB5Trace.MarkFailed("delete-jobprofiledetail-failed", ex); _Logger.LogError(ex, "DeleteJobProfileDetail failed for JobProfileDetailId {JobProfileDetailId}", JobProfileDetailId); throw; } } #endregion } }