using System.ComponentModel.DataAnnotations;
using InterfaceForward.Application.Contracts.Dtos.ServiceProvider;
using InterfaceForward.Application.Helpers;
using InterfaceForward.Domain.Shared.Enum;
using InterfaceForward.Repositories;
using InterfaceForward.Repositories.Interface.Entitys;
using InterfaceForward.Repositories.ServiceProvider.Entitys;
using InterfaceForward.Repositories.ServiceProvider.Services;
using InterfaceForward.Repositories.ServiceProvider.ValueObjects;
using Microsoft.AspNetCore.Mvc;
namespace InterfaceForward.Application.Services.ServiceProvider;
///
/// 服务商授权配置
///
[ApiExplorerSettings(GroupName = "服务商服务")]
public class ServiceProviderAuthService : ApplicationService
{
private readonly IBasicRepository _interfaceRepository;
private readonly IBasicRepository _parameterRepository;
private readonly IBasicRepository _serviceProviderAuthConfigRepository;
private readonly IServiceProviderRepository _serviceProviderRepository;
public ServiceProviderAuthService(
IBasicRepository serviceProviderAuthConfigRepository,
IBasicRepository interfaceRepository, IServiceProviderRepository serviceProviderRepository,
IBasicRepository parameterRepository)
{
_serviceProviderAuthConfigRepository = serviceProviderAuthConfigRepository;
_interfaceRepository = interfaceRepository;
_serviceProviderRepository = serviceProviderRepository;
_parameterRepository = parameterRepository;
}
///
/// 修改服务商授权接口
///
///
///
///
[HttpGet("ServiceProvider/ChangeAuthInterface")]
public async Task ChangeAuthInterface(ChangeAuthInterfaceInput input)
{
var serviceProvider = await _serviceProviderRepository.GetFirstAsync(x =>
x.Id == input.ServiceProviderId);
if (serviceProvider == null)
{
throw new BusinessException(message: "服务商不存在");
}
serviceProvider.AuthInterfaceCode = input.InterfaceCode;
return await _serviceProviderRepository.UpdateAsync(serviceProvider);
}
///
/// 获取服务商授权配置信息
///
///
///
[HttpGet("ServiceProvider/GetAuthInfo")]
public async Task GetAuthInfo([Required] int serviceProviderId)
{
var res = new ServiceProviderAuthInfoOutput();
var interfaceCode = await _serviceProviderRepository.GetFirstAsync(x =>
x.Id == serviceProviderId, x => x.AuthInterfaceCode);
if (interfaceCode.IsNullOrEmpty())
{
return res;
}
res.InterfaceCode = interfaceCode;
var interfaceId = await _interfaceRepository.GetFirstAsync(x => x.Code == interfaceCode, x => x.Id);
if (interfaceId == default)
{
return res;
}
res.InterfaceId = interfaceId;
var parameters = await _parameterRepository.GetListAsync(x => x.InterfaceId == interfaceId && x.IsInPara);
var authConfigs =
await _serviceProviderAuthConfigRepository.GetListAsync(x => x.ServiceProviderId == serviceProviderId);
var inParameterConfigs = authConfigs.Where(x => x.Flag == AuthParameterFlag.InParameter);
res.InParameterSummaries = parameters.Select(parameter =>
{
return new AuthInParameterSummary
{
Id = parameter.Id,
Name = parameter.Name,
CnName = parameter.CnName,
Type = parameter.Type.ToString(),
IsRequired = parameter.IsRequired,
Value = inParameterConfigs.FirstOrDefault(it => it.ParameterId == parameter.Id)?.Value1
};
}).ToList();
var tokenConfig = authConfigs.FirstOrDefault(x => x.Flag == AuthParameterFlag.Token);
res.TokenParameterId = tokenConfig?.ParameterId;
res.TokenPrefix = tokenConfig?.Value1;
var effectTimeConfig = authConfigs.FirstOrDefault(x => x.Flag == AuthParameterFlag.EffectTime);
if (effectTimeConfig != null)
{
res.EffectTimeParameterId = effectTimeConfig.ParameterId;
res.EffectTimeUnit = Enum.Parse(effectTimeConfig.Value1);
}
res.FixedEffectTime = authConfigs.FirstOrDefault(x => x.Flag == AuthParameterFlag.FixedEffectTime)?.Value1.ToInt();
res.Script = authConfigs.FirstOrDefault(x => x.Flag == AuthParameterFlag.Script)?.Value1;
return res;
}
///
/// 保存服务商授权配置信息
///
///
///
[HttpPost("ServiceProvider/SaveAuthInfo")]
public async Task SaveAuthInfo(ServiceProviderAuthInfoInput input)
{
var serviceProvider = await _serviceProviderRepository.GetFirstAsync(x =>
x.Id == input.ServiceProviderId);
if (serviceProvider == null)
{
throw new BusinessException(message: "服务商不存在");
}
var authConfigsEntities = BuildServiceProviderAuthConfigEntities(input);
using var ts = TransacationHelper.GetReadCommitted();
await _serviceProviderAuthConfigRepository.SoftDeleteAsync(x => x.ServiceProviderId == input.ServiceProviderId);
await _serviceProviderAuthConfigRepository.InsertRangeAsync(authConfigsEntities);
// del cache
var keys = await RedisHelper.Client.KeysAsync(
InterfaceForwardCommon.GetAccountCacheKey(serviceProvider.Code));
foreach (var key in keys)
{
await RedisHelper.Client.DelAsync(key);
}
ts.Complete();
return true;
}
private static List BuildServiceProviderAuthConfigEntities(
ServiceProviderAuthInfoInput input)
{
var authConfigsEntities = new List();
var inParameterConfigs = input.InParameters.Select(x => new ServiceProviderAuthConfigEntity
{
Flag = AuthParameterFlag.InParameter,
ParameterId = x.Id,
Value1 = x.Value,
});
authConfigsEntities.AddRange(inParameterConfigs);
if (input.TokenParameterId != null)
{
authConfigsEntities.Add(new ServiceProviderAuthConfigEntity
{
Flag = AuthParameterFlag.Token,
ParameterId = input.TokenParameterId,
Value1 = input.TokenPrefix,
});
}
if (input.EffectTimeParameterId != null)
{
authConfigsEntities.Add(new ServiceProviderAuthConfigEntity
{
Flag = AuthParameterFlag.EffectTime,
ParameterId = input.EffectTimeParameterId,
Value1 = input.EffectTimeUnit,
});
}
if (input.FixedEffectTime != null && input.FixedEffectTime > 0)
{
authConfigsEntities.Add(new ServiceProviderAuthConfigEntity
{
Flag = AuthParameterFlag.FixedEffectTime,
Value1 = input.FixedEffectTime.ToString(),
});
}
if (!input.Script.IsNullOrWhiteSpace())
{
authConfigsEntities.Add(new ServiceProviderAuthConfigEntity
{
Flag = AuthParameterFlag.Script,
Value1 = input.Script,
});
}
authConfigsEntities.ForEach(x => x.ServiceProviderId = input.ServiceProviderId);
return authConfigsEntities;
}
}