market.ts 7.2 KB

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