Files
caliverse_server/ServerCommon/EchoSystem/EchoSystemRequester.cs
2025-05-01 07:20:41 +09:00

219 lines
8.3 KiB
C#

using System.Text;
using Newtonsoft.Json;
using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using ServerCore;
using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using MetaAssets;
namespace ServerCommon;
public class EchoSystemRequester
{
private readonly HttpClient m_httpClient;
private readonly HttpClient? m_slackClient;
private const int DefaultTimeOutMs = 30_000;
private const string m_get_rollup_by_date_url_base = "/web/v3/rollup/ymd";
private const string m_get_rollup_by_epoch_url_base = "/web/v3/rollup/seq";
private const string m_post_calium_event_url = "/web/v3/circ_event";
private const string m_post_calium_event_time_url = "/web/v3/circ_event_time";
private const string m_get_acc_volume_url = "/web/v3/converter/acc_volume";
private readonly string m_server_name;
private readonly string m_ip_port;
public EchoSystemRequester(string baseAddress, string? serverName = null, string? ipPort = null, string? errorSlackAddress = null)
{
m_server_name = serverName ?? "None" ;
m_ip_port = ipPort ?? "None";
m_httpClient = new HttpClient
{
BaseAddress = new Uri(baseAddress),
Timeout = TimeSpan.FromMilliseconds(DefaultTimeOutMs)
};
if (!string.IsNullOrEmpty(errorSlackAddress))
{
m_slackClient = new HttpClient
{
BaseAddress = new Uri(errorSlackAddress),
Timeout = TimeSpan.FromMilliseconds(DefaultTimeOutMs)
};
}
}
public async Task<Result> checkWeb3Connection()
{
var res = await getConverterSyncData();
if (res.result.isFail() && res.response == null) return res.result;
return new Result();
}
public async Task<(Result result, CaliumRollUpResponse? response)> getDailyRollUpData(int epoch)
{
var result = new Result();
if (epoch <= 0)
{
var err_msg = $"fail to get daily roll up data !!! : epoch is zero - {epoch}";
result.setFail(ServerErrorCode.FailToSendEchoSystem, err_msg);
Log.getLogger().error(result.toBasicString());
return (result, null);
}
var url_path = $"{m_get_rollup_by_epoch_url_base}/{epoch}";
return await getDailyRollUpData(url_path);
}
public async Task<(Result result, CaliumRollUpResponse? response)> getDailyRollUpData(DateTime epochDate)
{
var url_path = $"{m_get_rollup_by_date_url_base}/{epochDate:yyyyMMdd}";
return await getDailyRollUpData(url_path);
}
public async Task<(Result result, ConverterSyncResponse? response)> getConverterSyncData()
{
var request = EchoSystemHelper.makeRequestMessage(EchoSystemMethod.Get, m_get_acc_volume_url);
Log.getLogger().debug($"EchoSystemRequester Request: url[{request.RequestUri}]");
var response = await sendHttpRequest<ConverterSyncResponse>(request);
return response;
}
public async Task<(Result result, CaliumEventResponse? response)> postCaliumEvent(CaliumEventRequest data)
{
var request = EchoSystemHelper.makeRequestMessage(EchoSystemMethod.Post, m_post_calium_event_time_url);
data.m_event_time = DateTimeHelper.Current.toStringWithUtcIso8601();
var body = JsonConvert.SerializeObject(data);
request.Content = new StringContent(body, Encoding.UTF8, "application/json");
Log.getLogger().debug($"EchoSystemRequester Request: url[{request.RequestUri}] - content[{body}");
var response = await sendHttpRequest<CaliumEventResponse>(request);
return response;
}
private async Task sendEchoSystemSlackMessage(HttpRequestMessage request, string errMsg)
{
if (null == m_slackClient) return;
var title = getEchoSystemType(request.RequestUri!.ToString());
var slack_msg_builder = new EchoSystemSlackMessageBuilder(title, m_server_name, m_ip_port);
slack_msg_builder.appendValue("URI", $"{m_httpClient.BaseAddress}{request.RequestUri}");
if (null != request.Content)
{
slack_msg_builder.appendValue("Param", await request.Content.ReadAsStringAsync(), true);
}
slack_msg_builder.appendValue("ERROR", errMsg, true);
var req = EchoSystemHelper.makeRequestMessage(EchoSystemMethod.Post, "");
var content = slack_msg_builder.build();
req.Content = new StringContent(content);
try
{
Log.getLogger().debug($"EchoSystemRequester Slack Message Request: url[{m_slackClient.BaseAddress}] - content[{content}");
var res = await m_slackClient.SendAsync(req);
var res_content = await res.Content.ReadAsStringAsync();
Log.getLogger().debug($"EchoSystemRequester Slack Message Response: url[{m_slackClient.BaseAddress}] - content[{res_content}");
}
catch (Exception e)
{
var err_msg = $"EchoSystemRequester Slack Message Exception!!: {e}";
Log.getLogger().error(err_msg);
}
}
private static string getEchoSystemType(string uri)
{
return uri switch
{
m_get_rollup_by_epoch_url_base or m_get_rollup_by_date_url_base => "롤업 데이터 조회",
m_post_calium_event_url => "유통량 적재",
m_get_acc_volume_url => "롤업 동기화 조회",
_ => string.Empty
};
}
private async Task<(Result result, CaliumRollUpResponse? response)> getDailyRollUpData(string urlPath)
{
var request = EchoSystemHelper.makeRequestMessage(EchoSystemMethod.Get, urlPath);
Log.getLogger().debug($"EchoSystemRequester Request: url[{request.RequestUri}]");
var response = await sendHttpRequest<CaliumRollUpResponse>(request);
return response;
}
private async Task<(Result, TResponse?)> sendHttpRequest<TResponse>(HttpRequestMessage request) where TResponse : EchoSystemBaseResponse
{
var result = new Result();
try
{
var response = await m_httpClient.SendAsync(request, new CancellationToken());
if (response.IsSuccessStatusCode == false)
{
var err_msg = $"failed to get {nameof(TResponse)} data !!! : response error[{response.StatusCode}]";
result.setFail(ServerErrorCode.FailToGetEchoSystemHttpError, err_msg);
Log.getLogger().error(result.toBasicString());
await sendEchoSystemSlackMessage(request, err_msg);
return (result, null);
}
var content = await response.Content.ReadAsStringAsync();
Log.getLogger().debug($"EchoSystemRequester Response: url[{request.RequestUri}] - content[{content}]");
var msg = JsonConvert.DeserializeObject<TResponse>(content);
if (null == msg)
{
var err_msg = $"failed to get {nameof(TResponse)} data !!! - response message is null !!!";
result.setFail(ServerErrorCode.FailToGetEchoSystemMessageNull, err_msg);
Log.getLogger().error(result.toBasicString());
await sendEchoSystemSlackMessage(request, err_msg);
return (result, null);
}
var check_response = checkEchoSystemResponse<TResponse>(msg);
return (check_response, msg);
}
catch (Exception e)
{
var err_msg = $"failed to get EchoSystemRequester response !!! : exception - {e}";
result.setFail(ServerErrorCode.FailToGetEchoSystemException, err_msg);
Log.getLogger().error(result.toBasicString());
await sendEchoSystemSlackMessage(request, e.ToString());
return (result, null);
}
}
private Result checkEchoSystemResponse<T>(EchoSystemBaseResponse response)
{
var result = new Result();
if (false == response.m_success || !string.IsNullOrEmpty(response.m_code))
{
var err_msg = $"response is failed !!! : {nameof(T)} - {response.m_code ?? string.Empty}";
result.setFail(ServerErrorCode.GetFailEchoSystemResponse, err_msg);
Log.getLogger().error(result.toBasicString());
}
return result;
}
}