market.ts 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  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 { fetchPublicJson } from '@/lib/utils/publicFetch';
  25. // 시장 T+1 공개 데이터 — 익명 공통·일 1회 갱신. Data Cache(tag 'market-data', 10분 재검증).
  26. const MARKET_REVALIDATE = 600;
  27. const MARKET_TAGS = ['market-data'];
  28. // 지수 요약 (KOSPI/KOSDAQ/KRX/채권/파생) — 최신 1건
  29. export async function fetchMarketIndices(): Promise<ResultDto<MarketIndicesResponse>>
  30. {
  31. return await fetchPublicJson<MarketIndicesResponse>('/api/market/indices', { revalidate: MARKET_REVALIDATE, tags: MARKET_TAGS });
  32. }
  33. // ETP (ETF/ETN/ELW) — type 은 enum 멤버명 문자열로 전송 (ASP.NET model binding)
  34. export async function fetchMarketEtp(params: { type?: EtpTypeName; page?: number }): Promise<ResultDto<EtpResponse>>
  35. {
  36. const queryParams = new URLSearchParams();
  37. if (params.type) queryParams.set('type', params.type);
  38. queryParams.set('page', String(params.page ?? 1));
  39. return await fetchPublicJson<EtpResponse>(`/api/market/etp?${queryParams.toString()}`, { revalidate: MARKET_REVALIDATE, tags: MARKET_TAGS });
  40. }
  41. // 채권 (국채전문/일반/소액)
  42. export async function fetchMarketBonds(params: { market?: BondMarketName; date?: string; page?: number }): Promise<ResultDto<BondsResponse>>
  43. {
  44. const queryParams = new URLSearchParams();
  45. if (params.market) queryParams.set('market', params.market);
  46. if (params.date) queryParams.set('date', params.date);
  47. queryParams.set('page', String(params.page ?? 1));
  48. return await fetchPublicJson<BondsResponse>(`/api/market/bonds?${queryParams.toString()}`, { revalidate: MARKET_REVALIDATE, tags: MARKET_TAGS });
  49. }
  50. // 선물 (일반/주식선물) — session 은 숫자 1(정규)/2(야간) 전송, 미지정 시 백엔드 기본 정규
  51. export async function fetchMarketFutures(params: { kind?: FuturesKindName; date?: string; page?: number; session?: MarketSessionValue }): Promise<ResultDto<FuturesResponse>>
  52. {
  53. const queryParams = new URLSearchParams();
  54. if (params.kind) queryParams.set('kind', params.kind);
  55. if (params.date) queryParams.set('date', params.date);
  56. if (params.session) queryParams.set('session', String(params.session));
  57. queryParams.set('page', String(params.page ?? 1));
  58. return await fetchPublicJson<FuturesResponse>(`/api/market/futures?${queryParams.toString()}`, { revalidate: MARKET_REVALIDATE, tags: MARKET_TAGS });
  59. }
  60. // 옵션 (일반/주식옵션) — session 은 숫자 1(정규)/2(야간) 전송, 미지정 시 백엔드 기본 정규
  61. export async function fetchMarketOptions(params: { kind?: OptionsKindName; date?: string; page?: number; session?: MarketSessionValue }): Promise<ResultDto<OptionsResponse>>
  62. {
  63. const queryParams = new URLSearchParams();
  64. if (params.kind) queryParams.set('kind', params.kind);
  65. if (params.date) queryParams.set('date', params.date);
  66. if (params.session) queryParams.set('session', String(params.session));
  67. queryParams.set('page', String(params.page ?? 1));
  68. return await fetchPublicJson<OptionsResponse>(`/api/market/options?${queryParams.toString()}`, { revalidate: MARKET_REVALIDATE, tags: MARKET_TAGS });
  69. }
  70. // 상품 (석유/금/배출권)
  71. export async function fetchMarketCommodities(params: { market?: CommodityMarketName; date?: string; page?: number }): Promise<ResultDto<CommoditiesResponse>>
  72. {
  73. const queryParams = new URLSearchParams();
  74. if (params.market) queryParams.set('market', params.market);
  75. if (params.date) queryParams.set('date', params.date);
  76. queryParams.set('page', String(params.page ?? 1));
  77. return await fetchPublicJson<CommoditiesResponse>(`/api/market/commodities?${queryParams.toString()}`, { revalidate: MARKET_REVALIDATE, tags: MARKET_TAGS });
  78. }
  79. // ESG 증권
  80. export async function fetchMarketEsgSecurities(params: { date?: string; page?: number }): Promise<ResultDto<EsgSecuritiesResponse>>
  81. {
  82. const queryParams = new URLSearchParams();
  83. if (params.date) queryParams.set('date', params.date);
  84. queryParams.set('page', String(params.page ?? 1));
  85. return await fetchPublicJson<EsgSecuritiesResponse>(`/api/market/esg/securities?${queryParams.toString()}`, { revalidate: MARKET_REVALIDATE, tags: MARKET_TAGS });
  86. }
  87. // ESG 지수
  88. export async function fetchMarketEsgIndices(params: { date?: string; page?: number }): Promise<ResultDto<EsgIndicesResponse>>
  89. {
  90. const queryParams = new URLSearchParams();
  91. if (params.date) queryParams.set('date', params.date);
  92. queryParams.set('page', String(params.page ?? 1));
  93. return await fetchPublicJson<EsgIndicesResponse>(`/api/market/esg/indices?${queryParams.toString()}`, { revalidate: MARKET_REVALIDATE, tags: MARKET_TAGS });
  94. }
  95. // SRI 채권 (사회책임투자채권)
  96. export async function fetchMarketSriBonds(params: { date?: string; bondType?: string; page?: number }): Promise<ResultDto<SriBondsResponse>>
  97. {
  98. const queryParams = new URLSearchParams();
  99. if (params.date) queryParams.set('date', params.date);
  100. if (params.bondType) queryParams.set('bondType', params.bondType);
  101. queryParams.set('page', String(params.page ?? 1));
  102. return await fetchPublicJson<SriBondsResponse>(`/api/market/esg/sri-bonds?${queryParams.toString()}`, { revalidate: MARKET_REVALIDATE, tags: MARKET_TAGS });
  103. }
  104. // 환율 (매매기준율)
  105. export async function fetchMarketExchangeRates(params: { date?: string }): Promise<ResultDto<ExchangeRatesResponse>>
  106. {
  107. const queryParams = new URLSearchParams();
  108. if (params.date) queryParams.set('date', params.date);
  109. const qs = queryParams.toString();
  110. return await fetchPublicJson<ExchangeRatesResponse>(`/api/market/exchange-rates${qs ? `?${qs}` : ''}`, { revalidate: MARKET_REVALIDATE, tags: MARKET_TAGS });
  111. }
  112. // 금리 (대출/국제)
  113. export async function fetchMarketInterestRates(params: { type?: RateTypeName; date?: string }): Promise<ResultDto<InterestRatesResponse>>
  114. {
  115. const queryParams = new URLSearchParams();
  116. if (params.type) queryParams.set('type', params.type);
  117. if (params.date) queryParams.set('date', params.date);
  118. const qs = queryParams.toString();
  119. return await fetchPublicJson<InterestRatesResponse>(`/api/market/interest-rates${qs ? `?${qs}` : ''}`, { revalidate: MARKET_REVALIDATE, tags: MARKET_TAGS });
  120. }
  121. // 공시 피드 (전체 — corpCls: Y/K/N/E 필터, 페이징). 경로는 /api/disclosures (market 하위 아님)
  122. export async function fetchDisclosures(params: { corpCls?: string; page?: number }): Promise<ResultDto<DisclosuresResponse>>
  123. {
  124. const queryParams = new URLSearchParams();
  125. if (params.corpCls) queryParams.set('corpCls', params.corpCls);
  126. queryParams.set('page', String(params.page ?? 1));
  127. return await fetchPublicJson<DisclosuresResponse>(`/api/disclosures?${queryParams.toString()}`, { revalidate: MARKET_REVALIDATE, tags: MARKET_TAGS });
  128. }
  129. // 종목별 공시 (6자리 코드) — /api/stocks/{code}/disclosures
  130. export async function fetchStockDisclosures(code: string, params: { page?: number }): Promise<ResultDto<DisclosuresResponse>>
  131. {
  132. const queryParams = new URLSearchParams();
  133. queryParams.set('page', String(params.page ?? 1));
  134. return await fetchPublicJson<DisclosuresResponse>(`/api/stocks/${encodeURIComponent(code)}/disclosures?${queryParams.toString()}`, { revalidate: MARKET_REVALIDATE, tags: MARKET_TAGS });
  135. }