fix(festival-bot): 서술형 장소명 카카오맵 매칭 개선

Gemini가 추출한 서술형 장소명("캐리비안 베이 야외 파도풀 특설무대")이
카카오맵 검색에 안 걸려 좌표 없이 저장(장소 클릭 불가)되던 문제.
검색 실패 시 뒤 단어부터 줄이며 재시도하고, 축약 매칭 시 표시명은
원본 유지 + 좌표만 사용. 기존 2건(울산·캐리비안) 좌표 백필 완료.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
caadiq 2026-06-12 14:19:03 +09:00
parent 5c31977411
commit 680ea46cd5

View file

@ -93,19 +93,32 @@ async function festivalBotPlugin(fastify, opts) {
/**
* 카카오맵 장소 검색 (실패 이름만 가진 venue 반환)
* 서술형 장소명("캐리비안 베이 야외 파도풀 특설무대") 검색이 되므로
* 단어부터 하나씩 줄이며 재시도. 축약 매칭 표시명은 원본을 유지하고 좌표만 사용.
*/
async function resolveVenue(query) {
let venue = query ? { name: query } : null;
if (!query) return venue;
try {
const docs = await searchKakaoPlace(query);
if (docs.length > 0) {
venue = kakaoToVenue(docs[0]);
if (!query) return null;
const fallback = { name: query };
const words = query.trim().split(/\s+/);
for (let n = words.length; n >= 1; n--) {
const q = words.slice(0, n).join(' ');
let docs;
try {
docs = await searchKakaoPlace(q);
} catch (err) {
fastify.log.warn(`[festival] 장소 검색 실패 (${q}): ${err.message}`);
return fallback;
}
if (docs.length > 0) {
const venue = kakaoToVenue(docs[0]);
if (n < words.length) {
venue.name = query; // 더 구체적인 원본 이름 유지
fastify.log.info(`[festival] 장소 축약 매칭: "${query}" → "${q}" (${docs[0].place_name})`);
}
return venue;
}
} catch (err) {
fastify.log.warn(`[festival] 장소 검색 실패 (${query}): ${err.message}`);
}
return venue;
return fallback;
}
/**