o2o-site-AEO/solution/backend/services
hbyang ca0bea77a7 [feat] solution/backend: 카카오 로그인 — 회원번호로 카톡 채널을 코드 없이 잇는다
★★ 챗봇 웹훅의 user.properties.appUserId 는 카카오 로그인의 회원번호와 **같은 값**이다
(카카오 공식 문서, 봇에 앱키가 물려 있을 때). 그래서 카카오로 로그인만 해 두면 채널에
말을 거는 순간 누구인지 알 수 있고, 6자리 코드 절차가 필요 없어진다.

- external/kakao_identity: 액세스 토큰을 카카오에 되물어 확인한다. ★ 응답의 app_id 를
  우리 앱과 대조하는 것이 구글의 aud 검사에 해당한다 — 이게 없으면 남의 앱 토큰으로
  우리 계정이 된다. 이름·이메일은 동의 항목이라 못 받아도 로그인은 되게 했다
- auth_service.kakao_login: google_login 과 같은 세 갈래. 이메일이 겹쳐도 자동으로
  잇지 않는다(DECISIONS 1 — 계정 선점)
- kakao_link_service.link_by_app_user_id: 자동 매칭. ★ 이미 다른 사장님에게 묶인
  카톡은 빼앗지 않는다 — 조용히 빼앗으면 앞사람이 남의 가게를 보게 된다
- ★ 코드 경로는 그대로 둔다: id/pw·구글 가입자에겐 appUserId 가 없고, 봇에 앱키가
  안 물린 환경에서는 값 자체가 안 온다

★ 함께 고친 것 — services/agent/tools.py 가 사라진 site_payload._DEFAULT_THEME 를
보고 있었다(c690862 템플릿 정의 통합에서 이름이 없어졌는데 이 한 줄만 남았다).
**대화의 섹션 기능이 통째로 죽어 있었고** 웹훅이 AttributeError 를 삼켜 "지금은
처리할 수 없어요" 로만 보였다 — common/template_catalog.industry_of 로 바꿨다.

test_kakao_link·test_kakao_webhook·test_agent_runtime·test_auth 194 passed
(신규 4: 자동 매칭·미가입자·빼앗지 않음·재진입). 남은 1건은 컨테이너에 실제
GOOGLE_CLIENT_ID 가 있어 나는 기존 실패다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-30 16:27:54 +09:00
..
agent [feat] solution/backend: 카카오 로그인 — 회원번호로 카톡 채널을 코드 없이 잇는다 2026-09-30 16:27:54 +09:00
collector [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
external [feat] solution/backend: 카카오 로그인 — 회원번호로 카톡 채널을 코드 없이 잇는다 2026-09-30 16:27:54 +09:00
grounding [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
llm [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
prompts [feat] solution/backend: SNS 캡션 첫 문장에 지역·업종·상호 2026-09-30 15:43:49 +09:00
resources [feat] solution,postgres-init,docs: SNS 게재 — 사장님이 누르면 쓰고, 승인받아, 사장님 계정으로 올린다 2026-09-14 15:46:44 +09:00
activity_feed.py [feat] solution/site,shared: 새 템플릿 8종을 카페·음식점·병원에도 연다 — 객실 문구를 업종별로 2026-09-30 14:57:02 +09:00
alert_service.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
auth_service.py [feat] solution/backend: 카카오 로그인 — 회원번호로 카톡 채널을 코드 없이 잇는다 2026-09-30 16:27:54 +09:00
azure_static.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
blog_jobs.py [feat] solution/backend: 승인 알림을 카톡으로도 발송하고 웹훅이 메시지를 그린다 (Event API 2-1) 2026-09-29 16:13:07 +09:00
blog_service.py merge: origin/main(에이전트 여러 동작 · 사진 도구 · 카톡 승인 알림) 을 feature/template-catalog 에 병합 2026-09-30 13:51:53 +09:00
booking_request_service.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
build_service.py [feat] solution/backend,frontend,site: 수집·사진 분석·발행 진행을 Teams 로 발송 — 수집 중 배포에도 사진 목록 복구 2026-09-30 15:09:52 +09:00
collect_service.py [feat] solution/backend,frontend,site: 수집·사진 분석·발행 진행을 Teams 로 발송 — 수집 중 배포에도 사진 목록 복구 2026-09-30 15:09:52 +09:00
copy_service.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
copy_steps.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
fact_service.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
faq_fill.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
faq_service.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
indexnow.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
intro_summary.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
itinerary_llm_service.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
itinerary.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
job_progress.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
job_service.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
kakao_link_service.py [feat] solution/backend: 카카오 로그인 — 회원번호로 카톡 채널을 코드 없이 잇는다 2026-09-30 16:27:54 +09:00
local_content_service.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
local_restaurant_enrichment.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
mail_service.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
media_service.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
notify_service.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
ops_service.py [feat] solution/backend,frontend: 관리자가 모든 사업장을 열고 관리 — 사이트관리 검색·업종 필터·삭제, 사장님 더보기 정리 2026-09-30 15:34:20 +09:00
place_category.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
place_research.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
place_service.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
post_service.py [feat] solution/backend: 카톡 승인 알림에 [승인] 버튼 — 연결된 계정이 권한 (Event API 2-2) 2026-09-29 16:50:40 +09:00
publish_gate.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
render_report.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
render_service.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
review_service.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
rollback_service.py [feat] solution/backend,frontend,site: 수집·사진 분석·발행 진행을 Teams 로 발송 — 수집 중 배포에도 사진 목록 복구 2026-09-30 15:09:52 +09:00
search_console_alerts.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
search_console_client.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
search_console_service.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
search_console_settings.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
seo_audit.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
seo_keywords.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
showcase_service.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
site_payload.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
site_service.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
site_slug.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
site_thumbnail.py [feat] solution/backend: 발행·재발행마다 사이트 화면을 찍어 썸네일로 — 실패하면 대표 사진 2026-09-30 15:34:21 +09:00
snapshot.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
social_account_service.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
social_service.py [feat] solution/backend: SNS 캡션 첫 문장에 지역·업종·상호 2026-09-30 15:43:49 +09:00
song_service.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
stay_guide.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
story_service.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
teams_webhook.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00
vision_service.py [feat] solution/backend,frontend,site: 수집·사진 분석·발행 진행을 Teams 로 발송 — 수집 중 배포에도 사진 목록 복구 2026-09-30 15:09:52 +09:00
weather_notes.json [fix] site,solution/backend: 날씨 상태 라벨을 코드별 고유값으로 — 구간 뭉치기 제거 2026-09-22 08:36:09 +09:00
weather_notes.py [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제 2026-09-28 16:05:19 +09:00