2026-01-09 21:56:32 +09:00
|
|
|
/**
|
|
|
|
|
* 일정 관련 공개 API
|
|
|
|
|
*/
|
2026-01-09 22:02:04 +09:00
|
|
|
import { fetchApi } from "../index";
|
|
|
|
|
import { getTodayKST } from "../../utils/date";
|
2026-01-09 21:56:32 +09:00
|
|
|
|
2026-01-21 23:33:32 +09:00
|
|
|
/**
|
|
|
|
|
* 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,
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-09 21:56:32 +09:00
|
|
|
// 일정 목록 조회 (월별)
|
|
|
|
|
export async function getSchedules(year, month) {
|
2026-01-17 17:52:15 +09:00
|
|
|
const data = await fetchApi(`/api/schedules?year=${year}&month=${month}`);
|
2026-01-21 23:33:32 +09:00
|
|
|
return (data.schedules || []).map(transformSchedule);
|
2026-01-09 21:56:32 +09:00
|
|
|
}
|
|
|
|
|
|
2026-01-09 22:02:04 +09:00
|
|
|
// 다가오는 일정 조회 (오늘 이후)
|
|
|
|
|
export async function getUpcomingSchedules(limit = 3) {
|
|
|
|
|
const todayStr = getTodayKST();
|
2026-01-21 23:33:32 +09:00
|
|
|
const data = await fetchApi(`/api/schedules?startDate=${todayStr}&limit=${limit}`);
|
|
|
|
|
return (data.schedules || []).map(transformSchedule);
|
2026-01-09 22:02:04 +09:00
|
|
|
}
|
|
|
|
|
|
2026-01-09 21:56:32 +09:00
|
|
|
// 일정 검색 (Meilisearch)
|
|
|
|
|
export async function searchSchedules(query, { offset = 0, limit = 20 } = {}) {
|
2026-01-21 23:33:32 +09:00
|
|
|
const data = await fetchApi(
|
|
|
|
|
`/api/schedules?search=${encodeURIComponent(query)}&offset=${offset}&limit=${limit}`
|
2026-01-09 21:56:32 +09:00
|
|
|
);
|
2026-01-21 23:33:32 +09:00
|
|
|
return {
|
|
|
|
|
...data,
|
|
|
|
|
schedules: (data.schedules || []).map(transformSchedule),
|
|
|
|
|
};
|
2026-01-09 21:56:32 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 일정 상세 조회
|
|
|
|
|
export async function getSchedule(id) {
|
|
|
|
|
return fetchApi(`/api/schedules/${id}`);
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-15 14:51:59 +09:00
|
|
|
// X 프로필 정보 조회
|
|
|
|
|
export async function getXProfile(username) {
|
|
|
|
|
return fetchApi(`/api/schedules/x-profile/${encodeURIComponent(username)}`);
|
|
|
|
|
}
|