/** * Meilisearch 동기화 봇 서비스 * 모든 일정을 Meilisearch에 동기화 */ import pool from "../lib/db.js"; import { addOrUpdateSchedule } from "./meilisearch.js"; /** * 전체 일정 Meilisearch 동기화 */ export async function syncAllSchedules(botId) { try { const startTime = Date.now(); // 모든 일정 조회 const [schedules] = await pool.query(` SELECT s.id, s.title, s.description, s.date, s.time, s.category_id, s.source_url, s.source_name, c.name as category_name, c.color as category_color FROM schedules s LEFT JOIN schedule_categories c ON s.category_id = c.id `); let synced = 0; for (const s of schedules) { // 멤버 조회 const [members] = await pool.query( "SELECT m.id, m.name FROM schedule_members sm JOIN members m ON sm.member_id = m.id WHERE sm.schedule_id = ?", [s.id] ); // Meilisearch 동기화 await addOrUpdateSchedule({ id: s.id, title: s.title, description: s.description || "", date: s.date, time: s.time, category_id: s.category_id, category_name: s.category_name || "", category_color: s.category_color || "", source_name: s.source_name, source_url: s.source_url, members: members, }); synced++; } const elapsedMs = Date.now() - startTime; const elapsedSec = (elapsedMs / 1000).toFixed(2); // 봇 상태 업데이트 (schedules_added = 동기화 수, last_added_count = 소요시간 ms) await pool.query( `UPDATE bots SET last_check_at = NOW(), schedules_added = ?, last_added_count = ?, error_message = NULL WHERE id = ?`, [synced, elapsedMs, botId] ); console.log(`[Meilisearch Bot] ${synced}개 동기화 완료 (${elapsedSec}초)`); return { synced, elapsed: elapsedSec }; } catch (error) { // 오류 상태 업데이트 await pool.query( `UPDATE bots SET last_check_at = NOW(), status = 'error', error_message = ? WHERE id = ?`, [error.message, botId] ); throw error; } } export default { syncAllSchedules, };