/** * 일정 관련 공개 API */ import { fetchApi } from "../index"; import { getTodayKST } from "../../utils/date"; /** * API 응답을 프론트엔드 형식으로 변환 * - datetime → date, time 분리 * - category 객체 → category_id, category_name, category_color 플랫화 * - members 배열 → member_names 문자열 */ function transformSchedule(schedule) { const category = schedule.category || {}; // datetime에서 date와 time 분리 let date = ''; let time = null; if (schedule.datetime) { const parts = schedule.datetime.split('T'); date = parts[0]; time = parts[1] || null; } // members 배열을 문자열로 (기존 코드 호환성) const memberNames = Array.isArray(schedule.members) ? schedule.members.join(',') : ''; return { ...schedule, date, time, category_id: category.id, category_name: category.name, category_color: category.color, member_names: memberNames, }; } // 일정 목록 조회 (월별) export async function getSchedules(year, month) { const data = await fetchApi(`/api/schedules?year=${year}&month=${month}`); return (data.schedules || []).map(transformSchedule); } // 다가오는 일정 조회 (오늘 이후) export async function getUpcomingSchedules(limit = 3) { const todayStr = getTodayKST(); const data = await fetchApi(`/api/schedules?startDate=${todayStr}&limit=${limit}`); return (data.schedules || []).map(transformSchedule); } // 일정 검색 (Meilisearch) export async function searchSchedules(query, { offset = 0, limit = 20 } = {}) { const data = await fetchApi( `/api/schedules?search=${encodeURIComponent(query)}&offset=${offset}&limit=${limit}` ); return { ...data, schedules: (data.schedules || []).map(transformSchedule), }; } // 일정 상세 조회 export async function getSchedule(id) { return fetchApi(`/api/schedules/${id}`); } // X 프로필 정보 조회 export async function getXProfile(username) { return fetchApi(`/api/schedules/x-profile/${encodeURIComponent(username)}`); }