/* src/service/api.ts */ import {Criteria, Song} from '@/types/song'; import {API_FIELDS} from '@/constants/apiFields'; // 띄어쓰기를 무시하는 정규화 함수 const normalizeText = (text: string): string => text.replace(/\s/g, '').toLowerCase(); // API 응답 데이터 타입 정의 interface ApiSongResponse { [key: string]: string; // 동적 키를 위해 인덱스 시그니처 사용 [API_FIELDS.BRAND]: string; [API_FIELDS.NO]: string; [API_FIELDS.TITLE]: string; [API_FIELDS.SINGER]: string; [API_FIELDS.COMPOSER]: string; [API_FIELDS.LYRICIST]: string; [API_FIELDS.RELEASE]: string; } export const fetchSongs = async (criteria: Criteria, keyword: string): Promise => { try { if (!keyword.trim()) return []; // 빈 검색어 처리 // 검색 키워드 정규화 (띄어쓰기 제거) const normalizedKeyword = normalizeText(keyword); // criteria에 따라 적절한 엔드포인트 선택 const endpoint = criteria === 'title' ? `https://api.manana.kr/karaoke/song/${normalizedKeyword}.json` : `https://api.manana.kr/karaoke/singer/${normalizedKeyword}.json`; const response = await fetch(endpoint); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const data: ApiSongResponse[] = await response.json(); // API 응답 데이터를 Song 타입으로 변환 (키를 상수로 정의) return data.map((item) => ({ [API_FIELDS.NO]: item[API_FIELDS.NO], [API_FIELDS.TITLE]: item[API_FIELDS.TITLE], [API_FIELDS.SINGER]: item[API_FIELDS.SINGER], })); } catch (error) { console.error('Error fetching songs:', error); return []; } };