| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- /* 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<Song[]> => {
- 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
- .filter((item) => item[API_FIELDS.BRAND] === 'tj')
- .map((item) => ({
- [API_FIELDS.NO]: item[API_FIELDS.NO],
- [API_FIELDS.TITLE]: item[API_FIELDS.TITLE],
- [API_FIELDS.SINGER]: item[API_FIELDS.SINGER],
- }))
- .sort((a, b) => {
- const aNormalized = normalizeText(a[API_FIELDS.TITLE]);
- const bNormalized = normalizeText(b[API_FIELDS.TITLE]);
- const aStartsWith = aNormalized.startsWith(normalizedKeyword);
- const bStartsWith = bNormalized.startsWith(normalizedKeyword);
- if (aStartsWith && !bStartsWith) return -1;
- if (!aStartsWith && bStartsWith) return 1;
- // 둘 다 앞글자 일치 또는 둘 다 불일치할 경우, 알파벳순 정렬
- return aNormalized.localeCompare(bNormalized);
- });
- } catch (error) {
- console.error('Error fetching songs:', error);
- return [];
- }
- };
|