Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions apps/pre-processing-service/app/api/endpoints/blog.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
# app/api/endpoints/keywords.py
from fastapi import APIRouter
from app.decorators.logging import log_api_call
from ...errors.CustomException import *
from fastapi import APIRouter

Expand All @@ -14,8 +11,14 @@ async def root():

@router.post("/rag/create", response_model=ResponseBlogCreate)
async def rag_create(request: RequestBlogCreate):
"""
RAG 기반 블로그 콘텐츠 생성
"""
return {"message": "blog API"}

@router.post("/publish", response_model=RequestBlogPublish)
async def publish(request: ResponseBlogPublish):
"""
생성된 블로그 콘텐츠 배포
"""
return {"message": "blog API"}
9 changes: 1 addition & 8 deletions apps/pre-processing-service/app/api/endpoints/keywords.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
# app/api/endpoints/keywords.py
from ...service.keyword_service import keyword_search

from fastapi import APIRouter
from app.decorators.logging import log_api_call
from ...errors.CustomException import *
from fastapi import APIRouter
from ...errors.CustomException import *
from ...model.schemas import RequestNaverSearch, ResponseNaverSearch, RequestSadaguValidate, ResponsetSadaguValidate
from ...model.schemas import RequestNaverSearch, ResponseNaverSearch

# 이 파일만의 독립적인 라우터를 생성합니다.
router = APIRouter()
Expand All @@ -32,7 +29,3 @@ async def search(request: RequestNaverSearch):
"""
response_data= await keyword_search(request)
return response_data

@router.post("/ssadagu/validate",response_model=ResponseNaverSearch)
async def ssadagu_validate(request: RequestNaverSearch):
return ResponseNaverSearch()
33 changes: 31 additions & 2 deletions apps/pre-processing-service/app/api/endpoints/product.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,43 @@
from app.decorators.logging import log_api_call
from ...errors.CustomException import InvalidItemDataException, ItemNotFoundException
from ...service.crawl_service import crawl_product_detail
from ...service.search_service import search_products
from ...service.match_service import match_products
from ...service.similarity_service import select_product_by_similarity
from ...model.schemas import *

router = APIRouter()

@router.get("/")
async def root():
return {"message": "product API"}

@router.post("/search", response_model=ResponseSadaguSearch)
async def search(request: RequestSadaguSearch):
"""
상품 검색 엔드포인트
"""
return search_products(request)

@router.post("/match", response_model=ResponseSadaguMatch)
async def match(request: RequestSadaguMatch):
"""
상품 매칭 엔드포인트
"""
return match_products(request)

@router.post("/similarity", response_model=ResponseSadaguSimilarity)
async def similarity(request: RequestSadaguSimilarity):
"""
유사도 분석 엔드포인트
"""
return select_product_by_similarity(request)

@router.post("/crawl", response_model=ResponseSadaguCrawl)
@log_api_call
async def crawl(request: Request, body: RequestSadaguCrawl):
"""
상품 상세 정보 크롤링 엔드포인트
"""
try:
result = await crawl_product_detail(body)
return result
Expand All @@ -17,5 +47,4 @@ async def crawl(request: Request, body: RequestSadaguCrawl):
except ItemNotFoundException as e:
raise HTTPException(status_code=e.status_code, detail=e.detail)
except Exception as e:
# 나머지 예외는 500으로 처리
raise HTTPException(status_code=500, detail=str(e))
4 changes: 2 additions & 2 deletions apps/pre-processing-service/app/api/router.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# app/api/router.py
from fastapi import APIRouter
from .endpoints import keywords, blog,test,product
from .endpoints import keywords, blog, product, test
from ..core.config import settings

api_router = APIRouter()
Expand All @@ -14,7 +14,7 @@
#상품 API URL
api_router.include_router(product.router, prefix="/product", tags=["product"])

#모듈 테스터를 위한 endpoint
#모듈 테스터를 위한 endpoint -> 추후 삭제 예정
api_router.include_router(test.router, prefix="/test", tags=["Test"])

@api_router.get("/")
Expand Down
38 changes: 32 additions & 6 deletions apps/pre-processing-service/app/model/schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,18 +24,44 @@ class RequestNaverSearch(RequestBase):
end_date : Optional[str] = None

class ResponseNaverSearch(ResponseBase):
category: str
category: Optional[str] = None
keyword: str
total_keyword: dict[int, str]

# #키워드 사다구몰 검증
# class RequestSadaguValidate(RequestBase):
# tag: str
# category: str
#
# class ResponsetSadaguValidate(ResponseBase):
# keyword: str

#키워드 사다구몰 검증
class RequestSadaguValidate(RequestBase):
tag: str
category: str
# 2단계: 검색
class RequestSadaguSearch(RequestBase):
keyword: str

class ResponseSadaguSearch(ResponseBase):
keyword: str
search_results: list[dict]

# 3단계: 매칭
class RequestSadaguMatch(RequestBase):
keyword: str
search_results: list[dict]

class ResponseSadaguMatch(ResponseBase):
keyword: str
matched_products: list[dict]

# 4단계: 유사도
class RequestSadaguSimilarity(RequestBase):
keyword: str
matched_products: list[dict]

class ResponseSadaguValidate(ResponseBase):
class ResponseSadaguSimilarity(ResponseBase):
keyword: str
selected_product: dict | None = None
reason: str | None = None

#사다구몰 크롤링
class RequestSadaguCrawl(RequestBase):
Expand Down
21 changes: 21 additions & 0 deletions apps/pre-processing-service/app/service/match_service.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import urllib

from ..model.schemas import RequestSadaguMatch

def match_products(request: RequestSadaguMatch) -> dict:
"""
키워드 매칭 로직 (MeCab 등 사용)
"""
keyword = request.keyword
products = request.search_results

# 키워드 매칭 로직 적용 해야함
matched = [p for p in products if keyword in p["title"]]

return {
"job_id": request.job_id,
"schedule_id": request.schedule_id,
"keyword": keyword,
"matched_products": matched,
"status": "success"
}
23 changes: 23 additions & 0 deletions apps/pre-processing-service/app/service/search_service.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
from ..model.schemas import RequestSadaguSearch
import urllib.parse

def search_products(request: RequestSadaguSearch) -> dict:
"""
키워드 기반으로 상품을 검색하는 비즈니스 로직
"""
keyword = request.keyword
encoded_keyword = urllib.parse.quote(keyword)

# Selenium/requests 로직 추가 해야함
search_results = [
{"url": f"https://ssadagu.kr/view.php?id=123"},
{"url": f"https://ssadagu.kr/view.php?id=456"}
]

return {
"job_id": request.job_id,
"schedule_id": request.schedule_id,
"keyword": keyword,
"search_results": search_results,
"status": "success"
}
20 changes: 20 additions & 0 deletions apps/pre-processing-service/app/service/similarity_service.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from ..model.schemas import RequestSadaguSimilarity

def select_product_by_similarity(request: RequestSadaguSimilarity) -> dict:
"""
BERT 기반 유사도 분석 후 상품 선택
"""
keyword = request.keyword
candidates = request.matched_products

# 유사도 분석 로직 적용 해야함
selected = candidates[0] if candidates else None

return {
"job_id": request.job_id,
"schedule_id": request.schedule_id,
"keyword": keyword,
"selected_product": selected,
"reason": "샘플 로직: 첫 번째 매칭 선택",
"status": "success"
}
Loading