/** * 스케줄 API */ import { fetchApi, fetchAuthApi, fetchFormData } from './client'; import { getTodayKST } from '@/utils'; /** * API 응답을 플랫 배열로 변환 * 백엔드가 날짜별 그룹화된 객체를 반환하므로 변환 필요 */ function flattenScheduleResponse(data) { const schedules = []; for (const [date, dayData] of Object.entries(data)) { for (const schedule of dayData.schedules || []) { const category = schedule.category || {}; schedules.push({ ...schedule, date, category_id: category.id, category_name: category.name, category_color: category.color, }); } } return schedules; } // ==================== 공개 API ==================== /** * 스케줄 목록 조회 (월별) */ export async function getSchedules(year, month) { const data = await fetchApi(`/schedules?year=${year}&month=${month}`); return flattenScheduleResponse(data); } /** * 다가오는 스케줄 조회 */ export async function getUpcomingSchedules(limit = 3) { const today = getTodayKST(); const data = await fetchApi(`/schedules?startDate=${today}&limit=${limit}`); return flattenScheduleResponse(data); } /** * 스케줄 검색 (Meilisearch) */ export async function searchSchedules(query, { offset = 0, limit = 20 } = {}) { return fetchApi( `/schedules?search=${encodeURIComponent(query)}&offset=${offset}&limit=${limit}` ); } /** * 스케줄 상세 조회 */ export async function getSchedule(id) { return fetchApi(`/schedules/${id}`); } /** * X 프로필 정보 조회 */ export async function getXProfile(username) { return fetchApi(`/schedules/x-profile/${encodeURIComponent(username)}`); } /** * 카테고리 목록 조회 */ export async function getCategories() { return fetchApi('/schedules/categories'); } // ==================== 어드민 API ==================== /** * [Admin] 스케줄 검색 */ export async function adminSearchSchedules(query) { return fetchAuthApi(`/admin/schedules/search?q=${encodeURIComponent(query)}`); } /** * [Admin] 스케줄 상세 조회 */ export async function adminGetSchedule(id) { return fetchAuthApi(`/admin/schedules/${id}`); } /** * [Admin] 스케줄 생성 */ export async function createSchedule(formData) { return fetchFormData('/admin/schedules', formData, 'POST'); } /** * [Admin] 스케줄 수정 */ export async function updateSchedule(id, formData) { return fetchFormData(`/admin/schedules/${id}`, formData, 'PUT'); } /** * [Admin] 스케줄 삭제 */ export async function deleteSchedule(id) { return fetchAuthApi(`/schedules/${id}`, { method: 'DELETE' }); } // ==================== 카테고리 어드민 API ==================== /** * [Admin] 카테고리 생성 */ export async function createCategory(data) { return fetchAuthApi('/admin/schedule-categories', { method: 'POST', body: JSON.stringify(data), }); } /** * [Admin] 카테고리 수정 */ export async function updateCategory(id, data) { return fetchAuthApi(`/admin/schedule-categories/${id}`, { method: 'PUT', body: JSON.stringify(data), }); } /** * [Admin] 카테고리 삭제 */ export async function deleteCategory(id) { return fetchAuthApi(`/admin/schedule-categories/${id}`, { method: 'DELETE' }); } /** * [Admin] 카테고리 순서 변경 */ export async function reorderCategories(orders) { return fetchAuthApi('/admin/schedule-categories-order', { method: 'PUT', body: JSON.stringify({ orders }), }); }