seibro.ts 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. 'use server';
  2. import { ResultDto } from '@/types/response/common';
  3. import {
  4. DividendCalendarResponse,
  5. LockupCalendarResponse,
  6. MeetingCalendarResponse,
  7. ElsRiskResponse,
  8. ForeignCustodyResponse,
  9. StockDividendsResponse,
  10. LendingHistoryResponse,
  11. CbExercisesResponse,
  12. BondDetailResponse
  13. } from '@/types/seibro';
  14. import { fetchJson } from '@/lib/utils/server';
  15. // 공통 헤더 (익명 · JSON)
  16. const JSON_HEADERS = { 'Accept': 'application/json' } as const;
  17. // 배당 캘린더 (권리기준일 from/to 기간 · 페이징)
  18. export async function fetchDividendCalendar(params: { from?: string; to?: string; page?: number; perPage?: number }): Promise<ResultDto<DividendCalendarResponse>>
  19. {
  20. const queryParams = new URLSearchParams();
  21. if (params.from) queryParams.set('from', params.from);
  22. if (params.to) queryParams.set('to', params.to);
  23. queryParams.set('page', String(params.page ?? 1));
  24. if (params.perPage) queryParams.set('perPage', String(params.perPage));
  25. return await fetchJson<DividendCalendarResponse>(`/api/market/dividend-calendar?${queryParams.toString()}`, {
  26. method: 'GET',
  27. headers: JSON_HEADERS
  28. });
  29. }
  30. // 락업(보호예수) 캘린더 (예수일/반환일 from/to 기간 · 페이징)
  31. export async function fetchLockupCalendar(params: { from?: string; to?: string; page?: number; perPage?: number }): Promise<ResultDto<LockupCalendarResponse>>
  32. {
  33. const queryParams = new URLSearchParams();
  34. if (params.from) queryParams.set('from', params.from);
  35. if (params.to) queryParams.set('to', params.to);
  36. queryParams.set('page', String(params.page ?? 1));
  37. if (params.perPage) queryParams.set('perPage', String(params.perPage));
  38. return await fetchJson<LockupCalendarResponse>(`/api/market/lockup-calendar?${queryParams.toString()}`, {
  39. method: 'GET',
  40. headers: JSON_HEADERS
  41. });
  42. }
  43. // 주총 캘린더 (총회일 from/to 기간 · 페이징)
  44. export async function fetchMeetingCalendar(params: { from?: string; to?: string; page?: number; perPage?: number }): Promise<ResultDto<MeetingCalendarResponse>>
  45. {
  46. const queryParams = new URLSearchParams();
  47. if (params.from) queryParams.set('from', params.from);
  48. if (params.to) queryParams.set('to', params.to);
  49. queryParams.set('page', String(params.page ?? 1));
  50. if (params.perPage) queryParams.set('perPage', String(params.perPage));
  51. return await fetchJson<MeetingCalendarResponse>(`/api/market/meeting-calendar?${queryParams.toString()}`, {
  52. method: 'GET',
  53. headers: JSON_HEADERS
  54. });
  55. }
  56. // ELS 리스크보드 (기초자산·종목구분·기간 필터 — 기초자산별 시계열 묶음)
  57. export async function fetchElsRisk(params: { bassetCd?: string; secnTpcd?: string; from?: string; to?: string }): Promise<ResultDto<ElsRiskResponse>>
  58. {
  59. const queryParams = new URLSearchParams();
  60. if (params.bassetCd) queryParams.set('bassetCd', params.bassetCd);
  61. if (params.secnTpcd) queryParams.set('secnTpcd', params.secnTpcd);
  62. if (params.from) queryParams.set('from', params.from);
  63. if (params.to) queryParams.set('to', params.to);
  64. const qs = queryParams.toString();
  65. return await fetchJson<ElsRiskResponse>(`/api/market/els-risk${qs ? `?${qs}` : ''}`, {
  66. method: 'GET',
  67. headers: JSON_HEADERS
  68. });
  69. }
  70. // 외화 커스터디 (국가·종목구분·기간 필터 — 국가별 시계열 묶음)
  71. export async function fetchForeignCustody(params: { nation?: string; secnTpcd?: string; from?: string; to?: string }): Promise<ResultDto<ForeignCustodyResponse>>
  72. {
  73. const queryParams = new URLSearchParams();
  74. if (params.nation) queryParams.set('nation', params.nation);
  75. if (params.secnTpcd) queryParams.set('secnTpcd', params.secnTpcd);
  76. if (params.from) queryParams.set('from', params.from);
  77. if (params.to) queryParams.set('to', params.to);
  78. const qs = queryParams.toString();
  79. return await fetchJson<ForeignCustodyResponse>(`/api/market/foreign-custody${qs ? `?${qs}` : ''}`, {
  80. method: 'GET',
  81. headers: JSON_HEADERS
  82. });
  83. }
  84. // 종목 배당 이력 (6자리 단축코드 · 페이징)
  85. export async function fetchStockDividends(code: string, params: { page?: number; perPage?: number }): Promise<ResultDto<StockDividendsResponse>>
  86. {
  87. const queryParams = new URLSearchParams();
  88. queryParams.set('page', String(params.page ?? 1));
  89. if (params.perPage) queryParams.set('perPage', String(params.perPage));
  90. return await fetchJson<StockDividendsResponse>(`/api/stocks/${encodeURIComponent(code)}/dividends?${queryParams.toString()}`, {
  91. method: 'GET',
  92. headers: JSON_HEADERS
  93. });
  94. }
  95. // 종목 대차 시계열 (6자리 단축코드 · 기간 · 페이징)
  96. export async function fetchStockLending(code: string, params: { from?: string; to?: string; page?: number; perPage?: number }): Promise<ResultDto<LendingHistoryResponse>>
  97. {
  98. const queryParams = new URLSearchParams();
  99. if (params.from) queryParams.set('from', params.from);
  100. if (params.to) queryParams.set('to', params.to);
  101. queryParams.set('page', String(params.page ?? 1));
  102. if (params.perPage) queryParams.set('perPage', String(params.perPage));
  103. return await fetchJson<LendingHistoryResponse>(`/api/stocks/${encodeURIComponent(code)}/lending?${queryParams.toString()}`, {
  104. method: 'GET',
  105. headers: JSON_HEADERS
  106. });
  107. }
  108. // 종목 CB/BW 행사 내역 (6자리 단축코드 · byBond · 페이징)
  109. export async function fetchStockCbExercises(code: string, params: { byBond?: boolean; page?: number; perPage?: number }): Promise<ResultDto<CbExercisesResponse>>
  110. {
  111. const queryParams = new URLSearchParams();
  112. if (params.byBond) queryParams.set('byBond', 'true');
  113. queryParams.set('page', String(params.page ?? 1));
  114. if (params.perPage) queryParams.set('perPage', String(params.perPage));
  115. return await fetchJson<CbExercisesResponse>(`/api/stocks/${encodeURIComponent(code)}/cb-exercises?${queryParams.toString()}`, {
  116. method: 'GET',
  117. headers: JSON_HEADERS
  118. });
  119. }
  120. // 채권 상세 (12자리 ISIN)
  121. export async function fetchBondDetail(isin: string): Promise<ResultDto<BondDetailResponse>>
  122. {
  123. return await fetchJson<BondDetailResponse>(`/api/stocks/bonds/${encodeURIComponent(isin)}`, {
  124. method: 'GET',
  125. headers: JSON_HEADERS
  126. });
  127. }