151 lines
3.4 KiB
JavaScript
151 lines
3.4 KiB
JavaScript
|
|
/**
|
||
|
|
* 스케줄 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,
|
||
|
|
categoryId: category.id,
|
||
|
|
categoryName: category.name,
|
||
|
|
categoryColor: 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();
|
||
|
|
return fetchApi(`/schedules?startDate=${today}&limit=${limit}`);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 스케줄 검색 (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 }),
|
||
|
|
});
|
||
|
|
}
|