GlobalModel.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. using System.Text.Json;
  2. using Microsoft.Extensions.Caching.Memory;
  3. namespace economy.Models.Price.Global
  4. {
  5. public class GlobalModel
  6. {
  7. private readonly Alpha_API _alphaAPI;
  8. private readonly IMemoryCache _cache;
  9. public GlobalModel(Alpha_API alphaAPI, IMemoryCache cache)
  10. {
  11. _alphaAPI = alphaAPI;
  12. _cache = cache;
  13. }
  14. // 천연가스 시세 조회
  15. public async Task<NaturalGas.Response> GetNaturalGasPriceInfo(NaturalGas.Request request)
  16. {
  17. string cacheKey = $"Alpha_NATURAL_GAS_{request.Interval}";
  18. // 캐시에 데이터가 존재하면 반환
  19. if (_cache.TryGetValue(cacheKey, out NaturalGas.Response cachedData))
  20. {
  21. return cachedData;
  22. }
  23. NaturalGas.Response parseData = new();
  24. try
  25. {
  26. var uriBuilder = new UriBuilder(_alphaAPI.APIUrl)
  27. {
  28. Path = "/query",
  29. Query = $"function=NATURAL_GAS&interval={request.Interval}&apikey={_alphaAPI.APIKey}"
  30. };
  31. var response = await _alphaAPI.httpClient.GetAsync(uriBuilder.Uri);
  32. if (response.IsSuccessStatusCode)
  33. {
  34. var jsonString = await response.Content.ReadAsStringAsync();
  35. parseData = JsonSerializer.Deserialize<NaturalGas.Response>(jsonString);
  36. // 호출 한도 초과 시 HTTP 200 + Information 응답이 와서 Data가 null이 됨 — 빈 응답은 캐시하지 않음
  37. if (parseData.Data is null)
  38. {
  39. return new NaturalGas.Response();
  40. }
  41. // 캐시에 저장 (1일 동안 유지)
  42. _cache.Set(cacheKey, parseData, TimeSpan.FromDays(1));
  43. }
  44. response.EnsureSuccessStatusCode();
  45. }
  46. catch (HttpRequestException e)
  47. {
  48. Console.WriteLine($"Request error: {e.Message}");
  49. }
  50. return parseData;
  51. }
  52. // 국제 원자재 시세 조회 (구리, 알루미늄, 밀, 섬유(면화), 설탕, 커피, 원자재 종합지수)
  53. public async Task<Commodity.Response> GetCommodityPriceInfo(string function, string interval)
  54. {
  55. string cacheKey = $"Alpha_{function}_{interval}";
  56. // 캐시에 데이터가 존재하면 반환
  57. if (_cache.TryGetValue(cacheKey, out Commodity.Response cachedData))
  58. {
  59. return cachedData;
  60. }
  61. Commodity.Response parseData = new();
  62. try
  63. {
  64. var uriBuilder = new UriBuilder(_alphaAPI.APIUrl)
  65. {
  66. Path = "/query",
  67. Query = $"function={function}&interval={interval}&apikey={_alphaAPI.APIKey}"
  68. };
  69. var response = await _alphaAPI.httpClient.GetAsync(uriBuilder.Uri);
  70. if (response.IsSuccessStatusCode)
  71. {
  72. var jsonString = await response.Content.ReadAsStringAsync();
  73. parseData = JsonSerializer.Deserialize<Commodity.Response>(jsonString);
  74. // 호출 한도 초과 시 HTTP 200 + Information 응답이 와서 Data가 null이 됨 — 빈 응답은 캐시하지 않음
  75. if (parseData.Data is null)
  76. {
  77. return new Commodity.Response();
  78. }
  79. // 캐시에 저장 (1일 동안 유지)
  80. _cache.Set(cacheKey, parseData, TimeSpan.FromDays(1));
  81. }
  82. response.EnsureSuccessStatusCode();
  83. }
  84. catch (HttpRequestException e)
  85. {
  86. Console.WriteLine($"Request error: {e.Message}");
  87. }
  88. return parseData;
  89. }
  90. }
  91. }