From 2b4c89217ae948f97d014722178f12da0b43197d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=84=B1=EA=B2=BD?= Date: Tue, 2 Jun 2026 11:56:36 +0900 Subject: [PATCH] =?UTF-8?q?=EB=8F=84=20=EC=A0=84=EC=B2=B4=20=EB=A7=A4?= =?UTF-8?q?=ED=95=91=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EB=AF=B8=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/home/schemas/home_schema.py | 14 -------- app/video/api/routers/v1/video.py | 54 ++++++++++++++++++++++++++++--- 2 files changed, 49 insertions(+), 19 deletions(-) diff --git a/app/home/schemas/home_schema.py b/app/home/schemas/home_schema.py index 3c5d283..c1b4bf7 100644 --- a/app/home/schemas/home_schema.py +++ b/app/home/schemas/home_schema.py @@ -260,20 +260,6 @@ class ManualMarketingRequest(BaseModel): address: str = Field(..., description="도로명 또는 지번 주소") -class MarketingAnalysisResponse(BaseModel): - """업체명+주소 직접 입력 마케팅 분석 응답""" - - status: str = Field( - default="completed", - description="처리 상태 (completed: 성공, failed: ChatGPT 분석 실패)", - ) - processed_info: ProcessedInfo = Field(..., description="가공된 장소 정보") - marketing_analysis: Optional[MarketingPromptOutput] = Field( - None, description="마케팅 분석 결과. 실패 시 null" - ) - m_id: int = Field(..., description="마케팅 분석 결과 ID") - - class ErrorResponse(BaseModel): """에러 응답 스키마""" diff --git a/app/video/api/routers/v1/video.py b/app/video/api/routers/v1/video.py index 0825a25..12a6ff9 100644 --- a/app/video/api/routers/v1/video.py +++ b/app/video/api/routers/v1/video.py @@ -66,6 +66,40 @@ logger = get_logger("video") router = APIRouter(prefix="/video", tags=["Video"]) +_SIDO_CITIES: dict[str, list[str]] = { + "특별시 / 광역시": ["서울시", "부산시", "대구시", "인천시", "광주시", "대전시", "울산시", "세종시"], + "경기도": [ + "수원시", "성남시", "고양시", "용인시", "부천시", "안산시", "안양시", "남양주시", + "화성시", "평택시", "의정부시", "시흥시", "파주시", "김포시", "광주시", "광명시", + "군포시", "하남시", "오산시", "이천시", "안성시", "구리시", "양주시", "포천시", + "여주시", "동두천시", "과천시", "가평군", "양평군", "연천군", + ], + "강원도": [ + "춘천시", "원주시", "강릉시", "동해시", "태백시", "속초시", "삼척시", + "홍천군", "횡성군", "영월군", "평창군", "정선군", "철원군", "화천군", + "양구군", "인제군", "고성군", "양양군", + ], + "충청북도": ["청주시", "충주시", "제천시", "보은군", "옥천군", "영동군", "증평군", "진천군", "괴산군", "음성군", "단양군"], + "충청남도": ["천안시", "공주시", "보령시", "아산시", "서산시", "논산시", "계룡시", "당진시", "금산군", "부여군", "서천군", "청양군", "홍성군", "예산군", "태안군"], + "전라북도": ["전주시", "군산시", "익산시", "정읍시", "남원시", "김제시", "완주군", "진안군", "무주군", "장수군", "임실군", "순창군", "고창군", "부안군"], + "전라남도": ["목포시", "여수시", "순천시", "나주시", "광양시", "담양군", "곡성군", "구례군", "고흥군", "보성군", "화순군", "장흥군", "강진군", "해남군", "영암군", "무안군", "함평군", "영광군", "장성군", "완도군", "진도군", "신안군"], + "경상북도": ["포항시", "경주시", "김천시", "안동시", "구미시", "영주시", "영천시", "상주시", "문경시", "경산시", "의성군", "청송군", "영양군", "영덕군", "청도군", "고령군", "성주군", "칠곡군", "예천군", "봉화군", "울진군", "울릉군"], + "경상남도": ["창원시", "진주시", "통영시", "사천시", "김해시", "밀양시", "거제시", "양산시", "의령군", "함안군", "창녕군", "고성군", "남해군", "하동군", "산청군", "함양군", "거창군", "합천군"], + "제주도": ["제주시", "서귀포시"], +} + +_SIDO_ALIASES: dict[str, list[str]] = { + "경기도": ["경기도", "경기"], + "강원도": ["강원도", "강원"], + "충청북도": ["충청북도", "충북"], + "충청남도": ["충청남도", "충남"], + "전라북도": ["전라북도", "전북"], + "전라남도": ["전라남도", "전남"], + "경상북도": ["경상북도", "경북"], + "경상남도": ["경상남도", "경남"], + "제주도": ["제주도", "제주"], +} + @router.get( "/generate/{task_id}", @@ -859,12 +893,22 @@ async def get_all_videos( if store_name: where_clauses.append(Project.store_name.ilike(f"%{store_name}%")) if region: - where_clauses.append( - or_( - Project.region.ilike(f"%{region}%"), - Project.detail_region_info.ilike(f"%{region}%"), + cities = _SIDO_CITIES.get(region) + if cities: + aliases = _SIDO_ALIASES.get(region, [region]) + where_clauses.append( + or_( + Project.region.in_(cities), + *[Project.detail_region_info.ilike(f"%{a}%") for a in aliases], + ) + ) + else: + where_clauses.append( + or_( + Project.region.ilike(f"%{region}%"), + Project.detail_region_info.ilike(f"%{region}%"), + ) ) - ) count_q = ( select(func.count(Video.id))