using Attribute;
using Dto;
using Vo;
using Model;
using Model.Base;
using Repository;
using Service;
using Microsoft.AspNetCore.Mvc;
using Common;
using Dto.Client;
using Infrastructure;
using Feign;
namespace Services
{
///
/// api接口Service业务层处理
///
[AppService(ServiceType = typeof(IApiInfoService), ServiceLifetime = LifeTime.Transient)]
public class ApiInfoService : BaseService, IApiInfoService
{
///
/// api接口-列表
///
/// 请求参数
/// api接口列表
public PagedInfo List([FromQuery] PagerInfo page, [FromQuery] ApiInfoListDto parm)
{
//开始拼装查询条件
var predicate = Expressionable.Create();
predicate = predicate.AndIF(parm.groupId > 0, m => m.groupId == parm.groupId);
predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.apiName), m => m.apiName.Contains(parm.apiName));
var response = Queryable()
.Where(predicate.ToExpression())
.OrderByDescending(m => m.id)
.Includes(m => m.apiGroupJoin)
.ToPage(page);
return response;
}
///
/// api接口-列表
///
/// 请求参数
/// api接口列表
public List ApiList([FromBody] ApiInfoDto param, List groups)
{
List groupSubs = RedisServer.Cache.LRange("appapiinfosub:" + param.groupKind + ":" + param.projectId, 0, -1).ToList();
if (groupSubs.Count <= 0)
{
List ids = groups.Select(m => m.id).ToList();
groupSubs = GetList(m => ids.Contains(m.groupId)).ToList();
RedisServer.Cache.LPush("appapiinfosub:" + param.groupKind + ":" + param.projectId, groupSubs.ToArray());
}
return groupSubs;
}
///
/// 列表属性结构-适配后台的tree-select
///
/// 列表
// public List getTreeList(List groups)
// {
// List result = new List();
// foreach(var sub in groups)
// {
// TreeVo item = new TreeVo();
// item.label = sub.groupRemark;
// item.value = sub.groupName;
// var list2 = GetList(m => m.groupId == sub.id);
// if(list2.Count > 0)
// {
// item.children = new List();
// foreach(var sub2 in list2)
// {
// TreeVo item2 = new TreeVo();
// item2.label = sub2.apiName;
// item2.value = sub2.apiKey;
// item.children.Add(item2);
// }
// }
// result.Add(item);
// }
// return result;
// }
///
/// 通知-同步接口数据
///
/// 请求参数
/// 通知-同步接口数据
public void notice([FromBody] Dto.Client.NoticeInfoDto param, int groupId, int groupProject, int groupKind)
{
string ApiRouter = param.apiRouter;
string ApiPort = param.apiPort;
string ApiHost = param.apiHost;
string ApiKey = param.apiKey;
string ApiName = param.apiName;
string ApiMethod = param.apiMethod;
ApiInfo apiInfo = GetFirst(m => m.groupId == groupId && m.apiKey == ApiKey && m.version == groupProject);
if (apiInfo == null)
{
Add(new ApiInfo()
{
createDate = DateTime.Now,
apiKey = string.Concat(ApiKey[..1].ToLower(), ApiKey.AsSpan(1)),
apiRouter = ApiRouter,
apiPort = int.Parse(Function.CheckInt(ApiPort)),
apiHost = ApiHost,
apiName = ApiName,
apiMethod = ApiMethod,
groupId = groupId,
version = groupProject,
});
if (groupKind == 1)
{
string ApiPath = param.apiPath;
string ApiEnName = param.apiEnName;
string module = ApiPath.Split('/')[1];
string rootPath = ApiPath.Split('/')[2];
IAdmin.sycnMenu(new AddMenuFromApiDto()
{
module = module,
apiEnName = ApiEnName,
apiPath = ApiPath,
apiName = ApiName,
rootPath = rootPath,
});
}
}
else
{
apiInfo.apiRouter = ApiRouter;
apiInfo.apiPort = int.Parse(Function.CheckInt(ApiPort));
apiInfo.apiHost = ApiHost;
apiInfo.apiName = ApiName;
apiInfo.apiMethod = ApiMethod;
Update(apiInfo, true);
}
}
///
/// 通知-同步接口数据
///
/// 请求参数
/// 通知-同步接口数据
public void noticeAll([FromBody] List param)
{
var apiGroupService = App.GetService();
foreach (NoticeGroupDto data in param)
{
int groupId = apiGroupService.notice(data);
List apiLists = data.child;
foreach (NoticeInfoDto apiList in apiLists)
{
notice(apiList, groupId, data.groupProject, data.groupKind);
}
RedisServer.Cache.Del(new string[] { "appapigroup:" + data.groupKind + ":" + data.groupProject, "appapiinfo:" + data.groupKind + ":" + data.groupProject, "appapiinfosub:" + data.groupKind + ":" + data.groupProject });
}
}
///
/// 获取接口数据
///
/// 请求参数
/// 获取接口数据
public Dictionary apiInfoList([FromBody] ApiInfoDto param, List groups, List groupSubs)
{
Dictionary obj = new Dictionary();
Dictionary groupobj = new Dictionary();
if (param.groups.Count > 0)
{
foreach (ApiInfoSubDto sub in param.groups)
{
string name = sub.name;
int version = sub.version;
groupobj.Add(name, version);
}
}
foreach (var group in groups)
{
int curVersion = int.Parse(Function.CheckInt(group.groupVersion));
if (groupobj.Any(m => m.Key == group.groupName && m.Value < curVersion))
{
Dictionary groupData = new Dictionary();
var apis = groupSubs.Where(m => m.groupId == group.id && m.version == param.projectId).ToList();
foreach (var api in apis)
{
Dictionary apiData = new Dictionary();
string url = api.apiHost;
if (api.apiPort != 80 && api.apiPort != 443)
{
url += ":" + api.apiPort;
}
url += api.apiRouter;
apiData.Add("name", api.apiName);
apiData.Add("url", url);
apiData.Add("method", api.apiMethod);
groupData.Add(api.apiKey, apiData);
}
groupData.Add("groupVersion", group.groupVersion);
groupData.Add("groupInfo", group.groupRemark);
obj.Add(group.groupName, groupData);
}
}
return obj;
}
}
}