85 lines
2.2 KiB
JavaScript
85 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,
|
||
|
|
};
|