using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using Grpc.Core;
using Grpc.Extension.BaseService.Model;
using System.Linq;
using Grpc.Extension.Common;
using TEAMModelOS.SDK.Extension;
using System.Text.Json;
namespace Grpc.Extension.BaseService
{
///
/// Grpc元数据服务
///
public class MetaService : IGrpcBaseService
{
///
/// 服务基本信息
///
public Task Info(InfoRQ rq, ServerCallContext context)
{
return Task.Run(() =>
{
var methods = MetaModel.Methods.Select(q => q.FullName?.Trim()).ToList();
if (!string.IsNullOrWhiteSpace(rq.MethodName))
{
methods = methods?.Where(q => q.ToLower().Contains(rq.MethodName.Trim().ToLower())).ToList();
}
var methodInfos = new List();
foreach (var m in methods)
{
var info = new GrpcMethodInfo { Name = m };
info.IsThrottled = ThrottleManager.Instance.IsThrottled(m);
info.SaveResponseEnable = MonitorManager.Instance.SaveResponseMethodEnable(m);
methodInfos.Add(info);
}
return new InfoRS
{
IpAndPort = $"{MetaModel.Ip}:{MetaModel.Port}",
StartTime = MetaModel.StartTime.ToUnixTimestamp(),
MethodInfos = methodInfos
};
});
}
///
/// 服务方法的详细信息
///
public Task MethodInfo(MethodInfoRQ rq, ServerCallContext context)
{
return Task.Run(() =>
{
var methodInfo = MetaModel.Methods.FirstOrDefault(q => q.FullName == rq.FullName?.Trim());
if (methodInfo == null)
{
return new MethodInfoRS();
}
return new MethodInfoRS
{
RequestJson = Activator.CreateInstance(methodInfo.RequestType).FillProp().ToJsonString(new JsonSerializerOptions() { IgnoreNullValues = false }),
ResponseJson = Activator.CreateInstance(methodInfo.ResponseType).FillProp().ToJsonString(new JsonSerializerOptions() { IgnoreNullValues = false })
};
});
}
//TODO 此段代碼後續檢視
///
/// 服务方法调用
///
//public Task MethodInvoke(MethodInvokeRQ rq, ServerCallContext context)
//{
// //return Task.Run(() =>
// //{
// // var methodInfo = MetaModel.Methods.FirstOrDefault(q => q.FullName == rq.FullName?.Trim());
// // if (methodInfo == null)
// // {
// // return new MethodInvokeRS() { ResponseJson = $"not fount method by fullname:{rq.FullName}" };
// // }
// // var task = (Task)methodInfo.Handler.DynamicInvoke(rq.RequestJson?.Trim().FromJson(methodInfo.RequestType), context);
// // task.Wait();
// // dynamic result = task;
// // return new MethodInvokeRS { ResponseJson = ((object)result.Result).ToJson(ignoreNullValue: false, isIndented: true) };
// //});
//}
}
}