market.ts 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. 'use server';
  2. import { ResultDto } from '@/types/response/common';
  3. import {
  4. MarketIndicesResponse,
  5. EtpResponse,
  6. EtpTypeName,
  7. BondsResponse,
  8. BondMarketName,
  9. FuturesResponse,
  10. FuturesKindName,
  11. OptionsResponse,
  12. OptionsKindName,
  13. CommoditiesResponse,
  14. CommodityMarketName,
  15. EsgSecuritiesResponse,
  16. EsgIndicesResponse,
  17. SriBondsResponse,
  18. ExchangeRatesResponse,
  19. InterestRatesResponse,
  20. RateTypeName,
  21. DisclosuresResponse
  22. } from '@/types/market';
  23. import { fetchJson } from '@/lib/utils/server';
  24. // 공통 헤더 (익명 · JSON)
  25. const JSON_HEADERS = { 'Accept': 'application/json' } as const;
  26. // 지수 요약 (KOSPI/KOSDAQ/KRX/채권/파생) — 최신 1건
  27. export async function fetchMarketIndices(): Promise<ResultDto<MarketIndicesResponse>>
  28. {
  29. return await fetchJson<MarketIndicesResponse>('/api/market/indices', {
  30. method: 'GET',
  31. headers: JSON_HEADERS
  32. });
  33. }
  34. // ETP (ETF/ETN/ELW) — type 은 enum 멤버명 문자열로 전송 (ASP.NET model binding)
  35. export async function fetchMarketEtp(params: { type?: EtpTypeName; page?: number }): Promise<ResultDto<EtpResponse>>
  36. {
  37. const queryParams = new URLSearchParams();
  38. if (params.type) queryParams.set('type', params.type);
  39. queryParams.set('page', String(params.page ?? 1));
  40. return await fetchJson<EtpResponse>(`/api/market/etp?${queryParams.toString()}`, {
  41. method: 'GET',
  42. headers: JSON_HEADERS
  43. });
  44. }
  45. // 채권 (국채전문/일반/소액)
  46. export async function fetchMarketBonds(params: { market?: BondMarketName; date?: string; page?: number }): Promise<ResultDto<BondsResponse>>
  47. {
  48. const queryParams = new URLSearchParams();
  49. if (params.market) queryParams.set('market', params.market);
  50. if (params.date) queryParams.set('date', params.date);
  51. queryParams.set('page', String(params.page ?? 1));
  52. return await fetchJson<BondsResponse>(`/api/market/bonds?${queryParams.toString()}`, {
  53. method: 'GET',
  54. headers: JSON_HEADERS
  55. });
  56. }
  57. // 선물 (일반/주식선물)
  58. export async function fetchMarketFutures(params: { kind?: FuturesKindName; date?: string; page?: number }): Promise<ResultDto<FuturesResponse>>
  59. {
  60. const queryParams = new URLSearchParams();
  61. if (params.kind) queryParams.set('kind', params.kind);
  62. if (params.date) queryParams.set('date', params.date);
  63. queryParams.set('page', String(params.page ?? 1));
  64. return await fetchJson<FuturesResponse>(`/api/market/futures?${queryParams.toString()}`, {
  65. method: 'GET',
  66. headers: JSON_HEADERS
  67. });
  68. }
  69. // 옵션 (일반/주식옵션)
  70. export async function fetchMarketOptions(params: { kind?: OptionsKindName; date?: string; page?: number }): Promise<ResultDto<OptionsResponse>>
  71. {
  72. const queryParams = new URLSearchParams();
  73. if (params.kind) queryParams.set('kind', params.kind);
  74. if (params.date) queryParams.set('date', params.date);
  75. queryParams.set('page', String(params.page ?? 1));
  76. return await fetchJson<OptionsResponse>(`/api/market/options?${queryParams.toString()}`, {
  77. method: 'GET',
  78. headers: JSON_HEADERS
  79. });
  80. }
  81. // 상품 (석유/금/배출권)
  82. export async function fetchMarketCommodities(params: { market?: CommodityMarketName; date?: string; page?: number }): Promise<ResultDto<CommoditiesResponse>>
  83. {
  84. const queryParams = new URLSearchParams();
  85. if (params.market) queryParams.set('market', params.market);
  86. if (params.date) queryParams.set('date', params.date);
  87. queryParams.set('page', String(params.page ?? 1));
  88. return await fetchJson<CommoditiesResponse>(`/api/market/commodities?${queryParams.toString()}`, {
  89. method: 'GET',
  90. headers: JSON_HEADERS
  91. });
  92. }
  93. // ESG 증권
  94. export async function fetchMarketEsgSecurities(params: { date?: string; page?: number }): Promise<ResultDto<EsgSecuritiesResponse>>
  95. {
  96. const queryParams = new URLSearchParams();
  97. if (params.date) queryParams.set('date', params.date);
  98. queryParams.set('page', String(params.page ?? 1));
  99. return await fetchJson<EsgSecuritiesResponse>(`/api/market/esg/securities?${queryParams.toString()}`, {
  100. method: 'GET',
  101. headers: JSON_HEADERS
  102. });
  103. }
  104. // ESG 지수
  105. export async function fetchMarketEsgIndices(params: { date?: string; page?: number }): Promise<ResultDto<EsgIndicesResponse>>
  106. {
  107. const queryParams = new URLSearchParams();
  108. if (params.date) queryParams.set('date', params.date);
  109. queryParams.set('page', String(params.page ?? 1));
  110. return await fetchJson<EsgIndicesResponse>(`/api/market/esg/indices?${queryParams.toString()}`, {
  111. method: 'GET',
  112. headers: JSON_HEADERS
  113. });
  114. }
  115. // SRI 채권 (사회책임투자채권)
  116. export async function fetchMarketSriBonds(params: { date?: string; bondType?: string; page?: number }): Promise<ResultDto<SriBondsResponse>>
  117. {
  118. const queryParams = new URLSearchParams();
  119. if (params.date) queryParams.set('date', params.date);
  120. if (params.bondType) queryParams.set('bondType', params.bondType);
  121. queryParams.set('page', String(params.page ?? 1));
  122. return await fetchJson<SriBondsResponse>(`/api/market/esg/sri-bonds?${queryParams.toString()}`, {
  123. method: 'GET',
  124. headers: JSON_HEADERS
  125. });
  126. }
  127. // 환율 (매매기준율)
  128. export async function fetchMarketExchangeRates(params: { date?: string }): Promise<ResultDto<ExchangeRatesResponse>>
  129. {
  130. const queryParams = new URLSearchParams();
  131. if (params.date) queryParams.set('date', params.date);
  132. const qs = queryParams.toString();
  133. return await fetchJson<ExchangeRatesResponse>(`/api/market/exchange-rates${qs ? `?${qs}` : ''}`, {
  134. method: 'GET',
  135. headers: JSON_HEADERS
  136. });
  137. }
  138. // 금리 (대출/국제)
  139. export async function fetchMarketInterestRates(params: { type?: RateTypeName; date?: string }): Promise<ResultDto<InterestRatesResponse>>
  140. {
  141. const queryParams = new URLSearchParams();
  142. if (params.type) queryParams.set('type', params.type);
  143. if (params.date) queryParams.set('date', params.date);
  144. const qs = queryParams.toString();
  145. return await fetchJson<InterestRatesResponse>(`/api/market/interest-rates${qs ? `?${qs}` : ''}`, {
  146. method: 'GET',
  147. headers: JSON_HEADERS
  148. });
  149. }
  150. // 공시 피드 (전체 — corpCls: Y/K/N/E 필터, 페이징). 경로는 /api/disclosures (market 하위 아님)
  151. export async function fetchDisclosures(params: { corpCls?: string; page?: number }): Promise<ResultDto<DisclosuresResponse>>
  152. {
  153. const queryParams = new URLSearchParams();
  154. if (params.corpCls) queryParams.set('corpCls', params.corpCls);
  155. queryParams.set('page', String(params.page ?? 1));
  156. return await fetchJson<DisclosuresResponse>(`/api/disclosures?${queryParams.toString()}`, {
  157. method: 'GET',
  158. headers: JSON_HEADERS
  159. });
  160. }
  161. // 종목별 공시 (6자리 코드) — /api/stocks/{code}/disclosures
  162. export async function fetchStockDisclosures(code: string, params: { page?: number }): Promise<ResultDto<DisclosuresResponse>>
  163. {
  164. const queryParams = new URLSearchParams();
  165. queryParams.set('page', String(params.page ?? 1));
  166. return await fetchJson<DisclosuresResponse>(`/api/stocks/${encodeURIComponent(code)}/disclosures?${queryParams.toString()}`, {
  167. method: 'GET',
  168. headers: JSON_HEADERS
  169. });
  170. }