goldenChat base source add

This commit is contained in:
aidev
2026-05-23 15:11:48 +09:00
commit a4ea7762b5
2081 changed files with 1155760 additions and 0 deletions
@@ -0,0 +1,158 @@
import axios from 'axios';
import { API_BASE_URL } from './apiConfig';
// 기간 정보 타입
export interface PeriodInfo {
id: number;
period: number;
isDefault: boolean;
enabled: boolean;
displayOrder: number;
}
// 지표별 기간 응답 타입
export interface IndicatorPeriodsResponse {
indicatorType: string;
indicatorDisplayName: string;
periods: PeriodInfo[];
defaultPeriod: number | null;
}
// 기간 요청 타입
export interface PeriodRequest {
indicatorType: string;
period: number;
isDefault?: boolean;
displayOrder?: number;
enabled?: boolean;
}
// 기간 설정 DTO
export interface IndicatorPeriodSettingDto {
id: number;
indicatorType: string;
period: number;
isDefault: boolean;
displayOrder: number;
enabled: boolean;
}
// 기간이 필요 없는 지표 목록
export const PERIOD_NOT_REQUIRED_INDICATORS = [
'MACD', 'MACD_HISTOGRAM'
];
/**
* 기간이 필요한 지표인지 확인
*/
export const isPeriodRequired = (indicatorType: string): boolean => {
return !PERIOD_NOT_REQUIRED_INDICATORS.includes(indicatorType);
};
/**
* 모든 지표의 기간 설정 조회
*/
export const getAllIndicatorPeriods = async (): Promise<IndicatorPeriodsResponse[]> => {
const response = await axios.get(`${API_BASE_URL}/indicator-periods`);
return response.data;
};
/**
* 특정 지표의 기간 설정 조회
*/
export const getIndicatorPeriods = async (indicatorType: string): Promise<IndicatorPeriodsResponse> => {
const response = await axios.get(`${API_BASE_URL}/indicator-periods/${indicatorType}`);
return response.data;
};
/**
* 특정 지표의 활성화된 기간 목록 조회 (드롭다운용)
*/
export const getEnabledPeriods = async (indicatorType: string): Promise<number[]> => {
const response = await axios.get(`${API_BASE_URL}/indicator-periods/${indicatorType}/enabled`);
return response.data;
};
/**
* 모든 지표의 활성화된 기간 맵 조회
*/
export const getAllEnabledPeriodsMap = async (): Promise<Record<string, number[]>> => {
const response = await axios.get(`${API_BASE_URL}/indicator-periods/map`);
return response.data;
};
/**
* 기간 추가
*/
export const addPeriod = async (request: PeriodRequest): Promise<IndicatorPeriodSettingDto> => {
const response = await axios.post(`${API_BASE_URL}/indicator-periods`, request);
return response.data;
};
/**
* 기간 수정
*/
export const updatePeriod = async (id: number, request: Partial<PeriodRequest>): Promise<IndicatorPeriodSettingDto> => {
const response = await axios.put(`${API_BASE_URL}/indicator-periods/${id}`, request);
return response.data;
};
/**
* 기간 삭제
*/
export const deletePeriod = async (id: number): Promise<void> => {
await axios.delete(`${API_BASE_URL}/indicator-periods/${id}`);
};
/**
* 지표 타입 표시명 가져오기 - 업비트 표준 16개
*/
export const getIndicatorDisplayName = (indicatorType: string): string => {
const displayNames: Record<string, string> = {
VOLUME: '거래량',
MACD: 'MACD',
STOCHASTIC: 'Stochastic Slow',
RSI: 'RSI',
ADX: 'ADX',
CCI: 'CCI',
TRIX: 'TRIX',
DISPARITY: '이격도',
NEW_PSYCHOLOGICAL: '신심리도',
INVEST_PSYCHOLOGICAL: '투자심리도',
WILLIAMS_R: 'Williams %R',
BWI: '볼린저밴드 %B',
OBV: 'OBV',
VOLUME_OSC: 'VolumeOSC',
VR: 'VR',
DMI: 'DMI',
};
return displayNames[indicatorType] || indicatorType;
};
// 캐시된 기간 맵 (성능 최적화)
let cachedPeriodsMap: Record<string, number[]> | null = null;
let cacheTimestamp: number = 0;
const CACHE_DURATION = 5 * 60 * 1000; // 5분
/**
* 캐시된 기간 맵 조회 (성능 최적화)
*/
export const getCachedPeriodsMap = async (): Promise<Record<string, number[]>> => {
const now = Date.now();
if (cachedPeriodsMap && (now - cacheTimestamp) < CACHE_DURATION) {
return cachedPeriodsMap;
}
cachedPeriodsMap = await getAllEnabledPeriodsMap();
cacheTimestamp = now;
return cachedPeriodsMap;
};
/**
* 캐시 무효화
*/
export const invalidatePeriodsCache = (): void => {
cachedPeriodsMap = null;
cacheTimestamp = 0;
};