o2o-site-AEO/solution/backend/services
김성경 e0155d0423 [feat] solution/backend: 카톡 승인 알림에 [승인] 버튼 — 연결된 계정이 권한 (Event API 2-2)
2-1 로 카톡에 글과 [수정하기] 가 오게 됐고, 이제 카톡 안에서 바로 올린다.
승인 권한은 링크가 아니라 연결된 계정이다 — 버튼이 들고 온 글 ID 는 믿지 않는다.

- kakao_bot: 알림 카드에 [승인](action: block, blockId=KAKAO_APPROVE_BLOCK_ID,
  extra={kind:approve, post_id}) 을 그리고, 클릭은 action.clientExtra 로 받는다.
  블록 ID 가 비면 버튼을 그리지 않는다(눌러도 안 되는 버튼을 보내지 않는다)
- channel.approve_post: 누른 발화자 → 사장님 → 그 가게의 미처리·기한 전 글인지 재확인 후
  approve_by_owner(메일·'바로 발행' 과 같은 경로라 재발행 잡·쓰레드 공유까지 동일).
  연결 안 됨·남의 글·이미 올림·기한 지남은 같은 안내로 끝나고 두 번 올라가지 않는다.
  답장은 "올렸습니다" + [사이트 보기](#blog). LLM 을 부르지 않는다
- 5초를 넘겨도 승인 작업은 취소하지 않는다(asyncio.shield) — 여러 번 커밋하는 작업이라
  중간에 끊기면 승인만 되고 재발행이 안 걸린 글이 남는다
- PostService._blog_url → blog_url(채널이 [사이트 보기] 에 쓴다)

test_kakao_webhook 10건 추가(구현 전 5건 실패 확인), 관련 11개 스위트 239 passed.
실제 클릭 본문(action.clientExtra 위치)은 첫 클릭의 로그로 확인한다.
2026-09-29 16:50:40 +09:00
..
agent [feat] solution/backend: 카톡 승인 알림에 [승인] 버튼 — 연결된 계정이 권한 (Event API 2-2) 2026-09-29 16:50:40 +09:00
collector [fix] solution/backend: 네이버 플레이스 수집이 음식점·카페 요금표를 통째로 반려 — 업종별 unit key 분기 2026-09-23 13:17:28 +09:00
external [feat] solution/backend: 카카오 챗봇 Event API 클라이언트와 테스트 발송 스크립트 (승인 알림 카톡 발송 1단계) 2026-09-29 15:25:06 +09:00
grounding [feat] solution: 지역 읽기 섹션 · 엽서 공유를 풀고 · 기존 사이트는 자산 주소만 갈아 끼운다 2026-09-15 09:31:19 +09:00
llm [fix] solution/backend: 키 미설정 문구가 엉뚱한 공급자를 가리키던 것 2026-09-21 17:19:29 +09:00
prompts [feat] solution/backend: 한 발화에 여러 가지 — 응답을 actions 배열로 2026-09-28 17:00:30 +09:00
resources [feat] solution,postgres-init,docs: SNS 게재 — 사장님이 누르면 쓰고, 승인받아, 사장님 계정으로 올린다 2026-09-14 15:46:44 +09:00
alert_service.py [fix] solution: 온보딩 생성·크롤링 진단·장애 알림 묶음 2026-09-16 16:25:02 +09:00
auth_service.py [fix] solution: 온보딩 생성·크롤링 진단·장애 알림 묶음 2026-09-16 16:25:02 +09:00
azure_static.py feat(solution): 발행 워커·버전 관리와 예약·미리보기 정리 2026-09-15 16:12:16 +09:00
blog_jobs.py [feat] solution/backend: 승인 알림을 카톡으로도 발송하고 웹훅이 메시지를 그린다 (Event API 2-1) 2026-09-29 16:13:07 +09:00
blog_service.py [fix] solution/backend,frontend: 메일 '고쳐서 올리려면' 링크를 일회용 코드로 2026-09-28 09:00:02 +09:00
booking_request_service.py [feat] solution: 미니 블로그·이용후기·예약요청 추가, /s/stay 목업·발행 사이트 UI 다수 수정 2026-09-18 09:03:18 +09:00
build_service.py [feat] solution: 미니 블로그·이용후기·예약요청 추가, /s/stay 목업·발행 사이트 UI 다수 수정 2026-09-18 09:03:18 +09:00
collect_service.py [fix] solution/backend: 네이버 플레이스 수집이 음식점·카페 요금표를 통째로 반려 — 업종별 unit key 분기 2026-09-23 13:17:28 +09:00
copy_service.py [fix] solution/backend: 키 미설정 문구가 엉뚱한 공급자를 가리키던 것 2026-09-21 17:19:29 +09:00
copy_steps.py [feat] solution/backend: LLM 공급자를 OpenAI 기본값으로 전환, Perplexity 실비용 계측 추가 2026-09-16 17:30:11 +09:00
fact_service.py Merge branch 'main' into feature/crawler 2026-09-14 19:45:25 +09:00
faq_fill.py [feat] solution,postgres-init: FAQ 를 20개까지 채운다 — 펜션 공통 질문 30개 + 문의 안내 2026-09-14 17:05:43 +09:00
faq_service.py [fix] solution/backend: 옛 테이블 이름 잔재로 빌더가 통째로 안 돌던 것 2026-09-09 17:08:51 +09:00
indexnow.py feat(solution): 발행 워커·버전 관리와 예약·미리보기 정리 2026-09-15 16:12:16 +09:00
intro_summary.py feat(backend,site): NOL 수집 및 숙박 안내 구조화와 지역 콘텐츠 연동 2026-09-14 19:40:04 +09:00
itinerary_llm_service.py [feat] solution/backend: LLM 공급자를 OpenAI 기본값으로 전환, Perplexity 실비용 계측 추가 2026-09-16 17:30:11 +09:00
itinerary.py [feat] solution,postgres-init: 지역 이야기를 서버가 채운다 · 공용과 개인화를 이름으로 가른다 2026-09-09 17:08:31 +09:00
job_progress.py [feat] solution,postgres-init,docs: 생성 진행 상태 · 새로 만들기 존중 · 발행본 색인·파비콘 2026-09-15 17:29:27 +09:00
job_service.py [feat] solution,postgres-init,docs: 생성 진행 상태 · 새로 만들기 존중 · 발행본 색인·파비콘 2026-09-15 17:29:27 +09:00
kakao_link_service.py [feat] solution/backend: 승인 알림을 카톡으로도 발송하고 웹훅이 메시지를 그린다 (Event API 2-1) 2026-09-29 16:13:07 +09:00
local_content_service.py [feat] solution: 날씨 조건 세분화, 2026-09-17 17:02:48 +09:00
local_restaurant_enrichment.py feat(backend,site): NOL 수집 및 숙박 안내 구조화와 지역 콘텐츠 연동 2026-09-14 19:40:04 +09:00
mail_service.py [feat] solution: 미니 블로그·이용후기·예약요청 추가, /s/stay 목업·발행 사이트 UI 다수 수정 2026-09-18 09:03:18 +09:00
media_service.py [feat] solution/backend: 에이전트가 사진을 내리고 대표를 지정한다 2026-09-28 14:16:08 +09:00
notify_service.py [feat] solution,postgres-init,docs: SNS 게재 — 사장님이 누르면 쓰고, 승인받아, 사장님 계정으로 올린다 2026-09-14 15:46:44 +09:00
place_category.py [refactor] postgres-init,solution: DB 구조 재편 — 스키마 해체 · 공용 콘텐츠 한 벌 · 마이그레이션 체계 2026-09-09 17:08:02 +09:00
place_research.py [feat] solution/backend: LLM 공급자를 OpenAI 기본값으로 전환, Perplexity 실비용 계측 추가 2026-09-16 17:30:11 +09:00
place_service.py [feat] solution: 미니블로그 빌더 기능 확장 — 알림 이메일 분리·삭제·즉시발송·공급자 무관 생성 2026-09-22 08:37:38 +09:00
post_service.py [feat] solution/backend: 카톡 승인 알림에 [승인] 버튼 — 연결된 계정이 권한 (Event API 2-2) 2026-09-29 16:50:40 +09:00
publish_gate.py [fix] solution/backend,shared,site: 에디터에 쓴 소개문이 발행에서 사라지던 구멍 — 계약에 body 추가 2026-09-02 12:00:16 +09:00
render_report.py feat(solution): 발행 워커·버전 관리와 예약·미리보기 정리 2026-09-15 16:12:16 +09:00
render_service.py feat(solution): 발행 워커·버전 관리와 예약·미리보기 정리 2026-09-15 16:12:16 +09:00
review_service.py [feat] solution: 미니 블로그·이용후기·예약요청 추가, /s/stay 목업·발행 사이트 UI 다수 수정 2026-09-18 09:03:18 +09:00
rollback_service.py [fix] solution: 온보딩 생성·크롤링 진단·장애 알림 묶음 2026-09-16 16:25:02 +09:00
search_console_alerts.py [fix] solution/backend: Teams 카드 필수 필드 보완 2026-09-15 15:55:59 +09:00
search_console_client.py [feat] solution/backend: 서치콘솔 자동 제출·색인 상태 추적 추가 2026-09-15 14:50:30 +09:00
search_console_service.py [feat] solution/backend: 서치콘솔 자동 제출·색인 상태 추적 추가 2026-09-15 14:50:30 +09:00
search_console_settings.py [feat] solution/backend: 서치콘솔 자동 제출·색인 상태 추적 추가 2026-09-15 14:50:30 +09:00
seo_audit.py [feat] solution,postgres-init: FAQ 를 20개까지 채운다 — 펜션 공통 질문 30개 + 문의 안내 2026-09-14 17:05:43 +09:00
seo_keywords.py [feat] solution/backend,site: 발행 사이트 제목·keywords 메타에 SiteOntology 키워드 — 이 가게 자료로 거른 것만 2026-09-14 14:38:24 +09:00
showcase_service.py [fix] solution: 썸네일 저장소 없이도 내 사이트·랜딩 카드에 그림을 채운다 2026-09-15 17:19:07 +09:00
site_payload.py [feat] solution: 미니블로그 빌더 기능 확장 — 알림 이메일 분리·삭제·즉시발송·공급자 무관 생성 2026-09-22 08:37:38 +09:00
site_service.py [feat] solution,postgres-init,docs: 생성 진행 상태 · 새로 만들기 존중 · 발행본 색인·파비콘 2026-09-15 17:29:27 +09:00
site_slug.py Merge commit '46171b4f24f2ddc3b9212b9ad6769925bcaceb03' into feature/site-features-and-mockup 2026-09-18 09:44:10 +09:00
site_thumbnail.py [feat] solution/backend,frontend: 내 사이트 목록을 카드로 — 썸네일·주소·시각 · 발행마다 그림 갱신 2026-09-08 13:01:47 +09:00
snapshot.py Merge commit '46171b4f24f2ddc3b9212b9ad6769925bcaceb03' into feature/site-features-and-mockup 2026-09-18 09:44:10 +09:00
social_account_service.py [feat] solution,postgres-init,docs: SNS 게재 — 사장님이 누르면 쓰고, 승인받아, 사장님 계정으로 올린다 2026-09-14 15:46:44 +09:00
social_service.py [fix] solution/backend: 쓰레드 게시 잡이 job_type 번호가 어긋나 워커에 조용히 씹혔다 2026-09-22 11:36:21 +09:00
song_service.py [fix] solution/backend: 키 미설정 문구가 엉뚱한 공급자를 가리키던 것 2026-09-21 17:19:29 +09:00
stay_guide.py [feat] solution: 날씨 조건 세분화, 2026-09-17 17:02:48 +09:00
story_service.py [feat] solution/backend: LLM 공급자를 OpenAI 기본값으로 전환, Perplexity 실비용 계측 추가 2026-09-16 17:30:11 +09:00
teams_webhook.py [fix] solution: 온보딩 생성·크롤링 진단·장애 알림 묶음 2026-09-16 16:25:02 +09:00
vision_service.py [feat] solution/backend: LLM 공급자를 OpenAI 기본값으로 전환, Perplexity 실비용 계측 추가 2026-09-16 17:30:11 +09:00
weather_notes.json [fix] site,solution/backend: 날씨 상태 라벨을 코드별 고유값으로 — 구간 뭉치기 제거 2026-09-22 08:36:09 +09:00
weather_notes.py feat(site): 오늘의 날씨 문구 로딩과 조건별 순환 추가 2026-09-15 16:23:53 +09:00