using System.ComponentModel.DataAnnotations; using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.Resource.Response; using GB5Shared.Telemetry; using GB5Shared.Validation; using Microsoft.Extensions.Logging; using PartnerBLL.Interfaces; using PartnerDAL.CustomCode.Partner; using PartnerDAL.DTO.Partner; namespace PartnerBLL.Implementations { public class PartnerBLL : IPartnerBLL { private readonly IPartnerDAL _partnerDAL; private readonly IValidation _validation; private readonly ILogger _logger; public PartnerBLL(IPartnerDAL partnerDAL, IValidation validation, ILogger logger) { _partnerDAL = partnerDAL; _validation = validation; _logger = logger; } public async Task GetPartner(int partnerId, LoginDTO loginDTO) { try { return await _partnerDAL.GetPartner(partnerId, loginDTO).ConfigureAwait(false); } catch (Exception) { throw; } } public async Task GetPartnerList(LoginDTO loginDTO) { try { return await _partnerDAL.GetPartnerList(loginDTO).ConfigureAwait(false); } catch (Exception) { throw; } } public async Task GetSelectListPartner(CriteriaDTO criteriaDTO, LoginDTO loginDTO, CancellationToken ct) { try { return await _partnerDAL.GetSelectListPartner(criteriaDTO, loginDTO, ct).ConfigureAwait(false); } catch (Exception) { throw; } } public async Task SavePartner(PartnerDTO partnerDTO, LoginDTO loginDTO) { if (partnerDTO == null) throw new ArgumentNullException(nameof(partnerDTO)); try { GB5Trace.Step("validate-partner", new { partnerDTO.PartnerId }); await _validation.NotEmpty(partnerDTO.PartnerCode, nameof(partnerDTO.PartnerCode)).ConfigureAwait(false); await _validation.NotEmpty(partnerDTO.PartnerName, nameof(partnerDTO.PartnerName)).ConfigureAwait(false); await _validation.NotEmpty(partnerDTO.PartnerShortName, nameof(partnerDTO.PartnerShortName)).ConfigureAwait(false); await _validation.NotEmpty(partnerDTO.PartnerType.ToString(), nameof(partnerDTO.PartnerType)).ConfigureAwait(false); bool isNew = partnerDTO.PartnerId == 0; partnerDTO.PartnerModifiedById = loginDTO.UserId; partnerDTO.PartnerModifiedOn = DateTime.UtcNow; GB5Trace.Step("save-partner", new { partnerDTO.PartnerId, isNew }); if (isNew) { partnerDTO.PartnerCreatedById = loginDTO.UserId; partnerDTO.PartnerCreatedOn = DateTime.UtcNow; int newId = await _partnerDAL.SavePartner(partnerDTO, loginDTO).ConfigureAwait(false); return $"{SuccessResponse.SaveSuccessMessage} {newId}"; } else { await _partnerDAL.UpdatePartner(partnerDTO, loginDTO).ConfigureAwait(false); return $"{SuccessResponse.UpdateSuccessMessage} {partnerDTO.PartnerId}"; } } catch (ValidationException vex) { throw new Exception(vex.Message); } catch (Exception ex) { GB5Trace.MarkFailed("save-partner-failed", ex); _logger.LogError(ex, "SavePartner failed for PartnerCode {PartnerCode}", partnerDTO.PartnerCode); throw; } } public async Task DeletePartner(int partnerId, LoginDTO loginDTO) { try { int rows = await _partnerDAL.DeletePartner(partnerId, loginDTO).ConfigureAwait(false); return rows > 0 ? SuccessResponse.DeleteSuccessMessage : ErrorResponse.DeleteNotFoundMessage; } catch (Exception ex) { GB5Trace.MarkFailed("delete-partner-failed", ex); _logger.LogError(ex, "DeletePartner failed for PartnerId {PartnerId}", partnerId); throw; } } } }