FinancialModel.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. using System.Text.Json;
  2. using Microsoft.Extensions.Caching.Memory;
  3. namespace economy.Models.Financial
  4. {
  5. public class FinancialModel
  6. {
  7. private readonly KoreaEximGoKR _koreaEximGoKR;
  8. private readonly IMemoryCache _cache;
  9. public FinancialModel(KoreaEximGoKR koreaEximGoKR)
  10. {
  11. _koreaEximGoKR = koreaEximGoKR;
  12. _cache = new MemoryCache(new MemoryCacheOptions());
  13. }
  14. // 환율 조회
  15. public async Task<Exchange.Response> GetExchange(Exchange.Request request)
  16. {
  17. Exchange.Response parseData = new();
  18. try
  19. {
  20. var uriBuilder = new UriBuilder(_koreaEximGoKR.APIUrl)
  21. {
  22. Path = "/site/program/financial/exchangeJSON",
  23. Query = $"authkey={_koreaEximGoKR.ExchangeAPIKey}&searchdate={request.Date:yyyyMMdd}&data=AP01"
  24. };
  25. var response = await _koreaEximGoKR.httpClient.GetAsync(uriBuilder.Uri);
  26. if (response.IsSuccessStatusCode)
  27. {
  28. var jsonString = await response.Content.ReadAsStringAsync();
  29. using (var document = JsonDocument.Parse(jsonString))
  30. {
  31. parseData.Items = JsonSerializer.Deserialize<List<Exchange.Data>>(jsonString);
  32. }
  33. if (parseData is null)
  34. {
  35. return new Exchange.Response();
  36. }
  37. }
  38. response.EnsureSuccessStatusCode();
  39. }
  40. catch (HttpRequestException e)
  41. {
  42. Console.WriteLine($"Request error: {e.Message}");
  43. }
  44. return parseData;
  45. }
  46. // 대출 금리 조회
  47. public async Task<Interest.Response> GetInterestRate(Interest.Request request)
  48. {
  49. Interest.Response parseData = new();
  50. try
  51. {
  52. var uriBuilder = new UriBuilder(_koreaEximGoKR.APIUrl)
  53. {
  54. Path = "/site/program/financial/interestJSON",
  55. Query = $"authkey={_koreaEximGoKR.InterestAPIKey}&searchdate={request.Date:yyyyMMdd}&data=AP02"
  56. };
  57. var response = await _koreaEximGoKR.httpClient.GetAsync(uriBuilder.Uri);
  58. if (response.IsSuccessStatusCode)
  59. {
  60. var jsonString = await response.Content.ReadAsStringAsync();
  61. using (var document = JsonDocument.Parse(jsonString))
  62. {
  63. parseData.Items = JsonSerializer.Deserialize<List<Interest.Data>>(jsonString);
  64. }
  65. if (parseData.Items is null)
  66. {
  67. return new Interest.Response();
  68. }
  69. }
  70. response.EnsureSuccessStatusCode();
  71. }
  72. catch (HttpRequestException e)
  73. {
  74. Console.WriteLine($"Request error: {e.Message}");
  75. }
  76. return parseData;
  77. }
  78. // 국제 금리 조회
  79. public async Task<International.Response> GetInternationalRate(International.Request request)
  80. {
  81. International.Response parseData = new();
  82. try
  83. {
  84. var uriBuilder = new UriBuilder(_koreaEximGoKR.APIUrl)
  85. {
  86. Path = "/site/program/financial/internationalJSON",
  87. Query = $"authkey={_koreaEximGoKR.InternationalAPIKey}&searchdate={request.Date:yyyyMMdd}&data=AP03"
  88. };
  89. var response = await _koreaEximGoKR.httpClient.GetAsync(uriBuilder.Uri);
  90. if (response.IsSuccessStatusCode)
  91. {
  92. var jsonString = await response.Content.ReadAsStringAsync();
  93. using (var document = JsonDocument.Parse(jsonString))
  94. {
  95. parseData = JsonSerializer.Deserialize<International.Response>(jsonString);
  96. }
  97. if (parseData is null)
  98. {
  99. return new International.Response();
  100. }
  101. }
  102. response.EnsureSuccessStatusCode();
  103. }
  104. catch (HttpRequestException e)
  105. {
  106. Console.WriteLine($"Request error: {e.Message}");
  107. }
  108. return parseData;
  109. }
  110. // 환율 원화 기준환율만 DB에 등록
  111. public async Task<int> GetExchangeValue()
  112. {
  113. string cacheKey = "ExchangeValue";
  114. // 캐시에 데이터가 존재하면 반환
  115. if (_cache.TryGetValue(cacheKey, out int cachedData))
  116. {
  117. return cachedData;
  118. }
  119. var request = new Exchange.Request
  120. {
  121. Date = DateOnly.FromDateTime(DateTime.Now).AddDays(-1)
  122. };
  123. Exchange.Response exchangeList = await GetExchange(request);
  124. int result = 0;
  125. if (exchangeList.Items != null)
  126. {
  127. var usdItem = exchangeList.Items.Where(item => item.CurUnit == "USD").Take(1).ToList();
  128. if (usdItem.Any())
  129. {
  130. // 쉼표 제거 후 소수점 처리
  131. var value = usdItem[0].DealBasRate.Replace(",", "");
  132. if (decimal.TryParse(value, out var parsedRate))
  133. {
  134. result = (int)Math.Round(parsedRate);
  135. }
  136. // 캐시에 저장 (1일 동안 유지)
  137. _cache.Set(cacheKey, result, TimeSpan.FromDays(1));
  138. }
  139. }
  140. return result;
  141. }
  142. }
  143. }