|
@@ -22,18 +22,16 @@ import {
|
|
|
RateTypeName,
|
|
RateTypeName,
|
|
|
DisclosuresResponse
|
|
DisclosuresResponse
|
|
|
} from '@/types/market';
|
|
} from '@/types/market';
|
|
|
-import { fetchJson } from '@/lib/utils/server';
|
|
|
|
|
|
|
+import { fetchPublicJson } from '@/lib/utils/publicFetch';
|
|
|
|
|
|
|
|
-// 공통 헤더 (익명 · JSON)
|
|
|
|
|
-const JSON_HEADERS = { 'Accept': 'application/json' } as const;
|
|
|
|
|
|
|
+// 시장 T+1 공개 데이터 — 익명 공통·일 1회 갱신. Data Cache(tag 'market-data', 10분 재검증).
|
|
|
|
|
+const MARKET_REVALIDATE = 600;
|
|
|
|
|
+const MARKET_TAGS = ['market-data'];
|
|
|
|
|
|
|
|
// 지수 요약 (KOSPI/KOSDAQ/KRX/채권/파생) — 최신 1건
|
|
// 지수 요약 (KOSPI/KOSDAQ/KRX/채권/파생) — 최신 1건
|
|
|
export async function fetchMarketIndices(): Promise<ResultDto<MarketIndicesResponse>>
|
|
export async function fetchMarketIndices(): Promise<ResultDto<MarketIndicesResponse>>
|
|
|
{
|
|
{
|
|
|
- return await fetchJson<MarketIndicesResponse>('/api/market/indices', {
|
|
|
|
|
- method: 'GET',
|
|
|
|
|
- headers: JSON_HEADERS
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ return await fetchPublicJson<MarketIndicesResponse>('/api/market/indices', { revalidate: MARKET_REVALIDATE, tags: MARKET_TAGS });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// ETP (ETF/ETN/ELW) — type 은 enum 멤버명 문자열로 전송 (ASP.NET model binding)
|
|
// ETP (ETF/ETN/ELW) — type 은 enum 멤버명 문자열로 전송 (ASP.NET model binding)
|
|
@@ -44,10 +42,7 @@ export async function fetchMarketEtp(params: { type?: EtpTypeName; page?: number
|
|
|
if (params.type) queryParams.set('type', params.type);
|
|
if (params.type) queryParams.set('type', params.type);
|
|
|
queryParams.set('page', String(params.page ?? 1));
|
|
queryParams.set('page', String(params.page ?? 1));
|
|
|
|
|
|
|
|
- return await fetchJson<EtpResponse>(`/api/market/etp?${queryParams.toString()}`, {
|
|
|
|
|
- method: 'GET',
|
|
|
|
|
- headers: JSON_HEADERS
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ return await fetchPublicJson<EtpResponse>(`/api/market/etp?${queryParams.toString()}`, { revalidate: MARKET_REVALIDATE, tags: MARKET_TAGS });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 채권 (국채전문/일반/소액)
|
|
// 채권 (국채전문/일반/소액)
|
|
@@ -59,10 +54,7 @@ export async function fetchMarketBonds(params: { market?: BondMarketName; date?:
|
|
|
if (params.date) queryParams.set('date', params.date);
|
|
if (params.date) queryParams.set('date', params.date);
|
|
|
queryParams.set('page', String(params.page ?? 1));
|
|
queryParams.set('page', String(params.page ?? 1));
|
|
|
|
|
|
|
|
- return await fetchJson<BondsResponse>(`/api/market/bonds?${queryParams.toString()}`, {
|
|
|
|
|
- method: 'GET',
|
|
|
|
|
- headers: JSON_HEADERS
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ return await fetchPublicJson<BondsResponse>(`/api/market/bonds?${queryParams.toString()}`, { revalidate: MARKET_REVALIDATE, tags: MARKET_TAGS });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 선물 (일반/주식선물) — session 은 숫자 1(정규)/2(야간) 전송, 미지정 시 백엔드 기본 정규
|
|
// 선물 (일반/주식선물) — session 은 숫자 1(정규)/2(야간) 전송, 미지정 시 백엔드 기본 정규
|
|
@@ -75,10 +67,7 @@ export async function fetchMarketFutures(params: { kind?: FuturesKindName; date?
|
|
|
if (params.session) queryParams.set('session', String(params.session));
|
|
if (params.session) queryParams.set('session', String(params.session));
|
|
|
queryParams.set('page', String(params.page ?? 1));
|
|
queryParams.set('page', String(params.page ?? 1));
|
|
|
|
|
|
|
|
- return await fetchJson<FuturesResponse>(`/api/market/futures?${queryParams.toString()}`, {
|
|
|
|
|
- method: 'GET',
|
|
|
|
|
- headers: JSON_HEADERS
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ return await fetchPublicJson<FuturesResponse>(`/api/market/futures?${queryParams.toString()}`, { revalidate: MARKET_REVALIDATE, tags: MARKET_TAGS });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 옵션 (일반/주식옵션) — session 은 숫자 1(정규)/2(야간) 전송, 미지정 시 백엔드 기본 정규
|
|
// 옵션 (일반/주식옵션) — session 은 숫자 1(정규)/2(야간) 전송, 미지정 시 백엔드 기본 정규
|
|
@@ -91,10 +80,7 @@ export async function fetchMarketOptions(params: { kind?: OptionsKindName; date?
|
|
|
if (params.session) queryParams.set('session', String(params.session));
|
|
if (params.session) queryParams.set('session', String(params.session));
|
|
|
queryParams.set('page', String(params.page ?? 1));
|
|
queryParams.set('page', String(params.page ?? 1));
|
|
|
|
|
|
|
|
- return await fetchJson<OptionsResponse>(`/api/market/options?${queryParams.toString()}`, {
|
|
|
|
|
- method: 'GET',
|
|
|
|
|
- headers: JSON_HEADERS
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ return await fetchPublicJson<OptionsResponse>(`/api/market/options?${queryParams.toString()}`, { revalidate: MARKET_REVALIDATE, tags: MARKET_TAGS });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 상품 (석유/금/배출권)
|
|
// 상품 (석유/금/배출권)
|
|
@@ -106,10 +92,7 @@ export async function fetchMarketCommodities(params: { market?: CommodityMarketN
|
|
|
if (params.date) queryParams.set('date', params.date);
|
|
if (params.date) queryParams.set('date', params.date);
|
|
|
queryParams.set('page', String(params.page ?? 1));
|
|
queryParams.set('page', String(params.page ?? 1));
|
|
|
|
|
|
|
|
- return await fetchJson<CommoditiesResponse>(`/api/market/commodities?${queryParams.toString()}`, {
|
|
|
|
|
- method: 'GET',
|
|
|
|
|
- headers: JSON_HEADERS
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ return await fetchPublicJson<CommoditiesResponse>(`/api/market/commodities?${queryParams.toString()}`, { revalidate: MARKET_REVALIDATE, tags: MARKET_TAGS });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// ESG 증권
|
|
// ESG 증권
|
|
@@ -120,10 +103,7 @@ export async function fetchMarketEsgSecurities(params: { date?: string; page?: n
|
|
|
if (params.date) queryParams.set('date', params.date);
|
|
if (params.date) queryParams.set('date', params.date);
|
|
|
queryParams.set('page', String(params.page ?? 1));
|
|
queryParams.set('page', String(params.page ?? 1));
|
|
|
|
|
|
|
|
- return await fetchJson<EsgSecuritiesResponse>(`/api/market/esg/securities?${queryParams.toString()}`, {
|
|
|
|
|
- method: 'GET',
|
|
|
|
|
- headers: JSON_HEADERS
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ return await fetchPublicJson<EsgSecuritiesResponse>(`/api/market/esg/securities?${queryParams.toString()}`, { revalidate: MARKET_REVALIDATE, tags: MARKET_TAGS });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// ESG 지수
|
|
// ESG 지수
|
|
@@ -134,10 +114,7 @@ export async function fetchMarketEsgIndices(params: { date?: string; page?: numb
|
|
|
if (params.date) queryParams.set('date', params.date);
|
|
if (params.date) queryParams.set('date', params.date);
|
|
|
queryParams.set('page', String(params.page ?? 1));
|
|
queryParams.set('page', String(params.page ?? 1));
|
|
|
|
|
|
|
|
- return await fetchJson<EsgIndicesResponse>(`/api/market/esg/indices?${queryParams.toString()}`, {
|
|
|
|
|
- method: 'GET',
|
|
|
|
|
- headers: JSON_HEADERS
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ return await fetchPublicJson<EsgIndicesResponse>(`/api/market/esg/indices?${queryParams.toString()}`, { revalidate: MARKET_REVALIDATE, tags: MARKET_TAGS });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// SRI 채권 (사회책임투자채권)
|
|
// SRI 채권 (사회책임투자채권)
|
|
@@ -149,10 +126,7 @@ export async function fetchMarketSriBonds(params: { date?: string; bondType?: st
|
|
|
if (params.bondType) queryParams.set('bondType', params.bondType);
|
|
if (params.bondType) queryParams.set('bondType', params.bondType);
|
|
|
queryParams.set('page', String(params.page ?? 1));
|
|
queryParams.set('page', String(params.page ?? 1));
|
|
|
|
|
|
|
|
- return await fetchJson<SriBondsResponse>(`/api/market/esg/sri-bonds?${queryParams.toString()}`, {
|
|
|
|
|
- method: 'GET',
|
|
|
|
|
- headers: JSON_HEADERS
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ return await fetchPublicJson<SriBondsResponse>(`/api/market/esg/sri-bonds?${queryParams.toString()}`, { revalidate: MARKET_REVALIDATE, tags: MARKET_TAGS });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 환율 (매매기준율)
|
|
// 환율 (매매기준율)
|
|
@@ -164,10 +138,7 @@ export async function fetchMarketExchangeRates(params: { date?: string }): Promi
|
|
|
|
|
|
|
|
const qs = queryParams.toString();
|
|
const qs = queryParams.toString();
|
|
|
|
|
|
|
|
- return await fetchJson<ExchangeRatesResponse>(`/api/market/exchange-rates${qs ? `?${qs}` : ''}`, {
|
|
|
|
|
- method: 'GET',
|
|
|
|
|
- headers: JSON_HEADERS
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ return await fetchPublicJson<ExchangeRatesResponse>(`/api/market/exchange-rates${qs ? `?${qs}` : ''}`, { revalidate: MARKET_REVALIDATE, tags: MARKET_TAGS });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 금리 (대출/국제)
|
|
// 금리 (대출/국제)
|
|
@@ -180,10 +151,7 @@ export async function fetchMarketInterestRates(params: { type?: RateTypeName; da
|
|
|
|
|
|
|
|
const qs = queryParams.toString();
|
|
const qs = queryParams.toString();
|
|
|
|
|
|
|
|
- return await fetchJson<InterestRatesResponse>(`/api/market/interest-rates${qs ? `?${qs}` : ''}`, {
|
|
|
|
|
- method: 'GET',
|
|
|
|
|
- headers: JSON_HEADERS
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ return await fetchPublicJson<InterestRatesResponse>(`/api/market/interest-rates${qs ? `?${qs}` : ''}`, { revalidate: MARKET_REVALIDATE, tags: MARKET_TAGS });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 공시 피드 (전체 — corpCls: Y/K/N/E 필터, 페이징). 경로는 /api/disclosures (market 하위 아님)
|
|
// 공시 피드 (전체 — corpCls: Y/K/N/E 필터, 페이징). 경로는 /api/disclosures (market 하위 아님)
|
|
@@ -194,10 +162,7 @@ export async function fetchDisclosures(params: { corpCls?: string; page?: number
|
|
|
if (params.corpCls) queryParams.set('corpCls', params.corpCls);
|
|
if (params.corpCls) queryParams.set('corpCls', params.corpCls);
|
|
|
queryParams.set('page', String(params.page ?? 1));
|
|
queryParams.set('page', String(params.page ?? 1));
|
|
|
|
|
|
|
|
- return await fetchJson<DisclosuresResponse>(`/api/disclosures?${queryParams.toString()}`, {
|
|
|
|
|
- method: 'GET',
|
|
|
|
|
- headers: JSON_HEADERS
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ return await fetchPublicJson<DisclosuresResponse>(`/api/disclosures?${queryParams.toString()}`, { revalidate: MARKET_REVALIDATE, tags: MARKET_TAGS });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 종목별 공시 (6자리 코드) — /api/stocks/{code}/disclosures
|
|
// 종목별 공시 (6자리 코드) — /api/stocks/{code}/disclosures
|
|
@@ -207,8 +172,5 @@ export async function fetchStockDisclosures(code: string, params: { page?: numbe
|
|
|
|
|
|
|
|
queryParams.set('page', String(params.page ?? 1));
|
|
queryParams.set('page', String(params.page ?? 1));
|
|
|
|
|
|
|
|
- return await fetchJson<DisclosuresResponse>(`/api/stocks/${encodeURIComponent(code)}/disclosures?${queryParams.toString()}`, {
|
|
|
|
|
- method: 'GET',
|
|
|
|
|
- headers: JSON_HEADERS
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ return await fetchPublicJson<DisclosuresResponse>(`/api/stocks/${encodeURIComponent(code)}/disclosures?${queryParams.toString()}`, { revalidate: MARKET_REVALIDATE, tags: MARKET_TAGS });
|
|
|
}
|
|
}
|