using System.Text.Json; using economy.Helpers; namespace economy.Models.Price.Domestic { public class DomesticModel { private readonly DataGoKR? _dataGoKR; private readonly FlowerAtOrKR? _flowerAtOrKR; public DomesticModel(DataGoKR? dataGoKR, FlowerAtOrKR? flowerAtOrKR) { _dataGoKR = dataGoKR; _flowerAtOrKR = flowerAtOrKR; } // 금 시세 조회 public async Task GetGoldPriceInfo(Gold.Request request) { Gold.Response parseData = new(); try { var uriBuilder = new UriBuilder(_dataGoKR.APIUrl) { Path = "/1160100/service/GetGeneralProductInfoService/getGoldPriceInfo", Query = $"serviceKey={_dataGoKR.APIKey}&pageNo={request.PageNo}&numOfRows={request.NumOfRows}&beginBasDt={request.StartDate:yyyyMMdd}&endBasDt={request.EndDate:yyyyMMdd}&resultType=json" }; if (request.LikeSrtnCd is not null) { uriBuilder.Query += $"&likeSrtnCd={request.LikeSrtnCd}"; } var response = await _dataGoKR.httpClient.GetAsync(uriBuilder.Uri); if (response.IsSuccessStatusCode) { var jsonString = await response.Content.ReadAsStringAsync(); using (var document = JsonDocument.Parse(jsonString)) { var resEle = document.RootElement.GetProperty("response"); parseData = JsonSerializer.Deserialize(resEle.GetRawText()); } if (parseData.Body is null) { return new Gold.Response(); } } response.EnsureSuccessStatusCode(); } catch (HttpRequestException e) { Console.WriteLine($"Request error: {e.Message}"); } return parseData; } // 석유 시세 조회 public async Task GetOilPriceInfo(Oil.Request request) { Oil.Response parseData = new(); try { var uriBuilder = new UriBuilder(_dataGoKR.APIUrl) { Path = "/1160100/service/GetGeneralProductInfoService/getOilPriceInfo", Query = $"serviceKey={_dataGoKR.APIKey}&pageNo={request.PageNo}&numOfRows={request.NumOfRows}&beginBasDt={request.StartDate:yyyyMMdd}&endBasDt={request.EndDate:yyyyMMdd}&resultType=json" }; var response = await _dataGoKR.httpClient.GetAsync(uriBuilder.Uri); if (response.IsSuccessStatusCode) { var jsonString = await response.Content.ReadAsStringAsync(); using (var document = JsonDocument.Parse(jsonString)) { var resEle = document.RootElement.GetProperty("response"); parseData = JsonSerializer.Deserialize(resEle.GetRawText()); } if (parseData.Body is null) { return new Oil.Response(); } } response.EnsureSuccessStatusCode(); } catch (HttpRequestException e) { Console.WriteLine($"Request error: {e.Message}"); } return parseData; } // 배출권 시세 조회 public async Task GetEmissionPriceInfo(Emission.Request request) { Emission.Response parseData = new(); try { var uriBuilder = new UriBuilder(_dataGoKR.APIUrl) { Path = "/1160100/service/GetGeneralProductInfoService/getCertifiedEmissionReductionPriceInfo", Query = $"serviceKey={_dataGoKR.APIKey}&pageNo={request.PageNo}&numOfRows={request.NumOfRows}&beginBasDt={request.StartDate:yyyyMMdd}&endBasDt={request.EndDate:yyyyMMdd}&resultType=json" }; if (request.LikeSrtnCd is not null) { uriBuilder.Query += $"&likeSrtnCd={request.LikeSrtnCd}"; } var response = await _dataGoKR.httpClient.GetAsync(uriBuilder.Uri); if (response.IsSuccessStatusCode) { var jsonString = await response.Content.ReadAsStringAsync(); using (var document = JsonDocument.Parse(jsonString)) { var resEle = document.RootElement.GetProperty("response"); parseData = JsonSerializer.Deserialize(resEle.GetRawText()); } if (parseData.Body is null) { return new Emission.Response(); } } response.EnsureSuccessStatusCode(); } catch (HttpRequestException e) { Console.WriteLine($"Request error: {e.Message}"); } return parseData; } // 품목별 가격 목록 조회 public async Task GetPriceItemList(Item.List.Request request) { Item.List.Response parsedData = new(); try { var response = await _dataGoKR.httpClient.GetAsync($"/1240000/bpp_openapi/getPriceItemList?ServiceKey={_dataGoKR.APIKey}&pageNo={request.PageNo}&numOfRows={request.NumOfRows}"); if (response.IsSuccessStatusCode) { var xmlString = await response.Content.ReadAsStringAsync(); parsedData = await Common.ParseXmlDataAsync(xmlString); if (parsedData.Body is null) { return parsedData; } } response.EnsureSuccessStatusCode(); // 예외 발생시킴 } catch (HttpRequestException e) { Console.WriteLine($"Request error: {e.Message}"); } return parsedData; } // 품목 상세 정보 조회 public async Task GetPriceItemInfo(Item.Detail.Request request) { Item.Detail.Response parseData = new(); try { var uriBuilder = new UriBuilder(_dataGoKR.APIUrl) { Path = "/1240000/bpp_openapi/getPriceInfo", Query = $"ServiceKey={_dataGoKR.APIKey}&pageNo={request.PageNo}&numOfRows={request.NumOfRows}&startDate={request.StartDate:yyyy-MM-dd}&endDate={request.EndDate:yyyy-MM-dd}&itemCode={request.ItemCode}" }; var response = await _dataGoKR.httpClient.GetAsync(uriBuilder.Uri); if (response.IsSuccessStatusCode) { var xmlString = await response.Content.ReadAsStringAsync(); parseData = await Common.ParseXmlDataAsync(xmlString); if (parseData.Body is null) { return new Item.Detail.Response(); } } response.EnsureSuccessStatusCode(); } catch (HttpRequestException e) { Console.WriteLine($"Request error: {e.Message}"); } return parseData; } // 화훼 시세 조회 public async Task GetFlowerPriceInfo(Flower.Request request) { Flower.Response parseData = new(); try { var uriBuilder = new UriBuilder(_flowerAtOrKR.APIUrl) { Path = "/api/returnData.api", Query = $"kind=f001&serviceKey={_flowerAtOrKR.APIKey}¤tPage={request.PageNo}&countPerPage={request.NumOfRows}&baseDate={request.BaseDate:yyyy-MM-dd}&flowerGubn={(int)request.Type}&dataType=json" }; if (request.PumName is not null) { uriBuilder.Query += $"&pumName={request.PumName}"; } if (request.GoodName is not null) { uriBuilder.Query += $"&goodName={request.GoodName}"; } var response = await _flowerAtOrKR.httpClient.GetAsync(uriBuilder.Uri); if (response.IsSuccessStatusCode) { var jsonString = await response.Content.ReadAsStringAsync(); using (var document = JsonDocument.Parse(jsonString)) { if (document.RootElement.TryGetProperty("response", out var resEle)) { Console.WriteLine("Found 'response' property."); Console.WriteLine(resEle.GetRawText()); // response 내부 텍스트 출력 parseData = JsonSerializer.Deserialize(resEle.GetRawText()); } else { Console.WriteLine("'response' property not found in JSON."); } } if (parseData.Items is null) { return new Flower.Response(); } } response.EnsureSuccessStatusCode(); } catch (HttpRequestException e) { Console.WriteLine($"Request error: {e.Message}"); } return parseData; } } }