using FMDAL.CustomCode.ScanZone; using FMDAL.DTO.ScanZone; using GB5Shared.DaprCache; using GB5Shared.DTO.Framework.Login; using GB5Shared.EventLogPublish; using GB5Shared.GenerateAutoNumber; using GB5Shared.QueryExecutor; using GB5Shared.Resource.Response; using GB5Shared.Telemetry; using GB5Shared.Validation; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using static GB5Shared.GB5Constant.Constant; namespace FMBLL.ScanZone { public class ScanZoneBLL : IScanZoneBLL { private readonly IScanZoneDAL _dal; private readonly IQueryExecutor _queryExecutor; private readonly AutoNumber _autoNumber; private readonly KeyInvalidate _keyInvalidate; private readonly EventLogPublish _eventLog; private readonly IValidation _validation; private readonly ILogger _logger; public ScanZoneBLL( IScanZoneDAL dal, IQueryExecutor queryExecutor, AutoNumber autoNumber, KeyInvalidate keyInvalidate, EventLogPublish eventLog, IValidation validation, ILogger logger) { _dal = dal; _queryExecutor = queryExecutor; _autoNumber = autoNumber; _keyInvalidate = keyInvalidate; _eventLog = eventLog; _validation = validation; _logger = logger; } public async Task GetScanZone(int scanZoneId, LoginDTO login, CancellationToken ct) => await _dal.GetScanZone(scanZoneId, login, ct).ConfigureAwait(false); public async Task> GetScanZoneList(LoginDTO login, CancellationToken ct) => await _dal.GetScanZoneList(login, ct).ConfigureAwait(false); public async Task SaveScanZone(ScanZoneDTO dto, LoginDTO login, CancellationToken ct) { try { GB5Trace.Step("validate-scanzone", new { dto.ScanZoneId, dto.ZoneCode }); await _validation.NotEmpty(dto.ZoneCode, nameof(dto.ZoneCode)).ConfigureAwait(false); await _validation.NotEmpty(dto.ZoneName, nameof(dto.ZoneName)).ConfigureAwait(false); bool isNew = dto.ScanZoneId == 0; dto.TenantId = login.ClientId; dto.ModifiedById = login.UserId; dto.ModifiedOn = DateTime.UtcNow; if (dto.OUId <= 0) dto.OUId = login.WorkOUId; GB5Trace.Step("save-scanzone", new { dto.ScanZoneId, isNew }); await using var tx = await _queryExecutor.BeginTransactionAsync(login).ConfigureAwait(false); try { if (isNew) { dto.CreatedById = login.UserId; dto.CreatedOn = DateTime.UtcNow; var auto = await _autoNumber.GetNumberAsync(1, AUTONUMBERCONSTANT.SCANZONE, login).ConfigureAwait(false); dto.ScanZoneId = auto.StartNumber; await _dal.SaveScanZone(dto, login, tx, ct).ConfigureAwait(false); } else { await _dal.UpdateScanZone(dto, login, tx, ct).ConfigureAwait(false); } await tx.CommitAsync(ct).ConfigureAwait(false); } catch { await tx.RollbackAsync(ct).ConfigureAwait(false); throw; } var cacheKey = new CacheKeyGeneration().KeyGeneration(dto.ScanZoneId, EntityConstant.OBJECTSCANZONE, CacheKeyLevel.CLIENT_LEVEL, login); await _keyInvalidate.AllInvalidateCache(cacheKey).ConfigureAwait(false); var eventTypeId = isNew ? EventTypeConstant.SAVESCANZONEEVENTTYPEID : EventTypeConstant.UPDATESCANZONEEVENTTYPEID; GB5Trace.Step("event-publish", new { EventTypeId = eventTypeId }); await _eventLog.PublishEventLogAsync( isNew ? "Scan Zone Created" : "Scan Zone Updated", dto, eventTypeId, dto.ScanZoneId, login, ct: ct).ConfigureAwait(false); return isNew ? $"{SuccessResponse.SaveSuccessMessage} {dto.ScanZoneId}" : SuccessResponse.UpdateSuccess; } catch (Exception ex) { GB5Trace.MarkFailed("save-scanzone-failed", ex); _logger.LogError(ex, "SaveScanZone failed for ScanZoneId {Id}", dto.ScanZoneId); throw; } } public async Task DeleteScanZone(int scanZoneId, LoginDTO login, CancellationToken ct) { try { GB5Trace.Step("delete-scanzone", new { scanZoneId }); await using var tx = await _queryExecutor.BeginTransactionAsync(login).ConfigureAwait(false); try { await _dal.DeleteScanZone(scanZoneId, login, tx, ct).ConfigureAwait(false); await tx.CommitAsync(ct).ConfigureAwait(false); } catch { await tx.RollbackAsync(ct).ConfigureAwait(false); throw; } var cacheKey = new CacheKeyGeneration().KeyGeneration(scanZoneId, EntityConstant.OBJECTSCANZONE, CacheKeyLevel.CLIENT_LEVEL, login); await _keyInvalidate.AllInvalidateCache(cacheKey).ConfigureAwait(false); GB5Trace.Step("event-publish", new { EventTypeId = EventTypeConstant.DELETESCANZONEEVENTTYPEID }); await _eventLog.PublishEventLogAsync( "Scan Zone Deleted", scanZoneId, EventTypeConstant.DELETESCANZONEEVENTTYPEID, scanZoneId, login, ct: ct).ConfigureAwait(false); return SuccessResponse.DeleteSuccessMessage; } catch (Exception ex) { GB5Trace.MarkFailed("delete-scanzone-failed", ex); _logger.LogError(ex, "DeleteScanZone failed for ScanZoneId {Id}", scanZoneId); throw; } } } }