using FMDAL.CustomCode.AssetTypeActivity; using FMDAL.DTO.AssetTypeActivity; using GB5Shared.DaprCache; using GB5Shared.DTO.Framework.Login; using GB5Shared.GenerateAutoNumber; using GB5Shared.QueryExecutor; using GB5Shared.Resource.Response; using GB5Shared.Telemetry; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using static GB5Shared.GB5Constant.Constant; namespace FMBLL.AssetTypeActivity { public class AssetTypeActivityBLL : IAssetTypeActivityBLL { private readonly IAssetTypeActivityDAL _dal; private readonly IQueryExecutor _queryExecutor; private readonly AutoNumber _autoNumber; private readonly KeyInvalidate _keyInvalidate; private readonly ILogger _logger; public AssetTypeActivityBLL( IAssetTypeActivityDAL dal, IQueryExecutor queryExecutor, AutoNumber autoNumber, KeyInvalidate keyInvalidate, ILogger logger) { _dal = dal; _queryExecutor = queryExecutor; _autoNumber = autoNumber; _keyInvalidate = keyInvalidate; _logger = logger; } public async Task GetAssetTypeActivity(int assetTypeActivityId, LoginDTO login, CancellationToken ct) => await _dal.GetAssetTypeActivity(assetTypeActivityId, login, ct).ConfigureAwait(false); public async Task> GetAssetTypeActivityListByAssetType(int assetTypeId, LoginDTO login, CancellationToken ct) => await _dal.GetAssetTypeActivityListByAssetType(assetTypeId, login, ct).ConfigureAwait(false); public async Task SaveAssetTypeActivity(AssetTypeActivityDTO dto, LoginDTO login, CancellationToken ct) { try { GB5Trace.Step("validate-assettypeactivity", new { dto.AssetTypeActivityId }); bool isNew = dto.AssetTypeActivityId == 0; GB5Trace.Step("save-assettypeactivity", new { dto.AssetTypeActivityId, isNew }); await using var tx = await _queryExecutor.BeginTransactionAsync(login).ConfigureAwait(false); try { if (isNew) { var auto = await _autoNumber.GetNumberAsync(1, AUTONUMBERCONSTANT.ASSETTYPEACTIVITY, login).ConfigureAwait(false); dto.AssetTypeActivityId = auto.StartNumber; await _dal.SaveAssetTypeActivity(dto, login, tx, ct).ConfigureAwait(false); } else { await _dal.UpdateAssetTypeActivity(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.AssetTypeActivityId, EntityConstant.OBJECTASSETTYPEACTIVITY, CacheKeyLevel.CLIENT_LEVEL, login); await _keyInvalidate.AllInvalidateCache(cacheKey).ConfigureAwait(false); return isNew ? $"{SuccessResponse.SaveSuccessMessage} {dto.AssetTypeActivityId}" : SuccessResponse.UpdateSuccess; } catch (Exception ex) { GB5Trace.MarkFailed("save-assettypeactivity-failed", ex); _logger.LogError(ex, "SaveAssetTypeActivity failed for AssetTypeActivityId {Id}", dto.AssetTypeActivityId); throw; } } public async Task DeleteAssetTypeActivity(int assetTypeActivityId, LoginDTO login, CancellationToken ct) { try { GB5Trace.Step("delete-assettypeactivity", new { assetTypeActivityId }); await using var tx = await _queryExecutor.BeginTransactionAsync(login).ConfigureAwait(false); try { await _dal.DeleteAssetTypeActivity(assetTypeActivityId, login, tx, ct).ConfigureAwait(false); await tx.CommitAsync(ct).ConfigureAwait(false); } catch { await tx.RollbackAsync(ct).ConfigureAwait(false); throw; } var cacheKey = new CacheKeyGeneration().KeyGeneration(assetTypeActivityId, EntityConstant.OBJECTASSETTYPEACTIVITY, CacheKeyLevel.CLIENT_LEVEL, login); await _keyInvalidate.AllInvalidateCache(cacheKey).ConfigureAwait(false); return SuccessResponse.DeleteSuccessMessage; } catch (Exception ex) { GB5Trace.MarkFailed("delete-assettypeactivity-failed", ex); _logger.LogError(ex, "DeleteAssetTypeActivity failed for AssetTypeActivityId {Id}", assetTypeActivityId); throw; } } } }