using FrameworkDAL.CustomCode.EIPConversation.EIPRestActionCfgAdmin; using FrameworkDAL.DTO.EIPConversation; using GB5Shared.DTO.Framework.Login; using GB5Shared.Resource.Response; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; namespace FrameworkBLL.EIPConversation.EIPAdmin.EIPRestActionCfgAdmin { public class EIPRestActionCfgAdminBLL : IEIPRestActionCfgAdminBLL { private readonly IEIPRestActionCfgAdminDAL _dal; private readonly ILogger _logger; public EIPRestActionCfgAdminBLL(IEIPRestActionCfgAdminDAL dal, ILogger logger) { _dal = dal ?? throw new ArgumentNullException(nameof(dal)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); } public async Task> GetCfgListAsync( int actionId, LoginDTO login, CancellationToken ct = default) { try { _logger.LogInformation("BLL | GetCfgList | Tenant={TenantId} | ActionId={Id}", login.ClientId, actionId); return await _dal.GetCfgListAsync(actionId, login, ct).ConfigureAwait(false); } catch (Exception ex) { _logger.LogError(ex, "BLL | GetCfgList | Error | ActionId={Id}", actionId); throw; } } public async Task GetCfgAsync( int restActionCfgId, LoginDTO login, CancellationToken ct = default) { try { _logger.LogInformation("BLL | GetCfg | Tenant={TenantId} | Id={Id}", login.ClientId, restActionCfgId); return await _dal.GetCfgAsync(restActionCfgId, login, ct).ConfigureAwait(false); } catch (Exception ex) { _logger.LogError(ex, "BLL | GetCfg | Error | Id={Id}", restActionCfgId); throw; } } public async Task SaveCfgAsync( EIPRestActionCfgAdminDTO dto, LoginDTO login, CancellationToken ct = default) { try { _logger.LogInformation( "BLL | SaveCfg | Validate | Tenant={TenantId} | ActionId={ActId}", login.ClientId, dto.ActionId); if (dto.ActionId == 0) throw new ArgumentException("ActionId must reference a valid action."); if (string.IsNullOrWhiteSpace(dto.EndpointPath)) throw new ArgumentException("EndpointPath is required."); if (dto.HttpMethod < 1 || dto.HttpMethod > 5) throw new ArgumentException("HttpMethod must be one of: 1=POST, 2=GET, 3=PUT, 4=PATCH, 5=DELETE."); if (dto.IsActive != 0 && dto.IsActive != 1) throw new ArgumentException("IsActive must be 0 or 1."); if (dto.TimeoutSeconds <= 0) throw new ArgumentException("TimeoutSeconds must be greater than 0."); if (!await _dal.ActionIdExistsAsync(dto.ActionId, login, ct).ConfigureAwait(false)) throw new ArgumentException($"ActionId {dto.ActionId} does not exist."); dto.TenantId = login.ClientId; var isNew = dto.RestActionCfgId == 0; _logger.LogInformation( "BLL | SaveCfg | Persist | Tenant={TenantId} | ActionId={ActId} | IsNew={IsNew}", login.ClientId, dto.ActionId, isNew); if (isNew) { var newId = await _dal.InsertCfgAsync(dto, login, ct).ConfigureAwait(false); _logger.LogInformation("BLL | SaveCfg | Inserted | NewId={NewId}", newId); return $"{SuccessResponse.SaveSuccessMessage} {newId}"; } else { await _dal.UpdateCfgAsync(dto, login, ct).ConfigureAwait(false); _logger.LogInformation("BLL | SaveCfg | Updated | Id={Id}", dto.RestActionCfgId); return SuccessResponse.UpdateSuccess; } } catch (Exception ex) { _logger.LogError(ex, "BLL | SaveCfg | Error | Tenant={TenantId} | ActionId={ActId}", login.ClientId, dto.ActionId); throw; } } public async Task DeleteCfgAsync( int restActionCfgId, LoginDTO login, CancellationToken ct = default) { try { _logger.LogInformation("BLL | DeleteCfg | Tenant={TenantId} | Id={Id}", login.ClientId, restActionCfgId); if (restActionCfgId == 0) throw new ArgumentException("RestActionCfgId must reference a valid record."); await _dal.DeleteCfgAsync(restActionCfgId, login, ct).ConfigureAwait(false); _logger.LogInformation("BLL | DeleteCfg | Completed | Id={Id}", restActionCfgId); return SuccessResponse.DeleteSuccessMessage; } catch (Exception ex) { _logger.LogError(ex, "BLL | DeleteCfg | Error | Id={Id}", restActionCfgId); throw; } } } }