using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.GenerateAutoNumber; using GB5Shared.Resource.Response; using GB5Shared.Validation; using SkillManagementDAL.CustomCode.SkillLevel; using SkillManagementDAL.DTO.SkillLevel; namespace SkillManagementBLL.SkillLevel { public class SkillLevelBLL : ISkillLevelBLL { private readonly ISkillLevelDAL _dal; private readonly AutoNumber _autoNumber; private readonly IValidation _validation; public SkillLevelBLL(ISkillLevelDAL dal, AutoNumber autoNumber, IValidation validation) { _dal = dal; _autoNumber = autoNumber; _validation = validation; } public async Task GetSelectListSkillLevel(CriteriaDTO criteriaDTO, LoginDTO login, CancellationToken ct) => await _dal.GetSelectListSkillLevel(criteriaDTO, login, ct); public async Task GetById(int sLevelId, int skillId, LoginDTO login, CancellationToken ct) => await _dal.GetById(sLevelId, skillId, login, ct); public async Task GetBySkill(int skillId, LoginDTO login, CancellationToken ct) => await _dal.GetBySkill(skillId, login, ct); public async Task Save(SkillLevelDTO dto, LoginDTO login, CancellationToken ct) { bool isNew = dto.SLevelId == 0; if (dto.SkillId == 0) throw new ArgumentException("SkillId is required."); if (dto.SlNo <= 0) throw new ArgumentException("SlNo must be greater than 0."); await _validation.NotEmpty(dto.LevelLabel, nameof(dto.LevelLabel)); GB5Shared.DTO.Framework.AutoNumber.AutoNumberDTO? an = null; try { if (isNew) { an = await _autoNumber.GetNumberAsync(1, "MSKILLLEVEL", login); dto.SLevelId = an.StartNumber; var rows = await _dal.Insert(dto, login, ct); if (rows == 0) throw new Exception("Insert failed."); return $"{SuccessResponse.SaveSuccessMessage} {dto.SLevelId}"; } else { var rows = await _dal.Update(dto, login, ct); if (rows == 0) throw new Exception("Update failed."); return $"{SuccessResponse.UpdateSuccessMessage} {dto.SLevelId}"; } } catch { if (an != null && isNew) await _autoNumber.RollbackAutoNumber("MSKILLLEVEL", an.StartNumber, login); throw; } } public async Task Delete(int sLevelId, int skillId, LoginDTO login) { var result = await _dal.Delete(sLevelId, skillId, login); if (result == ErrorResponse.DeleteNotFoundMessage) throw new Exception(result); return result; } } }