봇 시스템: - Meilisearch 동기화 봇 추가 (meilisearch-bot.js) - bots 테이블 type enum에 meilisearch 추가 - youtube-scheduler.js에 meilisearch 봇 분기 추가 - admin.js API에서 meilisearch 봇 지원 봇 관리 페이지 개선 (AdminScheduleBots.jsx): - Meilisearch 공식 로고 아이콘 추가 - Meilisearch 봇 통계: 동기화 수/소요 시간 표시 - 봇 타입별 배경색 (X: 검정, Meilisearch: #ddf1fd, YouTube: 빨강) 시간대 정리: - MariaDB KST 설정으로 DATE_ADD(NOW(), INTERVAL 9 HOUR) → NOW() 변경 - youtube-bot.js, x-bot.js에서 10곳 수정
84 lines
2.2 KiB
JavaScript
84 lines
2.2 KiB
JavaScript
/**
|
|
* 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,
|
|
};
|